diff --git a/DEPS b/DEPS index 364f73d6..7edfe31 100644 --- a/DEPS +++ b/DEPS
@@ -239,11 +239,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '68e240d9cdb3f09fc0c9de834aaef04aa3b3f579', + 'skia_revision': 'e17fd4fea551ea554b67af7c044b5fbc1e90ce00', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': 'b5bf62dafe52d10d65bfd2e378d658b5b3b04a5e', + 'v8_revision': 'ceb9223e1ab1df795d5f3e69f9fae92bb8328e92', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. @@ -255,7 +255,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': 'ffe2e366064b6d884e0c8ffd9fe94f2a585c5581', + 'pdfium_revision': '8436313566e6ad9c82e73888db468b315026ce8f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -306,7 +306,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': '563885e399ba18672cd7d009a0c0f0a996d71f6b', + 'catapult_revision': 'b759738dea9abafcbd0dc69553fd049a86e7b56b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -314,7 +314,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '5fec567a800a98035a5c7aa02eebf93d3690e484', + 'devtools_frontend_revision': '895afdf921d39c15ec8b6c072e08d12961f797b1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -354,7 +354,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': 'f296710f64b6625d204262c09463401def70cea6', + 'dawn_revision': '5397f9f9d0fa2d4adb03553f60d3fc4d4db5936c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -799,7 +799,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'Cd5XvW44KjLwajSIYoTsODMnpNKBR--BNLPfpIDKGeAC', + 'version': '51KZuMRReilT3sNyF1-vaB_9ciuTsRJxv8kUH1eLbDgC', }, ], 'condition': 'checkout_android', @@ -964,7 +964,7 @@ }, 'src/third_party/breakpad/breakpad': - Var('chromium_git') + '/breakpad/breakpad.git' + '@' + '647aa17a7aa8ec0b99ffd005908b8a4ab1995a30', + Var('chromium_git') + '/breakpad/breakpad.git' + '@' + '3846f6d297339c17663d7a797ba481b3411f13ad', 'src/third_party/byte_buddy': { 'packages': [ @@ -1033,12 +1033,12 @@ # For Linux and Chromium OS. 'src/third_party/cros_system_api': { - 'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '188fb4eba05af428a48c7ce173a3026215241850', + 'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '725259a4bd767e8535374fc391849f2bc4a79e32', 'condition': 'checkout_linux', }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '2777fd9c6a0ae1d00b9ea5de5fab0a5324e2dd5d', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '9e5809e98f33a5f9f9d3b69a5bd826ce8a7a5a81', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1603,7 +1603,7 @@ 'src/third_party/usrsctp/usrsctplib': Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + '62d7d0c928c9a040dce96aa2f16c00e7e67d59cb', - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@2ec74208b0306eff87b9ebc097d8dfbb20e76fc2', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@a8221eed597007ec8c52726562c1371195c41b08', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '5e49f57a6e71a026a54eb42e366de09a4142d24e', @@ -1639,7 +1639,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'b1f3776e4913637221733a4da09f3339e783b771', 'src/third_party/webgpu-cts/src': - Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '216e2ff413d3ed5e7695626bb55ae41575818352', + Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'c843f8d63c8c17acfbb7d48e09059a581ba779b9', 'src/third_party/webrtc': Var('webrtc_git') + '/src.git' + '@' + '63b97de330fe3d4775b9b4df8ad15c7593d58fc0', @@ -1700,7 +1700,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@c258c12674403e7c685e3462d136b29560e6b4d8', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@3772b4e1977a26513f2da475016bd6912a1c9c65', 'condition': 'checkout_src_internal', },
diff --git a/ash/app_list/views/app_list_bubble_view.cc b/ash/app_list/views/app_list_bubble_view.cc index 84216d2..e9239fa 100644 --- a/ash/app_list/views/app_list_bubble_view.cc +++ b/ash/app_list/views/app_list_bubble_view.cc
@@ -28,8 +28,10 @@ #include "ash/public/cpp/metrics_util.h" #include "ash/public/cpp/shelf_config.h" #include "ash/public/cpp/shelf_types.h" +#include "ash/public/cpp/view_shadow.h" #include "ash/search_box/search_box_constants.h" #include "ash/style/ash_color_provider.h" +#include "ash/style/highlight_border.h" #include "base/bind.h" #include "base/check.h" #include "base/check_op.h" @@ -62,6 +64,9 @@ // Folder view inset from the edge of the bubble. constexpr int kFolderViewInset = 16; +// Elevation for the bubble's shadow. +constexpr int kShadowElevation = 3; + AppListConfig* GetAppListConfig() { return AppListConfigProvider::Get().GetConfigForType( AppListConfigType::kDense, /*can_create=*/true); @@ -109,8 +114,8 @@ DCHECK(drag_and_drop_host); // Set up rounded corners and background blur, similar to TrayBubbleView. - // Layer color is set in OnThemeChanged(). - SetPaintToLayer(ui::LAYER_SOLID_COLOR); + // Layer background is set in OnThemeChanged(). + SetPaintToLayer(); layer()->SetRoundedCornerRadius(gfx::RoundedCornersF{kBubbleCornerRadius}); layer()->SetFillsBoundsOpaquely(false); layer()->SetIsFastRoundedCorner(true); @@ -216,6 +221,9 @@ } void AppListBubbleView::StartShowAnimation() { + // For performance, don't animate the shadow. + view_shadow_.reset(); + // Ensure layout is up-to-date before animating views. if (needs_layout()) Layout(); @@ -264,6 +272,9 @@ base::OnceClosure on_animation_ended) { on_hide_animation_ended_ = std::move(on_animation_ended); + // For performance, don't animate the shadow. + view_shadow_.reset(); + // Ensure any in-progress animations have their cleanup callbacks called. AbortAllAnimations(); @@ -388,8 +399,13 @@ void AppListBubbleView::OnThemeChanged() { views::View::OnThemeChanged(); - layer()->SetColor(AshColorProvider::Get()->GetBaseLayerColor( - AshColorProvider::BaseLayerType::kTransparent80)); + SetBackground(views::CreateRoundedRectBackground( + AshColorProvider::Get()->GetBaseLayerColor( + AshColorProvider::BaseLayerType::kTransparent80), + kBubbleCornerRadius)); + SetBorder(std::make_unique<HighlightBorder>( + kBubbleCornerRadius, HighlightBorder::Type::kHighlightBorder1, + /*use_light_colors=*/false)); } void AppListBubbleView::Layout() { @@ -530,6 +546,10 @@ // visible because the bounds won't change. If the animation was aborted, this // is needed to reset state before starting the hide animation. layer()->SetBounds(layer_bounds); + + // Add a shadow. + view_shadow_ = std::make_unique<ViewShadow>(this, kShadowElevation); + view_shadow_->SetRoundedCornerRadius(kBubbleCornerRadius); } void AppListBubbleView::OnHideAnimationEnded(const gfx::Rect& layer_bounds) {
diff --git a/ash/app_list/views/app_list_bubble_view.h b/ash/app_list/views/app_list_bubble_view.h index aa7837c..de36b8b 100644 --- a/ash/app_list/views/app_list_bubble_view.h +++ b/ash/app_list/views/app_list_bubble_view.h
@@ -28,6 +28,7 @@ class FolderBackgroundView; class SearchBoxView; class SearchResultPageDialogController; +class ViewShadow; // Contains the views for the bubble version of the launcher. It looks like a // system tray bubble. It does not derive from TrayBubbleView because it takes @@ -97,6 +98,7 @@ AppListBubbleAppsPage* apps_page() { return apps_page_; } + ViewShadow* view_shadow_for_test() { return view_shadow_.get(); } views::View* separator_for_test() { return separator_; } bool showing_folder_for_test() { return showing_folder_; } AppListBubbleAppsPage* apps_page_for_test() { return apps_page_; } @@ -129,6 +131,7 @@ std::unique_ptr<SearchResultPageDialogController> search_page_dialog_controller_; + std::unique_ptr<ViewShadow> view_shadow_; SearchBoxView* search_box_view_ = nullptr; views::View* separator_ = nullptr; AppListBubbleAppsPage* apps_page_ = nullptr;
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 a4a7bad..0a7f862 100644 --- a/ash/app_list/views/app_list_bubble_view_unittest.cc +++ b/ash/app_list/views/app_list_bubble_view_unittest.cc
@@ -58,6 +58,8 @@ namespace ash { namespace { +constexpr int kBorderSize = 2; + SearchModel* GetSearchModel() { return AppListModelProvider::Get()->search_model(); } @@ -197,9 +199,6 @@ EXPECT_FALSE(layer->fills_bounds_opaquely()); EXPECT_TRUE(layer->is_fast_rounded_corner()); EXPECT_EQ(layer->background_blur(), ColorProvider::kBackgroundBlurSigma); - EXPECT_EQ(layer->background_color(), - AshColorProvider::Get()->GetBaseLayerColor( - AshColorProvider::BaseLayerType::kTransparent80)); } // Tests some basic layout coordinates, because we don't have screenshot tests. @@ -207,12 +206,16 @@ TEST_F(AppListBubbleViewTest, Layout) { ShowAppList(); + // The view has a background. + auto* app_list_bubble_view = GetAppListTestHelper()->GetBubbleView(); + EXPECT_TRUE(app_list_bubble_view->background()); + // Check the bounds of the search box search icon. auto* search_box_view = GetSearchBoxView(); auto* search_icon = search_box_view->search_icon(); gfx::Rect search_icon_bounds = search_icon->ConvertRectToWidget(search_icon->GetLocalBounds()); - EXPECT_EQ("16,16 24x24", search_icon_bounds.ToString()); + EXPECT_EQ("18,18 24x24", search_icon_bounds.ToString()); // Check height of search box view. EXPECT_EQ(56, search_box_view->height()); @@ -220,8 +223,8 @@ // The separator is immediately under the search box. gfx::Point separator_origin; views::View::ConvertPointToWidget(GetSearchBoxSeparator(), &separator_origin); - EXPECT_EQ(0, separator_origin.x()); - EXPECT_EQ(search_box_view->height(), separator_origin.y()); + EXPECT_EQ(kBorderSize, separator_origin.x()); + EXPECT_EQ(kBorderSize + search_box_view->height(), separator_origin.y()); } TEST_F(AppListBubbleViewTest, OpeningBubbleTriggersAnimations) { @@ -323,6 +326,28 @@ EXPECT_TRUE(scroll_view->layer()->layer_mask_layer()); } +TEST_F(AppListBubbleViewTest, ShowAnimationDestroysAndRestoresShadow) { + // Enable animations. + base::test::ScopedFeatureList feature( + features::kProductivityLauncherAnimation); + ui::ScopedAnimationDurationScaleMode duration( + ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); + + AddAppItems(20); + ShowAppList(); + + // Shadow is suppressed during show animation for performance. + auto* app_list_bubble_view = GetAppListTestHelper()->GetBubbleView(); + EXPECT_FALSE(app_list_bubble_view->view_shadow_for_test()); + + // Finish the animation. + auto* apps_grid_view = GetAppsGridView(); + WaitForLayerAnimation(apps_grid_view->layer()); + + // Shadow is restored. + EXPECT_TRUE(app_list_bubble_view->view_shadow_for_test()); +} + TEST_F(AppListBubbleViewTest, ShowAnimationRecordsSmoothnessHistogram) { base::HistogramTester histograms; @@ -459,7 +484,9 @@ // Assistant fills the bubble view, so that any suggestion chips will appear // at the bottom. auto* app_list_bubble_view = GetAppListTestHelper()->GetBubbleView(); - EXPECT_EQ(GetAssistantPage()->bounds(), app_list_bubble_view->bounds()); + gfx::Rect expected_bounds = app_list_bubble_view->bounds(); + expected_bounds.Inset(kBorderSize); + EXPECT_EQ(GetAssistantPage()->bounds(), expected_bounds); } TEST_F(AppListBubbleViewTest, SearchBoxCloseButton) {
diff --git a/ash/app_list/views/apps_container_view.cc b/ash/app_list/views/apps_container_view.cc index 8a65e8f..305f29d 100644 --- a/ash/app_list/views/apps_container_view.cc +++ b/ash/app_list/views/apps_container_view.cc
@@ -311,6 +311,10 @@ ColorProvider::ContentLayerType::kSeparatorColor)); } + bool HasRecentApps() const { + return recent_apps_ && recent_apps_->GetVisible(); + } + ContinueSectionView* continue_section() { return continue_section_; } RecentAppsView* recent_apps() { return recent_apps_; } views::View* separator() { return separator_; } @@ -834,7 +838,7 @@ // added margins. grid_rect.Inset(-grid_insets); scrollable_container_->SetBoundsRect(grid_rect); - bool first_page_offset_changed = false; + bool first_page_config_changed = false; if (features::IsProductivityLauncherEnabled()) { const int continue_container_height = continue_container_->GetPreferredSize().height(); @@ -842,9 +846,8 @@ gfx::Rect(0, 0, grid_rect.width(), continue_container_height)); // Setting this offset prevents the app items in the grid from overlapping // with the continue section. - first_page_offset_changed = - continue_container_height != apps_grid_view_->first_page_offset(); - apps_grid_view_->set_first_page_offset(continue_container_height); + first_page_config_changed = apps_grid_view_->ConfigureFirstPagePadding( + continue_container_height, continue_container_->HasRecentApps()); } // Make sure that UpdateTopLevelGridDimensions() happens after setting the @@ -855,7 +858,7 @@ const gfx::Rect apps_grid_bounds(grid_rect.size()); if (apps_grid_view_->bounds() != apps_grid_bounds) { apps_grid_view_->SetBoundsRect(apps_grid_bounds); - } else if (first_page_offset_changed) { + } else if (first_page_config_changed) { // Apps grid layout depends on the continue container bounds, so explicitly // call layout to ensure apps grid view gets laid out even if its bounds do // not change.
diff --git a/ash/app_list/views/paged_apps_grid_view.cc b/ash/app_list/views/paged_apps_grid_view.cc index 5c59683..42d647a 100644 --- a/ash/app_list/views/paged_apps_grid_view.cc +++ b/ash/app_list/views/paged_apps_grid_view.cc
@@ -639,7 +639,7 @@ } gfx::Vector2d PagedAppsGridView::GetGridCenteringOffset(int page) const { - const int y_offset = page == 0 ? first_page_offset_ : 0; + const int y_offset = page == 0 ? GetTotalTopPaddingOnFirstPage() : 0; if (!cardified_state_) return gfx::Vector2d(0, y_offset); const gfx::Rect bounds = GetContentsBounds(); @@ -1235,8 +1235,9 @@ (GetContentsBounds().width() - background_card_size.width()) / 2 + extra_padding_for_cardified_state; - int y_offset = std::max(new_page_index == 0 ? first_page_offset_ : 0, - GetFadeoutMaskHeight()); + int y_offset = + std::max(new_page_index == 0 ? GetTotalTopPaddingOnFirstPage() : 0, + GetFadeoutMaskHeight()); // The vertical padding should account for the fadeout mask. const int vertical_padding = y_offset + (GetContentsBounds().height() - y_offset - @@ -1341,15 +1342,51 @@ // NOTE: The padding on the first page can be different than other pages // depending on `first_page_offset_` and `max_rows_on_first_page_`. - first_page_vertical_tile_padding_ = - calculate_tile_padding(content_size.height(), max_rows_on_first_page_, - tile_size.height(), first_page_offset_); + // When shown under recent apps, assume an extra row when calculating padding, + // as an extra leading tile padding will get added above the first row of apps + // (as a margin to recent apps container). + // Adjust `first_page_offset_` by removing space required for recent apps + // (assumes that recent apps tile size matches the apps grid tile size, and + // that recent apps container has a single row of apps) so padding is + // calculated assuming recent apps container is part of the apps grid. + if (shown_under_recent_apps_) { + first_page_vertical_tile_padding_ = calculate_tile_padding( + content_size.height(), max_rows_on_first_page_ + 1, tile_size.height(), + std::max(0, first_page_offset_ - tile_size.height())); + } else { + first_page_vertical_tile_padding_ = + calculate_tile_padding(content_size.height(), max_rows_on_first_page_, + tile_size.height(), first_page_offset_); + } +} + +bool PagedAppsGridView::ConfigureFirstPagePadding( + int offset, + bool shown_under_recent_apps) { + if (offset == first_page_offset_ && + shown_under_recent_apps == shown_under_recent_apps_) { + return false; + } + first_page_offset_ = offset; + shown_under_recent_apps_ = shown_under_recent_apps; + return true; } int PagedAppsGridView::CalculateFirstPageMaxRows(int available_height, int preferred_rows) { - return CalculateMaxRows(available_height - first_page_offset_, - preferred_rows); + // When shown under recent apps, calculate max rows as if recent apps + // container is part of the grid, i.e. calculate number of rows as if grid + // allows for an extra row of apps. + const int space_for_recent_apps = + shown_under_recent_apps_ ? app_list_config()->grid_tile_height() : 0; + const int max_rows = CalculateMaxRows( + available_height - + std::max(0, first_page_offset_ - space_for_recent_apps), + preferred_rows); + // If `shown_under_recent_apps_`, subtract a row from the result of + // `CalculateMaxRows()` which was calculated assuming there's an extra row of + // apps added for recent apps. + return shown_under_recent_apps_ ? std::max(0, max_rows - 1) : max_rows; } int PagedAppsGridView::CalculateMaxRows(int available_height, @@ -1383,4 +1420,12 @@ return final_row_count; } +int PagedAppsGridView::GetTotalTopPaddingOnFirstPage() const { + // Add the page offset that accommodates continue section content, and if + // shown under recent apps, additional tile padding above the first row of + // apps. + return first_page_offset_ + + (shown_under_recent_apps_ ? 2 * first_page_vertical_tile_padding_ : 0); +} + } // namespace ash
diff --git a/ash/app_list/views/paged_apps_grid_view.h b/ash/app_list/views/paged_apps_grid_view.h index bd9c030..e05b554 100644 --- a/ash/app_list/views/paged_apps_grid_view.h +++ b/ash/app_list/views/paged_apps_grid_view.h
@@ -150,11 +150,22 @@ // Gets the PaginationModel used for the grid view. PaginationModel* pagination_model() { return &pagination_model_; } - int first_page_offset() const { return first_page_offset_; } - void set_first_page_offset(int offset) { first_page_offset_ = offset; } + // Sets `first_page_offset_` and `shown_under_recent_apps_`, which are used to + // calculate the first apps grid page layout (number of rows and the padding + // between them). + // `offset` is reserved space for continue section in the apps + // container (which is shown above the grid on the first app list page with + // productivity launcher). + // `shown_under_recent_apps` indicates whether the + // continue section contains list of recent apps. If this is the case, the + // apps grid will add additional padding above the apps grid (i.e. treat the + // recent apps row as additional row of apps). + // Returns whether the first page configuration changed. + bool ConfigureFirstPagePadding(int offset, bool shown_under_recent_apps); // Calculates the maximum number of rows on the first page. Relies on tile - // size, `first_page_offset_`, and the bounds of the apps grid. + // size, `first_page_offset_`, `shown_under_recent_apps_` and the bounds of + // the apps grid. int CalculateFirstPageMaxRows(int available_height, int preferred_rows); // Calculates the maximum number of rows. Relies on tile size and the bounds @@ -169,6 +180,12 @@ class FadeoutLayerDelegate; + // Gets the leading padding for app list item grid on the first app list page. + // Includes the space reserved for the continue seaction of the app list UI, + // and additional vertical tile padding before the first row of apps when + // needed (i.e. if the grid is shown under a row of recent apps). + int GetTotalTopPaddingOnFirstPage() const; + // Returns the size reserved for a single apps grid page. May not match the // tile grid size when the first page selected, as the first page may have // reduced number of tiles. @@ -297,6 +314,11 @@ // with the recent apps and continue section. int first_page_offset_ = 0; + // Whether the apps grid is shown underneath recent apps container. If this is + // the case, layout will add additional vertical tile padding before the first + // apps grid row on the first page. + bool shown_under_recent_apps_ = false; + // Vertical tile spacing between the tile views on the first page. int first_page_vertical_tile_padding_ = 0;
diff --git a/ash/app_list/views/paged_apps_grid_view_unittest.cc b/ash/app_list/views/paged_apps_grid_view_unittest.cc index d53d138..a017443 100644 --- a/ash/app_list/views/paged_apps_grid_view_unittest.cc +++ b/ash/app_list/views/paged_apps_grid_view_unittest.cc
@@ -167,20 +167,20 @@ // Test with a display in landscape mode with more height. This should have // more rows. UpdateDisplay("1400x1100"); - EXPECT_EQ(4, GetPagedAppsGridView()->GetFirstPageRowsForTesting()); + EXPECT_EQ(3, GetPagedAppsGridView()->GetFirstPageRowsForTesting()); EXPECT_EQ(4, GetPagedAppsGridView()->GetRowsForTesting()); EXPECT_EQ(5, GetPagedAppsGridView()->cols()); // Test with a display in portrait mode. UpdateDisplay("700x1100"); - EXPECT_EQ(5, GetPagedAppsGridView()->GetFirstPageRowsForTesting()); + EXPECT_EQ(4, GetPagedAppsGridView()->GetFirstPageRowsForTesting()); EXPECT_EQ(5, GetPagedAppsGridView()->GetRowsForTesting()); EXPECT_EQ(5, GetPagedAppsGridView()->cols()); // Test with a display in portrait mode with more height. This should have // more rows. UpdateDisplay("700x1400"); - EXPECT_EQ(5, GetPagedAppsGridView()->GetFirstPageRowsForTesting()); + EXPECT_EQ(4, GetPagedAppsGridView()->GetFirstPageRowsForTesting()); EXPECT_EQ(6, GetPagedAppsGridView()->GetRowsForTesting()); EXPECT_EQ(5, GetPagedAppsGridView()->cols()); }
diff --git a/ash/assistant/ui/main_stage/suggestion_chip_view.cc b/ash/assistant/ui/main_stage/suggestion_chip_view.cc index 533423f..32c7410 100644 --- a/ash/assistant/ui/main_stage/suggestion_chip_view.cc +++ b/ash/assistant/ui/main_stage/suggestion_chip_view.cc
@@ -24,6 +24,7 @@ #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/gfx/canvas.h" #include "ui/gfx/color_palette.h" +#include "ui/gfx/font_list.h" #include "ui/views/background.h" #include "ui/views/border.h" #include "ui/views/controls/button/button.h" @@ -153,8 +154,9 @@ text_view_->SetID(kSuggestionChipViewLabel); text_view_->SetAutoColorReadabilityEnabled(false); text_view_->SetSubpixelRenderingEnabled(false); - text_view_->SetFontList( - assistant::ui::GetDefaultFontList().DeriveWithSizeDelta(1)); + const gfx::FontList& font_list = assistant::ui::GetDefaultFontList(); + text_view_->SetFontList(font_list.Derive( + /*size_delta=*/1, font_list.GetFontStyle(), gfx::Font::Weight::MEDIUM)); SetText(text); if (!use_dark_light_mode_colors_) {
diff --git a/ash/assistant/ui/main_stage/suggestion_chip_view_unittest.cc b/ash/assistant/ui/main_stage/suggestion_chip_view_unittest.cc index 3b590ac..a9b5480 100644 --- a/ash/assistant/ui/main_stage/suggestion_chip_view_unittest.cc +++ b/ash/assistant/ui/main_stage/suggestion_chip_view_unittest.cc
@@ -228,4 +228,18 @@ SkColorSetA(gfx::kGoogleGrey900, 0x14)); } +TEST_F(SuggestionChipViewTest, FontWeight) { + auto widget = CreateFramelessTestWidget(); + auto* suggestion_chip_view = + widget->SetContentsView(std::make_unique<SuggestionChipView>( + /*delegate=*/nullptr, + CreateSuggestionWithIconUrl( + "googleassistant://resource?type=icon&name=assistant"))); + + views::Label* label = static_cast<views::Label*>( + suggestion_chip_view->GetViewByID(kSuggestionChipViewLabel)); + + EXPECT_EQ(label->font_list().GetFontWeight(), gfx::Font::Weight::MEDIUM); +} + } // namespace ash
diff --git a/ash/components/disks/disk_mount_manager.cc b/ash/components/disks/disk_mount_manager.cc index 6263805..92fffe48 100644 --- a/ash/components/disks/disk_mount_manager.cc +++ b/ash/components/disks/disk_mount_manager.cc
@@ -101,14 +101,13 @@ MountType type, MountAccessMode access_mode, MountPathCallback callback) override { - auto insert_result = - mount_callbacks_.insert({source_path, std::move(callback)}); - if (!insert_result.second) { + if (mount_callbacks_.find(source_path) != mount_callbacks_.end()) { std::move(callback).Run( MOUNT_ERROR_PATH_ALREADY_MOUNTED, MountPointInfo(source_path, "", type, MOUNT_CONDITION_NONE)); return; } + mount_callbacks_.insert({source_path, std::move(callback)}); // Hidden and non-existent devices should not be mounted. if (type == MOUNT_TYPE_DEVICE) { DiskMap::const_iterator it = disks_.find(source_path);
diff --git a/ash/components/disks/disk_mount_manager_unittest.cc b/ash/components/disks/disk_mount_manager_unittest.cc index 1e0a418..40ef940 100644 --- a/ash/components/disks/disk_mount_manager_unittest.cc +++ b/ash/components/disks/disk_mount_manager_unittest.cc
@@ -28,6 +28,7 @@ #include "testing/gtest/include/gtest/gtest.h" using base::StringPrintf; +using testing::_; using testing::Field; namespace ash { @@ -1097,6 +1098,82 @@ EXPECT_TRUE(disks.find(kReadOnlyDeviceSourcePath)->second->is_read_only()); } +TEST_F(DiskMountManagerTest, MountPath_DoubleCall) { + DiskMountManager* manager = DiskMountManager::GetInstance(); + const std::string kMountPath1 = "/media/foo"; + + base::MockCallback<DiskMountManager::MountPathCallback> mock_callback1; + + manager->MountPath( + kDevice1SourcePath, "", "", {}, chromeos::MOUNT_TYPE_DEVICE, + chromeos::MOUNT_ACCESS_MODE_READ_WRITE, mock_callback1.Get()); + + { + // While the first mount is occurring, queue up a second mount for the same + // source. It should immediately fail. + base::MockCallback<DiskMountManager::MountPathCallback> mock_callback2; + EXPECT_CALL(mock_callback2, + Run(chromeos::MOUNT_ERROR_PATH_ALREADY_MOUNTED, _)); + + manager->MountPath( + kDevice1SourcePath, "", "", {}, chromeos::MOUNT_TYPE_DEVICE, + chromeos::MOUNT_ACCESS_MODE_READ_WRITE, mock_callback2.Get()); + } + + // Verify the first mount can complete as expected. + EXPECT_CALL( + mock_callback1, + Run(chromeos::MOUNT_ERROR_NONE, + Field(&DiskMountManager::MountPointInfo::mount_path, kMountPath1))); + fake_cros_disks_client_->NotifyMountCompleted( + chromeos::MOUNT_ERROR_NONE, kDevice1SourcePath, + chromeos::MOUNT_TYPE_DEVICE, kMountPath1); +} + +TEST_F(DiskMountManagerTest, MountPath_CallbackCallsMount) { + DiskMountManager* manager = DiskMountManager::GetInstance(); + const std::string kMountPath1 = "/media/foo"; + const std::string kMountPath2 = "/media/bar"; + + base::MockCallback<DiskMountManager::MountPathCallback> mock_callback1; + + // Try call MountPath() again in the complete callback of a MountPath() call. + EXPECT_CALL( + mock_callback1, + Run(chromeos::MOUNT_ERROR_NONE, + Field(&DiskMountManager::MountPointInfo::mount_path, kMountPath1))) + .WillOnce([=](chromeos::MountError error, + const DiskMountManager::MountPointInfo& mount_info) { + // Try remount the same path and verify it fails. + base::MockCallback<DiskMountManager::MountPathCallback> mock_callback2; + EXPECT_CALL(mock_callback2, + Run(chromeos::MOUNT_ERROR_PATH_ALREADY_MOUNTED, _)); + manager->MountPath( + kDevice1SourcePath, "", "", {}, chromeos::MOUNT_TYPE_DEVICE, + chromeos::MOUNT_ACCESS_MODE_READ_WRITE, mock_callback2.Get()); + + // Try mount a different path and verify it succeeds. + base::MockCallback<DiskMountManager::MountPathCallback> mock_callback3; + EXPECT_CALL(mock_callback3, + Run(chromeos::MOUNT_ERROR_NONE, + Field(&DiskMountManager::MountPointInfo::mount_path, + kMountPath2))); + manager->MountPath( + kDevice2SourcePath, "", "", {}, chromeos::MOUNT_TYPE_DEVICE, + chromeos::MOUNT_ACCESS_MODE_READ_WRITE, mock_callback3.Get()); + fake_cros_disks_client_->NotifyMountCompleted( + chromeos::MOUNT_ERROR_NONE, kDevice2SourcePath, + chromeos::MOUNT_TYPE_DEVICE, kMountPath2); + }); + + manager->MountPath( + kDevice1SourcePath, "", "", {}, chromeos::MOUNT_TYPE_DEVICE, + chromeos::MOUNT_ACCESS_MODE_READ_WRITE, mock_callback1.Get()); + fake_cros_disks_client_->NotifyMountCompleted( + chromeos::MOUNT_ERROR_NONE, kDevice1SourcePath, + chromeos::MOUNT_TYPE_DEVICE, kMountPath1); +} + TEST_F(DiskMountManagerTest, RemountRemovableDrives) { DiskMountManager* manager = DiskMountManager::GetInstance(); // Initially we have 2 mounted devices.
diff --git a/ash/components/tether/active_host.cc b/ash/components/tether/active_host.cc index a88e430..9137bb49 100644 --- a/ash/components/tether/active_host.cc +++ b/ash/components/tether/active_host.cc
@@ -14,7 +14,7 @@ #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" -namespace chromeos { +namespace ash { namespace tether { @@ -261,4 +261,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/active_host.h b/ash/components/tether/active_host.h index 407efd38..1fc436973 100644 --- a/ash/components/tether/active_host.h +++ b/ash/components/tether/active_host.h
@@ -16,7 +16,7 @@ class PrefRegistrySimple; class PrefService; -namespace chromeos { +namespace ash { namespace tether { @@ -163,6 +163,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_ACTIVE_HOST_H_
diff --git a/ash/components/tether/active_host_network_state_updater.cc b/ash/components/tether/active_host_network_state_updater.cc index 58394db..7f676d1 100644 --- a/ash/components/tether/active_host_network_state_updater.cc +++ b/ash/components/tether/active_host_network_state_updater.cc
@@ -10,7 +10,7 @@ #include "chromeos/components/multidevice/remote_device_ref.h" #include "chromeos/network/network_state_handler.h" -namespace chromeos { +namespace ash { namespace tether { @@ -80,4 +80,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/active_host_network_state_updater.h b/ash/components/tether/active_host_network_state_updater.h index 123ee99..44f6ecacb 100644 --- a/ash/components/tether/active_host_network_state_updater.h +++ b/ash/components/tether/active_host_network_state_updater.h
@@ -7,10 +7,10 @@ #include "ash/components/tether/active_host.h" #include "base/memory/weak_ptr.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_state_handler.h" -namespace chromeos { - -class NetworkStateHandler; +namespace ash { namespace tether { @@ -38,6 +38,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_ACTIVE_HOST_NETWORK_STATE_UPDATER_H_
diff --git a/ash/components/tether/active_host_network_state_updater_unittest.cc b/ash/components/tether/active_host_network_state_updater_unittest.cc index eccefca..2340217a 100644 --- a/ash/components/tether/active_host_network_state_updater_unittest.cc +++ b/ash/components/tether/active_host_network_state_updater_unittest.cc
@@ -17,7 +17,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/cros_system_api/dbus/shill/dbus-constants.h" -namespace chromeos { +namespace ash { namespace tether { @@ -129,4 +129,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/active_host_unittest.cc b/ash/components/tether/active_host_unittest.cc index 55d6ca5..eef9239 100644 --- a/ash/components/tether/active_host_unittest.cc +++ b/ash/components/tether/active_host_unittest.cc
@@ -15,7 +15,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" -namespace chromeos { +namespace ash { namespace tether { @@ -219,4 +219,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/asynchronous_shutdown_object_container.h b/ash/components/tether/asynchronous_shutdown_object_container.h index fff0e28..adfb26a 100644 --- a/ash/components/tether/asynchronous_shutdown_object_container.h +++ b/ash/components/tether/asynchronous_shutdown_object_container.h
@@ -7,7 +7,7 @@ #include "base/callback_forward.h" -namespace chromeos { +namespace ash { namespace tether { @@ -45,6 +45,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_ASYNCHRONOUS_SHUTDOWN_OBJECT_CONTAINER_H_
diff --git a/ash/components/tether/asynchronous_shutdown_object_container_impl.cc b/ash/components/tether/asynchronous_shutdown_object_container_impl.cc index f27f4ef..1b2a734f 100644 --- a/ash/components/tether/asynchronous_shutdown_object_container_impl.cc +++ b/ash/components/tether/asynchronous_shutdown_object_container_impl.cc
@@ -11,7 +11,7 @@ #include "chromeos/services/device_sync/public/cpp/device_sync_client.h" #include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client.h" -namespace chromeos { +namespace ash { namespace tether { @@ -148,4 +148,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/asynchronous_shutdown_object_container_impl.h b/ash/components/tether/asynchronous_shutdown_object_container_impl.h index a4ee59b1..42ac401 100644 --- a/ash/components/tether/asynchronous_shutdown_object_container_impl.h +++ b/ash/components/tether/asynchronous_shutdown_object_container_impl.h
@@ -11,22 +11,20 @@ #include "ash/components/tether/disconnect_tethering_request_sender.h" #include "base/callback.h" #include "base/memory/ref_counted.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/managed_network_configuration_handler.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_connection_handler.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_state_handler.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/device_sync/public/cpp/device_sync_client.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client.h" class PrefService; -namespace chromeos { - -class ManagedNetworkConfigurationHandler; -class NetworkConnectionHandler; -class NetworkStateHandler; - -namespace device_sync { -class DeviceSyncClient; -} // namespace device_sync - -namespace secure_channel { -class SecureChannelClient; -} // namespace secure_channel +namespace ash { namespace tether { @@ -118,6 +116,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_ASYNCHRONOUS_SHUTDOWN_OBJECT_CONTAINER_IMPL_H_
diff --git a/ash/components/tether/asynchronous_shutdown_object_container_impl_unittest.cc b/ash/components/tether/asynchronous_shutdown_object_container_impl_unittest.cc index d260a66..a57d8be 100644 --- a/ash/components/tether/asynchronous_shutdown_object_container_impl_unittest.cc +++ b/ash/components/tether/asynchronous_shutdown_object_container_impl_unittest.cc
@@ -25,7 +25,7 @@ using testing::NiceMock; using testing::Return; -namespace chromeos { +namespace ash { namespace tether { @@ -167,4 +167,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/connect_tethering_operation.cc b/ash/components/tether/connect_tethering_operation.cc index fa849d5..6aa17c7 100644 --- a/ash/components/tether/connect_tethering_operation.cc +++ b/ash/components/tether/connect_tethering_operation.cc
@@ -12,7 +12,7 @@ #include "base/time/default_clock.h" #include "chromeos/components/multidevice/logging/logging.h" -namespace chromeos { +namespace ash { namespace tether { @@ -248,4 +248,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/connect_tethering_operation.h b/ash/components/tether/connect_tethering_operation.h index 9b48c9e..25b6a087 100644 --- a/ash/components/tether/connect_tethering_operation.h +++ b/ash/components/tether/connect_tethering_operation.h
@@ -16,16 +16,12 @@ #include "base/time/clock.h" #include "base/time/time.h" #include "chromeos/components/multidevice/remote_device_ref.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/device_sync/public/cpp/device_sync_client.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client.h" -namespace chromeos { - -namespace device_sync { -class DeviceSyncClient; -} // namespace device_sync - -namespace secure_channel { -class SecureChannelClient; -} // namespace secure_channel +namespace ash { namespace tether { @@ -166,6 +162,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_CONNECT_TETHERING_OPERATION_H_
diff --git a/ash/components/tether/connect_tethering_operation_unittest.cc b/ash/components/tether/connect_tethering_operation_unittest.cc index 19c941d0..60f8322 100644 --- a/ash/components/tether/connect_tethering_operation_unittest.cc +++ b/ash/components/tether/connect_tethering_operation_unittest.cc
@@ -30,7 +30,7 @@ using testing::_; using testing::StrictMock; -namespace chromeos { +namespace ash { namespace tether { @@ -309,4 +309,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/connection_preserver.cc b/ash/components/tether/connection_preserver.cc index 556c1ee..79787cf 100644 --- a/ash/components/tether/connection_preserver.cc +++ b/ash/components/tether/connection_preserver.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/connection_preserver.h" -namespace chromeos { +namespace ash { namespace tether { @@ -14,4 +14,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/connection_preserver.h b/ash/components/tether/connection_preserver.h index fd0d9abd..0c54583f 100644 --- a/ash/components/tether/connection_preserver.h +++ b/ash/components/tether/connection_preserver.h
@@ -7,7 +7,7 @@ #include <memory> -namespace chromeos { +namespace ash { namespace tether { @@ -32,6 +32,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_CONNECTION_PRESERVER_H_
diff --git a/ash/components/tether/connection_preserver_impl.cc b/ash/components/tether/connection_preserver_impl.cc index 4c9fe99..7f2c129d 100644 --- a/ash/components/tether/connection_preserver_impl.cc +++ b/ash/components/tether/connection_preserver_impl.cc
@@ -13,12 +13,15 @@ #include "chromeos/network/network_state_handler.h" #include "chromeos/network/network_type_pattern.h" -namespace chromeos { +namespace ash { namespace tether { namespace { +// TODO(https://crbug.com/1164001): remove when secure_channel moved to ash +namespace secure_channel = ::chromeos::secure_channel; + const char kTetherFeature[] = "magic_tether"; } // namespace @@ -227,4 +230,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/connection_preserver_impl.h b/ash/components/tether/connection_preserver_impl.h index 914b575c..5340772b 100644 --- a/ash/components/tether/connection_preserver_impl.h +++ b/ash/components/tether/connection_preserver_impl.h
@@ -11,6 +11,8 @@ #include "ash/components/tether/connection_preserver.h" #include "base/timer/timer.h" #include "base/unguessable_token.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_state_handler.h" #include "chromeos/services/device_sync/public/cpp/device_sync_client.h" #include "chromeos/services/secure_channel/public/cpp/client/client_channel.h" #include "chromeos/services/secure_channel/public/cpp/client/connection_attempt.h" @@ -18,9 +20,7 @@ #include "chromeos/services/secure_channel/public/cpp/shared/connection_priority.h" #include "chromeos/services/secure_channel/public/mojom/secure_channel.mojom.h" -namespace chromeos { - -class NetworkStateHandler; +namespace ash { namespace tether { @@ -59,7 +59,8 @@ protected: // secure_channel::ConnectionAttempt::Delegate: void OnConnectionAttemptFailure( - secure_channel::mojom::ConnectionAttemptFailureReason reason) override; + chromeos::secure_channel::mojom::ConnectionAttemptFailureReason reason) + override; void OnConnection( std::unique_ptr<secure_channel::ClientChannel> channel) override; @@ -104,6 +105,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_CONNECTION_PRESERVER_IMPL_H_
diff --git a/ash/components/tether/connection_preserver_impl_unittest.cc b/ash/components/tether/connection_preserver_impl_unittest.cc index ea4cd1e..ed94b49 100644 --- a/ash/components/tether/connection_preserver_impl_unittest.cc +++ b/ash/components/tether/connection_preserver_impl_unittest.cc
@@ -31,7 +31,7 @@ using testing::NiceMock; using testing::Return; -namespace chromeos { +namespace ash { namespace tether { @@ -306,4 +306,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/crash_recovery_manager.h b/ash/components/tether/crash_recovery_manager.h index 33e1e3e..fc51acf 100644 --- a/ash/components/tether/crash_recovery_manager.h +++ b/ash/components/tether/crash_recovery_manager.h
@@ -7,7 +7,7 @@ #include "base/callback.h" -namespace chromeos { +namespace ash { namespace tether { @@ -34,6 +34,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_CRASH_RECOVERY_MANAGER_H_
diff --git a/ash/components/tether/crash_recovery_manager_impl.cc b/ash/components/tether/crash_recovery_manager_impl.cc index da154c6..2a5b725 100644 --- a/ash/components/tether/crash_recovery_manager_impl.cc +++ b/ash/components/tether/crash_recovery_manager_impl.cc
@@ -15,7 +15,7 @@ #include "chromeos/network/network_state.h" #include "chromeos/network/network_state_handler.h" -namespace chromeos { +namespace ash { namespace tether { @@ -178,4 +178,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/crash_recovery_manager_impl.h b/ash/components/tether/crash_recovery_manager_impl.h index 74adcc9..de343ed 100644 --- a/ash/components/tether/crash_recovery_manager_impl.h +++ b/ash/components/tether/crash_recovery_manager_impl.h
@@ -10,11 +10,11 @@ #include "ash/components/tether/active_host.h" #include "ash/components/tether/crash_recovery_manager.h" #include "base/callback.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_state_handler.h" #include "third_party/abseil-cpp/absl/types/optional.h" -namespace chromeos { - -class NetworkStateHandler; +namespace ash { namespace tether { @@ -78,6 +78,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_CRASH_RECOVERY_MANAGER_IMPL_H_
diff --git a/ash/components/tether/crash_recovery_manager_impl_unittest.cc b/ash/components/tether/crash_recovery_manager_impl_unittest.cc index a56c7cb..974d59c9 100644 --- a/ash/components/tether/crash_recovery_manager_impl_unittest.cc +++ b/ash/components/tether/crash_recovery_manager_impl_unittest.cc
@@ -19,7 +19,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/cros_system_api/dbus/shill/dbus-constants.h" -namespace chromeos { +namespace ash { namespace tether { @@ -185,4 +185,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/device_id_tether_network_guid_map.cc b/ash/components/tether/device_id_tether_network_guid_map.cc index e6ae272..344ef31 100644 --- a/ash/components/tether/device_id_tether_network_guid_map.cc +++ b/ash/components/tether/device_id_tether_network_guid_map.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/device_id_tether_network_guid_map.h" -namespace chromeos { +namespace ash { namespace tether { @@ -26,4 +26,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/device_id_tether_network_guid_map.h b/ash/components/tether/device_id_tether_network_guid_map.h index c9091fa..7a6ea25 100644 --- a/ash/components/tether/device_id_tether_network_guid_map.h +++ b/ash/components/tether/device_id_tether_network_guid_map.h
@@ -7,7 +7,7 @@ #include <string> -namespace chromeos { +namespace ash { namespace tether { @@ -37,6 +37,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_DEVICE_ID_TETHER_NETWORK_GUID_MAP_H_
diff --git a/ash/components/tether/device_status_util.cc b/ash/components/tether/device_status_util.cc index 662c05d..9699ce7 100644 --- a/ash/components/tether/device_status_util.cc +++ b/ash/components/tether/device_status_util.cc
@@ -6,7 +6,7 @@ #include "base/cxx17_backports.h" -namespace chromeos { +namespace ash { namespace tether { @@ -50,4 +50,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/device_status_util.h b/ash/components/tether/device_status_util.h index 4f7edfd8..08e1881 100644 --- a/ash/components/tether/device_status_util.h +++ b/ash/components/tether/device_status_util.h
@@ -7,7 +7,7 @@ #include "ash/components/tether/proto/tether.pb.h" -namespace chromeos { +namespace ash { namespace tether { @@ -34,6 +34,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_DEVICE_STATUS_UTIL_H_
diff --git a/ash/components/tether/device_status_util_unittest.cc b/ash/components/tether/device_status_util_unittest.cc index a5b4042..b05932c 100644 --- a/ash/components/tether/device_status_util_unittest.cc +++ b/ash/components/tether/device_status_util_unittest.cc
@@ -15,7 +15,7 @@ #include "components/prefs/testing_pref_service.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -116,4 +116,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/disconnect_tethering_operation.cc b/ash/components/tether/disconnect_tethering_operation.cc index 553d48c2..93930b9 100644 --- a/ash/components/tether/disconnect_tethering_operation.cc +++ b/ash/components/tether/disconnect_tethering_operation.cc
@@ -13,7 +13,7 @@ #include "base/time/default_clock.h" #include "chromeos/components/multidevice/logging/logging.h" -namespace chromeos { +namespace ash { namespace tether { @@ -114,4 +114,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/disconnect_tethering_operation.h b/ash/components/tether/disconnect_tethering_operation.h index 0f6d05c..1324b96 100644 --- a/ash/components/tether/disconnect_tethering_operation.h +++ b/ash/components/tether/disconnect_tethering_operation.h
@@ -9,16 +9,12 @@ #include "base/gtest_prod_util.h" #include "base/observer_list.h" #include "base/time/clock.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/device_sync/public/cpp/device_sync_client.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client.h" -namespace chromeos { - -namespace device_sync { -class DeviceSyncClient; -} // namespace device_sync - -namespace secure_channel { -class SecureChannelClient; -} // namespace secure_channel +namespace ash { namespace tether { @@ -98,6 +94,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_DISCONNECT_TETHERING_OPERATION_H_
diff --git a/ash/components/tether/disconnect_tethering_operation_unittest.cc b/ash/components/tether/disconnect_tethering_operation_unittest.cc index 7319384..392288c 100644 --- a/ash/components/tether/disconnect_tethering_operation_unittest.cc +++ b/ash/components/tether/disconnect_tethering_operation_unittest.cc
@@ -24,7 +24,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -183,4 +183,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/disconnect_tethering_request_sender.cc b/ash/components/tether/disconnect_tethering_request_sender.cc index aceed98..fefaa10ee 100644 --- a/ash/components/tether/disconnect_tethering_request_sender.cc +++ b/ash/components/tether/disconnect_tethering_request_sender.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/disconnect_tethering_request_sender.h" -namespace chromeos { +namespace ash { namespace tether { @@ -28,4 +28,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/disconnect_tethering_request_sender.h b/ash/components/tether/disconnect_tethering_request_sender.h index 93a839a..9bc9041 100644 --- a/ash/components/tether/disconnect_tethering_request_sender.h +++ b/ash/components/tether/disconnect_tethering_request_sender.h
@@ -7,7 +7,7 @@ #include "base/observer_list.h" -namespace chromeos { +namespace ash { namespace tether { @@ -51,6 +51,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_DISCONNECT_TETHERING_REQUEST_SENDER_H_
diff --git a/ash/components/tether/disconnect_tethering_request_sender_impl.cc b/ash/components/tether/disconnect_tethering_request_sender_impl.cc index b6fc9e3..38c2100 100644 --- a/ash/components/tether/disconnect_tethering_request_sender_impl.cc +++ b/ash/components/tether/disconnect_tethering_request_sender_impl.cc
@@ -12,7 +12,7 @@ #include "base/memory/ptr_util.h" #include "chromeos/components/multidevice/logging/logging.h" -namespace chromeos { +namespace ash { namespace tether { @@ -140,4 +140,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/disconnect_tethering_request_sender_impl.h b/ash/components/tether/disconnect_tethering_request_sender_impl.h index cc6742c..5cbdddc 100644 --- a/ash/components/tether/disconnect_tethering_request_sender_impl.h +++ b/ash/components/tether/disconnect_tethering_request_sender_impl.h
@@ -9,17 +9,13 @@ #include "ash/components/tether/disconnect_tethering_operation.h" #include "ash/components/tether/disconnect_tethering_request_sender.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/device_sync/public/cpp/device_sync_client.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client.h" #include "third_party/abseil-cpp/absl/types/optional.h" -namespace chromeos { - -namespace device_sync { -class DeviceSyncClient; -} // namespace device_sync - -namespace secure_channel { -class SecureChannelClient; -} // namespace secure_channel +namespace ash { namespace tether { @@ -88,6 +84,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_DISCONNECT_TETHERING_REQUEST_SENDER_IMPL_H_
diff --git a/ash/components/tether/disconnect_tethering_request_sender_impl_unittest.cc b/ash/components/tether/disconnect_tethering_request_sender_impl_unittest.cc index edfcdfa..06f44ac 100644 --- a/ash/components/tether/disconnect_tethering_request_sender_impl_unittest.cc +++ b/ash/components/tether/disconnect_tethering_request_sender_impl_unittest.cc
@@ -17,7 +17,7 @@ #include "chromeos/services/secure_channel/public/cpp/client/fake_secure_channel_client.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -322,4 +322,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_active_host.cc b/ash/components/tether/fake_active_host.cc index cdcd0fe9..65c06811 100644 --- a/ash/components/tether/fake_active_host.cc +++ b/ash/components/tether/fake_active_host.cc
@@ -13,7 +13,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" -namespace chromeos { +namespace ash { namespace tether { @@ -109,4 +109,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_active_host.h b/ash/components/tether/fake_active_host.h index 6fb69ad..0cf7336 100644 --- a/ash/components/tether/fake_active_host.h +++ b/ash/components/tether/fake_active_host.h
@@ -11,7 +11,7 @@ #include "base/callback.h" #include "base/memory/weak_ptr.h" -namespace chromeos { +namespace ash { namespace tether { @@ -53,6 +53,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_ACTIVE_HOST_H_
diff --git a/ash/components/tether/fake_asynchronous_shutdown_object_container.cc b/ash/components/tether/fake_asynchronous_shutdown_object_container.cc index 6048c6f..39bd5e6 100644 --- a/ash/components/tether/fake_asynchronous_shutdown_object_container.cc +++ b/ash/components/tether/fake_asynchronous_shutdown_object_container.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/fake_asynchronous_shutdown_object_container.h" -namespace chromeos { +namespace ash { namespace tether { @@ -44,4 +44,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_asynchronous_shutdown_object_container.h b/ash/components/tether/fake_asynchronous_shutdown_object_container.h index 5fa253c..1b3c2d6b 100644 --- a/ash/components/tether/fake_asynchronous_shutdown_object_container.h +++ b/ash/components/tether/fake_asynchronous_shutdown_object_container.h
@@ -10,7 +10,7 @@ #include "base/callback.h" #include "base/callback_helpers.h" -namespace chromeos { +namespace ash { namespace tether { @@ -73,6 +73,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_ASYNCHRONOUS_SHUTDOWN_OBJECT_CONTAINER_H_
diff --git a/ash/components/tether/fake_connection_preserver.cc b/ash/components/tether/fake_connection_preserver.cc index 15bc8b2..af0bb34 100644 --- a/ash/components/tether/fake_connection_preserver.cc +++ b/ash/components/tether/fake_connection_preserver.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/fake_connection_preserver.h" -namespace chromeos { +namespace ash { namespace tether { @@ -19,4 +19,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_connection_preserver.h b/ash/components/tether/fake_connection_preserver.h index 667f3bda..07a1134 100644 --- a/ash/components/tether/fake_connection_preserver.h +++ b/ash/components/tether/fake_connection_preserver.h
@@ -9,7 +9,7 @@ #include "ash/components/tether/connection_preserver.h" -namespace chromeos { +namespace ash { namespace tether { @@ -36,6 +36,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_CONNECTION_PRESERVER_H_
diff --git a/ash/components/tether/fake_crash_recovery_manager.cc b/ash/components/tether/fake_crash_recovery_manager.cc index 414403a4..34075ab 100644 --- a/ash/components/tether/fake_crash_recovery_manager.cc +++ b/ash/components/tether/fake_crash_recovery_manager.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/fake_crash_recovery_manager.h" -namespace chromeos { +namespace ash { namespace tether { @@ -19,4 +19,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_crash_recovery_manager.h b/ash/components/tether/fake_crash_recovery_manager.h index e22c0f9..ddd503a 100644 --- a/ash/components/tether/fake_crash_recovery_manager.h +++ b/ash/components/tether/fake_crash_recovery_manager.h
@@ -8,7 +8,7 @@ #include "ash/components/tether/crash_recovery_manager.h" #include "base/callback.h" -namespace chromeos { +namespace ash { namespace tether { @@ -36,6 +36,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_CRASH_RECOVERY_MANAGER_H_
diff --git a/ash/components/tether/fake_disconnect_tethering_request_sender.cc b/ash/components/tether/fake_disconnect_tethering_request_sender.cc index 4de05f9..717b8af 100644 --- a/ash/components/tether/fake_disconnect_tethering_request_sender.cc +++ b/ash/components/tether/fake_disconnect_tethering_request_sender.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/fake_disconnect_tethering_request_sender.h" -namespace chromeos { +namespace ash { namespace tether { @@ -30,4 +30,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_disconnect_tethering_request_sender.h b/ash/components/tether/fake_disconnect_tethering_request_sender.h index 4663526b..d837c46 100644 --- a/ash/components/tether/fake_disconnect_tethering_request_sender.h +++ b/ash/components/tether/fake_disconnect_tethering_request_sender.h
@@ -10,7 +10,7 @@ #include "ash/components/tether/disconnect_tethering_request_sender.h" -namespace chromeos { +namespace ash { namespace tether { @@ -48,6 +48,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_DISCONNECT_TETHERING_REQUEST_SENDER_H_
diff --git a/ash/components/tether/fake_gms_core_notifications_state_tracker.cc b/ash/components/tether/fake_gms_core_notifications_state_tracker.cc index c01b05bc..76be291 100644 --- a/ash/components/tether/fake_gms_core_notifications_state_tracker.cc +++ b/ash/components/tether/fake_gms_core_notifications_state_tracker.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/fake_gms_core_notifications_state_tracker.h" -namespace chromeos { +namespace ash { namespace tether { @@ -26,4 +26,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_gms_core_notifications_state_tracker.h b/ash/components/tether/fake_gms_core_notifications_state_tracker.h index 1bcb510..0d725426 100644 --- a/ash/components/tether/fake_gms_core_notifications_state_tracker.h +++ b/ash/components/tether/fake_gms_core_notifications_state_tracker.h
@@ -10,7 +10,7 @@ #include "ash/components/tether/gms_core_notifications_state_tracker.h" -namespace chromeos { +namespace ash { namespace tether { @@ -43,6 +43,13 @@ } // namespace tether +} // namespace ash + +// TODO(https://crbug.com/1164001): remove when the migration is finished. +namespace chromeos { +namespace tether { +using ::ash::tether::FakeGmsCoreNotificationsStateTracker; +} // namespace tether } // namespace chromeos #endif // ASH_COMPONENTS_TETHER_FAKE_GMS_CORE_NOTIFICATIONS_STATE_TRACKER_H_
diff --git a/ash/components/tether/fake_host_scan_cache.cc b/ash/components/tether/fake_host_scan_cache.cc index 424d9b0..2eb502aa 100644 --- a/ash/components/tether/fake_host_scan_cache.cc +++ b/ash/components/tether/fake_host_scan_cache.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/fake_host_scan_cache.h" -namespace chromeos { +namespace ash { namespace tether { @@ -57,4 +57,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_host_scan_cache.h b/ash/components/tether/fake_host_scan_cache.h index 1a66d976..0219eee0 100644 --- a/ash/components/tether/fake_host_scan_cache.h +++ b/ash/components/tether/fake_host_scan_cache.h
@@ -11,7 +11,7 @@ #include "ash/components/tether/host_scan_cache.h" -namespace chromeos { +namespace ash { namespace tether { @@ -50,6 +50,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_HOST_SCAN_CACHE_H_
diff --git a/ash/components/tether/fake_host_scan_scheduler.cc b/ash/components/tether/fake_host_scan_scheduler.cc index a0af063..a354d99 100644 --- a/ash/components/tether/fake_host_scan_scheduler.cc +++ b/ash/components/tether/fake_host_scan_scheduler.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/fake_host_scan_scheduler.h" -namespace chromeos { +namespace ash { namespace tether { @@ -18,4 +18,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_host_scan_scheduler.h b/ash/components/tether/fake_host_scan_scheduler.h index aa581eca..8a110a1 100644 --- a/ash/components/tether/fake_host_scan_scheduler.h +++ b/ash/components/tether/fake_host_scan_scheduler.h
@@ -7,7 +7,7 @@ #include "ash/components/tether/host_scan_scheduler.h" -namespace chromeos { +namespace ash { namespace tether { @@ -32,6 +32,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_HOST_SCAN_SCHEDULER_H_
diff --git a/ash/components/tether/fake_host_scanner.cc b/ash/components/tether/fake_host_scanner.cc index c8977bb..9860ca4b 100644 --- a/ash/components/tether/fake_host_scanner.cc +++ b/ash/components/tether/fake_host_scanner.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/fake_host_scanner.h" -namespace chromeos { +namespace ash { namespace tether { @@ -35,4 +35,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_host_scanner.h b/ash/components/tether/fake_host_scanner.h index b012efc0..37f1ecb8 100644 --- a/ash/components/tether/fake_host_scanner.h +++ b/ash/components/tether/fake_host_scanner.h
@@ -7,7 +7,7 @@ #include "ash/components/tether/host_scanner.h" -namespace chromeos { +namespace ash { namespace tether { @@ -37,6 +37,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_HOST_SCANNER_H_
diff --git a/ash/components/tether/fake_network_configuration_remover.cc b/ash/components/tether/fake_network_configuration_remover.cc index 0a67404..25d487b0 100644 --- a/ash/components/tether/fake_network_configuration_remover.cc +++ b/ash/components/tether/fake_network_configuration_remover.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/fake_network_configuration_remover.h" -namespace chromeos { +namespace ash { namespace tether { @@ -21,4 +21,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_network_configuration_remover.h b/ash/components/tether/fake_network_configuration_remover.h index bd3bbdb..77574ec5 100644 --- a/ash/components/tether/fake_network_configuration_remover.h +++ b/ash/components/tether/fake_network_configuration_remover.h
@@ -9,7 +9,7 @@ #include "ash/components/tether/network_configuration_remover.h" -namespace chromeos { +namespace ash { namespace tether { @@ -39,6 +39,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_NETWORK_CONFIGURATION_REMOVER_H_
diff --git a/ash/components/tether/fake_notification_presenter.cc b/ash/components/tether/fake_notification_presenter.cc index 6267b76..e027dd8 100644 --- a/ash/components/tether/fake_notification_presenter.cc +++ b/ash/components/tether/fake_notification_presenter.cc
@@ -8,7 +8,7 @@ #include "base/memory/ptr_util.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -73,4 +73,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_notification_presenter.h b/ash/components/tether/fake_notification_presenter.h index 8f5efe3..20793b0 100644 --- a/ash/components/tether/fake_notification_presenter.h +++ b/ash/components/tether/fake_notification_presenter.h
@@ -11,7 +11,7 @@ #include "ash/components/tether/notification_presenter.h" #include "third_party/abseil-cpp/absl/types/optional.h" -namespace chromeos { +namespace ash { namespace tether { @@ -60,6 +60,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_NOTIFICATION_PRESENTER_H_
diff --git a/ash/components/tether/fake_synchronous_shutdown_object_container.cc b/ash/components/tether/fake_synchronous_shutdown_object_container.cc index 4a4757e..e1f36b3 100644 --- a/ash/components/tether/fake_synchronous_shutdown_object_container.cc +++ b/ash/components/tether/fake_synchronous_shutdown_object_container.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/fake_synchronous_shutdown_object_container.h" -namespace chromeos { +namespace ash { namespace tether { @@ -37,4 +37,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_synchronous_shutdown_object_container.h b/ash/components/tether/fake_synchronous_shutdown_object_container.h index 53cf969..6c9afc9 100644 --- a/ash/components/tether/fake_synchronous_shutdown_object_container.h +++ b/ash/components/tether/fake_synchronous_shutdown_object_container.h
@@ -10,7 +10,7 @@ #include "base/callback.h" #include "base/callback_helpers.h" -namespace chromeos { +namespace ash { namespace tether { @@ -60,6 +60,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_SYNCHRONOUS_SHUTDOWN_OBJECT_CONTAINER_H_
diff --git a/ash/components/tether/fake_tether_component.cc b/ash/components/tether/fake_tether_component.cc index 10e83cd..2955db34 100644 --- a/ash/components/tether/fake_tether_component.cc +++ b/ash/components/tether/fake_tether_component.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/fake_tether_component.h" -namespace chromeos { +namespace ash { namespace tether { @@ -31,4 +31,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_tether_component.h b/ash/components/tether/fake_tether_component.h index c664f12..eb743c0 100644 --- a/ash/components/tether/fake_tether_component.h +++ b/ash/components/tether/fake_tether_component.h
@@ -8,7 +8,7 @@ #include "ash/components/tether/tether_component.h" #include "ash/components/tether/tether_disconnector.h" -namespace chromeos { +namespace ash { namespace tether { @@ -41,6 +41,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_TETHER_COMPONENT_H_
diff --git a/ash/components/tether/fake_tether_connector.cc b/ash/components/tether/fake_tether_connector.cc index 2838be9a..c3c70315 100644 --- a/ash/components/tether/fake_tether_connector.cc +++ b/ash/components/tether/fake_tether_connector.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/fake_tether_connector.h" -namespace chromeos { +namespace ash { namespace tether { @@ -32,4 +32,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_tether_connector.h b/ash/components/tether/fake_tether_connector.h index 746f4cf..93a00fa 100644 --- a/ash/components/tether/fake_tether_connector.h +++ b/ash/components/tether/fake_tether_connector.h
@@ -9,7 +9,7 @@ #include "base/callback_forward.h" #include "chromeos/network/network_connection_handler.h" -namespace chromeos { +namespace ash { namespace tether { @@ -55,6 +55,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_TETHER_CONNECTOR_H_
diff --git a/ash/components/tether/fake_tether_disconnector.cc b/ash/components/tether/fake_tether_disconnector.cc index fb4bc795..ced2763 100644 --- a/ash/components/tether/fake_tether_disconnector.cc +++ b/ash/components/tether/fake_tether_disconnector.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/fake_tether_disconnector.h" -namespace chromeos { +namespace ash { namespace tether { @@ -31,4 +31,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_tether_disconnector.h b/ash/components/tether/fake_tether_disconnector.h index b4033d5..4483401 100644 --- a/ash/components/tether/fake_tether_disconnector.h +++ b/ash/components/tether/fake_tether_disconnector.h
@@ -10,7 +10,7 @@ #include "base/callback_forward.h" #include "chromeos/network/network_connection_handler.h" -namespace chromeos { +namespace ash { namespace tether { @@ -55,6 +55,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_TETHER_DISCONNECTOR_H_
diff --git a/ash/components/tether/fake_tether_host_fetcher.cc b/ash/components/tether/fake_tether_host_fetcher.cc index 86b62af1..2d599020 100644 --- a/ash/components/tether/fake_tether_host_fetcher.cc +++ b/ash/components/tether/fake_tether_host_fetcher.cc
@@ -6,7 +6,7 @@ #include "base/memory/ptr_util.h" -namespace chromeos { +namespace ash { namespace tether { @@ -41,4 +41,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_tether_host_fetcher.h b/ash/components/tether/fake_tether_host_fetcher.h index bb3745e..1328e22 100644 --- a/ash/components/tether/fake_tether_host_fetcher.h +++ b/ash/components/tether/fake_tether_host_fetcher.h
@@ -10,7 +10,7 @@ #include "ash/components/tether/tether_host_fetcher.h" #include "chromeos/components/multidevice/remote_device_ref.h" -namespace chromeos { +namespace ash { namespace tether { @@ -45,6 +45,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_TETHER_HOST_FETCHER_H_
diff --git a/ash/components/tether/fake_tether_session_completion_logger.cc b/ash/components/tether/fake_tether_session_completion_logger.cc index 4c4f8af..d799c4c 100644 --- a/ash/components/tether/fake_tether_session_completion_logger.cc +++ b/ash/components/tether/fake_tether_session_completion_logger.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/fake_tether_session_completion_logger.h" -namespace chromeos { +namespace ash { namespace tether { @@ -22,4 +22,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_tether_session_completion_logger.h b/ash/components/tether/fake_tether_session_completion_logger.h index cba4c1c..517d557 100644 --- a/ash/components/tether/fake_tether_session_completion_logger.h +++ b/ash/components/tether/fake_tether_session_completion_logger.h
@@ -9,7 +9,7 @@ #include "ash/components/tether/tether_session_completion_logger.h" -namespace chromeos { +namespace ash { namespace tether { @@ -41,6 +41,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_TETHER_SESSION_COMPLETION_LOGGER_H_
diff --git a/ash/components/tether/fake_wifi_hotspot_connector.cc b/ash/components/tether/fake_wifi_hotspot_connector.cc index f35b3738..4f30674 100644 --- a/ash/components/tether/fake_wifi_hotspot_connector.cc +++ b/ash/components/tether/fake_wifi_hotspot_connector.cc
@@ -8,7 +8,7 @@ #include "chromeos/network/network_state_handler.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -38,4 +38,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_wifi_hotspot_connector.h b/ash/components/tether/fake_wifi_hotspot_connector.h index a2b9b86..c70895ab 100644 --- a/ash/components/tether/fake_wifi_hotspot_connector.h +++ b/ash/components/tether/fake_wifi_hotspot_connector.h
@@ -9,7 +9,7 @@ #include "ash/components/tether/wifi_hotspot_connector.h" -namespace chromeos { +namespace ash { namespace tether { @@ -50,6 +50,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_WIFI_HOTSPOT_CONNECTOR_H_
diff --git a/ash/components/tether/fake_wifi_hotspot_disconnector.cc b/ash/components/tether/fake_wifi_hotspot_disconnector.cc index 29673c0e..65ba7a17 100644 --- a/ash/components/tether/fake_wifi_hotspot_disconnector.cc +++ b/ash/components/tether/fake_wifi_hotspot_disconnector.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/fake_wifi_hotspot_disconnector.h" -namespace chromeos { +namespace ash { namespace tether { @@ -26,4 +26,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/fake_wifi_hotspot_disconnector.h b/ash/components/tether/fake_wifi_hotspot_disconnector.h index e1c1fd3f..5265925 100644 --- a/ash/components/tether/fake_wifi_hotspot_disconnector.h +++ b/ash/components/tether/fake_wifi_hotspot_disconnector.h
@@ -8,7 +8,7 @@ #include "ash/components/tether/wifi_hotspot_disconnector.h" #include "base/callback.h" -namespace chromeos { +namespace ash { namespace tether { @@ -44,6 +44,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_FAKE_WIFI_HOTSPOT_DISCONNECTOR_H_
diff --git a/ash/components/tether/gms_core_notifications_state_tracker.cc b/ash/components/tether/gms_core_notifications_state_tracker.cc index 5606b6b..e2b3fa7 100644 --- a/ash/components/tether/gms_core_notifications_state_tracker.cc +++ b/ash/components/tether/gms_core_notifications_state_tracker.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/gms_core_notifications_state_tracker.h" -namespace chromeos { +namespace ash { namespace tether { @@ -27,4 +27,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/gms_core_notifications_state_tracker.h b/ash/components/tether/gms_core_notifications_state_tracker.h index 2bc6745..375ee95 100644 --- a/ash/components/tether/gms_core_notifications_state_tracker.h +++ b/ash/components/tether/gms_core_notifications_state_tracker.h
@@ -10,7 +10,7 @@ #include "base/observer_list.h" -namespace chromeos { +namespace ash { namespace tether { @@ -51,6 +51,13 @@ } // namespace tether +} // namespace ash + +// TODO(https://crbug.com/1164001): remove when the migration is finished. +namespace chromeos { +namespace tether { +using ::ash::tether::GmsCoreNotificationsStateTracker; +} // namespace tether } // namespace chromeos #endif // ASH_COMPONENTS_TETHER_GMS_CORE_NOTIFICATIONS_STATE_TRACKER_H_
diff --git a/ash/components/tether/gms_core_notifications_state_tracker_impl.cc b/ash/components/tether/gms_core_notifications_state_tracker_impl.cc index f3f32be..4aa8b7d 100644 --- a/ash/components/tether/gms_core_notifications_state_tracker_impl.cc +++ b/ash/components/tether/gms_core_notifications_state_tracker_impl.cc
@@ -8,7 +8,7 @@ #include "chromeos/components/multidevice/logging/logging.h" -namespace chromeos { +namespace ash { namespace tether { @@ -125,4 +125,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/gms_core_notifications_state_tracker_impl.h b/ash/components/tether/gms_core_notifications_state_tracker_impl.h index 3bf25b94..024c8d3 100644 --- a/ash/components/tether/gms_core_notifications_state_tracker_impl.h +++ b/ash/components/tether/gms_core_notifications_state_tracker_impl.h
@@ -13,7 +13,7 @@ #include "ash/components/tether/host_scanner_operation.h" #include "chromeos/components/multidevice/remote_device_ref.h" -namespace chromeos { +namespace ash { namespace tether { @@ -54,6 +54,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_GMS_CORE_NOTIFICATIONS_STATE_TRACKER_IMPL_H_
diff --git a/ash/components/tether/gms_core_notifications_state_tracker_impl_unittest.cc b/ash/components/tether/gms_core_notifications_state_tracker_impl_unittest.cc index 6d94fe4..9eb80201 100644 --- a/ash/components/tether/gms_core_notifications_state_tracker_impl_unittest.cc +++ b/ash/components/tether/gms_core_notifications_state_tracker_impl_unittest.cc
@@ -14,7 +14,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -236,4 +236,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/host_connection_metrics_logger.cc b/ash/components/tether/host_connection_metrics_logger.cc index f9994e39..bc8819b0 100644 --- a/ash/components/tether/host_connection_metrics_logger.cc +++ b/ash/components/tether/host_connection_metrics_logger.cc
@@ -7,7 +7,7 @@ #include "base/metrics/histogram_macros.h" #include "base/time/default_clock.h" -namespace chromeos { +namespace ash { namespace tether { @@ -200,4 +200,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/host_connection_metrics_logger.h b/ash/components/tether/host_connection_metrics_logger.h index 6506387c..73d1541 100644 --- a/ash/components/tether/host_connection_metrics_logger.h +++ b/ash/components/tether/host_connection_metrics_logger.h
@@ -13,9 +13,9 @@ namespace base { class Clock; -} +} // namespace base -namespace chromeos { +namespace ash { namespace tether { @@ -210,6 +210,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_HOST_CONNECTION_METRICS_LOGGER_H_
diff --git a/ash/components/tether/host_connection_metrics_logger_unittest.cc b/ash/components/tether/host_connection_metrics_logger_unittest.cc index 7900606c..34bb783 100644 --- a/ash/components/tether/host_connection_metrics_logger_unittest.cc +++ b/ash/components/tether/host_connection_metrics_logger_unittest.cc
@@ -13,7 +13,7 @@ #include "chromeos/components/multidevice/remote_device_test_util.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -408,4 +408,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/host_scan_cache.cc b/ash/components/tether/host_scan_cache.cc index 925633ed..5d9252e 100644 --- a/ash/components/tether/host_scan_cache.cc +++ b/ash/components/tether/host_scan_cache.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/host_scan_cache.h" -namespace chromeos { +namespace ash { namespace tether { @@ -34,4 +34,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/host_scan_cache.h b/ash/components/tether/host_scan_cache.h index 0af3073..ebe3b13 100644 --- a/ash/components/tether/host_scan_cache.h +++ b/ash/components/tether/host_scan_cache.h
@@ -11,7 +11,7 @@ #include "ash/components/tether/host_scan_cache_entry.h" #include "base/observer_list.h" -namespace chromeos { +namespace ash { namespace tether { @@ -66,6 +66,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_HOST_SCAN_CACHE_H_
diff --git a/ash/components/tether/host_scan_cache_entry.cc b/ash/components/tether/host_scan_cache_entry.cc index 6f1fab2..eef5141 100644 --- a/ash/components/tether/host_scan_cache_entry.cc +++ b/ash/components/tether/host_scan_cache_entry.cc
@@ -7,7 +7,7 @@ #include "base/check_op.h" #include "base/memory/ptr_util.h" -namespace chromeos { +namespace ash { namespace tether { @@ -87,4 +87,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/host_scan_cache_entry.h b/ash/components/tether/host_scan_cache_entry.h index 479ce59..1321a8d 100644 --- a/ash/components/tether/host_scan_cache_entry.h +++ b/ash/components/tether/host_scan_cache_entry.h
@@ -8,7 +8,7 @@ #include <memory> #include <string> -namespace chromeos { +namespace ash { namespace tether { @@ -75,6 +75,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_HOST_SCAN_CACHE_ENTRY_H_
diff --git a/ash/components/tether/host_scan_cache_unittest.cc b/ash/components/tether/host_scan_cache_unittest.cc index b595dca2..789e8583 100644 --- a/ash/components/tether/host_scan_cache_unittest.cc +++ b/ash/components/tether/host_scan_cache_unittest.cc
@@ -11,7 +11,7 @@ #include "ash/components/tether/host_scan_test_util.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -92,4 +92,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/host_scan_device_prioritizer.h b/ash/components/tether/host_scan_device_prioritizer.h index bf76fb0..7525eee 100644 --- a/ash/components/tether/host_scan_device_prioritizer.h +++ b/ash/components/tether/host_scan_device_prioritizer.h
@@ -7,7 +7,7 @@ #include "chromeos/components/multidevice/remote_device_ref.h" -namespace chromeos { +namespace ash { namespace tether { @@ -36,6 +36,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_HOST_SCAN_DEVICE_PRIORITIZER_H_
diff --git a/ash/components/tether/host_scan_device_prioritizer_impl.cc b/ash/components/tether/host_scan_device_prioritizer_impl.cc index 8cce097..06cea57 100644 --- a/ash/components/tether/host_scan_device_prioritizer_impl.cc +++ b/ash/components/tether/host_scan_device_prioritizer_impl.cc
@@ -13,7 +13,7 @@ #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" -namespace chromeos { +namespace ash { namespace tether { @@ -81,4 +81,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/host_scan_device_prioritizer_impl.h b/ash/components/tether/host_scan_device_prioritizer_impl.h index 2aaf368..b3c39fa 100644 --- a/ash/components/tether/host_scan_device_prioritizer_impl.h +++ b/ash/components/tether/host_scan_device_prioritizer_impl.h
@@ -8,7 +8,7 @@ #include "ash/components/tether/host_scan_device_prioritizer.h" #include "chromeos/components/multidevice/remote_device_ref.h" -namespace chromeos { +namespace ash { namespace tether { @@ -36,6 +36,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_HOST_SCAN_DEVICE_PRIORITIZER_IMPL_H_
diff --git a/ash/components/tether/host_scan_device_prioritizer_impl_unittest.cc b/ash/components/tether/host_scan_device_prioritizer_impl_unittest.cc index 7523bb0..e0b72305 100644 --- a/ash/components/tether/host_scan_device_prioritizer_impl_unittest.cc +++ b/ash/components/tether/host_scan_device_prioritizer_impl_unittest.cc
@@ -12,7 +12,7 @@ #include "components/sync_preferences/testing_pref_service_syncable.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -205,4 +205,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/host_scan_scheduler.h b/ash/components/tether/host_scan_scheduler.h index 1ed2978..f3c83ba 100644 --- a/ash/components/tether/host_scan_scheduler.h +++ b/ash/components/tether/host_scan_scheduler.h
@@ -5,7 +5,7 @@ #ifndef ASH_COMPONENTS_TETHER_HOST_SCAN_SCHEDULER_H_ #define ASH_COMPONENTS_TETHER_HOST_SCAN_SCHEDULER_H_ -namespace chromeos { +namespace ash { namespace tether { @@ -27,6 +27,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_HOST_SCAN_SCHEDULER_H_
diff --git a/ash/components/tether/host_scan_scheduler_impl.cc b/ash/components/tether/host_scan_scheduler_impl.cc index 184bda6..5a18c23 100644 --- a/ash/components/tether/host_scan_scheduler_impl.cc +++ b/ash/components/tether/host_scan_scheduler_impl.cc
@@ -19,7 +19,7 @@ #include "chromeos/network/network_type_pattern.h" #include "components/session_manager/core/session_manager.h" -namespace chromeos { +namespace ash { namespace tether { @@ -211,4 +211,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/host_scan_scheduler_impl.h b/ash/components/tether/host_scan_scheduler_impl.h index c302e2e..97aae121 100644 --- a/ash/components/tether/host_scan_scheduler_impl.h +++ b/ash/components/tether/host_scan_scheduler_impl.h
@@ -14,7 +14,11 @@ #include "base/time/clock.h" #include "base/time/time.h" #include "base/timer/timer.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_state_handler.h" #include "chromeos/network/network_state_handler_observer.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_type_pattern.h" #include "components/session_manager/core/session_manager_observer.h" namespace base { @@ -25,10 +29,7 @@ class SessionManager; } // namespace session_manager -namespace chromeos { - -class NetworkStateHandler; -class NetworkTypePattern; +namespace ash { namespace tether { @@ -95,6 +96,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_HOST_SCAN_SCHEDULER_IMPL_H_
diff --git a/ash/components/tether/host_scan_scheduler_impl_unittest.cc b/ash/components/tether/host_scan_scheduler_impl_unittest.cc index 0a4e984..372746f1 100644 --- a/ash/components/tether/host_scan_scheduler_impl_unittest.cc +++ b/ash/components/tether/host_scan_scheduler_impl_unittest.cc
@@ -25,7 +25,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -435,4 +435,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/host_scan_test_util.cc b/ash/components/tether/host_scan_test_util.cc index f9720be6d..6c21698 100644 --- a/ash/components/tether/host_scan_test_util.cc +++ b/ash/components/tether/host_scan_test_util.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/host_scan_test_util.h" -namespace chromeos { +namespace ash { namespace tether { @@ -60,4 +60,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/host_scan_test_util.h b/ash/components/tether/host_scan_test_util.h index af7c07b..6555ad1 100644 --- a/ash/components/tether/host_scan_test_util.h +++ b/ash/components/tether/host_scan_test_util.h
@@ -10,7 +10,7 @@ #include "ash/components/tether/host_scan_cache_entry.h" -namespace chromeos { +namespace ash { namespace tether { @@ -55,6 +55,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_HOST_SCAN_TEST_UTIL_H_
diff --git a/ash/components/tether/host_scanner.cc b/ash/components/tether/host_scanner.cc index a34b516..fa3f1f3 100644 --- a/ash/components/tether/host_scanner.cc +++ b/ash/components/tether/host_scanner.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/host_scanner.h" -namespace chromeos { +namespace ash { namespace tether { @@ -27,4 +27,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/host_scanner.h b/ash/components/tether/host_scanner.h index 972c171..3e78b0ca3 100644 --- a/ash/components/tether/host_scanner.h +++ b/ash/components/tether/host_scanner.h
@@ -7,7 +7,7 @@ #include "base/observer_list.h" -namespace chromeos { +namespace ash { namespace tether { @@ -52,6 +52,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_HOST_SCANNER_H_
diff --git a/ash/components/tether/host_scanner_impl.cc b/ash/components/tether/host_scanner_impl.cc index 7b8eea0..45017e31 100644 --- a/ash/components/tether/host_scanner_impl.cc +++ b/ash/components/tether/host_scanner_impl.cc
@@ -20,7 +20,7 @@ #include "chromeos/network/network_state.h" #include "components/session_manager/core/session_manager.h" -namespace chromeos { +namespace ash { namespace tether { @@ -311,4 +311,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/host_scanner_impl.h b/ash/components/tether/host_scanner_impl.h index 2d0e4604..e1109e3f 100644 --- a/ash/components/tether/host_scanner_impl.h +++ b/ash/components/tether/host_scanner_impl.h
@@ -18,21 +18,17 @@ #include "base/time/clock.h" #include "chromeos/components/multidevice/remote_device_ref.h" #include "chromeos/network/network_state_handler.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/device_sync/public/cpp/device_sync_client.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client.h" #include "components/session_manager/core/session_manager_observer.h" namespace session_manager { class SessionManager; } // namespace session_manager -namespace chromeos { - -namespace device_sync { -class DeviceSyncClient; -} // namespace device_sync - -namespace secure_channel { -class SecureChannelClient; -} // namespace secure_channel +namespace ash { namespace tether { @@ -146,6 +142,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_HOST_SCANNER_IMPL_H_
diff --git a/ash/components/tether/host_scanner_impl_unittest.cc b/ash/components/tether/host_scanner_impl_unittest.cc index 70e97a58..acbb530 100644 --- a/ash/components/tether/host_scanner_impl_unittest.cc +++ b/ash/components/tether/host_scanner_impl_unittest.cc
@@ -33,7 +33,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/cros_system_api/dbus/shill/dbus-constants.h" -namespace chromeos { +namespace ash { namespace tether { @@ -823,4 +823,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/host_scanner_operation.cc b/ash/components/tether/host_scanner_operation.cc index 930c423f..9ff716e5 100644 --- a/ash/components/tether/host_scanner_operation.cc +++ b/ash/components/tether/host_scanner_operation.cc
@@ -18,7 +18,7 @@ #include "base/time/default_clock.h" #include "chromeos/components/multidevice/logging/logging.h" -namespace chromeos { +namespace ash { namespace tether { @@ -283,4 +283,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/host_scanner_operation.h b/ash/components/tether/host_scanner_operation.h index 925ccaf3..3b39890 100644 --- a/ash/components/tether/host_scanner_operation.h +++ b/ash/components/tether/host_scanner_operation.h
@@ -13,16 +13,12 @@ #include "base/observer_list.h" #include "base/time/clock.h" #include "chromeos/components/multidevice/remote_device_ref.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/device_sync/public/cpp/device_sync_client.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client.h" -namespace chromeos { - -namespace device_sync { -class DeviceSyncClient; -} // namespace device_sync - -namespace secure_channel { -class SecureChannelClient; -} // namespace secure_channel +namespace ash { namespace tether { @@ -155,6 +151,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_HOST_SCANNER_OPERATION_H_
diff --git a/ash/components/tether/host_scanner_operation_unittest.cc b/ash/components/tether/host_scanner_operation_unittest.cc index 935daf5d..968911a 100644 --- a/ash/components/tether/host_scanner_operation_unittest.cc +++ b/ash/components/tether/host_scanner_operation_unittest.cc
@@ -29,7 +29,7 @@ using testing::_; using testing::StrictMock; -namespace chromeos { +namespace ash { namespace tether { @@ -360,4 +360,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/hotspot_usage_duration_tracker.cc b/ash/components/tether/hotspot_usage_duration_tracker.cc index 44ed8dbd..c77bc17 100644 --- a/ash/components/tether/hotspot_usage_duration_tracker.cc +++ b/ash/components/tether/hotspot_usage_duration_tracker.cc
@@ -8,7 +8,7 @@ #include "base/time/clock.h" #include "chromeos/components/multidevice/logging/logging.h" -namespace chromeos { +namespace ash { namespace tether { @@ -97,4 +97,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/hotspot_usage_duration_tracker.h b/ash/components/tether/hotspot_usage_duration_tracker.h index 0ee707d..bc2ab99e 100644 --- a/ash/components/tether/hotspot_usage_duration_tracker.h +++ b/ash/components/tether/hotspot_usage_duration_tracker.h
@@ -12,7 +12,7 @@ class Clock; } // namespace base -namespace chromeos { +namespace ash { namespace tether { @@ -46,6 +46,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_HOTSPOT_USAGE_DURATION_TRACKER_H_
diff --git a/ash/components/tether/hotspot_usage_duration_tracker_unittest.cc b/ash/components/tether/hotspot_usage_duration_tracker_unittest.cc index d7155e1..b49734f 100644 --- a/ash/components/tether/hotspot_usage_duration_tracker_unittest.cc +++ b/ash/components/tether/hotspot_usage_duration_tracker_unittest.cc
@@ -12,7 +12,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -120,4 +120,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/keep_alive_operation.cc b/ash/components/tether/keep_alive_operation.cc index 989ad99..d6f56db2 100644 --- a/ash/components/tether/keep_alive_operation.cc +++ b/ash/components/tether/keep_alive_operation.cc
@@ -11,7 +11,7 @@ #include "base/time/default_clock.h" #include "chromeos/components/multidevice/logging/logging.h" -namespace chromeos { +namespace ash { namespace tether { @@ -118,4 +118,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/keep_alive_operation.h b/ash/components/tether/keep_alive_operation.h index 8d69de8..fe4beb7 100644 --- a/ash/components/tether/keep_alive_operation.h +++ b/ash/components/tether/keep_alive_operation.h
@@ -9,16 +9,12 @@ #include "base/gtest_prod_util.h" #include "base/observer_list.h" #include "base/time/clock.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/device_sync/public/cpp/device_sync_client.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client.h" -namespace chromeos { - -namespace device_sync { -class DeviceSyncClient; -} // namespace device_sync - -namespace secure_channel { -class SecureChannelClient; -} // namespace secure_channel +namespace ash { namespace tether { @@ -97,6 +93,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_KEEP_ALIVE_OPERATION_H_
diff --git a/ash/components/tether/keep_alive_operation_unittest.cc b/ash/components/tether/keep_alive_operation_unittest.cc index 3ebacf1..c50b09a 100644 --- a/ash/components/tether/keep_alive_operation_unittest.cc +++ b/ash/components/tether/keep_alive_operation_unittest.cc
@@ -26,7 +26,7 @@ using testing::Invoke; using testing::NotNull; -namespace chromeos { +namespace ash { namespace tether { @@ -188,4 +188,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/keep_alive_scheduler.cc b/ash/components/tether/keep_alive_scheduler.cc index de392a5f..82be7cda 100644 --- a/ash/components/tether/keep_alive_scheduler.cc +++ b/ash/components/tether/keep_alive_scheduler.cc
@@ -10,7 +10,7 @@ #include "base/metrics/histogram_functions.h" #include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client.h" -namespace chromeos { +namespace ash { namespace tether { @@ -125,4 +125,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/keep_alive_scheduler.h b/ash/components/tether/keep_alive_scheduler.h index 262a509..3b5d44e6 100644 --- a/ash/components/tether/keep_alive_scheduler.h +++ b/ash/components/tether/keep_alive_scheduler.h
@@ -12,17 +12,13 @@ #include "ash/components/tether/keep_alive_operation.h" #include "base/memory/weak_ptr.h" #include "base/timer/timer.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/device_sync/public/cpp/device_sync_client.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client.h" #include "third_party/abseil-cpp/absl/types/optional.h" -namespace chromeos { - -namespace device_sync { -class DeviceSyncClient; -} // namespace device_sync - -namespace secure_channel { -class SecureChannelClient; -} // namespace secure_channel +namespace ash { namespace tether { @@ -87,6 +83,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_KEEP_ALIVE_SCHEDULER_H_
diff --git a/ash/components/tether/keep_alive_scheduler_unittest.cc b/ash/components/tether/keep_alive_scheduler_unittest.cc index fb393f5..e8ba56e8 100644 --- a/ash/components/tether/keep_alive_scheduler_unittest.cc +++ b/ash/components/tether/keep_alive_scheduler_unittest.cc
@@ -18,7 +18,7 @@ #include "chromeos/services/secure_channel/public/cpp/client/fake_secure_channel_client.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -310,4 +310,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/message_transfer_operation.cc b/ash/components/tether/message_transfer_operation.cc index 99c33a34..253a994a 100644 --- a/ash/components/tether/message_transfer_operation.cc +++ b/ash/components/tether/message_transfer_operation.cc
@@ -13,12 +13,15 @@ #include "base/containers/contains.h" #include "chromeos/components/multidevice/logging/logging.h" -namespace chromeos { +namespace ash { namespace tether { namespace { +// TODO(https://crbug.com/1164001): remove when secure_channel moved to ash +namespace secure_channel = ::chromeos::secure_channel; + const char kTetherFeature[] = "magic_tether"; multidevice::RemoteDeviceRefList RemoveDuplicatesFromVector( @@ -305,4 +308,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/message_transfer_operation.h b/ash/components/tether/message_transfer_operation.h index 3dee39f..39e80e7 100644 --- a/ash/components/tether/message_transfer_operation.h +++ b/ash/components/tether/message_transfer_operation.h
@@ -20,7 +20,7 @@ #include "chromeos/services/secure_channel/public/mojom/secure_channel.mojom.h" #include "third_party/abseil-cpp/absl/types/optional.h" -namespace chromeos { +namespace ash { namespace tether { @@ -114,7 +114,8 @@ // secure_channel::ConnectionAttempt::Delegate: void OnConnectionAttemptFailure( - secure_channel::mojom::ConnectionAttemptFailureReason reason) override; + chromeos::secure_channel::mojom::ConnectionAttemptFailureReason reason) + override; void OnConnection( std::unique_ptr<secure_channel::ClientChannel> channel) override; @@ -157,7 +158,7 @@ void OnConnectionAttemptFailure( multidevice::RemoteDeviceRef remote_device, - secure_channel::mojom::ConnectionAttemptFailureReason reason); + chromeos::secure_channel::mojom::ConnectionAttemptFailureReason reason); void OnConnection(multidevice::RemoteDeviceRef remote_device, std::unique_ptr<secure_channel::ClientChannel> channel); void OnDisconnected(multidevice::RemoteDeviceRef remote_device); @@ -208,6 +209,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_MESSAGE_TRANSFER_OPERATION_H_
diff --git a/ash/components/tether/message_transfer_operation_unittest.cc b/ash/components/tether/message_transfer_operation_unittest.cc index 2da49b1..4cc5672 100644 --- a/ash/components/tether/message_transfer_operation_unittest.cc +++ b/ash/components/tether/message_transfer_operation_unittest.cc
@@ -19,12 +19,15 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { namespace { +// TODO(https://crbug.com/1164001): remove when secure_channel moved to ash +namespace secure_channel = ::chromeos::secure_channel; + // Arbitrarily chosen value. The MessageType used in this test does not matter // except that it must be consistent throughout the test. const MessageType kTestMessageType = MessageType::TETHER_AVAILABILITY_REQUEST; @@ -405,4 +408,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/message_wrapper.cc b/ash/components/tether/message_wrapper.cc index 4a3af06e..f4fc97c 100644 --- a/ash/components/tether/message_wrapper.cc +++ b/ash/components/tether/message_wrapper.cc
@@ -12,7 +12,7 @@ #include "base/memory/ptr_util.h" #include "base/values.h" -namespace chromeos { +namespace ash { namespace tether { @@ -176,4 +176,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/message_wrapper.h b/ash/components/tether/message_wrapper.h index 207a8c8b..627b261 100644 --- a/ash/components/tether/message_wrapper.h +++ b/ash/components/tether/message_wrapper.h
@@ -10,7 +10,7 @@ #include "ash/components/tether/proto/tether.pb.h" -namespace chromeos { +namespace ash { namespace tether { @@ -60,6 +60,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_MESSAGE_WRAPPER_H_
diff --git a/ash/components/tether/message_wrapper_unittest.cc b/ash/components/tether/message_wrapper_unittest.cc index 01468e3..1e8245fd 100644 --- a/ash/components/tether/message_wrapper_unittest.cc +++ b/ash/components/tether/message_wrapper_unittest.cc
@@ -12,7 +12,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -190,4 +190,4 @@ } // namespace tether -} // namespace cryptauth +} // namespace ash
diff --git a/ash/components/tether/mock_host_connection_metrics_logger.cc b/ash/components/tether/mock_host_connection_metrics_logger.cc index 981fb9cf..68950a3 100644 --- a/ash/components/tether/mock_host_connection_metrics_logger.cc +++ b/ash/components/tether/mock_host_connection_metrics_logger.cc
@@ -6,7 +6,7 @@ #include "ash/components/tether/active_host.h" -namespace chromeos { +namespace ash { namespace tether { @@ -18,4 +18,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/mock_host_connection_metrics_logger.h b/ash/components/tether/mock_host_connection_metrics_logger.h index 41d141e7..0772f07 100644 --- a/ash/components/tether/mock_host_connection_metrics_logger.h +++ b/ash/components/tether/mock_host_connection_metrics_logger.h
@@ -10,7 +10,7 @@ #include "ash/components/tether/host_connection_metrics_logger.h" #include "testing/gmock/include/gmock/gmock.h" -namespace chromeos { +namespace ash { namespace tether { @@ -34,6 +34,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_MOCK_HOST_CONNECTION_METRICS_LOGGER_H_
diff --git a/ash/components/tether/mock_tether_host_response_recorder.cc b/ash/components/tether/mock_tether_host_response_recorder.cc index e3986bc..6c1f4302 100644 --- a/ash/components/tether/mock_tether_host_response_recorder.cc +++ b/ash/components/tether/mock_tether_host_response_recorder.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/mock_tether_host_response_recorder.h" -namespace chromeos { +namespace ash { namespace tether { @@ -15,4 +15,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/mock_tether_host_response_recorder.h b/ash/components/tether/mock_tether_host_response_recorder.h index 75a307a..b64114d 100644 --- a/ash/components/tether/mock_tether_host_response_recorder.h +++ b/ash/components/tether/mock_tether_host_response_recorder.h
@@ -11,7 +11,7 @@ #include "chromeos/components/multidevice/remote_device_ref.h" #include "testing/gmock/include/gmock/gmock.h" -namespace chromeos { +namespace ash { namespace tether { @@ -37,6 +37,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_MOCK_TETHER_HOST_RESPONSE_RECORDER_H_
diff --git a/ash/components/tether/network_configuration_remover.cc b/ash/components/tether/network_configuration_remover.cc index de302b9..e1139be 100644 --- a/ash/components/tether/network_configuration_remover.cc +++ b/ash/components/tether/network_configuration_remover.cc
@@ -26,7 +26,7 @@ } // namespace -namespace chromeos { +namespace ash { namespace tether { @@ -47,4 +47,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/network_configuration_remover.h b/ash/components/tether/network_configuration_remover.h index daa3c7e2..b8bf23408 100644 --- a/ash/components/tether/network_configuration_remover.h +++ b/ash/components/tether/network_configuration_remover.h
@@ -7,9 +7,10 @@ #include <string> -namespace chromeos { +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/managed_network_configuration_handler.h" -class ManagedNetworkConfigurationHandler; +namespace ash { namespace tether { @@ -38,6 +39,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_NETWORK_CONFIGURATION_REMOVER_H_
diff --git a/ash/components/tether/network_configuration_remover_unittest.cc b/ash/components/tether/network_configuration_remover_unittest.cc index bf5efe7..ea0a3e9b 100644 --- a/ash/components/tether/network_configuration_remover_unittest.cc +++ b/ash/components/tether/network_configuration_remover_unittest.cc
@@ -14,7 +14,7 @@ using testing::_; using testing::NiceMock; -namespace chromeos { +namespace ash { namespace tether { @@ -61,4 +61,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/network_connection_handler_tether_delegate.cc b/ash/components/tether/network_connection_handler_tether_delegate.cc index 45c5e8c0..7ca8680 100644 --- a/ash/components/tether/network_connection_handler_tether_delegate.cc +++ b/ash/components/tether/network_connection_handler_tether_delegate.cc
@@ -12,7 +12,7 @@ #include "base/containers/contains.h" #include "chromeos/components/multidevice/logging/logging.h" -namespace chromeos { +namespace ash { namespace tether { @@ -136,4 +136,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/network_connection_handler_tether_delegate.h b/ash/components/tether/network_connection_handler_tether_delegate.h index 7dbe71b..136d81a 100644 --- a/ash/components/tether/network_connection_handler_tether_delegate.h +++ b/ash/components/tether/network_connection_handler_tether_delegate.h
@@ -10,9 +10,7 @@ #include "base/memory/weak_ptr.h" #include "chromeos/network/network_connection_handler.h" -namespace chromeos { - -class NetworkConnectionHandler; +namespace ash { namespace tether { @@ -76,6 +74,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_NETWORK_CONNECTION_HANDLER_TETHER_DELEGATE_H_
diff --git a/ash/components/tether/network_connection_handler_tether_delegate_unittest.cc b/ash/components/tether/network_connection_handler_tether_delegate_unittest.cc index 3cd7020..164d69b 100644 --- a/ash/components/tether/network_connection_handler_tether_delegate_unittest.cc +++ b/ash/components/tether/network_connection_handler_tether_delegate_unittest.cc
@@ -16,7 +16,7 @@ #include "chromeos/network/network_connection_handler.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -231,4 +231,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/network_host_scan_cache.cc b/ash/components/tether/network_host_scan_cache.cc index 9785c0da..6061ec8 100644 --- a/ash/components/tether/network_host_scan_cache.cc +++ b/ash/components/tether/network_host_scan_cache.cc
@@ -11,7 +11,7 @@ #include "chromeos/network/network_state.h" #include "chromeos/network/network_state_handler.h" -namespace chromeos { +namespace ash { namespace tether { @@ -124,4 +124,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/network_host_scan_cache.h b/ash/components/tether/network_host_scan_cache.h index e14709a..7805486 100644 --- a/ash/components/tether/network_host_scan_cache.h +++ b/ash/components/tether/network_host_scan_cache.h
@@ -12,10 +12,10 @@ #include "ash/components/tether/host_scan_cache.h" #include "ash/components/tether/tether_host_response_recorder.h" #include "base/memory/weak_ptr.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_state_handler.h" -namespace chromeos { - -class NetworkStateHandler; +namespace ash { namespace tether { @@ -62,6 +62,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_NETWORK_HOST_SCAN_CACHE_H_
diff --git a/ash/components/tether/network_host_scan_cache_unittest.cc b/ash/components/tether/network_host_scan_cache_unittest.cc index b23d5023..0b21fcdc 100644 --- a/ash/components/tether/network_host_scan_cache_unittest.cc +++ b/ash/components/tether/network_host_scan_cache_unittest.cc
@@ -22,7 +22,7 @@ using testing::NiceMock; using testing::Invoke; -namespace chromeos { +namespace ash { namespace tether { @@ -200,4 +200,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/network_list_sorter.cc b/ash/components/tether/network_list_sorter.cc index 61e6bc2d..d9ee2d9c 100644 --- a/ash/components/tether/network_list_sorter.cc +++ b/ash/components/tether/network_list_sorter.cc
@@ -10,7 +10,7 @@ #include "chromeos/network/network_state.h" #include "chromeos/network/network_type_pattern.h" -namespace chromeos { +namespace ash { namespace tether { @@ -72,4 +72,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/network_list_sorter.h b/ash/components/tether/network_list_sorter.h index 1d4066e7..d105e39 100644 --- a/ash/components/tether/network_list_sorter.h +++ b/ash/components/tether/network_list_sorter.h
@@ -8,9 +8,7 @@ #include "chromeos/components/multidevice/remote_device_ref.h" #include "chromeos/network/network_state_handler.h" -namespace chromeos { - -class NetworkStateHandler; +namespace ash { namespace tether { @@ -34,6 +32,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_NETWORK_LIST_SORTER_H_
diff --git a/ash/components/tether/network_list_sorter_unittest.cc b/ash/components/tether/network_list_sorter_unittest.cc index 5f75ff9..40f7c1c1 100644 --- a/ash/components/tether/network_list_sorter_unittest.cc +++ b/ash/components/tether/network_list_sorter_unittest.cc
@@ -12,7 +12,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/cros_system_api/dbus/service_constants.h" -namespace chromeos { +namespace ash { namespace tether { @@ -131,4 +131,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/notification_presenter.h b/ash/components/tether/notification_presenter.h index 9973e34..3421862 100644 --- a/ash/components/tether/notification_presenter.h +++ b/ash/components/tether/notification_presenter.h
@@ -8,7 +8,7 @@ #include "chromeos/components/multidevice/remote_device_ref.h" #include "chromeos/network/network_state.h" -namespace chromeos { +namespace ash { namespace tether { @@ -65,6 +65,13 @@ } // namespace tether +} // namespace ash + +// TODO(https://crbug.com/1164001): remove when the migration is finished. +namespace chromeos { +namespace tether { +using ::ash::tether::NotificationPresenter; +} // namespace tether } // namespace chromeos #endif // ASH_COMPONENTS_TETHER_NOTIFICATION_PRESENTER_H_
diff --git a/ash/components/tether/notification_remover.cc b/ash/components/tether/notification_remover.cc index 6adc84bc..f511dd2 100644 --- a/ash/components/tether/notification_remover.cc +++ b/ash/components/tether/notification_remover.cc
@@ -7,7 +7,7 @@ #include "ash/components/tether/notification_presenter.h" #include "chromeos/network/network_state_handler.h" -namespace chromeos { +namespace ash { namespace tether { @@ -64,4 +64,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/notification_remover.h b/ash/components/tether/notification_remover.h index 0cbbc4d..55d6ecb 100644 --- a/ash/components/tether/notification_remover.h +++ b/ash/components/tether/notification_remover.h
@@ -7,11 +7,11 @@ #include "ash/components/tether/active_host.h" #include "ash/components/tether/host_scan_cache.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_state_handler.h" #include "chromeos/network/network_state_handler_observer.h" -namespace chromeos { - -class NetworkStateHandler; +namespace ash { namespace tether { @@ -55,6 +55,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_NOTIFICATION_REMOVER_H_
diff --git a/ash/components/tether/notification_remover_unittest.cc b/ash/components/tether/notification_remover_unittest.cc index a39c466..e47742d 100644 --- a/ash/components/tether/notification_remover_unittest.cc +++ b/ash/components/tether/notification_remover_unittest.cc
@@ -17,7 +17,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/cros_system_api/dbus/shill/dbus-constants.h" -namespace chromeos { +namespace ash { namespace tether { @@ -139,4 +139,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/persistent_host_scan_cache.h b/ash/components/tether/persistent_host_scan_cache.h index 5fcb761d..243f75c 100644 --- a/ash/components/tether/persistent_host_scan_cache.h +++ b/ash/components/tether/persistent_host_scan_cache.h
@@ -7,7 +7,7 @@ #include "ash/components/tether/host_scan_cache.h" -namespace chromeos { +namespace ash { namespace tether { @@ -30,6 +30,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_PERSISTENT_HOST_SCAN_CACHE_H_
diff --git a/ash/components/tether/persistent_host_scan_cache_impl.cc b/ash/components/tether/persistent_host_scan_cache_impl.cc index a2c5dfe..f3ef0dae 100644 --- a/ash/components/tether/persistent_host_scan_cache_impl.cc +++ b/ash/components/tether/persistent_host_scan_cache_impl.cc
@@ -13,7 +13,7 @@ #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" -namespace chromeos { +namespace ash { namespace tether { @@ -209,4 +209,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/persistent_host_scan_cache_impl.h b/ash/components/tether/persistent_host_scan_cache_impl.h index 007b9d4..f730eef 100644 --- a/ash/components/tether/persistent_host_scan_cache_impl.h +++ b/ash/components/tether/persistent_host_scan_cache_impl.h
@@ -14,7 +14,7 @@ class PrefRegistrySimple; class PrefService; -namespace chromeos { +namespace ash { namespace tether { @@ -56,6 +56,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_PERSISTENT_HOST_SCAN_CACHE_IMPL_H_
diff --git a/ash/components/tether/persistent_host_scan_cache_impl_unittest.cc b/ash/components/tether/persistent_host_scan_cache_impl_unittest.cc index 5c7f057..0b3e00e2 100644 --- a/ash/components/tether/persistent_host_scan_cache_impl_unittest.cc +++ b/ash/components/tether/persistent_host_scan_cache_impl_unittest.cc
@@ -12,7 +12,7 @@ #include "components/sync_preferences/testing_pref_service_syncable.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -166,4 +166,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/pref_names.cc b/ash/components/tether/pref_names.cc index a47535f..a1c854c 100644 --- a/ash/components/tether/pref_names.cc +++ b/ash/components/tether/pref_names.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/pref_names.h" -namespace chromeos { +namespace ash { namespace tether { @@ -33,4 +33,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/pref_names.h b/ash/components/tether/pref_names.h index 8fde66c..21508a6 100644 --- a/ash/components/tether/pref_names.h +++ b/ash/components/tether/pref_names.h
@@ -5,7 +5,7 @@ #ifndef ASH_COMPONENTS_TETHER_PREF_NAMES_H_ #define ASH_COMPONENTS_TETHER_PREF_NAMES_H_ -namespace chromeos { +namespace ash { namespace tether { @@ -59,6 +59,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_PREF_NAMES_H_
diff --git a/ash/components/tether/proto/tether.proto b/ash/components/tether/proto/tether.proto index ce8a74e..4ee49e6 100644 --- a/ash/components/tether/proto/tether.proto +++ b/ash/components/tether/proto/tether.proto
@@ -6,7 +6,7 @@ syntax = "proto2"; -package chromeos.tether; +package ash.tether; option optimize_for = LITE_RUNTIME;
diff --git a/ash/components/tether/proto_test_util.cc b/ash/components/tether/proto_test_util.cc index ba27f9a..0bf8bac 100644 --- a/ash/components/tether/proto_test_util.cc +++ b/ash/components/tether/proto_test_util.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/proto_test_util.h" -namespace chromeos { +namespace ash { namespace tether { @@ -41,4 +41,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/proto_test_util.h b/ash/components/tether/proto_test_util.h index 06f3250..c66e02e 100644 --- a/ash/components/tether/proto_test_util.h +++ b/ash/components/tether/proto_test_util.h
@@ -7,7 +7,7 @@ #include "ash/components/tether/proto/tether.pb.h" -namespace chromeos { +namespace ash { namespace tether { @@ -32,6 +32,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_PROTO_TEST_UTIL_H_
diff --git a/ash/components/tether/synchronous_shutdown_object_container.h b/ash/components/tether/synchronous_shutdown_object_container.h index b6e5cd0..f4e9793f 100644 --- a/ash/components/tether/synchronous_shutdown_object_container.h +++ b/ash/components/tether/synchronous_shutdown_object_container.h
@@ -5,7 +5,7 @@ #ifndef ASH_COMPONENTS_TETHER_SYNCHRONOUS_SHUTDOWN_OBJECT_CONTAINER_H_ #define ASH_COMPONENTS_TETHER_SYNCHRONOUS_SHUTDOWN_OBJECT_CONTAINER_H_ -namespace chromeos { +namespace ash { namespace tether { @@ -37,6 +37,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_SYNCHRONOUS_SHUTDOWN_OBJECT_CONTAINER_H_
diff --git a/ash/components/tether/synchronous_shutdown_object_container_impl.cc b/ash/components/tether/synchronous_shutdown_object_container_impl.cc index c941323..e447ef4b 100644 --- a/ash/components/tether/synchronous_shutdown_object_container_impl.cc +++ b/ash/components/tether/synchronous_shutdown_object_container_impl.cc
@@ -33,7 +33,7 @@ #include "base/memory/ptr_util.h" #include "base/time/default_clock.h" -namespace chromeos { +namespace ash { namespace tether { @@ -224,4 +224,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/synchronous_shutdown_object_container_impl.h b/ash/components/tether/synchronous_shutdown_object_container_impl.h index 2d50aea..438cc8f 100644 --- a/ash/components/tether/synchronous_shutdown_object_container_impl.h +++ b/ash/components/tether/synchronous_shutdown_object_container_impl.h
@@ -8,6 +8,16 @@ #include <memory> #include "ash/components/tether/synchronous_shutdown_object_container.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_connect.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_state_handler.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_connection_handler.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/device_sync/public/cpp/device_sync_client.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client.h" class PrefService; @@ -15,19 +25,7 @@ class SessionManager; } // namespace session_manager -namespace chromeos { - -namespace device_sync { -class DeviceSyncClient; -} // namespace device_sync - -namespace secure_channel { -class SecureChannelClient; -} // namespace secure_channel - -class NetworkStateHandler; -class NetworkConnect; -class NetworkConnectionHandler; +namespace ash { namespace tether { @@ -157,6 +155,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_SYNCHRONOUS_SHUTDOWN_OBJECT_CONTAINER_IMPL_H_
diff --git a/ash/components/tether/test_timer_factory.cc b/ash/components/tether/test_timer_factory.cc index d40030b..7b29662 100644 --- a/ash/components/tether/test_timer_factory.cc +++ b/ash/components/tether/test_timer_factory.cc
@@ -6,7 +6,7 @@ #include "base/check.h" -namespace chromeos { +namespace ash { namespace tether { TestTimerFactory::TestTimerFactory() = default; @@ -20,4 +20,4 @@ } } // namespace tether -} // namespace chromeos \ No newline at end of file +} // namespace ash
diff --git a/ash/components/tether/test_timer_factory.h b/ash/components/tether/test_timer_factory.h index 7ba731a..eaeaa8f 100644 --- a/ash/components/tether/test_timer_factory.h +++ b/ash/components/tether/test_timer_factory.h
@@ -13,7 +13,7 @@ #include "base/timer/mock_timer.h" #include "base/timer/timer.h" -namespace chromeos { +namespace ash { namespace tether { class TestTimerFactory : public TimerFactory { @@ -43,6 +43,6 @@ }; } // namespace tether -} // namespace chromeos +} // namespace ash -#endif // ASH_COMPONENTS_TETHER_TEST_TIMER_FACTORY_H_ \ No newline at end of file +#endif // ASH_COMPONENTS_TETHER_TEST_TIMER_FACTORY_H_
diff --git a/ash/components/tether/tether_component.cc b/ash/components/tether/tether_component.cc index 1f6b9d96..283f50b 100644 --- a/ash/components/tether/tether_component.cc +++ b/ash/components/tether/tether_component.cc
@@ -4,7 +4,7 @@ #include "ash/components/tether/tether_component.h" -namespace chromeos { +namespace ash { namespace tether { @@ -35,4 +35,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/tether_component.h b/ash/components/tether/tether_component.h index 12828fe..d92c569 100644 --- a/ash/components/tether/tether_component.h +++ b/ash/components/tether/tether_component.h
@@ -7,7 +7,7 @@ #include "base/observer_list.h" -namespace chromeos { +namespace ash { namespace tether { @@ -64,6 +64,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_TETHER_COMPONENT_H_
diff --git a/ash/components/tether/tether_component_impl.cc b/ash/components/tether/tether_component_impl.cc index 60f13c9..b429414f 100644 --- a/ash/components/tether/tether_component_impl.cc +++ b/ash/components/tether/tether_component_impl.cc
@@ -24,7 +24,7 @@ #include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client.h" #include "components/pref_registry/pref_registry_syncable.h" -namespace chromeos { +namespace ash { namespace tether { @@ -245,4 +245,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/tether_component_impl.h b/ash/components/tether/tether_component_impl.h index 867d1fe..3fd30d5 100644 --- a/ash/components/tether/tether_component_impl.h +++ b/ash/components/tether/tether_component_impl.h
@@ -10,6 +10,18 @@ #include "ash/components/tether/tether_component.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/managed_network_configuration_handler.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_connect.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_connection_handler.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_state_handler.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/device_sync/public/cpp/device_sync_client.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client.h" #include "components/prefs/pref_registry_simple.h" #include "device/bluetooth/bluetooth_adapter.h" @@ -23,20 +35,7 @@ class PrefRegistrySyncable; } // namespace user_prefs -namespace chromeos { - -class ManagedNetworkConfigurationHandler; -class NetworkConnect; -class NetworkConnectionHandler; -class NetworkStateHandler; - -namespace device_sync { -class DeviceSyncClient; -} // namespace device_sync - -namespace secure_channel { -class SecureChannelClient; -} // namespace secure_channel +namespace ash { namespace tether { @@ -136,6 +135,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_TETHER_COMPONENT_IMPL_H_
diff --git a/ash/components/tether/tether_component_impl_unittest.cc b/ash/components/tether/tether_component_impl_unittest.cc index 305297f..6a95408 100644 --- a/ash/components/tether/tether_component_impl_unittest.cc +++ b/ash/components/tether/tether_component_impl_unittest.cc
@@ -20,7 +20,7 @@ #include "base/memory/ptr_util.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -310,4 +310,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/tether_connector.h b/ash/components/tether/tether_connector.h index d1efd13..1bae209 100644 --- a/ash/components/tether/tether_connector.h +++ b/ash/components/tether/tether_connector.h
@@ -8,7 +8,7 @@ #include "base/callback_forward.h" #include "chromeos/network/network_connection_handler.h" -namespace chromeos { +namespace ash { namespace tether { @@ -40,6 +40,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_TETHER_CONNECTOR_H_
diff --git a/ash/components/tether/tether_connector_impl.cc b/ash/components/tether/tether_connector_impl.cc index d86d3ff..084971f 100644 --- a/ash/components/tether/tether_connector_impl.cc +++ b/ash/components/tether/tether_connector_impl.cc
@@ -21,7 +21,7 @@ #include "chromeos/network/network_state.h" #include "chromeos/network/network_state_handler.h" -namespace chromeos { +namespace ash { namespace tether { @@ -450,4 +450,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/tether_connector_impl.h b/ash/components/tether/tether_connector_impl.h index d8cba93..4d3f653 100644 --- a/ash/components/tether/tether_connector_impl.h +++ b/ash/components/tether/tether_connector_impl.h
@@ -10,19 +10,15 @@ #include "ash/components/tether/tether_connector.h" #include "base/memory/weak_ptr.h" #include "chromeos/network/network_connection_handler.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_state_handler.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/device_sync/public/cpp/device_sync_client.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client.h" #include "third_party/abseil-cpp/absl/types/optional.h" -namespace chromeos { - -class NetworkStateHandler; - -namespace device_sync { -class DeviceSyncClient; -} // namespace device_sync - -namespace secure_channel { -class SecureChannelClient; -} // namespace secure_channel +namespace ash { namespace tether { @@ -127,6 +123,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_TETHER_CONNECTOR_IMPL_H_
diff --git a/ash/components/tether/tether_connector_impl_unittest.cc b/ash/components/tether/tether_connector_impl_unittest.cc index 8e545b9..48b1c306 100644 --- a/ash/components/tether/tether_connector_impl_unittest.cc +++ b/ash/components/tether/tether_connector_impl_unittest.cc
@@ -36,7 +36,7 @@ using testing::StrictMock; -namespace chromeos { +namespace ash { namespace tether { @@ -836,4 +836,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/tether_disconnector.h b/ash/components/tether/tether_disconnector.h index 34de2c88..dbd9c72 100644 --- a/ash/components/tether/tether_disconnector.h +++ b/ash/components/tether/tether_disconnector.h
@@ -13,7 +13,7 @@ #include "base/memory/weak_ptr.h" #include "chromeos/network/network_connection_handler.h" -namespace chromeos { +namespace ash { namespace tether { @@ -44,6 +44,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_TETHER_DISCONNECTOR_H_
diff --git a/ash/components/tether/tether_disconnector_impl.cc b/ash/components/tether/tether_disconnector_impl.cc index f8c1dc5d3..2e002701 100644 --- a/ash/components/tether/tether_disconnector_impl.cc +++ b/ash/components/tether/tether_disconnector_impl.cc
@@ -17,7 +17,7 @@ #include "chromeos/network/network_state.h" #include "chromeos/network/network_state_handler.h" -namespace chromeos { +namespace ash { namespace tether { @@ -119,4 +119,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/tether_disconnector_impl.h b/ash/components/tether/tether_disconnector_impl.h index 6dca7a0..3daa691 100644 --- a/ash/components/tether/tether_disconnector_impl.h +++ b/ash/components/tether/tether_disconnector_impl.h
@@ -13,7 +13,7 @@ #include "base/callback_forward.h" #include "base/memory/weak_ptr.h" -namespace chromeos { +namespace ash { namespace tether { @@ -65,6 +65,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_TETHER_DISCONNECTOR_IMPL_H_
diff --git a/ash/components/tether/tether_disconnector_impl_unittest.cc b/ash/components/tether/tether_disconnector_impl_unittest.cc index 92d62a8..f942d8bf 100644 --- a/ash/components/tether/tether_disconnector_impl_unittest.cc +++ b/ash/components/tether/tether_disconnector_impl_unittest.cc
@@ -18,7 +18,7 @@ #include "chromeos/components/multidevice/remote_device_test_util.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -261,4 +261,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/tether_host_fetcher.cc b/ash/components/tether/tether_host_fetcher.cc index 718a8f7..e98af797 100644 --- a/ash/components/tether/tether_host_fetcher.cc +++ b/ash/components/tether/tether_host_fetcher.cc
@@ -9,7 +9,7 @@ #include "base/callback.h" #include "chromeos/components/multidevice/logging/logging.h" -namespace chromeos { +namespace ash { namespace tether { @@ -53,4 +53,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/tether_host_fetcher.h b/ash/components/tether/tether_host_fetcher.h index bef12061f..d0de5e6 100644 --- a/ash/components/tether/tether_host_fetcher.h +++ b/ash/components/tether/tether_host_fetcher.h
@@ -12,7 +12,7 @@ #include "chromeos/components/multidevice/remote_device_ref.h" #include "third_party/abseil-cpp/absl/types/optional.h" -namespace chromeos { +namespace ash { namespace tether { @@ -69,6 +69,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_TETHER_HOST_FETCHER_H_
diff --git a/ash/components/tether/tether_host_fetcher_impl.cc b/ash/components/tether/tether_host_fetcher_impl.cc index 8641fecb..fffd7e57 100644 --- a/ash/components/tether/tether_host_fetcher_impl.cc +++ b/ash/components/tether/tether_host_fetcher_impl.cc
@@ -9,7 +9,7 @@ #include "base/memory/ptr_util.h" #include "chromeos/components/multidevice/remote_device.h" -namespace chromeos { +namespace ash { namespace tether { @@ -113,4 +113,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/tether_host_fetcher_impl.h b/ash/components/tether/tether_host_fetcher_impl.h index b0dd3fc..3e3a465 100644 --- a/ash/components/tether/tether_host_fetcher_impl.h +++ b/ash/components/tether/tether_host_fetcher_impl.h
@@ -13,7 +13,7 @@ #include "chromeos/services/device_sync/public/cpp/device_sync_client.h" #include "chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client.h" -namespace chromeos { +namespace ash { namespace tether { @@ -91,6 +91,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_TETHER_HOST_FETCHER_IMPL_H_
diff --git a/ash/components/tether/tether_host_fetcher_impl_unittest.cc b/ash/components/tether/tether_host_fetcher_impl_unittest.cc index af8f769..c0af18f 100644 --- a/ash/components/tether/tether_host_fetcher_impl_unittest.cc +++ b/ash/components/tether/tether_host_fetcher_impl_unittest.cc
@@ -20,12 +20,15 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" -namespace chromeos { +namespace ash { namespace tether { namespace { +// TODO(https://crbug.com/1164001): remove when multidevice_setup moved to ash +namespace multidevice_setup = ::chromeos::multidevice_setup; + const size_t kNumTestDevices = 5; class TestObserver : public TetherHostFetcher::Observer { @@ -308,4 +311,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/tether_host_response_recorder.cc b/ash/components/tether/tether_host_response_recorder.cc index 8efcf07..f91e114 100644 --- a/ash/components/tether/tether_host_response_recorder.cc +++ b/ash/components/tether/tether_host_response_recorder.cc
@@ -11,7 +11,7 @@ #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" -namespace chromeos { +namespace ash { namespace tether { @@ -126,4 +126,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/tether_host_response_recorder.h b/ash/components/tether/tether_host_response_recorder.h index 326637d..4857bcc 100644 --- a/ash/components/tether/tether_host_response_recorder.h +++ b/ash/components/tether/tether_host_response_recorder.h
@@ -17,7 +17,7 @@ class PrefRegistrySyncable; } // namespace user_prefs -namespace chromeos { +namespace ash { namespace tether { @@ -92,6 +92,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_TETHER_HOST_RESPONSE_RECORDER_H_
diff --git a/ash/components/tether/tether_host_response_recorder_unittest.cc b/ash/components/tether/tether_host_response_recorder_unittest.cc index b118e1d2a..44086edc 100644 --- a/ash/components/tether/tether_host_response_recorder_unittest.cc +++ b/ash/components/tether/tether_host_response_recorder_unittest.cc
@@ -12,7 +12,7 @@ #include "components/sync_preferences/testing_pref_service_syncable.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -176,4 +176,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/tether_network_disconnection_handler.cc b/ash/components/tether/tether_network_disconnection_handler.cc index 85b7e82..2dd23c1 100644 --- a/ash/components/tether/tether_network_disconnection_handler.cc +++ b/ash/components/tether/tether_network_disconnection_handler.cc
@@ -19,7 +19,7 @@ #include "chromeos/network/network_state.h" #include "chromeos/network/network_state_handler.h" -namespace chromeos { +namespace ash { namespace tether { @@ -96,4 +96,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/tether_network_disconnection_handler.h b/ash/components/tether/tether_network_disconnection_handler.h index 76f137d4..5a82e62 100644 --- a/ash/components/tether/tether_network_disconnection_handler.h +++ b/ash/components/tether/tether_network_disconnection_handler.h
@@ -7,15 +7,15 @@ #include "ash/components/tether/active_host.h" #include "base/memory/weak_ptr.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_state_handler.h" #include "chromeos/network/network_state_handler_observer.h" namespace base { class TaskRunner; } // namespace base -namespace chromeos { - -class NetworkStateHandler; +namespace ash { namespace tether { @@ -70,6 +70,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_TETHER_NETWORK_DISCONNECTION_HANDLER_H_
diff --git a/ash/components/tether/tether_network_disconnection_handler_unittest.cc b/ash/components/tether/tether_network_disconnection_handler_unittest.cc index e1e6127..fc0b29f 100644 --- a/ash/components/tether/tether_network_disconnection_handler_unittest.cc +++ b/ash/components/tether/tether_network_disconnection_handler_unittest.cc
@@ -22,7 +22,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/cros_system_api/dbus/shill/dbus-constants.h" -namespace chromeos { +namespace ash { namespace tether { @@ -187,4 +187,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/tether_session_completion_logger.cc b/ash/components/tether/tether_session_completion_logger.cc index 644bb6fb..d0ee42f3 100644 --- a/ash/components/tether/tether_session_completion_logger.cc +++ b/ash/components/tether/tether_session_completion_logger.cc
@@ -6,7 +6,7 @@ #include "base/metrics/histogram_macros.h" -namespace chromeos { +namespace ash { namespace tether { @@ -23,4 +23,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/tether_session_completion_logger.h b/ash/components/tether/tether_session_completion_logger.h index 12ac14a..e25132a 100644 --- a/ash/components/tether/tether_session_completion_logger.h +++ b/ash/components/tether/tether_session_completion_logger.h
@@ -5,7 +5,7 @@ #ifndef ASH_COMPONENTS_TETHER_TETHER_SESSION_COMPLETION_LOGGER_H_ #define ASH_COMPONENTS_TETHER_TETHER_SESSION_COMPLETION_LOGGER_H_ -namespace chromeos { +namespace ash { namespace tether { @@ -45,6 +45,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_TETHER_SESSION_COMPLETION_LOGGER_H_
diff --git a/ash/components/tether/tether_session_completion_logger_unittest.cc b/ash/components/tether/tether_session_completion_logger_unittest.cc index 1594499..4ce010da 100644 --- a/ash/components/tether/tether_session_completion_logger_unittest.cc +++ b/ash/components/tether/tether_session_completion_logger_unittest.cc
@@ -9,7 +9,7 @@ #include "base/test/metrics/histogram_tester.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -106,4 +106,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/timer_factory.cc b/ash/components/tether/timer_factory.cc index cde74820..ea687be 100644 --- a/ash/components/tether/timer_factory.cc +++ b/ash/components/tether/timer_factory.cc
@@ -6,7 +6,7 @@ #include <memory> -namespace chromeos { +namespace ash { namespace tether { @@ -18,4 +18,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/timer_factory.h b/ash/components/tether/timer_factory.h index 443a79a6..43880127 100644 --- a/ash/components/tether/timer_factory.h +++ b/ash/components/tether/timer_factory.h
@@ -10,7 +10,7 @@ #include "base/memory/ptr_util.h" #include "base/timer/timer.h" -namespace chromeos { +namespace ash { namespace tether { @@ -26,6 +26,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_TIMER_FACTORY_H_
diff --git a/ash/components/tether/top_level_host_scan_cache.cc b/ash/components/tether/top_level_host_scan_cache.cc index 8e98f175..bc405c4 100644 --- a/ash/components/tether/top_level_host_scan_cache.cc +++ b/ash/components/tether/top_level_host_scan_cache.cc
@@ -13,7 +13,7 @@ #include "base/memory/ptr_util.h" #include "chromeos/components/multidevice/logging/logging.h" -namespace chromeos { +namespace ash { namespace tether { @@ -200,4 +200,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/top_level_host_scan_cache.h b/ash/components/tether/top_level_host_scan_cache.h index d15eb50..97320b5 100644 --- a/ash/components/tether/top_level_host_scan_cache.h +++ b/ash/components/tether/top_level_host_scan_cache.h
@@ -15,7 +15,7 @@ #include "base/memory/weak_ptr.h" #include "base/timer/timer.h" -namespace chromeos { +namespace ash { namespace tether { @@ -86,6 +86,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_TOP_LEVEL_HOST_SCAN_CACHE_H_
diff --git a/ash/components/tether/top_level_host_scan_cache_unittest.cc b/ash/components/tether/top_level_host_scan_cache_unittest.cc index 5e78c3c4..545b796 100644 --- a/ash/components/tether/top_level_host_scan_cache_unittest.cc +++ b/ash/components/tether/top_level_host_scan_cache_unittest.cc
@@ -21,7 +21,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { +namespace ash { namespace tether { @@ -363,4 +363,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/wifi_hotspot_connector.cc b/ash/components/tether/wifi_hotspot_connector.cc index 1506cd0..faa56397 100644 --- a/ash/components/tether/wifi_hotspot_connector.cc +++ b/ash/components/tether/wifi_hotspot_connector.cc
@@ -21,7 +21,7 @@ #include "chromeos/network/shill_property_util.h" #include "third_party/cros_system_api/dbus/shill/dbus-constants.h" -namespace chromeos { +namespace ash { namespace tether { @@ -301,4 +301,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/wifi_hotspot_connector.h b/ash/components/tether/wifi_hotspot_connector.h index 7230f0f..32631c04 100644 --- a/ash/components/tether/wifi_hotspot_connector.h +++ b/ash/components/tether/wifi_hotspot_connector.h
@@ -12,17 +12,19 @@ #include "base/time/clock.h" #include "base/timer/timer.h" #include "base/values.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_connect.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_state.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_state_handler.h" #include "chromeos/network/network_state_handler_observer.h" namespace base { class TaskRunner; } // namespace base -namespace chromeos { - -class NetworkConnect; -class NetworkState; -class NetworkStateHandler; +namespace ash { namespace tether { @@ -97,6 +99,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_WIFI_HOTSPOT_CONNECTOR_H_
diff --git a/ash/components/tether/wifi_hotspot_connector_unittest.cc b/ash/components/tether/wifi_hotspot_connector_unittest.cc index 338a9d8..1160690 100644 --- a/ash/components/tether/wifi_hotspot_connector_unittest.cc +++ b/ash/components/tether/wifi_hotspot_connector_unittest.cc
@@ -25,7 +25,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/cros_system_api/dbus/shill/dbus-constants.h" -namespace chromeos { +namespace ash { namespace tether { @@ -824,4 +824,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/wifi_hotspot_disconnector.h b/ash/components/tether/wifi_hotspot_disconnector.h index e7fd127..2198ec7 100644 --- a/ash/components/tether/wifi_hotspot_disconnector.h +++ b/ash/components/tether/wifi_hotspot_disconnector.h
@@ -8,7 +8,7 @@ #include "base/callback.h" #include "chromeos/network/network_connection_handler.h" -namespace chromeos { +namespace ash { namespace tether { @@ -36,6 +36,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_WIFI_HOTSPOT_DISCONNECTOR_H_
diff --git a/ash/components/tether/wifi_hotspot_disconnector_impl.cc b/ash/components/tether/wifi_hotspot_disconnector_impl.cc index 4fd948f..a68e6909 100644 --- a/ash/components/tether/wifi_hotspot_disconnector_impl.cc +++ b/ash/components/tether/wifi_hotspot_disconnector_impl.cc
@@ -15,7 +15,7 @@ #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" -namespace chromeos { +namespace ash { namespace tether { @@ -133,4 +133,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/components/tether/wifi_hotspot_disconnector_impl.h b/ash/components/tether/wifi_hotspot_disconnector_impl.h index 620c7e1..108e41ba 100644 --- a/ash/components/tether/wifi_hotspot_disconnector_impl.h +++ b/ash/components/tether/wifi_hotspot_disconnector_impl.h
@@ -7,14 +7,15 @@ #include "ash/components/tether/wifi_hotspot_disconnector.h" #include "base/memory/weak_ptr.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_connection_handler.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_state_handler.h" class PrefRegistrySimple; class PrefService; -namespace chromeos { - -class NetworkConnectionHandler; -class NetworkStateHandler; +namespace ash { namespace tether { @@ -68,6 +69,6 @@ } // namespace tether -} // namespace chromeos +} // namespace ash #endif // ASH_COMPONENTS_TETHER_WIFI_HOTSPOT_DISCONNECTOR_IMPL_H_
diff --git a/ash/components/tether/wifi_hotspot_disconnector_impl_unittest.cc b/ash/components/tether/wifi_hotspot_disconnector_impl_unittest.cc index a3745f6..ec9acd5 100644 --- a/ash/components/tether/wifi_hotspot_disconnector_impl_unittest.cc +++ b/ash/components/tether/wifi_hotspot_disconnector_impl_unittest.cc
@@ -20,7 +20,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/cros_system_api/dbus/shill/dbus-constants.h" -namespace chromeos { +namespace ash { namespace tether { @@ -281,4 +281,4 @@ } // namespace tether -} // namespace chromeos +} // namespace ash
diff --git a/ash/constants/ash_pref_names.cc b/ash/constants/ash_pref_names.cc index 2d66986..c5b4eb3 100644 --- a/ash/constants/ash_pref_names.cc +++ b/ash/constants/ash_pref_names.cc
@@ -431,9 +431,11 @@ "managed_session.privacy_warning_enabled"; // Boolean pref indicating whether the user has enabled detection of snooping -// over their shoulder. +// over their shoulder, and hiding of notifications when a snooper is detected. const char kSnoopingProtectionEnabled[] = "ash.privacy.snooping_protection_enabled"; +const char kSnoopingProtectionNotificationSuppressionEnabled[] = + "ash.privacy.snooping_protection_notification_suppression_enabled"; // A string pref storing the type of lock screen notification mode. // "show" -> show notifications on the lock screen
diff --git a/ash/constants/ash_pref_names.h b/ash/constants/ash_pref_names.h index ab5c81e..bed1800c 100644 --- a/ash/constants/ash_pref_names.h +++ b/ash/constants/ash_pref_names.h
@@ -214,6 +214,8 @@ COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kSnoopingProtectionEnabled[]; +COMPONENT_EXPORT(ASH_CONSTANTS) +extern const char kSnoopingProtectionNotificationSuppressionEnabled[]; // Lock screen notification settings. COMPONENT_EXPORT(ASH_CONSTANTS)
diff --git a/ash/constants/ash_switches.cc b/ash/constants/ash_switches.cc index 70411c93..40072fa 100644 --- a/ash/constants/ash_switches.cc +++ b/ash/constants/ash_switches.cc
@@ -469,6 +469,12 @@ const char kEnterpriseEnrollmentModulusLimit[] = "enterprise-enrollment-modulus-limit"; +// Disallow blocking developer mode through enterprise device policy: +// - Fail enterprise enrollment if enrolling would block dev mode. +// - Don't apply new device policy if it would block dev mode. +// This is only usable on test builds. +const char kDisallowPolicyBlockDevMode[] = "disallow-policy-block-dev-mode"; + // Write extension install events to chrome log for integration test. const char kExtensionInstallEventChromeLogForTests[] = "extension-install-event-chrome-log-for-tests";
diff --git a/ash/constants/ash_switches.h b/ash/constants/ash_switches.h index a010a01..b6636ce 100644 --- a/ash/constants/ash_switches.h +++ b/ash/constants/ash_switches.h
@@ -159,6 +159,8 @@ COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kEnterpriseEnrollmentModulusLimit[]; COMPONENT_EXPORT(ASH_CONSTANTS) +extern const char kDisallowPolicyBlockDevMode[]; +COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kExtensionInstallEventChromeLogForTests[]; COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kExternalMetricsCollectionInterval[];
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb index fd9722bd..183c851f1 100644 --- a/ash/strings/ash_strings_af.xtb +++ b/ash/strings/ash_strings_af.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">Lessenaar 7</translation> <translation id="2224075387478458881">Skermopname word nie toegelaat wanneer beskermde inhoud sigbaar is nie</translation> <translation id="225680501294068881">Skandeer tans vir toestelle …</translation> +<translation id="2257486738914982088">Kon nie <ph name="FILENAME" /> aflaai nie</translation> <translation id="2268130516524549846">Bluetooth gedeaktiveer</translation> <translation id="2268813581635650749">Meld almal af</translation> <translation id="2269016722240250274">'n Program gebruik tans jou mikrofoon</translation> @@ -588,6 +589,7 @@ <translation id="4831034276697007977">Is jy seker jy wil outomatiese klikke afskakel?</translation> <translation id="4849058404725798627">Lig voorwerp met sleutelbordfokus uit</translation> <translation id="485592688953820832">Geen handeling nie (onderbreek)</translation> +<translation id="4860284199500934869">Gaan jou netwerkverbinding na om <ph name="FILENAME" /> af te laai</translation> <translation id="486056901304535126">Sal later probeer aflaai. Spraak sal na Google toe gestuur word vir verwerking totdat aflaai voltooi is.</translation> <translation id="4868492592575313542">geaktiveer</translation> <translation id="4872237917498892622">Alt+Search of Shift</translation> @@ -805,6 +807,7 @@ <translation id="6452181791372256707">Verwerp</translation> <translation id="6453179446719226835">Taal is verander</translation> <translation id="6459472438155181876">Brei skerm na <ph name="DISPLAY_NAME" /> uit</translation> +<translation id="6477681113376365978">Kan nie lêer aflaai nie</translation> <translation id="6482559668224714696">Volskermvergrootglas</translation> <translation id="6490471652906364588">USB C-toestel (poort aan regterkant)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> vereis dat jy hierdie <ph name="DEVICE_TYPE" /> voor die spertyd opdateer</translation> @@ -818,6 +821,8 @@ <translation id="6537924328260219877">Seinsterkte <ph name="SIGNAL_STRENGTH" />, foonbattery <ph name="BATTERY_STATUS" /></translation> <translation id="6539852571005954999">Laai <ph name="FILENAME" /> af wat tans skandeer</translation> <translation id="6542521951477560771">Saai tans uit na <ph name="RECEIVER_NAME" /></translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +Nuwe installasie</translation> <translation id="6559976592393364813">Vra administrateur</translation> <translation id="6565007273808762236">e-SIM-verbinding is nie beskikbaar nie</translation> <translation id="6570831796530454248">{0,plural, =1{Dateer toestel binne 'n uur op}other{Dateer toestel binne # uur op}}</translation> @@ -849,6 +854,7 @@ <translation id="6723839937902243910">Intensiteit</translation> <translation id="6727969043791803658">Gekoppel, <ph name="BATTERY_PERCENTAGE" />% batterykrag</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6739144137573853180">GAAN NA INSTELLINGS</translation> <translation id="6751052314767925245">Afgedwing deur jou administrateur</translation> <translation id="6751826523481687655">Werkverrigtingnasporing is aangeskakel</translation> <translation id="6752912906630585008">Lessenaar <ph name="REMOVED_DESK" /> is verwyder en met lessenaar <ph name="RECEIVE_DESK" /> saamgevoeg</translation> @@ -984,6 +990,7 @@ <translation id="7662283695561029522">Tik om op te stel</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">Voeg nuwe selnetwerk by</translation> +<translation id="7720410380936703141">PROBEER WEER</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 kennisgewing}other{# kennisgewings}}</translation> <translation id="7724603315864178912">Knip</translation> <translation id="7745560842763881396">Wys programme op rak</translation> @@ -1170,6 +1177,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">Gebruik tans <ph name="IME_NAME" /></translation> <translation id="899350903320462459">Ontsluit toestel as <ph name="LOGIN_ID" /> om die kennisgewinghandeling uit te voer</translation> +<translation id="9000771174482730261">BESTUUR BERGING</translation> <translation id="9017320285115481645">Voer die Family Link-ouertoegangskode in.</translation> <translation id="9024331582947483881">volskerm</translation> <translation id="9047624247355796468">Maak instellings oop vir <ph name="NETWORK_NAME" /></translation> @@ -1215,6 +1223,7 @@ <translation id="938963181863597773">Wat is op my kalender?</translation> <translation id="945522503751344254">Stuur terugvoer</translation> <translation id="951991426597076286">Weier</translation> +<translation id="954052413789300507">Nie genoeg spasie vir <ph name="FILENAME" /> nie. Maak spasie beskikbaar.</translation> <translation id="974545358917229949">Wys tans <ph name="RESULT_COUNT" /> resultate vir <ph name="QUERY" /></translation> <translation id="98515147261107953">Landskap</translation> <translation id="990277280839877440">Venster <ph name="WINDOW_TITILE" /> is gesluit.</translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index a75523bd..af0b423 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">ዴስክ 7</translation> <translation id="2224075387478458881">ጥበቃ የሚደረግለት ይዘት በሚታይበት ጊዜ የማያ ገጽ ቀረጻ አይፈቀድም</translation> <translation id="225680501294068881">መሣሪያዎችን በመቃኘት ላይ...</translation> +<translation id="2257486738914982088"><ph name="FILENAME" />ን በማውረድ ላይ ሳለ የሆነ ችግር ተፈጥሯል</translation> <translation id="2268130516524549846">ብሉቱዝ ተሰናክሏል</translation> <translation id="2268813581635650749">ሁሉንም ዘግተህ ውጣ</translation> <translation id="2269016722240250274">አንድ መተግበሪያ ማይክሮፎንዎን እየተጠቀመ ነው</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">ራስሰር ጠቅ ማድረጎችን ማጥፋት እንደሚፈልጉ እርግጠኛ ነዎት?</translation> <translation id="4849058404725798627">ነገርየውን ከቁልፍ ሰሌዳ ትኩረት ጋር አድምቅ</translation> <translation id="485592688953820832">ምንም እርምጃ የለም (ባለበት አቁም)</translation> +<translation id="4860284199500934869"><ph name="FILENAME" />ን ለማውረድ የአውታረ መረብ ግንኙነትዎን ያረጋግጡ</translation> <translation id="486056901304535126">ማውረድ በኋላ ላይ ይሞከራል። ማውረድ እስኪጠናቀቅ ድረስ ንግግር ለመሰናዳት ወደ Google ይላካል።</translation> <translation id="4868492592575313542">ገብሯል</translation> <translation id="4872237917498892622">Alt+Search ወይም Shift</translation> @@ -804,6 +806,7 @@ <translation id="6452181791372256707">አይቀበሉ</translation> <translation id="6453179446719226835">ቋንቋ ተለውጧል</translation> <translation id="6459472438155181876">ማያ ገጽ ወደ <ph name="DISPLAY_NAME" /> በመቀጠል ላይ</translation> +<translation id="6477681113376365978">ፋይል ማውረድ አልተቻለም</translation> <translation id="6482559668224714696">የሙሉ ማያ ገጽ ማጉያ</translation> <translation id="6490471652906364588">USB-C መሣሪያ (የቀኝ ወደብ)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> የእርስዎን <ph name="DEVICE_TYPE" /> ከቀነገደቡ በፊት እንዲያዘምኑት ይፈልግብዎታል።</translation> @@ -817,6 +820,8 @@ <translation id="6537924328260219877">የሲግናል ጥንካሬ <ph name="SIGNAL_STRENGTH" />፣ የስልክ ባትሪ <ph name="BATTERY_STATUS" /></translation> <translation id="6539852571005954999">እየተቃኘ ያለ <ph name="FILENAME" /> ያውርዱ</translation> <translation id="6542521951477560771">ወደ <ph name="RECEIVER_NAME" /> cast በማድረግ ላይ</translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +አዲስ ጭነት</translation> <translation id="6559976592393364813">አስተዳዳሪን ይጠይቁ</translation> <translation id="6565007273808762236">ኢሲም ግንኙነት አይገኝም</translation> <translation id="6570831796530454248">{0,plural, =1{በአንድ ሰዓት ውስጥ መሣሪያን ያዘምኑ}one{በ# ሰዓታት ውስጥ መሣሪያን ያዘምኑ}other{በ# ሰዓታት ውስጥ መሣሪያን ያዘምኑ}}</translation> @@ -848,6 +853,7 @@ <translation id="6723839937902243910">ኃይል</translation> <translation id="6727969043791803658">ተገናኝቷል፣ <ph name="BATTERY_PERCENTAGE" />% ባትሪ</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6739144137573853180">ወደ ቅንብሮች ሂድ</translation> <translation id="6751052314767925245">በእርስዎ አስተዳዳሪ ተፈጻሚ የተደረገ</translation> <translation id="6751826523481687655">የአፈጻጸም ክትትል በርቷል</translation> <translation id="6752912906630585008">ዴስክ <ph name="REMOVED_DESK" /> ተወግዶ ከዴስክ <ph name="RECEIVE_DESK" /> ጋር ተዋህዷል</translation> @@ -983,6 +989,7 @@ <translation id="7662283695561029522">ለማዋቀር መታ ያድርጉ</translation> <translation id="7705524343798198388">ቪ ፒ ኤን</translation> <translation id="7714767791242455379">አዲስ የተንቀሳቃሽ ስልክ አውታረ መረብን አክል</translation> +<translation id="7720410380936703141">እንደገና ይሞክሩ</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 ማሳወቂያ}one{# ማሳወቂያዎች}other{# ማሳወቂያዎች}}</translation> <translation id="7724603315864178912">ቁረጥ</translation> <translation id="7745560842763881396">መተግበሪያዎችን በመደርደሪያ አሳይ</translation> @@ -1169,6 +1176,7 @@ <translation id="8983038754672563810">ኤችኤስፒኤ</translation> <translation id="8990809378771970590"><ph name="IME_NAME" />ን በመጠቀም ላይ</translation> <translation id="899350903320462459">የማሳወቅ እርምጃውን ለማከናወን መሣሪያን እንደ <ph name="LOGIN_ID" /> ይክፈቱ</translation> +<translation id="9000771174482730261">ማከማቻን ያቀናብሩ</translation> <translation id="9017320285115481645">የ Family Link ወላጅ መዳረሻ ኮድ ያስገቡ።</translation> <translation id="9024331582947483881">ሙሉ ገጽ ማያ</translation> <translation id="9047624247355796468">ለ <ph name="NETWORK_NAME" /> ቅንብሮችን ክፈት</translation> @@ -1214,6 +1222,7 @@ <translation id="938963181863597773">የቀን መቁጠሪያዬ ላይ ምን አለ?</translation> <translation id="945522503751344254">ግብረመልስ ላክ</translation> <translation id="951991426597076286">አትቀበል</translation> +<translation id="954052413789300507">ለ<ph name="FILENAME" /> በቂ ቦታ የለም። ቦታ ያስለቅቁ።</translation> <translation id="974545358917229949">ለ<ph name="RESULT_COUNT" /> ውጤቶችን ለ<ph name="QUERY" /> በማሳየት ላይ</translation> <translation id="98515147261107953">በወርድ</translation> <translation id="990277280839877440">መስኮት <ph name="WINDOW_TITILE" /> ተዘግቷል።</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb index c186a81..8df3742d 100644 --- a/ash/strings/ash_strings_as.xtb +++ b/ash/strings/ash_strings_as.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">ডেস্ক ৭</translation> <translation id="2224075387478458881">সুৰক্ষিত সমল দৃশ্যমান হৈ থকাৰ সময়ত স্ক্ৰীন ৰেকৰ্ডিঙৰ অনুমতি দিয়া নহয়</translation> <translation id="225680501294068881">ডিভাইচসমূহৰ বাবে স্কেন কৰি থকা হৈছে...</translation> +<translation id="2257486738914982088"><ph name="FILENAME" /> ডাউনল’ড কৰি থাকোঁতে কিবা ভুল হৈছে</translation> <translation id="2268130516524549846">ব্লুটুথ অক্ষম কৰা হ’ল</translation> <translation id="2268813581635650749">সকলো ছাইন আউট কৰক</translation> <translation id="2269016722240250274">এটা এপ্লিকেশ্বনে আপোনাৰ মাইক্ৰ’ফ’নটো ব্যৱহাৰ কৰি আছে</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">আপুনি স্বয়ংক্ৰিয়ভাৱে ক্লিক অফ কৰিব বিচাৰে বুলি নিশ্চিতনে?</translation> <translation id="4849058404725798627">কীব’ৰ্ডৰ ফ’কাছেৰে বস্তু হাইলাইট কৰক</translation> <translation id="485592688953820832">কোনো কাৰ্য নাই (পজ)</translation> +<translation id="4860284199500934869"><ph name="FILENAME" /> ডাউনল’ড কৰিবলৈ আপোনাৰ নেটৱৰ্ক সংযোগ পৰীক্ষা কৰক</translation> <translation id="486056901304535126">পাছত ডাউনল’ড কৰিবলৈ প্ৰয়াস কৰা হ’ব। ডাউনল’ড সম্পূৰ্ণ নোহোৱা পৰ্যন্ত প্ৰক্ৰিয়াকৰণৰ বাবে Googleলৈ কথন পঠিওৱা হ’ব।</translation> <translation id="4868492592575313542">সক্ৰিয় কৰা হৈছে</translation> <translation id="4872237917498892622">Alt+Search বা Shift</translation> @@ -804,6 +806,7 @@ <translation id="6452181791372256707">প্ৰত্যাখ্যান কৰক</translation> <translation id="6453179446719226835">ভাষা সলনি কৰা হৈছে</translation> <translation id="6459472438155181876">স্ক্রীণখন <ph name="DISPLAY_NAME" />লৈ বিস্তাৰ কৰা হৈছে</translation> +<translation id="6477681113376365978">ফাইল ডাউনল’ড কৰিব নোৱাৰি</translation> <translation id="6482559668224714696">সম্পূর্ণ স্ক্ৰীণৰ বিৱৰ্ধক</translation> <translation id="6490471652906364588">USB-C ডিভাইচ (সোঁফালৰ পর্ট)</translation> <translation id="6491071886865974820"><ph name="MANAGER" />ৰ বাবে আপুনি নিৰ্ধাৰিত সময়সীমা পাৰ হোৱাৰ পূৰ্বে এই <ph name="DEVICE_TYPE" />টো আপডে’ট কৰাৰ আৱশ্যক</translation> @@ -816,6 +819,8 @@ <translation id="65320610082834431">ইম'জিসমূহ</translation> <translation id="6537924328260219877">ছিগনেলৰ ক্ষমতা <ph name="SIGNAL_STRENGTH" />, ফ’নৰ বেটাৰী <ph name="BATTERY_STATUS" /></translation> <translation id="6542521951477560771"><ph name="RECEIVER_NAME" /> লৈ কাষ্ট কৰি থকা হৈছে</translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +নতুনকৈ ইনষ্টল কৰা</translation> <translation id="6559976592393364813">প্ৰশাসকক সোধক</translation> <translation id="6565007273808762236">ই-ছিমৰ সংযোগ উপলব্ধ নহয়</translation> <translation id="6570831796530454248">{0,plural, =1{এঘণ্টাৰ ভিতৰত ডিভাইচটো আপডে’ট কৰক}one{# ঘণ্টাৰ ভিতৰত ডিভাইচটো আপডে’ট কৰক}other{# ঘণ্টাৰ ভিতৰত ডিভাইচটো আপডে’ট কৰক}}</translation> @@ -847,6 +852,7 @@ <translation id="6723839937902243910">পাৱাৰ</translation> <translation id="6727969043791803658">সংযোগ কৰা আছে, <ph name="BATTERY_PERCENTAGE" />% বেটাৰী</translation> <translation id="6732800389263199929">+<ph name="COUNT" /> টা</translation> +<translation id="6739144137573853180">ছেটিঙলৈ যাওক</translation> <translation id="6751052314767925245">আপোনাৰ প্ৰশাসকে বলৱৎ কৰা</translation> <translation id="6751826523481687655">কাৰ্যদক্ষতাৰ ট্ৰেচিং অন কৰা হৈছে</translation> <translation id="6752912906630585008"><ph name="REMOVED_DESK" /> ডেস্কখন আঁতৰোৱা হৈছে আৰু <ph name="RECEIVE_DESK" /> ডেস্কৰ সৈতে একত্ৰিত কৰা হৈছে</translation> @@ -982,6 +988,7 @@ <translation id="7662283695561029522">কনফিগাৰ কৰিবলৈ টিপক</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">নতুন চেলুলাৰ নেটৱৰ্ক যোগ দিয়ক</translation> +<translation id="7720410380936703141">পুনৰ চেষ্টা কৰক</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{১টা জাননী}one{#টা জাননী}other{#টা জাননী}}</translation> <translation id="7724603315864178912">কাট কৰক</translation> <translation id="7745560842763881396">শ্বেল্ফত এপ্সমূহ দেখুৱাওক</translation> @@ -1168,6 +1175,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590"><ph name="IME_NAME" /> ব্যৱহাৰ কৰি</translation> <translation id="899350903320462459">জাননী সম্পর্কীয় কার্যসমূহ কৰিবলৈ <ph name="LOGIN_ID" /> হিচাপে ডিভাইচটো আনলক কৰক</translation> +<translation id="9000771174482730261">ষ্ট’ৰেজ পৰিচালনা কৰক</translation> <translation id="9017320285115481645">Family Linkৰ অভিভাৱকৰ এক্সেছ ক'ডটো দিয়ক।</translation> <translation id="9024331582947483881">সম্পূৰ্ণ স্ক্ৰীন</translation> <translation id="9047624247355796468"><ph name="NETWORK_NAME" />ৰ বাবে ছেটিংসমূহ খোলক</translation> @@ -1213,6 +1221,7 @@ <translation id="938963181863597773">আপোনাৰ কেলেণ্ডাৰত কি আছে?</translation> <translation id="945522503751344254">মতামত পঠিয়াওক</translation> <translation id="951991426597076286">অস্বীকাৰ কৰক</translation> +<translation id="954052413789300507"><ph name="FILENAME" />ৰ বাবে পৰ্যাপ্ত ঠাই নাই। ঠাই খালী কৰক।</translation> <translation id="974545358917229949"><ph name="QUERY" />ৰ বাবে <ph name="RESULT_COUNT" />টা ফলাফল দেখুৱাই থকা হৈছে</translation> <translation id="98515147261107953">লেণ্ডস্কেইপ</translation> <translation id="990277280839877440">ৱিণ্ড’ <ph name="WINDOW_TITILE" /> বন্ধ হৈ আছে৷</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index 2a7b49e..2e3f651 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -623,6 +623,7 @@ <translation id="5075554201838155866">Bağlanmış subtitrləri başladın</translation> <translation id="5078796286268621944">Yanlış PIN</translation> <translation id="5083553833479578423">Daha çox Assistent funksiyalarını kiliddən çıxarın.</translation> +<translation id="5106223312672646208">Fərdiləşdirin</translation> <translation id="5117590920725113268">Gələn ayı göstərin</translation> <translation id="5136175204352732067">Fərqli klaviatura qoşuldu</translation> <translation id="5147567197700016471">Kiliddən çıxarılmış</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index d7dab69..004f086 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">ডেস্ক ৭</translation> <translation id="2224075387478458881">কোনও সুরক্ষিত কন্টেন্ট দেখানোর সময় স্ক্রিন রেকর্ড করার অনুমতি দেওয়া হয় না</translation> <translation id="225680501294068881">ডিভাইসগুলির জন্য স্ক্যান করা হচ্ছে...</translation> +<translation id="2257486738914982088"><ph name="FILENAME" /> ডাউনলোড করার সময় কিছু সমস্যা হয়েছে</translation> <translation id="2268130516524549846">ব্লুটুথ অক্ষমিত</translation> <translation id="2268813581635650749">সবগুলি থেকে সাইন-আউট</translation> <translation id="2269016722240250274">কোনও অ্যাপ্লিকেশন আপনার মাইক্রোফোন ব্যবহার করছে</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">অটোমেটিক ক্লিক বন্ধ করতে চান কিনা সেই বিষয়টি ভাল করে দেখে নিন?</translation> <translation id="4849058404725798627">কিবোর্ড ফোকাসের মাধ্যমে হাইলাইট করুন</translation> <translation id="485592688953820832">কোনও অ্যাকশন নেবেন না (পজ)</translation> +<translation id="4860284199500934869"><ph name="FILENAME" /> ডাউনলোড করার জন্য আপনার নেটওয়ার্ক কানেকশন চেক করুন</translation> <translation id="486056901304535126">পরে ডাউনলোড করার চেষ্টা করা হবে। ফাইল সম্পূর্ণভাবে ডাউনলোড হওয়া পর্যন্ত স্পিচ প্রসেসিং করতে Google-এর কাছে পাঠানো হবে।</translation> <translation id="4868492592575313542">চালু আছে</translation> <translation id="4872237917498892622">Alt+Search অথবা Shift</translation> @@ -804,6 +806,7 @@ <translation id="6452181791372256707">প্রত্যাখ্যান</translation> <translation id="6453179446719226835">ভাষা পরিবর্তন করা হয়েছে</translation> <translation id="6459472438155181876">স্ক্রিন <ph name="DISPLAY_NAME" /> তে প্রসারিত হচ্ছে</translation> +<translation id="6477681113376365978">ফাইল ডাউনলোড করা যাচ্ছে না</translation> <translation id="6482559668224714696">ফুল-স্ক্রিন ম্যাগনিফায়ার</translation> <translation id="6490471652906364588">USB-C ডিভাইস (ডান পোর্ট)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> আপনাকে ডেডলাইনের আগে <ph name="DEVICE_TYPE" /> আপডেট করতে বলছে</translation> @@ -815,7 +818,10 @@ <translation id="6528179044667508675">বিরক্ত করবে না</translation> <translation id="65320610082834431">ইমোজি</translation> <translation id="6537924328260219877">সিগন্যাল: <ph name="SIGNAL_STRENGTH" />, ফোনের ব্যাটারি <ph name="BATTERY_STATUS" /></translation> +<translation id="6539852571005954999">ডাউনলোডের জন্য <ph name="FILENAME" /> ফাইল স্ক্যান করা হচ্ছে</translation> <translation id="6542521951477560771"><ph name="RECEIVER_NAME" /> এ কাস্ট করা হচ্ছে</translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +নতুন ইনস্টল</translation> <translation id="6559976592393364813">অ্যাডমিনিস্ট্রেটরকে জিজ্ঞাসা করুন</translation> <translation id="6565007273808762236">ই-সিম কানেকশন উপলভ্য নেই</translation> <translation id="6570831796530454248">{0,plural, =1{১ ঘণ্টার মধ্যে ডিভাইস আপডেট করুন}one{# ঘণ্টার মধ্যে ডিভাইস আপডেট করুন}other{# ঘণ্টার মধ্যে ডিভাইস আপডেট করুন}}</translation> @@ -847,6 +853,7 @@ <translation id="6723839937902243910">পাওয়ার</translation> <translation id="6727969043791803658">কানেক্ট করা আছে, ব্যাটারিতে <ph name="BATTERY_PERCENTAGE" />% চার্জ আছে</translation> <translation id="6732800389263199929">+<ph name="COUNT" />টি</translation> +<translation id="6739144137573853180">সেটিংসে যান</translation> <translation id="6751052314767925245">আপনার অ্যাডমিনিস্ট্রেটর প্রয়োগ করেছেন</translation> <translation id="6751826523481687655">পারফরম্যান্স ট্রেস করার বিকল্প চালু আছে</translation> <translation id="6752912906630585008">ডেস্ক <ph name="REMOVED_DESK" />-কে সরিয়ে দিয়ে <ph name="RECEIVE_DESK" />-এর সাথে মার্জ করা হয়েছে</translation> @@ -982,6 +989,7 @@ <translation id="7662283695561029522">কনফিগার করতে ট্যাপ করুন</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">নতুন মোবাইল নেটওয়ার্ক যোগ করুন</translation> +<translation id="7720410380936703141">আবার চেষ্টা করুন</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{১টি বিজ্ঞপ্তি}one{#টি বিজ্ঞপ্তি}other{#টি বিজ্ঞপ্তি}}</translation> <translation id="7724603315864178912">কাটুন</translation> <translation id="7745560842763881396">শেল্ফে অ্যাপ দেখুন</translation> @@ -1168,6 +1176,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590"><ph name="IME_NAME" /> ব্যবহার করা হচ্ছে</translation> <translation id="899350903320462459">বিজ্ঞপ্তি সম্পর্কিত অ্যাকশনের জন্য <ph name="LOGIN_ID" /> হিসেবে ডিভাইস আনলক করুন</translation> +<translation id="9000771174482730261">স্টোরেজ ম্যানেজ করুন</translation> <translation id="9017320285115481645">Family Link-এর অভিভাবকীয় অ্যাক্সেস কোডটি লিখুন।</translation> <translation id="9024331582947483881">পূর্ণ স্ক্রিন</translation> <translation id="9047624247355796468"><ph name="NETWORK_NAME" /> নেটওয়ার্কের জন্য সেটিংস খুলুন</translation> @@ -1213,6 +1222,7 @@ <translation id="938963181863597773">আমার ক্যালেন্ডারে কী কী আছে?</translation> <translation id="945522503751344254">মতামত জানান</translation> <translation id="951991426597076286">প্রত্যাখ্যান</translation> +<translation id="954052413789300507"><ph name="FILENAME" />-এর জন্য পর্যাপ্ত স্টোরেজ নেই। স্টোরেজ খালি করুন।</translation> <translation id="974545358917229949"><ph name="QUERY" />-এর জন্য <ph name="RESULT_COUNT" />টি ফলাফল দেখানো হচ্ছে</translation> <translation id="98515147261107953">ল্যান্ডস্কেপ</translation> <translation id="990277280839877440">উইন্ডো <ph name="WINDOW_TITILE" /> বন্ধ করা আছে।</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index 40f1584..1e1f922c 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">Radna površina 7</translation> <translation id="2224075387478458881">Snimanje ekrana nije dozvoljeno kada je prisutan zaštićeni sadržaj</translation> <translation id="225680501294068881">Traženje uređaja...</translation> +<translation id="2257486738914982088">Došlo je do problema prilikom preuzimanja fajla <ph name="FILENAME" /></translation> <translation id="2268130516524549846">Bluetooth je onemogućen</translation> <translation id="2268813581635650749">Odjavi sve</translation> <translation id="2269016722240250274">Aplikacija koristi vaš mikrofon</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">Jeste li sigurni da želite isključiti automatske klikove?</translation> <translation id="4849058404725798627">Istakni objekat fokusom tastature</translation> <translation id="485592688953820832">Nema radnje (pauza)</translation> +<translation id="4860284199500934869">Provjerite mrežnu vezu da preuzmete fajl <ph name="FILENAME" /></translation> <translation id="486056901304535126">Pokušaj preuzimanja će se izvršiti kasnije. Govor će se poslati Googleu na obradu kada se završi preuzimanje.</translation> <translation id="4868492592575313542">aktivirano</translation> <translation id="4872237917498892622">Alt + tipka za pretraživanje + Shift</translation> @@ -804,6 +806,7 @@ <translation id="6452181791372256707">Odbij</translation> <translation id="6453179446719226835">Promijenjen je jezik</translation> <translation id="6459472438155181876">Proširivanje zaslona na zaslon <ph name="DISPLAY_NAME" /></translation> +<translation id="6477681113376365978">Nije moguće preuzeti datoteku</translation> <translation id="6482559668224714696">Povećalo za cijeli ekran</translation> <translation id="6490471652906364588">USB-C uređaj (desni priključak)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> zahtijeva da ažurirate ovaj uređaj <ph name="DEVICE_TYPE" /> prije isteka roka</translation> @@ -817,6 +820,8 @@ <translation id="6537924328260219877">Jačina signala <ph name="SIGNAL_STRENGTH" />, baterija telefona <ph name="BATTERY_STATUS" /></translation> <translation id="6539852571005954999">Preuzimanje fajla <ph name="FILENAME" /> koji se skenira</translation> <translation id="6542521951477560771">Emitiranje na uređaj <ph name="RECEIVER_NAME" /></translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +Nova instalacija</translation> <translation id="6559976592393364813">Pitajte administratora</translation> <translation id="6565007273808762236">eSIM veza je nedostupna</translation> <translation id="6570831796530454248">{0,plural, =1{Ažurirajte uređaj u roku od jednog sata}one{Ažurirajte uređaj u roku od # sata}few{Ažurirajte uređaj u roku od # sata}other{Ažurirajte uređaj u roku od # sati}}</translation> @@ -848,6 +853,7 @@ <translation id="6723839937902243910">Napajanje</translation> <translation id="6727969043791803658">Povezano, <ph name="BATTERY_PERCENTAGE" />% baterije</translation> <translation id="6732800389263199929">+ <ph name="COUNT" /></translation> +<translation id="6739144137573853180">IDITE U POSTAVKE</translation> <translation id="6751052314767925245">Nametnuo vaš administrator</translation> <translation id="6751826523481687655">Uključeno je praćenje performansi</translation> <translation id="6752912906630585008">Radna površina <ph name="REMOVED_DESK" /> je uklonjena i spojena s radnom površinom <ph name="RECEIVE_DESK" /></translation> @@ -983,6 +989,7 @@ <translation id="7662283695561029522">Dodirnite za konfiguriranje</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">Dodajte novu mobilnu mrežu</translation> +<translation id="7720410380936703141">POKUŠAJTE PONOVO</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 obavještenje}one{# obavještenje}few{# obavještenja}other{# obavještenja}}</translation> <translation id="7724603315864178912">Izreži</translation> <translation id="7745560842763881396">Pregledajte aplikacije na polici</translation> @@ -1169,6 +1176,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">Koristi se <ph name="IME_NAME" /></translation> <translation id="899350903320462459">Otključajte uređaj kao <ph name="LOGIN_ID" /> da izvršite radnju obavještenja</translation> +<translation id="9000771174482730261">UPRAVLJAJTE POHRANOM</translation> <translation id="9017320285115481645">Unesite kôd za pristup roditelja za Family Link.</translation> <translation id="9024331582947483881">cijeli zaslon</translation> <translation id="9047624247355796468">Otvorite postavke za mrežu <ph name="NETWORK_NAME" /></translation> @@ -1214,6 +1222,7 @@ <translation id="938963181863597773">Šta ima u mom kalendaru?</translation> <translation id="945522503751344254">Pošaljite povratne informacije</translation> <translation id="951991426597076286">Odbij</translation> +<translation id="954052413789300507">Nema dovoljno prostora za fajl <ph name="FILENAME" />. Oslobodite prostor.</translation> <translation id="974545358917229949">Prikaz <ph name="RESULT_COUNT" /> rezultata za upit <ph name="QUERY" /></translation> <translation id="98515147261107953">Pejzaž</translation> <translation id="990277280839877440">Prozor <ph name="WINDOW_TITILE" /> je zatvoren.</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index 34fd567..29054ba 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">Desktop 7</translation> <translation id="2224075387478458881">Die Bildschirmaufzeichnung ist blockiert, wenn geschützte Inhalte sichtbar sind</translation> <translation id="225680501294068881">Nach Geräten wird gesucht...</translation> +<translation id="2257486738914982088">Fehler beim Herunterladen von „<ph name="FILENAME" />“</translation> <translation id="2268130516524549846">Bluetooth deaktiviert</translation> <translation id="2268813581635650749">Alle abmelden</translation> <translation id="2269016722240250274">Eine Anwendung verwendet Ihr Mikrofon</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">Möchten Sie automatische Klicks wirklich deaktivieren?</translation> <translation id="4849058404725798627">Objekt mit Tastaturfokus hervorheben</translation> <translation id="485592688953820832">Keine Aktion (Pause)</translation> +<translation id="4860284199500934869">Prüfen Sie Ihre Netzwerkverbindung, um „<ph name="FILENAME" />“ herunterzuladen</translation> <translation id="486056901304535126">Der Download wird später versucht. Sprachaufnahmen werden zur Verarbeitung an Google gesendet, bis der Download abgeschlossen ist.</translation> <translation id="4868492592575313542">aktiviert</translation> <translation id="4872237917498892622">Alt+Suchen oder Umschalttaste</translation> @@ -804,6 +806,7 @@ <translation id="6452181791372256707">Ablehnen</translation> <translation id="6453179446719226835">Die Sprache wurde geändert</translation> <translation id="6459472438155181876">Bildschirm wird auf <ph name="DISPLAY_NAME" /> erweitert...</translation> +<translation id="6477681113376365978">Datei kann nicht heruntergeladen werden</translation> <translation id="6482559668224714696">Vollbildlupe</translation> <translation id="6490471652906364588">USB-C-Gerät (Port rechts)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> erfordert, dass Ihr Gerät (<ph name="DEVICE_TYPE" />) vor Ablauf der Frist aktualisiert wird</translation> @@ -816,6 +819,8 @@ <translation id="65320610082834431">Emojis</translation> <translation id="6537924328260219877">Signalstärke bei <ph name="SIGNAL_STRENGTH" />, Smartphone-Akku bei <ph name="BATTERY_STATUS" /></translation> <translation id="6542521951477560771">Inhalte werden an <ph name="RECEIVER_NAME" /> gestreamt</translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +Neuinstallation</translation> <translation id="6559976592393364813">Administrator fragen</translation> <translation id="6565007273808762236">eSIM-Verbindung nicht verfügbar</translation> <translation id="6570831796530454248">{0,plural, =1{Gerät innerhalb von einer Stunde neu starten}other{Gerät innerhalb von # Stunden neu starten}}</translation> @@ -847,6 +852,7 @@ <translation id="6723839937902243910">Leistung</translation> <translation id="6727969043791803658">Verbunden, Akkustand bei <ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6739144137573853180">EINSTELLUNGEN ÖFFNEN</translation> <translation id="6751052314767925245">Von Ihrem Administrator erzwungen</translation> <translation id="6751826523481687655">Leistungsverfolgung ist aktiviert</translation> <translation id="6752912906630585008">Desktop <ph name="REMOVED_DESK" /> wurde entfernt und mit Desktop <ph name="RECEIVE_DESK" /> zusammengeführt</translation> @@ -982,6 +988,7 @@ <translation id="7662283695561029522">Zum Konfigurieren tippen</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">Neues Mobilfunknetz hinzufügen</translation> +<translation id="7720410380936703141">WIEDERHOLEN</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 Benachrichtigung}other{# Benachrichtigungen}}</translation> <translation id="7724603315864178912">Ausschneiden</translation> <translation id="7745560842763881396">Apps in Ablage anzeigen</translation> @@ -1168,6 +1175,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590"><ph name="IME_NAME" /> aktiv</translation> <translation id="899350903320462459">Wenn Sie die Benachrichtigungsaktion ausführen möchten, entsperren Sie das Gerät als <ph name="LOGIN_ID" /></translation> +<translation id="9000771174482730261">SPEICHERPLATZ VERWALTEN</translation> <translation id="9017320285115481645">Geben Sie Ihren Eltern-Zugangscode für Family Link ein.</translation> <translation id="9024331582947483881">Vollbild</translation> <translation id="9047624247355796468">Einstellungen für <ph name="NETWORK_NAME" /> öffnen</translation> @@ -1213,6 +1221,7 @@ <translation id="938963181863597773">Welche Termine stehen an?</translation> <translation id="945522503751344254">Feedback geben</translation> <translation id="951991426597076286">Ablehnen</translation> +<translation id="954052413789300507">Nicht genug Speicherplatz für „<ph name="FILENAME" />“. Gib Speicherplatz frei.</translation> <translation id="974545358917229949"><ph name="RESULT_COUNT" /> Suchergebnisse für "<ph name="QUERY" />"</translation> <translation id="98515147261107953">Querformat</translation> <translation id="990277280839877440">Fenster "<ph name="WINDOW_TITILE" />" geschlossen.</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index 842a8633..24bd9443 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb
@@ -623,6 +623,7 @@ <translation id="5075554201838155866">Έναρξη υποτίτλων</translation> <translation id="5078796286268621944">Εσφαλμένο PIN</translation> <translation id="5083553833479578423">Ξεκλειδώστε περισσότερες λειτουργίες του Βοηθού.</translation> +<translation id="5106223312672646208">Εξατομίκευση</translation> <translation id="5117590920725113268">Εμφάνιση επόμενου μήνα</translation> <translation id="5136175204352732067">Συνδέθηκε διαφορετικό πληκτρολόγιο</translation> <translation id="5147567197700016471">Ξεκλειδώθηκε</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index 7f710b0..d8cde01 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -623,6 +623,7 @@ <translation id="5075554201838155866">Start closed captions</translation> <translation id="5078796286268621944">Incorrect PIN</translation> <translation id="5083553833479578423">Unlock more Assistant features.</translation> +<translation id="5106223312672646208">Personalise</translation> <translation id="5117590920725113268">Show next month</translation> <translation id="5136175204352732067">Different keyboard connected</translation> <translation id="5147567197700016471">Unlocked</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb index b351572..41a05b4 100644 --- a/ash/strings/ash_strings_eu.xtb +++ b/ash/strings/ash_strings_eu.xtb
@@ -819,6 +819,7 @@ <translation id="6528179044667508675">Ez molestatu</translation> <translation id="65320610082834431">Emojiak</translation> <translation id="6537924328260219877">Seinalearen indarra: <ph name="SIGNAL_STRENGTH" />. Telefonoaren bateria: <ph name="BATTERY_STATUS" />.</translation> +<translation id="6539852571005954999"><ph name="FILENAME" /> eskaneatzen deskargatu ahal izateko</translation> <translation id="6542521951477560771"><ph name="RECEIVER_NAME" /> gailura igortzen</translation> <translation id="655633303491376835"><ph name="APP_NAME" /> Berriki instalatu da</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index 9410b06..189db81 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">میزکار ۷</translation> <translation id="2224075387478458881">ضبط صفحهنمایش هنگامی که محتوای محافظتشده نمایان باشد مجاز نیست</translation> <translation id="225680501294068881">درحال جستجو برای دستگاهها...</translation> +<translation id="2257486738914982088">هنگام بارگیری <ph name="FILENAME" /> مشکلی پیش آمد</translation> <translation id="2268130516524549846">بلوتوث غیرفعال است</translation> <translation id="2268813581635650749">خروج همه از سیستم</translation> <translation id="2269016722240250274">برنامهای درحال استفاده از میکروفونتان است</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">مطمئنید میخواهید کلیکهای خودکار را خاموش کنید؟</translation> <translation id="4849058404725798627">برجسته کردن شیء با فوکوس صفحهکلید</translation> <translation id="485592688953820832">بیحرکت (مکث)</translation> +<translation id="4860284199500934869">برای بارگیری <ph name="FILENAME" />، اتصال شبکه را بررسی کنید</translation> <translation id="486056901304535126">بارگیری بعداً انجام خواهد شد. تا وقتی بارگیری کامل شود، گفتار برای پردازش به Google ارسال خواهد شد.</translation> <translation id="4868492592575313542">فعال شد</translation> <translation id="4872237917498892622">Alt+جستجو یا Shift</translation> @@ -804,6 +806,7 @@ <translation id="6452181791372256707">عدم پذیرش</translation> <translation id="6453179446719226835">زبان تغییر کرد</translation> <translation id="6459472438155181876">گسترش صفحه به <ph name="DISPLAY_NAME" /></translation> +<translation id="6477681113376365978">فایل بارگیری نشد</translation> <translation id="6482559668224714696">ذرهبین تمامصفحه</translation> <translation id="6490471652906364588">دستگاه USB-C (درگاه سمت راست)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> از شما میخواهد <ph name="DEVICE_TYPE" /> را تا قبلاز موعد مقرر بهروزرسانی کنید</translation> @@ -817,6 +820,8 @@ <translation id="6537924328260219877">قدرت سیگنال <ph name="SIGNAL_STRENGTH" />، باتری تلفن <ph name="BATTERY_STATUS" /></translation> <translation id="6539852571005954999">بارگیری <ph name="FILENAME" /> درحال اسکن</translation> <translation id="6542521951477560771">ارسال محتوا به <ph name="RECEIVER_NAME" /></translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +نصب جدید</translation> <translation id="6559976592393364813">سؤال از سرپرست</translation> <translation id="6565007273808762236">اتصال سیمکارت داخلی دردسترس نیست</translation> <translation id="6570831796530454248">{0,plural, =1{دستگاه را تا یک ساعت دیگر بهروزرسانی کنید}one{دستگاه را تا # ساعت دیگر بهروزرسانی کنید}other{دستگاه را تا # ساعت دیگر بهروزرسانی کنید}}</translation> @@ -848,6 +853,7 @@ <translation id="6723839937902243910">نیرو</translation> <translation id="6727969043791803658">متصل، <ph name="BATTERY_PERCENTAGE" />٪ باتری</translation> <translation id="6732800389263199929">بیشاز <ph name="COUNT" /></translation> +<translation id="6739144137573853180">رفتن به تنظیمات</translation> <translation id="6751052314767925245">بهاجبار اجراشده توسط سرپرست</translation> <translation id="6751826523481687655">ردیابی عملکرد روشن است</translation> <translation id="6752912906630585008">میز <ph name="REMOVED_DESK" /> برداشته شد و با میز <ph name="RECEIVE_DESK" /> ادغام شد</translation> @@ -983,6 +989,7 @@ <translation id="7662283695561029522">برای پیکربندی ضربه بزنید</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">افزودن شبکه تلفن همراه جدید</translation> +<translation id="7720410380936703141">امتحان مجدد</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{۱ اعلان}one{# اعلان}other{# اعلان}}</translation> <translation id="7724603315864178912">برش</translation> <translation id="7745560842763881396">نمایش برنامهها در قفسه</translation> @@ -1169,6 +1176,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">درحال استفاده از <ph name="IME_NAME" /></translation> <translation id="899350903320462459">بهعنوان <ph name="LOGIN_ID" />، قفل دستگاه را باز کنید تا کنش اعلان اجرا شود</translation> +<translation id="9000771174482730261">مدیریت فضای ذخیرهسازی</translation> <translation id="9017320285115481645">کد دسترسی ولی Family Link را وارد کنید</translation> <translation id="9024331582947483881">تمامصفحه</translation> <translation id="9047624247355796468">باز کردن تنظیمات <ph name="NETWORK_NAME" /></translation> @@ -1214,6 +1222,7 @@ <translation id="938963181863597773">?What's on my calendar (در تقویم من چه رویدادی هست؟)</translation> <translation id="945522503751344254">ارسال بازخورد</translation> <translation id="951991426597076286">رد کردن</translation> +<translation id="954052413789300507">فضای کافی برای <ph name="FILENAME" /> وجود ندارد فضا آزاد کنید.</translation> <translation id="974545358917229949">نمایش <ph name="RESULT_COUNT" /> نتیجه برای <ph name="QUERY" /></translation> <translation id="98515147261107953">افقی</translation> <translation id="990277280839877440">پنجره <ph name="WINDOW_TITILE" /> بسته شد.</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index 45667179..e634031 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb
@@ -815,6 +815,7 @@ <translation id="6528179044667508675">Ne pas déranger</translation> <translation id="65320610082834431">Emoji</translation> <translation id="6537924328260219877">Force du signal : <ph name="SIGNAL_STRENGTH" />, batterie du téléphone à <ph name="BATTERY_STATUS" /></translation> +<translation id="6539852571005954999">Téléchargement en cours d'analyse : <ph name="FILENAME" /></translation> <translation id="6542521951477560771">Diffusion vers <ph name="RECEIVER_NAME" />…</translation> <translation id="6559976592393364813">Se renseigner auprès de l'administrateur</translation> <translation id="6565007273808762236">Connexion eSIM indisponible</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index 5218aa4..6c9f185 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -815,6 +815,7 @@ <translation id="6528179044667508675">ખલેલ પાડશો નહિ</translation> <translation id="65320610082834431">ઇમોજી</translation> <translation id="6537924328260219877">સિગ્નલની સશક્તતા <ph name="SIGNAL_STRENGTH" />, ફોનની બૅટરી <ph name="BATTERY_STATUS" /></translation> +<translation id="6539852571005954999">ડાઉનલોડ <ph name="FILENAME" /> સ્કૅન કરી રહ્યું છે</translation> <translation id="6542521951477560771"><ph name="RECEIVER_NAME" /> પર કાસ્ટ કરી રહ્યાં છીએ</translation> <translation id="6559976592393364813">વ્યવસ્થાપકને પૂછો</translation> <translation id="6565007273808762236">ઇ-સિમ કનેક્શન ઉપલબ્ધ નથી</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index 470767f..341e54e 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">डेस्क 7</translation> <translation id="2224075387478458881">जब सुरक्षित कॉन्टेंट दिख रहा हो, तो स्क्रीन रिकॉर्डिंग की सुविधा काम नहीं करती</translation> <translation id="225680501294068881">डिवाइस स्कैन किए जा रहे हैं...</translation> +<translation id="2257486738914982088"><ph name="FILENAME" /> डाउनलोड करते समय कोई गड़बड़ी हुई</translation> <translation id="2268130516524549846">ब्लूटूथ अक्षम किया गया</translation> <translation id="2268813581635650749">सभी को साइन आउट करें</translation> <translation id="2269016722240250274">एक ऐप्लिकेशन आपके माइक्रोफ़ोन का इस्तेमाल कर रहा है</translation> @@ -588,6 +589,7 @@ <translation id="4831034276697007977">क्या आप वाकई अपने-आप क्लिक होने की सुविधा बंद करना चाहते हैं?</translation> <translation id="4849058404725798627">कीबोर्ड फ़ोकस वाला ऑब्जेक्ट हाइलाइट करें</translation> <translation id="485592688953820832">कोई कार्रवाई नहीं (रोकें)</translation> +<translation id="4860284199500934869"><ph name="FILENAME" /> को डाउनलोड करने के लिए, अपना इंटरनेट कनेक्शन देखें</translation> <translation id="486056901304535126">बाद में, डाउनलोड करने की कोशिश की जाएगी. फ़ाइल पूरी डाउनलोड होने तक, स्पीच को प्रोसेसिंग के लिए Google के पास भेजा जाएगा.</translation> <translation id="4868492592575313542">चालू किया गया</translation> <translation id="4872237917498892622">Alt+Search या Shift</translation> @@ -805,6 +807,7 @@ <translation id="6452181791372256707">अस्वीकार करें</translation> <translation id="6453179446719226835">भाषा बदल दी गई है</translation> <translation id="6459472438155181876"><ph name="DISPLAY_NAME" /> पर स्क्रीन विस्तृत कर रहा है</translation> +<translation id="6477681113376365978">फ़ाइल डाउनलोड नहीं की जा सकी</translation> <translation id="6482559668224714696">फ़ुल-स्क्रीन पर सामग्री को बड़ा दिखाने वाला</translation> <translation id="6490471652906364588">USB-C डिवाइस (दायां पोर्ट)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> के लिए ज़रूरी है आप अपने <ph name="DEVICE_TYPE" /> को समयसीमा खत्म होने से पहले अपडेट करें</translation> @@ -817,6 +820,8 @@ <translation id="65320610082834431">इमोजी</translation> <translation id="6537924328260219877">सिग्नल की क्षमता <ph name="SIGNAL_STRENGTH" />, फ़ोन की बैटरी <ph name="BATTERY_STATUS" /></translation> <translation id="6542521951477560771"><ph name="RECEIVER_NAME" /> पर कास्ट किया जा रहा है</translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +अभी इंस्टॉल किया गया है</translation> <translation id="6559976592393364813">एडमिन से पूछें</translation> <translation id="6565007273808762236">ई-सिम कनेक्शन मौजूद नहीं है</translation> <translation id="6570831796530454248">{0,plural, =1{डिवाइस को 1 घंटे के अंदर अपडेट करें}one{डिवाइस को # घंटे के अंदर अपडेट करें}other{डिवाइस को # घंटों के अंदर अपडेट करें}}</translation> @@ -848,6 +853,7 @@ <translation id="6723839937902243910">पावर</translation> <translation id="6727969043791803658">कनेक्ट किया गया, <ph name="BATTERY_PERCENTAGE" /> % बैटरी बची है</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6739144137573853180">'सेटिंग' पर जाएं</translation> <translation id="6751052314767925245">यह सुविधा आपके एडमिन ने लागू की है</translation> <translation id="6751826523481687655">'परफ़ॉर्मेंस ट्रेसिंग' चालू कर दी गई है</translation> <translation id="6752912906630585008">डेस्क <ph name="REMOVED_DESK" /> को हटा दिया गया है और इसे डेस्क<ph name="RECEIVE_DESK" /> के साथ मिला दिया गया है</translation> @@ -983,6 +989,7 @@ <translation id="7662283695561029522">कॉन्फ़िगर करने के लिए टैप करें</translation> <translation id="7705524343798198388">वीपीएन</translation> <translation id="7714767791242455379">नया मोबाइल नेटवर्क जोड़ें</translation> +<translation id="7720410380936703141">फिर से कोशिश करें</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 सूचना}one{# सूचना}other{# सूचनाएं}}</translation> <translation id="7724603315864178912">काटें</translation> <translation id="7745560842763881396">शेल्फ़ में मौजूद ऐप्लिकेशन दिखाएं</translation> @@ -1169,6 +1176,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590"><ph name="IME_NAME" /> का इस्तेमाल करें</translation> <translation id="899350903320462459">सूचना से जुड़ी कार्रवाई करने के लिए डिवाइस को <ph name="LOGIN_ID" /> के तौर पर अनलॉक करें</translation> +<translation id="9000771174482730261">डिवाइस का स्टोरेज मैनेज करें</translation> <translation id="9017320285115481645">Family Link का अभिभावक ऐक्सेस कोड डालें.</translation> <translation id="9024331582947483881">फ़ुल स्क्रीन</translation> <translation id="9047624247355796468"><ph name="NETWORK_NAME" /> के लिए सेटिंग खोलें</translation> @@ -1214,6 +1222,7 @@ <translation id="938963181863597773">मेरे कैलेंडर पर आज के लिए क्या काम हैं?</translation> <translation id="945522503751344254">फ़ीडबैक भेजें</translation> <translation id="951991426597076286">अस्वीकार करें</translation> +<translation id="954052413789300507"><ph name="FILENAME" /> को डाउनलोड करने के लिए, डिवाइस में जगह कम है. जगह खाली करें.</translation> <translation id="974545358917229949"><ph name="QUERY" /> के लिए <ph name="RESULT_COUNT" /> नतीजे दिखाए जा रहे हैं</translation> <translation id="98515147261107953">लैंडस्केप</translation> <translation id="990277280839877440"><ph name="WINDOW_TITILE" /> विंडो बंद है.</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index a5ea3ae2..beee6c2 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">Radna površina 7</translation> <translation id="2224075387478458881">Snimanje zaslona nije dopušteno ako je vidljiv povjerljiv sadržaj</translation> <translation id="225680501294068881">Pretraživanje uređaja...</translation> +<translation id="2257486738914982088">Došlo je do pogreške prilikom preuzimanja <ph name="FILENAME" /></translation> <translation id="2268130516524549846">Bluetooth onemogućen</translation> <translation id="2268813581635650749">Odjavi sve</translation> <translation id="2269016722240250274">Aplikacija upotrebljava vaš mikrofon</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">Jeste li sigurni da želite isključiti automatske klikove?</translation> <translation id="4849058404725798627">Istakni objekt fokusom na tipkovnici</translation> <translation id="485592688953820832">Nema radnje (pauza)</translation> +<translation id="4860284199500934869">Provjerite mrežnu vezu da biste preuzeli datoteku <ph name="FILENAME" /></translation> <translation id="486056901304535126">Kasnije ćemo pokušati preuzimanje. Govor će se poslati Googleu na obradu dok se ne dovrši preuzimanje.</translation> <translation id="4868492592575313542">aktivirano</translation> <translation id="4872237917498892622">Alt + Pretraživanje ili Shift</translation> @@ -804,6 +806,7 @@ <translation id="6452181791372256707">Odbaci</translation> <translation id="6453179446719226835">Jezik je promijenjen</translation> <translation id="6459472438155181876">Proširivanje zaslona na zaslon <ph name="DISPLAY_NAME" /></translation> +<translation id="6477681113376365978">Datoteku nije moguće preuzeti</translation> <translation id="6482559668224714696">Povećalo za cijeli zaslon</translation> <translation id="6490471652906364588">USB-C uređaj (desni priključak)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> zahtijeva da ažurirate svoj uređaj <ph name="DEVICE_TYPE" /> prije roka</translation> @@ -817,6 +820,8 @@ <translation id="6537924328260219877">Jačina signala <ph name="SIGNAL_STRENGTH" />, baterija telefona <ph name="BATTERY_STATUS" /></translation> <translation id="6539852571005954999">Pregled preuzimanja datoteke <ph name="FILENAME" /></translation> <translation id="6542521951477560771">Emitiranje na uređaj <ph name="RECEIVER_NAME" /></translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +Novo instaliranje</translation> <translation id="6559976592393364813">Pitajte administratora</translation> <translation id="6565007273808762236">eSIM veza nije dostupna</translation> <translation id="6570831796530454248">{0,plural, =1{Ažurirajte uređaj u roku od sat vremena}one{Ažurirajte uređaj u roku od # sata}few{Ažurirajte uređaj u roku od # sata}other{Ažurirajte uređaj u roku od # sati}}</translation> @@ -848,6 +853,7 @@ <translation id="6723839937902243910">Napajanje</translation> <translation id="6727969043791803658">Povezano, baterija <ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="6732800389263199929">+ <ph name="COUNT" /></translation> +<translation id="6739144137573853180">OTVORI POSTAVKE</translation> <translation id="6751052314767925245">Provodi vaš administrator</translation> <translation id="6751826523481687655">Uključeno je praćenje izvedbe</translation> <translation id="6752912906630585008">Radna površina <ph name="REMOVED_DESK" /> uklonjena je i spojena s radnom površinom <ph name="RECEIVE_DESK" /></translation> @@ -983,6 +989,7 @@ <translation id="7662283695561029522">Dodirnite da biste konfigurirali</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">Dodajte novu mobilnu mrežu</translation> +<translation id="7720410380936703141">PONOVI</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 obavijest}one{# obavijest}few{# obavijesti}other{# obavijesti}}</translation> <translation id="7724603315864178912">Izreži</translation> <translation id="7745560842763881396">Prikaži aplikacije na polici</translation> @@ -1169,6 +1176,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">Upotrebljava se <ph name="IME_NAME" /></translation> <translation id="899350903320462459">Otključajte uređaj kao <ph name="LOGIN_ID" /> za izvršenje radnje obavijesti.</translation> +<translation id="9000771174482730261">UPRAVLJAJTE POHRANOM</translation> <translation id="9017320285115481645">Unesite kôd za roditeljski pristup Family Linka.</translation> <translation id="9024331582947483881">cijeli zaslon</translation> <translation id="9047624247355796468">Otvorite postavke mreže <ph name="NETWORK_NAME" /></translation> @@ -1214,6 +1222,7 @@ <translation id="938963181863597773">Što je na mojem kalendaru?</translation> <translation id="945522503751344254">Pošaljite povratne informacije</translation> <translation id="951991426597076286">Odbijam</translation> +<translation id="954052413789300507">Nema dovoljno prostora za datoteku <ph name="FILENAME" />. Oslobodite prostor.</translation> <translation id="974545358917229949">Prikazuju se rezultati za upit <ph name="QUERY" /> (njih <ph name="RESULT_COUNT" />)</translation> <translation id="98515147261107953">Pejzaž</translation> <translation id="990277280839877440">Zatvoren je prozor <ph name="WINDOW_TITILE" />.</translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb index 99998af..718d9a2 100644 --- a/ash/strings/ash_strings_hy.xtb +++ b/ash/strings/ash_strings_hy.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">Աշխատասեղան 7</translation> <translation id="2224075387478458881">Էկրանի տեսագրում չի թույլատրվում, երբ պաշտպանված բովանդակություն է տեսանելի</translation> <translation id="225680501294068881">Սարքերի որոնում…</translation> +<translation id="2257486738914982088">Ֆայլը (<ph name="FILENAME" />) ներբեռնելիս սխալ առաջացավ</translation> <translation id="2268130516524549846">Bluetooth-ն անջատված է</translation> <translation id="2268813581635650749">Դուրս գալ բոլորից</translation> <translation id="2269016722240250274">Ինչ-որ հավելված օգտագործում է ձեր խոսափողը</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">Իսկապե՞ս ուզում եք անջատել ավտոմատ սեղմումները:</translation> <translation id="4849058404725798627">Ընդգծել ստեղնաշարի միջոցով ընտրված օբյեկտները</translation> <translation id="485592688953820832">Ոչ մի գործողություն (դադար)</translation> +<translation id="4860284199500934869">Ստուգեք կապը՝ <ph name="FILENAME" /> ֆայլը ներբեռնելու համար</translation> <translation id="486056901304535126">Ավելի ուշ մենք կփորձենք նորից ներբեռնել ֆայլերը։ Մինչև ներբեռնումը չավարտվի, խոսքի ձայնագրությունները կփոխանցվեն Google-ին՝ մշակման համար։</translation> <translation id="4868492592575313542">ակտիվացված է</translation> <translation id="4872237917498892622">Alt+Search կամ Shift</translation> @@ -804,6 +806,7 @@ <translation id="6452181791372256707">Մերժել</translation> <translation id="6453179446719226835">Լեզուն փոխվել է</translation> <translation id="6459472438155181876">Էկրանի ընդլայնում մինչև <ph name="DISPLAY_NAME" /></translation> +<translation id="6477681113376365978">Չհաջողվեց ներբեռնել ֆայլը</translation> <translation id="6482559668224714696">Լիաէկրան խոշորացույց</translation> <translation id="6490471652906364588">USB-C սարք (աջ միացք)</translation> <translation id="6491071886865974820">Կառավարիչը (<ph name="MANAGER" />) պահանջում է, որ թարմացնեք ձեր <ph name="DEVICE_TYPE" /> սարքը, քանի դեռ վերջնաժամկետը չի լրացել։</translation> @@ -817,6 +820,8 @@ <translation id="6537924328260219877">Ազդանշանի ուժգնությունը՝ <ph name="SIGNAL_STRENGTH" />, մարտկոցի լիցքը՝ <ph name="BATTERY_STATUS" /></translation> <translation id="6539852571005954999">Ներբեռնումը դադարեցված է, <ph name="FILENAME" /> ֆայլը ստուգվում է</translation> <translation id="6542521951477560771">Հեռարձակում «<ph name="RECEIVER_NAME" />» սարքին</translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +Նոր տեղադրում</translation> <translation id="6559976592393364813">Հարցրեք ադմինիստրատորին</translation> <translation id="6565007273808762236">eSIM կապն անհասանելի է</translation> <translation id="6570831796530454248">{0,plural, =1{Թարմացրեք սարքը մեկ ժամվա ընթացքում}one{Թարմացրեք սարքը # ժամվա ընթացքում}other{Թարմացրեք սարքը # ժամվա ընթացքում}}</translation> @@ -848,6 +853,7 @@ <translation id="6723839937902243910">Սնուցում</translation> <translation id="6727969043791803658">Միացված է, մարտկոցի լիցքը՝ <ph name="BATTERY_PERCENTAGE" /></translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6739144137573853180">ԲԱՑԵԼ ԿԱՐԳԱՎՈՐՈՒՄՆԵՐԸ</translation> <translation id="6751052314767925245">Պարտադրված է ադմինիստրատորի կողմից</translation> <translation id="6751826523481687655">Արդյունավետության հետագծումը միացված է</translation> <translation id="6752912906630585008">Աշխատասեղան <ph name="REMOVED_DESK" />-ը հեռացվել է և միացվել է աշխատասեղան <ph name="RECEIVE_DESK" />-ի հետ</translation> @@ -983,6 +989,7 @@ <translation id="7662283695561029522">Հպեք՝ կարգավորելու համար</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">Ավելացնել նոր բջջային ցանց</translation> +<translation id="7720410380936703141">ՆՈՐԻՑ ՓՈՐՁԵԼ</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 ծանուցում}one{# ծանուցում}other{# ծանուցում}}</translation> <translation id="7724603315864178912">Կտրել</translation> <translation id="7745560842763881396">Ցուցադրել դարակի հավելվածները</translation> @@ -1169,6 +1176,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">Օգտագործվում է՝ <ph name="IME_NAME" /></translation> <translation id="899350903320462459">Ծանուցման հետ գործողություն կատարելու համար ապակողպեք սարքը որպես <ph name="LOGIN_ID" /></translation> +<translation id="9000771174482730261">ԿԱՌԱՎԱՐԵԼ ՏԱՐԱԾՔԸ</translation> <translation id="9017320285115481645">Մուտքագրեք Family Link-ի ծնողի մուտքի կոդը։</translation> <translation id="9024331582947483881">լիաէկրան</translation> <translation id="9047624247355796468">Բացել «<ph name="NETWORK_NAME" />» ցանցի կարգավորումները</translation> @@ -1214,6 +1222,7 @@ <translation id="938963181863597773">Ի՞նչ ունեմ պլանավորած։</translation> <translation id="945522503751344254">Կարծիք հայտնել</translation> <translation id="951991426597076286">Մերժել</translation> +<translation id="954052413789300507">Բավարար տարածք չկա <ph name="FILENAME" /> ֆայլը ներբեռնելու համար։ Ազատեք տարածք։</translation> <translation id="974545358917229949">Ցուցադրվում է «<ph name="QUERY" />»-ի որոնման <ph name="RESULT_COUNT" /> արդյունք</translation> <translation id="98515147261107953">Հորիզոնական</translation> <translation id="990277280839877440"><ph name="WINDOW_TITILE" /> պատուհանը փակվեց։</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb index 7e13c63e..6b26a62 100644 --- a/ash/strings/ash_strings_kk.xtb +++ b/ash/strings/ash_strings_kk.xtb
@@ -35,6 +35,7 @@ <translation id="1175572348579024023">Айналдыру</translation> <translation id="1178581264944972037">Кідірту</translation> <translation id="1181037720776840403">Өшіру</translation> +<translation id="118437560755358292">Қауіпсіздікті күшейту үшін құпия сөзді немесе PIN кодын енгізіңіз.</translation> <translation id="118532027333893379">Толық экранды түсіру үшін кез келген жерді басыңыз.</translation> <translation id="1190609913194133056">Хабарландыру орталығы</translation> <translation id="1190678134285018527">Құрылғыны алдыңғы нұсқаға қайтару керек</translation> @@ -338,6 +339,7 @@ <translation id="3307642347673023554">Ноутбук режиміне ауысты.</translation> <translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> кейінірек те кіре алады.</translation> <translation id="3321628682574733415">Ата-ана коды дұрыс емес</translation> +<translation id="3339826665088060472">Скриншот, скриншоттар түсіруге және экран жазуға арналған құралдар</translation> <translation id="3341303451326249809">Скриншот түсірілді.</translation> <translation id="334252345105450327">Скриншот түсіру</translation> <translation id="3351879221545518001">Экранды трансляциялап жатырсыз.</translation> @@ -394,6 +396,7 @@ <translation id="3606978283550408104">Брайль дисплейі қосылды.</translation> <translation id="3615926715408477684">Мобильдік деректерді қоссаңыз, Bluetooth та қосылады.</translation> <translation id="3616883743181209306">Мәзір экранның жоғарғы оң жақ бұрышына жылжытылды.</translation> +<translation id="3619536907358025872">Скриншот параметрлері</translation> <translation id="3621202678540785336">Енгізу</translation> <translation id="3621712662352432595">Аудио параметрлері</translation> <translation id="3626281679859535460">Жарықтық</translation> @@ -492,6 +495,7 @@ <translation id="4269883910223712419">Құрылғының әкімшісі мына әрекеттерді орындай алады:</translation> <translation id="4274537685965975248">Ctrl + Alt + төменге бағыттауыш перне тіркесімінің функциясы өзгерді. End пернесінің әрекетін орындау үшін <ph name="LAUNCHER_KEY_NAME" /> пернесі + оң жаққа бағыттауыш перне тіркесімін басыңыз.</translation> <translation id="4279490309300973883">Экран көшірмесін көрсету</translation> +<translation id="4283888303416325161">Қауіпсіздікті күшейту үшін құпия сөзді енгізіңіз.</translation> <translation id="4285498937028063278">Босату</translation> <translation id="429402653707266969">Құралдар тақтасының орнын ауыстыру</translation> <translation id="4294319844246081198">Қайырлы таң, <ph name="GIVEN_NAME" />!</translation> @@ -761,6 +765,7 @@ <translation id="607652042414456612">Компьютеріңізді жақын жердегі Bluetooth құрылғылары анықтай алады. <ph name="ADDRESS" /> мекенжайымен және "<ph name="NAME" />" атауымен көрсетіледі</translation> <translation id="6114505516289286752">Тіл файлдары (<ph name="LANGUAGE" />) жүктеп алынды</translation> <translation id="6119360623251949462"><ph name="CHARGING_STATE" />. <ph name="BATTERY_SAVER_STATE" /></translation> +<translation id="6121838516699723042"><ph name="FILENAME" /> жүктеп алуды растау</translation> <translation id="612734058257491180">Google Assistant қонақ сеансында жұмыс істемейді.</translation> <translation id="6134259848159370930">Құрылғыдан, қолданбалардан, параметрлерден және интернеттен іздеңіз.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> аккаунтын өшіру диалогтік терезесін ашу</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index 034144dc..fe15e2d7a 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">ಡೆಸ್ಕ್ 7</translation> <translation id="2224075387478458881">ಸುರಕ್ಷಿತ ವಿಷಯವು ಗೋಚರಿಸಿದಾಗ ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡಿಂಗ್ ಅನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ</translation> <translation id="225680501294068881">ಸಾಧನಗಳಿಗಾಗಿ ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation> +<translation id="2257486738914982088"><ph name="FILENAME" /> ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡುವಾಗ ಏನೋ ತಪ್ಪಾಗಿದೆ</translation> <translation id="2268130516524549846">ಬ್ಲೂಟೂತ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation> <translation id="2268813581635650749">ಎಲ್ಲಾ ಸೈನ್ ಔಟ್ ಮಾಡಿ</translation> <translation id="2269016722240250274">ಆ್ಯಪ್ವೊಂದು ನಿಮ್ಮ ಮೈಕ್ರೊಫೋನ್ ಅನ್ನು ಬಳಸುತ್ತಿದೆ</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">ಸ್ವಯಂಚಾಲಿತ ಕ್ಲಿಕ್ಗಳನ್ನು ಖಚಿತವಾಗಿಯೂ ಆಫ್ ಮಾಡಲು ಬಯಸುವಿರಾ?</translation> <translation id="4849058404725798627">ಕೀಬೋರ್ಡ್ ಫೋಕಸ್ ಮೂಲಕ ವಿಷಯವನ್ನು ಎದ್ದುಗಾಣಿಸಿ</translation> <translation id="485592688953820832">ಯಾವುದೇ ಕ್ರಮ ಕೈಗೊಳ್ಳಬೇಡಿ (ವಿರಾಮಗೊಳಿಸಿ)</translation> +<translation id="4860284199500934869"><ph name="FILENAME" /> ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲು ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ ಕನೆಕ್ಷನ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ</translation> <translation id="486056901304535126">ನಂತರ ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಲಾಗುವುದು. ಡೌನ್ಲೋಡ್ ಪೂರ್ಣಗೊಳ್ಳುವವರೆಗೆ, ಪ್ರಕ್ರಿಯೆಗಾಗಿ Google ಗೆ ಧ್ವನಿಯನ್ನು ಕಳುಹಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="4868492592575313542">ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation> <translation id="4872237917498892622">Alt+ಹುಡುಕಾಟ ಅಥವಾ Shift</translation> @@ -805,6 +807,7 @@ <translation id="6452181791372256707">ತಿರಸ್ಕರಿಸಿ</translation> <translation id="6453179446719226835">ಭಾಷೆಯನ್ನು ಬದಲಿಸಲಾಗಿದೆ</translation> <translation id="6459472438155181876"><ph name="DISPLAY_NAME" /> ಗೆ ಪರದೆಯನ್ನು ವಿಸ್ತರಿಸಲಾಗುತ್ತಿದೆ</translation> +<translation id="6477681113376365978">ಫೈಲ್ ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="6482559668224714696">ಪೂರ್ಣಪರದೆ ವರ್ಧಕ</translation> <translation id="6490471652906364588">USB-C ಸಾಧನ (ಬಲ ಪೋರ್ಟ್)</translation> <translation id="6491071886865974820">ಗಡುವಿನ ಮೊದಲು ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಅನ್ನು ನೀವು ಅಪ್ಡೇಟ್ ಮಾಡಬೇಕೆಂದು <ph name="MANAGER" /> ಬಯಸುತ್ತದೆ</translation> @@ -817,6 +820,8 @@ <translation id="65320610082834431">ಎಮೋಜಿಗಳು</translation> <translation id="6537924328260219877">ಸಿಗ್ನಲ್ ಸಾಮರ್ಥ್ಯ <ph name="SIGNAL_STRENGTH" />, ಫೋನ್ ಬ್ಯಾಟರಿ <ph name="BATTERY_STATUS" /></translation> <translation id="6542521951477560771"><ph name="RECEIVER_NAME" /> ಗೆ ಬಿತ್ತರಿಸಲಾಗುತ್ತಿದೆ</translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +ಹೊಸ ಇನ್ಸ್ಟಾಲ್</translation> <translation id="6559976592393364813">ನಿರ್ವಾಹಕರನ್ನು ಕೇಳಿ</translation> <translation id="6565007273808762236">eSIM ಕನೆಕ್ಷನ್ ಲಭ್ಯವಿಲ್ಲ</translation> <translation id="6570831796530454248">{0,plural, =1{ಒಂದು ಗಂಟೆಯೊಳಗೆ ಸಾಧನವನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಿ}one{# ಗಂಟೆಗಳೊಳಗೆ ಸಾಧನವನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಿ}other{# ಗಂಟೆಗಳೊಳಗೆ ಸಾಧನವನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಿ}}</translation> @@ -848,6 +853,7 @@ <translation id="6723839937902243910">ಪವರ್</translation> <translation id="6727969043791803658">ಸಂಪರ್ಕಗೊಂಡಿದೆ, <ph name="BATTERY_PERCENTAGE" />% ರಷ್ಟು ಬ್ಯಾಟರಿ ಲಭ್ಯವಿದೆ</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6739144137573853180">ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ</translation> <translation id="6751052314767925245">ನಿಮ್ಮ ನಿರ್ವಾಹಕರ ಮೂಲಕ ಜಾರಿಗೊಳಿಸಲಾಗಿದೆ</translation> <translation id="6751826523481687655">ಕಾರ್ಯಕ್ಷಮತೆಯ ಟ್ರೇಸಿಂಗ್ ಅನ್ನು ಆನ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="6752912906630585008"><ph name="REMOVED_DESK" /> ಡೆಸ್ಕ್ ಅನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ ಮತ್ತು <ph name="RECEIVE_DESK" /> ಡೆಸ್ಕ್ನೊಂದಿಗೆ ವಿಲೀನಗೊಳಿಸಲಾಗಿದೆ</translation> @@ -983,6 +989,7 @@ <translation id="7662283695561029522">ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">ಹೊಸ ಸೆಲ್ಯುಲಾರ್ ನೆಟ್ವರ್ಕ್ ಅನ್ನು ಸೇರಿಸಿ</translation> +<translation id="7720410380936703141">ಪುನಃ ಪ್ರಯತ್ನಿಸಿ</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 ಅಧಿಸೂಚನೆ}one{# ಅಧಿಸೂಚನೆಗಳು}other{# ಅಧಿಸೂಚನೆಗಳು}}</translation> <translation id="7724603315864178912">ಕತ್ತರಿಸು</translation> <translation id="7745560842763881396">ಶೆಲ್ಫ್ನಲ್ಲಿ ಆ್ಯಪ್ಗಳನ್ನು ತೋರಿಸಿ</translation> @@ -1169,6 +1176,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590"><ph name="IME_NAME" /> ಬಳಸಲಾಗುತ್ತಿದೆ</translation> <translation id="899350903320462459">ಅಧಿಸೂಚನೆ ಕ್ರಿಯೆಯನ್ನು ನಿರ್ವಹಿಸಲು ಸಾಧನವನ್ನು <ph name="LOGIN_ID" /> ನಂತೆ ಅನ್ಲಾಕ್ ಮಾಡಿ</translation> +<translation id="9000771174482730261">ಸಂಗ್ರಹಣೆಯನ್ನು ನಿರ್ವಹಿಸಿ</translation> <translation id="9017320285115481645">Family Link ಪೋಷಕ ಪ್ರವೇಶದ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ.</translation> <translation id="9024331582947483881">ಪೂರ್ಣ ಪರದೆ</translation> <translation id="9047624247355796468"><ph name="NETWORK_NAME" /> ನ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಿರಿ</translation> @@ -1214,6 +1222,7 @@ <translation id="938963181863597773">ನನ್ನ ಕ್ಯಾಲೆಂಡರ್ನಲ್ಲಿ ಏನಿದೆ?</translation> <translation id="945522503751344254">ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಕಳುಹಿಸಿ</translation> <translation id="951991426597076286">ನಿರಾಕರಿಸಿ</translation> +<translation id="954052413789300507"><ph name="FILENAME" /> ಗಾಗಿ ಸಾಕಷ್ಟು ಸ್ಥಳಾವಕಾಶವಿಲ್ಲ. ಸ್ಥಳಾವಕಾಶವನ್ನು ಮುಕ್ತಗೊಳಿಸಿ.</translation> <translation id="974545358917229949"><ph name="QUERY" /> ಕುರಿತಾದ <ph name="RESULT_COUNT" /> ಫಲಿತಾಂಶಗಳನ್ನು ಪ್ರದರ್ಶಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="98515147261107953">ಲ್ಯಾಂಡ್ಸ್ಕೇಪ್</translation> <translation id="990277280839877440"><ph name="WINDOW_TITILE" />ವಿಂಡೋವನ್ನು ಮುಚ್ಚಲಾಗಿದೆ.</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb index c5cdb3e4..0f992d7 100644 --- a/ash/strings/ash_strings_ky.xtb +++ b/ash/strings/ash_strings_ky.xtb
@@ -623,6 +623,7 @@ <translation id="5075554201838155866">Коштомо жазууларды баштоо</translation> <translation id="5078796286268621944">Туура эмес PIN</translation> <translation id="5083553833479578423">Жардамчынын башка функцияларын иштетиңиз.</translation> +<translation id="5106223312672646208">Жекелештирүү</translation> <translation id="5117590920725113268">Кийинки айды көрсөтүү</translation> <translation id="5136175204352732067">Башка баскычтоп туташтырылды</translation> <translation id="5147567197700016471">Кулпусу ачык</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index 2365bb3..d32d5ad2 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">7 darbalaukis</translation> <translation id="2224075387478458881">Negalima įrašyti ekrano vaizdo, jei matomas apsaugotas turinys</translation> <translation id="225680501294068881">Ieškoma įrenginių...</translation> +<translation id="2257486738914982088">Atsisiunčiant „<ph name="FILENAME" />“ įvyko klaida</translation> <translation id="2268130516524549846">„Bluetooth“ neleidžiama</translation> <translation id="2268813581635650749">Atjungti visus</translation> <translation id="2269016722240250274">Programa naudoja mikrofoną</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">Ar tikrai norite išjungti automatinius paspaudimus?</translation> <translation id="4849058404725798627">Paryškinti objektą jį suaktyvinus klaviatūra</translation> <translation id="485592688953820832">Nesiimti jokių veiksmų (pristabdyti)</translation> +<translation id="4860284199500934869">Patikrinkite tinklo ryšį, kad atsisiųstumėte failą „<ph name="FILENAME" />“</translation> <translation id="486056901304535126">Atsisiųsti bus bandoma vėliau. Kalba bus siunčiama į sistemą „Google“ apdoroti, kol bus atsisiųsta.</translation> <translation id="4868492592575313542">suaktyvinta</translation> <translation id="4872237917498892622">„Alt“ + paieškos arba antrojo lygio klavišas</translation> @@ -804,6 +806,7 @@ <translation id="6452181791372256707">Atmesti</translation> <translation id="6453179446719226835">Kalba pakeista</translation> <translation id="6459472438155181876">Ekranas išplečiamas į <ph name="DISPLAY_NAME" /></translation> +<translation id="6477681113376365978">Neįmanoma atsiųsti failo</translation> <translation id="6482559668224714696">Viso ekrano didintuvas</translation> <translation id="6490471652906364588">USB-C įrenginys (prievadas dešinėje)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> reikalauja atnaujinti „<ph name="DEVICE_TYPE" />“ iki termino</translation> @@ -816,6 +819,8 @@ <translation id="65320610082834431">Jaustukai</translation> <translation id="6537924328260219877">Signalo stiprumas <ph name="SIGNAL_STRENGTH" />, telefono akumuliatorius <ph name="BATTERY_STATUS" /></translation> <translation id="6542521951477560771">Perduodama į „<ph name="RECEIVER_NAME" />“</translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +Naujas įdiegimas</translation> <translation id="6559976592393364813">Klausti administratoriaus</translation> <translation id="6565007273808762236">„eSIM“ kortelės ryšys nepasiekiamas</translation> <translation id="6570831796530454248">{0,plural, =1{Atnaujinkite įrenginį per valandą}one{Atnaujinkite įrenginį per # valandą}few{Atnaujinkite įrenginį per # valandas}many{Atnaujinkite įrenginį per # valandos}other{Atnaujinkite įrenginį per # valandų}}</translation> @@ -847,6 +852,7 @@ <translation id="6723839937902243910">Maitinimas</translation> <translation id="6727969043791803658">Prisijungta, akumuliatoriaus įkrovos lygis: <ph name="BATTERY_PERCENTAGE" /> proc.</translation> <translation id="6732800389263199929">Dar <ph name="COUNT" /></translation> +<translation id="6739144137573853180">EIKITE Į NUSTATYMUS</translation> <translation id="6751052314767925245">Įgalino jūsų administratorius</translation> <translation id="6751826523481687655">Našumo stebėjimas įjungtas</translation> <translation id="6752912906630585008">Darbalaukis „<ph name="REMOVED_DESK" />“ pašalintas ir sujungtas su darbalaukiu „<ph name="RECEIVE_DESK" />“</translation> @@ -982,6 +988,7 @@ <translation id="7662283695561029522">Palieskite, kad konfigūruotumėte</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">Pridėti naują mobiliojo ryšio tinklą</translation> +<translation id="7720410380936703141">BANDYKITE DAR KARTĄ</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 pranešimas}one{# pranešimas}few{# pranešimai}many{# pranešimo}other{# pranešimų}}</translation> <translation id="7724603315864178912">Iškirpti</translation> <translation id="7745560842763881396">Rodyti programas lentynoje</translation> @@ -1168,6 +1175,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">Naudojama <ph name="IME_NAME" /></translation> <translation id="899350903320462459">Atrakinkite įrenginį su <ph name="LOGIN_ID" />, kad galėtumėte įvykdyti pranešimo veiksmą</translation> +<translation id="9000771174482730261">TVARKYKITE SAUGYKLĄ</translation> <translation id="9017320285115481645">Įveskite „Family Link“ tėvų prieigos kodą.</translation> <translation id="9024331582947483881">visas ekranas</translation> <translation id="9047624247355796468">Atidaryti „<ph name="NETWORK_NAME" />“ nustatymus</translation> @@ -1213,6 +1221,7 @@ <translation id="938963181863597773">„What's on my calendar?“ (Kas mano kalendoriuje?)</translation> <translation id="945522503751344254">Siųsti atsiliepimą</translation> <translation id="951991426597076286">Atmesti</translation> +<translation id="954052413789300507">Nepakanka vietos failui „<ph name="FILENAME" />“. Atlaisvinkite vietos.</translation> <translation id="974545358917229949">Pagal užklausą „<ph name="QUERY" />“ pateikiama rezultatų: <ph name="RESULT_COUNT" /></translation> <translation id="98515147261107953">Gulsčias</translation> <translation id="990277280839877440">Langas „<ph name="WINDOW_TITILE" />“ uždarytas.</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index 5f2b17a..503b984b 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">ഡെസ്ക് 7</translation> <translation id="2224075387478458881">പരിരക്ഷിത ഉള്ളടക്കം ദൃശ്യമായിരിക്കുമ്പോൾ സ്ക്രീൻ റെക്കോർഡിംഗ് അനുവദനീയമല്ല</translation> <translation id="225680501294068881">ഉപകരണങ്ങൾക്കായി സ്കാൻ ചെയ്യുന്നു...</translation> +<translation id="2257486738914982088"><ph name="FILENAME" /> ഡൗൺലോഡ് ചെയ്യുന്നതിനിടെ എന്തോ കുഴപ്പം സംഭവിച്ചു</translation> <translation id="2268130516524549846">Bluetooth അപ്രാപ്തമാക്കി</translation> <translation id="2268813581635650749">എല്ലാം സൈൻ ഔട്ട്</translation> <translation id="2269016722240250274">ഒരു ആപ്പ് നിങ്ങളുടെ മൈക്രോഫോൺ ഉപയോഗിക്കുന്നു</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">സ്വയമേവയുള്ള ക്ലിക്കുകൾ ഓഫാക്കണമെന്ന് നിങ്ങൾക്ക് തീർച്ചയാണോ?</translation> <translation id="4849058404725798627">കീബോർഡ് ഫോക്കസ് ഉപയോഗിച്ച് ഒബ്ജക്റ്റിനെ ഹൈലൈറ്റ് ചെയ്യുക</translation> <translation id="485592688953820832">പ്രവർത്തനമൊന്നും വേണ്ട (താൽക്കാലികമായി നിർത്തുക)</translation> +<translation id="4860284199500934869"><ph name="FILENAME" /> ഡൗൺലോഡ് ചെയ്യാൻ നിങ്ങളുടെ കണക്ഷൻ പരിശോധിക്കുക</translation> <translation id="486056901304535126">പിന്നീട് ഡൗൺലോഡ് ചെയ്യാൻ ശ്രമിക്കും. ഡൗൺലോഡ് പൂർത്തിയാകുന്നത് വരെ സംഭാഷണം പ്രോസസ് ചെയ്യുന്നതിനായി Google-ലേക്ക് അയയ്ക്കും.</translation> <translation id="4868492592575313542">സജീവമാക്കി</translation> <translation id="4872237917498892622">Alt+തിരയൽ അല്ലെങ്കിൽ Shift</translation> @@ -621,6 +623,7 @@ <translation id="5075554201838155866">സബ്ടൈറ്റിലുകൾ ആരംഭിക്കുക</translation> <translation id="5078796286268621944">തെറ്റായ PIN</translation> <translation id="5083553833479578423">കൂടുതൽ അസിസ്റ്റന്റ് ഫീച്ചറുകൾ അൺലോക്ക് ചെയ്യുക.</translation> +<translation id="5106223312672646208">വ്യക്തിപരമാക്കുക</translation> <translation id="5117590920725113268">അടുത്ത മാസം കാണിക്കുക</translation> <translation id="5136175204352732067">വ്യത്യസ്ത കീബോർഡ് കണക്റ്റ് ചെയ്തു</translation> <translation id="5147567197700016471">അൺലോക്ക് ചെയ്തു</translation> @@ -804,6 +807,7 @@ <translation id="6452181791372256707">നിരസിക്കുക</translation> <translation id="6453179446719226835">ഭാഷ മാറ്റിയിരിക്കുന്നു</translation> <translation id="6459472438155181876">സ്ക്രീൻ <ph name="DISPLAY_NAME" /> എന്നതിലേക്ക് വികസിപ്പിക്കുന്നു</translation> +<translation id="6477681113376365978">ഫയൽ ഡൗൺലോഡ് ചെയ്യാനാകുന്നില്ല</translation> <translation id="6482559668224714696">പൂർണ്ണസ്ക്രീൻ മാഗ്നിഫയർ</translation> <translation id="6490471652906364588">USB-C ഉപകരണം (വലത് പോർട്ട്)</translation> <translation id="6491071886865974820">സമയപരിധി അവസാനിക്കുന്നതിന് മുമ്പ് നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> അപ്ഡേറ്റ് ചെയ്യാൻ <ph name="MANAGER" /> ആവശ്യപ്പെടുന്നു.</translation> @@ -817,6 +821,8 @@ <translation id="6537924328260219877">സിഗ്നൽ ശക്തി <ph name="SIGNAL_STRENGTH" />, ഫോൺ ബാറ്ററി <ph name="BATTERY_STATUS" /></translation> <translation id="6539852571005954999">ഡൗൺലോഡ് സ്കാൻ ചെയ്യുന്നു <ph name="FILENAME" /></translation> <translation id="6542521951477560771"><ph name="RECEIVER_NAME" /> ഉപകരണത്തിലേക്ക് കാസ്റ്റ് ചെയ്യുന്നു</translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +പുതിയ ഇൻസ്റ്റാൾ</translation> <translation id="6559976592393364813">അഡ്മിനിസ്ട്രേറ്ററോട് ചോദിക്കുക</translation> <translation id="6565007273808762236">eSIM കണക്ഷൻ ലഭ്യമല്ല</translation> <translation id="6570831796530454248">{0,plural, =1{ഒരു മണിക്കൂറിനുള്ളിൽ ഉപകരണം അപ്ഡേറ്റ് ചെയ്യുക}other{# മണിക്കൂറിനുള്ളിൽ ഉപകരണം അപ്ഡേറ്റ് ചെയ്യുക}}</translation> @@ -848,6 +854,7 @@ <translation id="6723839937902243910">പവർ</translation> <translation id="6727969043791803658">കണക്റ്റ് ചെയ്തു, <ph name="BATTERY_PERCENTAGE" />% ബാറ്ററി</translation> <translation id="6732800389263199929">+<ph name="COUNT" /> എണ്ണം</translation> +<translation id="6739144137573853180">ക്രമീകരണത്തിലേക്ക് പോകുക</translation> <translation id="6751052314767925245">നിങ്ങളുടെ അഡ്മിൻ നടപ്പിലാക്കിയതാണ്</translation> <translation id="6751826523481687655">പ്രകടനം പിന്തുടരൽ ഓണാണ്</translation> <translation id="6752912906630585008">ഡെസ്ക് <ph name="REMOVED_DESK" /> നീക്കം ചെയ്ത്, ഡെസ്ക് <ph name="RECEIVE_DESK" />-മായി ലയിപ്പിച്ചു</translation> @@ -983,6 +990,7 @@ <translation id="7662283695561029522">കോൺഫിഗർ ചെയ്യുന്നതിന് ടാപ്പ് ചെയ്യുക</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">പുതിയ സെല്ലുലാർ നെറ്റ്വർക്ക് ചേർക്കുക</translation> +<translation id="7720410380936703141">വീണ്ടും ശ്രമിക്കുക</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{ഒരു അറിയിപ്പ്}other{# അറിയിപ്പുകൾ}}</translation> <translation id="7724603315864178912">മുറിക്കുക</translation> <translation id="7745560842763881396">ഷെൽഫിലെ ആപ്പുകൾ കാണിക്കുക</translation> @@ -1169,6 +1177,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590"><ph name="IME_NAME" /> ഉപയോഗിക്കുന്നു</translation> <translation id="899350903320462459">അറിയിപ്പ് പ്രവർത്തനം നിർവഹിക്കാൻ, <ph name="LOGIN_ID" /> ആയി ഉപകരണം അൺലോക്ക് ചെയ്യുക</translation> +<translation id="9000771174482730261">സ്റ്റോറേജ് മാനേജ് ചെയ്യുക</translation> <translation id="9017320285115481645">Family Link രക്ഷാകർതൃ ആക്സസ് കോഡ് നൽകുക.</translation> <translation id="9024331582947483881">പൂര്ണ്ണ സ്ക്രീന്</translation> <translation id="9047624247355796468"><ph name="NETWORK_NAME" /> എന്നതിനുള്ള ക്രമീകരണം തുറക്കുക</translation> @@ -1214,6 +1223,7 @@ <translation id="938963181863597773">എന്റെ കലണ്ടറിൽ എന്താണുള്ളത്?</translation> <translation id="945522503751344254">ഫീഡ്ബാക്ക് അയയ്ക്കുക</translation> <translation id="951991426597076286">നിരസിക്കുക</translation> +<translation id="954052413789300507"><ph name="FILENAME" /> എന്നതിനാവശ്യമായ ഇടം ലഭ്യമല്ല. ഇടം സൃഷ്ടിക്കുക.</translation> <translation id="974545358917229949"><ph name="QUERY" /> എന്നതിനുള്ള <ph name="RESULT_COUNT" /> ഫലങ്ങൾ കാണിക്കുന്നു</translation> <translation id="98515147261107953">ലാന്ഡ്സ്കേപ്പ്</translation> <translation id="990277280839877440"><ph name="WINDOW_TITILE" /> വിൻഡോ അടച്ചു.</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb index 34b004d7..626c0b5 100644 --- a/ash/strings/ash_strings_mn.xtb +++ b/ash/strings/ash_strings_mn.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">Дэлгэц 7</translation> <translation id="2224075387478458881">Хамгаалалттай контент харагдаж байх үед дэлгэцийн үйлдэл бичихийг зөвшөөрөхгүй</translation> <translation id="225680501294068881">Төхөөрөмжийг хайж байна...</translation> +<translation id="2257486738914982088"><ph name="FILENAME" />-г татаж авах явцад алдаа гарлаа</translation> <translation id="2268130516524549846">Bluetooth-г идэвхгүй болгосон байна</translation> <translation id="2268813581635650749">Бүгдээс гарах</translation> <translation id="2269016722240250274">Аппликэйшн таны микрофоныг ашиглаж байна</translation> @@ -588,6 +589,7 @@ <translation id="4831034276697007977">Автомат даралтыг унтраахдаа итгэлтэй байна уу?</translation> <translation id="4849058404725798627">Объектыг гарын фокусаар тодруулах</translation> <translation id="485592688953820832">Үйлдэл алга (түр зогсоох)</translation> +<translation id="4860284199500934869"><ph name="FILENAME" /> татаж авахын тулд сүлжээний холболтоо шалгана уу</translation> <translation id="486056901304535126">Таталтыг дараа оролдоно. Таталт дуусах хүртэл яриаг Google-д боловсруулахаар илгээнэ.</translation> <translation id="4868492592575313542">идэвхжүүлсэн байна</translation> <translation id="4872237917498892622">Alt+Search эсвэл Shift</translation> @@ -806,6 +808,7 @@ <translation id="6452181791372256707">Татгалзах</translation> <translation id="6453179446719226835">Хэлийг өөрчилсөн</translation> <translation id="6459472438155181876">Дэлгэцийг <ph name="DISPLAY_NAME" /> руу сунгаж байна</translation> +<translation id="6477681113376365978">Файлыг татах боломжгүй</translation> <translation id="6482559668224714696">Бүтэн дэлгэц томруулагч</translation> <translation id="6490471652906364588">USB-C төхөөрөмж (баруун талын порт)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> таныг өөрийн <ph name="DEVICE_TYPE" />-г эцсийн хугацаанаас өмнө шинэчлэхийг шаардаж байна</translation> @@ -819,6 +822,8 @@ <translation id="6537924328260219877">Дохионы хүч <ph name="SIGNAL_STRENGTH" />, утасны батарей <ph name="BATTERY_STATUS" /></translation> <translation id="6539852571005954999">Татах <ph name="FILENAME" />-г скан хийж байна</translation> <translation id="6542521951477560771"><ph name="RECEIVER_NAME" />-д дамжуулж байна</translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +Шинээр суулгасан</translation> <translation id="6559976592393364813">Админаас асуух</translation> <translation id="6565007273808762236">eSIM холболт боломжгүй</translation> <translation id="6570831796530454248">{0,plural, =1{Төхөөрөмжийг нэг цагийн дотор шинэчилнэ үү}other{Төхөөрөмжийг # цагийн дотор шинэчилнэ үү}}</translation> @@ -850,6 +855,7 @@ <translation id="6723839937902243910">Эрчим хүч</translation> <translation id="6727969043791803658">Холбогдсон, батарей <ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6739144137573853180">ТОХИРГОО РУУ ОЧИХ</translation> <translation id="6751052314767925245">Таны администратор хэрэгжүүлдэг</translation> <translation id="6751826523481687655">Гүйцэтгэлийн хяналтыг асаасан</translation> <translation id="6752912906630585008"><ph name="REMOVED_DESK" /> дэлгэцийг хасаж, <ph name="RECEIVE_DESK" /> дэлгэцтэй нэгтгэсэн</translation> @@ -985,6 +991,7 @@ <translation id="7662283695561029522">Тохируулахын тулд товших</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">Үүрэн холбооны шинэ сүлжээ нэмэх</translation> +<translation id="7720410380936703141">ДАХИН ОРОЛДОХ</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 мэдэгдэл}other{# мэдэгдэл}}</translation> <translation id="7724603315864178912">Хайчлах</translation> <translation id="7745560842763881396">Аппуудыг тавиур дээр харуулах</translation> @@ -1172,6 +1179,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590"><ph name="IME_NAME" />-г ашиглаж байна</translation> <translation id="899350903320462459">Мэдэгдлийн үйлдлийг гүйцэтгэхийн тулд төхөөрөмжийн түгжээг <ph name="LOGIN_ID" />-р тайлна уу</translation> +<translation id="9000771174482730261">ХАДГАЛАХ САНГ УДИРДАХ</translation> <translation id="9017320285115481645">Family Link-н эцэг эхийн нэвтрэх кодоо оруулна уу.</translation> <translation id="9024331582947483881">бүтэн дэлгэц</translation> <translation id="9047624247355796468"><ph name="NETWORK_NAME" />-н тохиргоог нээх</translation> @@ -1217,6 +1225,7 @@ <translation id="938963181863597773">Миний календарьд юу байна вэ?</translation> <translation id="945522503751344254">Санал хүсэлт илгээх</translation> <translation id="951991426597076286">Татгалзах</translation> +<translation id="954052413789300507"><ph name="FILENAME" />-д хангалттай зай байхгүй байна. Зай гаргана уу.</translation> <translation id="974545358917229949"><ph name="QUERY" />-н <ph name="RESULT_COUNT" /> илэрцийг үзүүлж байна</translation> <translation id="98515147261107953">Газрын гадаргуун зураг</translation> <translation id="990277280839877440"><ph name="WINDOW_TITILE" /> цонх хаалттай байна.</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb index 031d24d7..76f04a4 100644 --- a/ash/strings/ash_strings_mr.xtb +++ b/ash/strings/ash_strings_mr.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">डेस्क ७</translation> <translation id="2224075387478458881">सुरक्षित आशय दृश्यमान असेल तेव्हा स्क्रीन रेकॉर्डिंगला अनुमती नाही</translation> <translation id="225680501294068881">डिव्हाइसेससाठी स्कॅन करत आहे...</translation> +<translation id="2257486738914982088"><ph name="FILENAME" /> डाउनलोड करताना काहीतरी चूक झाली</translation> <translation id="2268130516524549846">ब्लूटूथ अक्षम</translation> <translation id="2268813581635650749">सर्व साइन आउट करा</translation> <translation id="2269016722240250274">अॅप्लिकेशन तुमचा मायक्रोफोन वापरत आहे</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">तुम्हाला ऑटोमेटिक क्लिक नक्की बंद करायचे आहे का?</translation> <translation id="4849058404725798627">कीबोर्ड फोकससह ऑब्जेक्ट हायलाइट करा</translation> <translation id="485592688953820832">कृती नाही (थांबवा)</translation> +<translation id="4860284199500934869"><ph name="FILENAME" /> डाउनलोड करण्यासाठी तुमचे नेटवर्क कनेक्शन तपासा</translation> <translation id="486056901304535126">नंतर डाउनलोड करण्याचा प्रयत्न केला जाईल. डाउनलोड पूर्ण होईपर्यंत प्रक्रिया करण्यासाठी स्पीच Google ला पाठवली जाईल.</translation> <translation id="4868492592575313542">अॅक्टिव्हेट केले आहे</translation> <translation id="4872237917498892622">Alt+Search किंवा Shift</translation> @@ -804,6 +806,7 @@ <translation id="6452181791372256707">नाकारा</translation> <translation id="6453179446719226835">भाषा बदलण्यात आली आहे</translation> <translation id="6459472438155181876"><ph name="DISPLAY_NAME" /> मध्ये स्क्रीन विस्तृत करत आहे</translation> +<translation id="6477681113376365978">फाइल डाउनलोड करू शकत नाही</translation> <translation id="6482559668224714696">फुल-स्क्रीन मॅग्निफायर</translation> <translation id="6490471652906364588">USB-C डिव्हाइस (उजवे पोर्ट)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> ला तुम्ही तुमचे <ph name="DEVICE_TYPE" /> डिव्हाइस डेडलाइनच्या आधी अपडेट करणे आवश्यक आहे</translation> @@ -816,6 +819,8 @@ <translation id="65320610082834431">इमोजी</translation> <translation id="6537924328260219877">सिग्नल क्षमता <ph name="SIGNAL_STRENGTH" />, फोन बॅटरी <ph name="BATTERY_STATUS" /></translation> <translation id="6542521951477560771"><ph name="RECEIVER_NAME" /> वर कास्ट करत आहे</translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +नवीन इंस्टॉल केले आहे</translation> <translation id="6559976592393364813">अॅडमिनिस्ट्रेटरला विचारा</translation> <translation id="6565007273808762236">eSIM कनेक्शन उपलब्ध नाही</translation> <translation id="6570831796530454248">{0,plural, =1{डिव्हाइस एका तासाच्या आत अपडेट करा}other{डिव्हाइस # तासांच्या आत अपडेट करा}}</translation> @@ -847,6 +852,7 @@ <translation id="6723839937902243910">सामर्थ्य</translation> <translation id="6727969043791803658">कनेक्ट केले, <ph name="BATTERY_PERCENTAGE" />% बॅटरी</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6739144137573853180">सेटिंग्जवर जा</translation> <translation id="6751052314767925245">तुमच्या अॅडमिनिस्ट्रेटरने अंमलबजावणी केलेले</translation> <translation id="6751826523481687655">परफॉर्मंस ट्रेसिंग सुरू आहे</translation> <translation id="6752912906630585008"><ph name="REMOVED_DESK" /> डेस्क काढून टाकले आणि डेस्क <ph name="RECEIVE_DESK" /> साेबत मर्ज केले</translation> @@ -982,6 +988,7 @@ <translation id="7662283695561029522">कॉंफिगर करण्यासाठी टॅप करा</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">नवीन मोबाइल नेटवर्क जोडा</translation> +<translation id="7720410380936703141">पुन्हा प्रयत्न करा</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{एक सूचना}other{# सूचना}}</translation> <translation id="7724603315864178912">कट करा</translation> <translation id="7745560842763881396">शेल्फमधील अॅप्स दाखवा</translation> @@ -1168,6 +1175,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590"><ph name="IME_NAME" /> वापरत आहे</translation> <translation id="899350903320462459">सूचनेशी संबंधित क्रिया पार पाडण्यासाठी डिव्हाइस <ph name="LOGIN_ID" /> म्हणून अनलॉक करा</translation> +<translation id="9000771174482730261">स्टोरेज व्यवस्थापित करा</translation> <translation id="9017320285115481645">Family Link पालक ॲक्सेस कोड एंटर करा.</translation> <translation id="9024331582947483881">फुल स्क्रीन</translation> <translation id="9047624247355796468"><ph name="NETWORK_NAME" /> साठी सेटिंग्ज उघडा</translation> @@ -1214,6 +1222,7 @@ <translation id="938963181863597773">माझ्या कॅलेंडरमधील इव्हेंट काय आहेत?</translation> <translation id="945522503751344254">अभिप्राय पाठवा</translation> <translation id="951991426597076286">नकार द्या</translation> +<translation id="954052413789300507"><ph name="FILENAME" /> साठी पुरेशी जागा नाही. जागा मोकळी करा.</translation> <translation id="974545358917229949"><ph name="QUERY" /> साठी <ph name="RESULT_COUNT" /> परिणाम दाखवत आहे</translation> <translation id="98515147261107953">लँडस्केप</translation> <translation id="990277280839877440"><ph name="WINDOW_TITILE" /> विंडो बंद केली आहे.</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index e822d1e..eee08b3 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -818,6 +818,7 @@ <translation id="6528179044667508675">Niet storen</translation> <translation id="65320610082834431">Emoji's</translation> <translation id="6537924328260219877">Signaalsterkte <ph name="SIGNAL_STRENGTH" />, telefoonbatterij <ph name="BATTERY_STATUS" /></translation> +<translation id="6539852571005954999"><ph name="FILENAME" /> scannen voor downloaden</translation> <translation id="6542521951477560771">Er wordt gecast naar <ph name="RECEIVER_NAME" /></translation> <translation id="655633303491376835"><ph name="APP_NAME" /> Nieuwe installatie</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index 7a8a1697..f7261e2 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">Skrivebord 7</translation> <translation id="2224075387478458881">Skjermopptak tillates ikke når beskyttet innhold er synlig</translation> <translation id="225680501294068881">Leter etter enheter ...</translation> +<translation id="2257486738914982088">Noe gikk galt under nedlasting av <ph name="FILENAME" /></translation> <translation id="2268130516524549846">Bluetooth er deaktivert</translation> <translation id="2268813581635650749">Logg alle av</translation> <translation id="2269016722240250274">Et program bruker mikrofonen din</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">Er du sikker på at du vil slå av automatiske klikk?</translation> <translation id="4849058404725798627">Fremhev objektet med tastaturfokus</translation> <translation id="485592688953820832">Ingen handling (pause)</translation> +<translation id="4860284199500934869">Kontroller nettverkstilkoblingen din for å laste ned <ph name="FILENAME" /></translation> <translation id="486056901304535126">Vi forsøker å laste ned filene senere. Tale blir sendt til Google for behandling frem til nedlastingen er fullført.</translation> <translation id="4868492592575313542">aktivert</translation> <translation id="4872237917498892622">Alt + Søk eller Shift</translation> @@ -804,6 +806,7 @@ <translation id="6452181791372256707">Avslå</translation> <translation id="6453179446719226835">Språket er endret</translation> <translation id="6459472438155181876">Utvider skjermen til <ph name="DISPLAY_NAME" /></translation> +<translation id="6477681113376365978">Kan ikke laste ned filen</translation> <translation id="6482559668224714696">Lupe for hele skjermen</translation> <translation id="6490471652906364588">USB-C-enhet (porten på høyre side)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> krever at du oppdaterer <ph name="DEVICE_TYPE" /> før tidsfristen</translation> @@ -817,6 +820,8 @@ <translation id="6537924328260219877">Signalstyrke <ph name="SIGNAL_STRENGTH" /> – telefonbatterinivå <ph name="BATTERY_STATUS" /></translation> <translation id="6539852571005954999">Nedlastingen skannes: <ph name="FILENAME" /></translation> <translation id="6542521951477560771">Caster til <ph name="RECEIVER_NAME" /></translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +Nylig installert</translation> <translation id="6559976592393364813">Spør administratoren</translation> <translation id="6565007273808762236">e-SIM-korttilkoblingen er ikke tilgjengelig</translation> <translation id="6570831796530454248">{0,plural, =1{Oppdater enheten innen en time}other{Oppdater enheten innen # timer}}</translation> @@ -848,6 +853,7 @@ <translation id="6723839937902243910">Strøm</translation> <translation id="6727969043791803658">Koblet til – <ph name="BATTERY_PERCENTAGE" /> % batteri</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6739144137573853180">GÅ TIL INNSTILLINGER</translation> <translation id="6751052314767925245">Påkreves av administratoren din</translation> <translation id="6751826523481687655">Ytelsessporing er slått på</translation> <translation id="6752912906630585008">Skrivebord <ph name="REMOVED_DESK" /> ble fjernet og slått sammen med skrivebord <ph name="RECEIVE_DESK" /></translation> @@ -983,6 +989,7 @@ <translation id="7662283695561029522">Trykk for å konfigurere</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">Legg til nytt mobilnettverk</translation> +<translation id="7720410380936703141">PRØV PÅ NYTT</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 varsel}other{# varsler}}</translation> <translation id="7724603315864178912">Klipp ut</translation> <translation id="7745560842763881396">Vis apper på hyllen</translation> @@ -1169,6 +1176,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">Bruker <ph name="IME_NAME" /></translation> <translation id="899350903320462459">Lås opp enheten som <ph name="LOGIN_ID" /> for å utføre varselhandlingen</translation> +<translation id="9000771174482730261">ADMINISTRER LAGRING</translation> <translation id="9017320285115481645">Skriv inn koden for foreldretilgang til Family Link.</translation> <translation id="9024331582947483881">full skjerm</translation> <translation id="9047624247355796468">Åpne innstillinger for <ph name="NETWORK_NAME" /></translation> @@ -1214,6 +1222,7 @@ <translation id="938963181863597773">Hva er i kalenderen min?</translation> <translation id="945522503751344254">Send tilbakemelding</translation> <translation id="951991426597076286">Avvis</translation> +<translation id="954052413789300507">Ikke nok plass til <ph name="FILENAME" />. Frigjør plass.</translation> <translation id="974545358917229949">Viser <ph name="RESULT_COUNT" /> resultater for <ph name="QUERY" /></translation> <translation id="98515147261107953">Liggende</translation> <translation id="990277280839877440">Vinduet <ph name="WINDOW_TITILE" /> er lukket.</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index 50c7810..268ed7c 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">Biurko 7</translation> <translation id="2224075387478458881">Gdy widoczne są treści chronione, nagrywanie ekranu jest niedozwolone</translation> <translation id="225680501294068881">Skanowanie w poszukiwaniu urządzeń...</translation> +<translation id="2257486738914982088">Podczas pobierania pliku <ph name="FILENAME" /> coś poszło nie tak</translation> <translation id="2268130516524549846">Bluetooth wyłączony</translation> <translation id="2268813581635650749">Wyloguj wszystkich</translation> <translation id="2269016722240250274">Aplikacja używa Twojego mikrofonu</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">Czy na pewno chcesz wyłączyć automatyczne kliknięcia?</translation> <translation id="4849058404725798627">Podświetlaj obiekt wybrany za pomocą klawiatury</translation> <translation id="485592688953820832">Brak działania (wstrzymaj)</translation> +<translation id="4860284199500934869">Aby pobrać plik <ph name="FILENAME" />, sprawdź połączenie sieciowe</translation> <translation id="486056901304535126">Spróbuję je pobrać później. Do momentu ukończenia pobierania mowa będzie wysyłana do Google i tam przetwarzana.</translation> <translation id="4868492592575313542">aktywna</translation> <translation id="4872237917498892622">Alt+Szukaj lub Shift</translation> @@ -804,6 +806,7 @@ <translation id="6452181791372256707">Odrzuć</translation> <translation id="6453179446719226835">Język został zmieniony</translation> <translation id="6459472438155181876">Rozszerzanie ekranu na <ph name="DISPLAY_NAME" /></translation> +<translation id="6477681113376365978">Nie można pobrać pliku</translation> <translation id="6482559668224714696">Lupa pełnoekranowa</translation> <translation id="6490471652906364588">Urządzenie USB-C (prawy port)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> wymaga zaktualizowania tego urządzenia <ph name="DEVICE_TYPE" /> przed podanym terminem</translation> @@ -817,6 +820,7 @@ <translation id="6537924328260219877">Siła sygnału: <ph name="SIGNAL_STRENGTH" />, bateria telefonu: <ph name="BATTERY_STATUS" /></translation> <translation id="6539852571005954999">Skanuję pobierany plik <ph name="FILENAME" /></translation> <translation id="6542521951477560771">Przesyłam do: <ph name="RECEIVER_NAME" /></translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> – nowa instalacja</translation> <translation id="6559976592393364813">Poproś administratora</translation> <translation id="6565007273808762236">Połączenie eSIM jest niedostępne</translation> <translation id="6570831796530454248">{0,plural, =1{Aktualizacja urządzenia nastąpi w ciągu godziny}few{Aktualizacja urządzenia nastąpi w ciągu # godzin}many{Aktualizacja urządzenia nastąpi w ciągu # godzin}other{Aktualizacja urządzenia nastąpi w ciągu # godziny}}</translation> @@ -848,6 +852,7 @@ <translation id="6723839937902243910">Zasilanie</translation> <translation id="6727969043791803658">Połączono, bateria: <ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6739144137573853180">OTWÓRZ USTAWIENIA</translation> <translation id="6751052314767925245">Wymusił administrator</translation> <translation id="6751826523481687655">Śledzenie wydajności jest włączone</translation> <translation id="6752912906630585008">Biurko <ph name="REMOVED_DESK" /> zostało usunięte i połączone z biurkiem <ph name="RECEIVE_DESK" /></translation> @@ -983,6 +988,7 @@ <translation id="7662283695561029522">Kliknij, by skonfigurować</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">Dodaj nową sieć komórkową</translation> +<translation id="7720410380936703141">SPRÓBUJ PONOWNIE</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 powiadomienie}few{# powiadomienia}many{# powiadomień}other{# powiadomienia}}</translation> <translation id="7724603315864178912">Wytnij</translation> <translation id="7745560842763881396">Pokaż aplikacje na półce</translation> @@ -1169,6 +1175,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">W użyciu jest <ph name="IME_NAME" /></translation> <translation id="899350903320462459">Odblokuj urządzenie jako <ph name="LOGIN_ID" />, by zareagować na powiadomienie</translation> +<translation id="9000771174482730261">ZARZĄDZAJ MIEJSCEM NA DANE</translation> <translation id="9017320285115481645">Wpisz kod dostępu rodzica w Family Link.</translation> <translation id="9024331582947483881">pełny ekran</translation> <translation id="9047624247355796468">Otwórz ustawienia sieci <ph name="NETWORK_NAME" /></translation> @@ -1214,6 +1221,7 @@ <translation id="938963181863597773">Co mam w kalendarzu?</translation> <translation id="945522503751344254">Prześlij opinię</translation> <translation id="951991426597076286">Odrzuć</translation> +<translation id="954052413789300507">Za mało miejsca na plik <ph name="FILENAME" />. Zwolnij miejsce.</translation> <translation id="974545358917229949">Wyświetlam wyniki (<ph name="RESULT_COUNT" />) dla zapytania <ph name="QUERY" /></translation> <translation id="98515147261107953">Poziomo</translation> <translation id="990277280839877440">Okno <ph name="WINDOW_TITILE" /> zostało zamknięte.</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index 71d6734c..ad3c7a3 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -623,6 +623,7 @@ <translation id="5075554201838155866">Iniciar closed captions</translation> <translation id="5078796286268621944">PIN incorreto</translation> <translation id="5083553833479578423">Desbloqueie mais recursos do Assistente.</translation> +<translation id="5106223312672646208">Personalizar</translation> <translation id="5117590920725113268">Mostrar próximo mês</translation> <translation id="5136175204352732067">Teclado diferente conectado</translation> <translation id="5147567197700016471">Desbloqueado</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index 761fc9c..758c32c 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -623,6 +623,7 @@ <translation id="5075554201838155866">Iniciar legendas</translation> <translation id="5078796286268621944">PIN incorreto</translation> <translation id="5083553833479578423">Desbloqueie mais funcionalidades do Assistente.</translation> +<translation id="5106223312672646208">Personalizar</translation> <translation id="5117590920725113268">Mostrar mês seguinte</translation> <translation id="5136175204352732067">Teclado diferente ligado</translation> <translation id="5147567197700016471">Desbloqueado</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index f4bcfc1..2127982c 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">Desktop 7</translation> <translation id="2224075387478458881">Înregistrarea ecranului nu este permisă atunci când se afișează conținut protejat</translation> <translation id="225680501294068881">Se caută gadgeturi...</translation> +<translation id="2257486738914982088">A apărut o eroare în timpul descărcării <ph name="FILENAME" /></translation> <translation id="2268130516524549846">Bluetooth dezactivat</translation> <translation id="2268813581635650749">Deconectează tot</translation> <translation id="2269016722240250274">O aplicație folosește microfonul</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">Sigur vrei să dezactivezi clicurile automate?</translation> <translation id="4849058404725798627">Evidențiază obiectul focalizat de la tastatură</translation> <translation id="485592688953820832">Nicio acțiune (pauză)</translation> +<translation id="4860284199500934869">Verifică starea conexiunii la rețea pentru a descărca <ph name="FILENAME" /></translation> <translation id="486056901304535126">Se va încerca descărcarea mai târziu. Fișierele de redare în scris a vorbirii vor fi trimise la Google pentru procesare până la finalizarea descărcării.</translation> <translation id="4868492592575313542">activată</translation> <translation id="4872237917498892622">Alt+Căutare sau Shift</translation> @@ -804,6 +806,7 @@ <translation id="6452181791372256707">Respingeți</translation> <translation id="6453179446719226835">Limba a fost schimbată</translation> <translation id="6459472438155181876">Se extinde ecranul pe <ph name="DISPLAY_NAME" /></translation> +<translation id="6477681113376365978">Nu s-a putut descărca fișierul</translation> <translation id="6482559668224714696">Lupă de ecran complet</translation> <translation id="6490471652906364588">Dispozitiv USB-C (portul din dreapta)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> solicită să actualizezi dispozitivul <ph name="DEVICE_TYPE" /> înainte de termenul limită</translation> @@ -816,6 +819,8 @@ <translation id="65320610082834431">Emoji</translation> <translation id="6537924328260219877">Puterea semnalului: <ph name="SIGNAL_STRENGTH" />, bateria telefonului: <ph name="BATTERY_STATUS" /></translation> <translation id="6542521951477560771">Se proiectează conținut la <ph name="RECEIVER_NAME" /></translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +Instalare nouă</translation> <translation id="6559976592393364813">Întreabă administratorul</translation> <translation id="6565007273808762236">Nu este disponibilă o conexiune eSIM</translation> <translation id="6570831796530454248">{0,plural, =1{Actualizează dispozitivul într-o oră}few{Actualizează dispozitivul în # ore}other{Actualizează dispozitivul în # de ore}}</translation> @@ -847,6 +852,7 @@ <translation id="6723839937902243910">Alimentare</translation> <translation id="6727969043791803658">Conectat, nivelul bateriei: <ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6739144137573853180">ACCESEAZĂ SETĂRILE</translation> <translation id="6751052314767925245">Impusă de administrator</translation> <translation id="6751826523481687655">Urmărirea performanțelor este activată</translation> <translation id="6752912906630585008">Desktopul <ph name="REMOVED_DESK" /> a fost eliminat și îmbinat cu desktopul <ph name="RECEIVE_DESK" /></translation> @@ -982,6 +988,7 @@ <translation id="7662283695561029522">Atinge pentru a configura</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">Adaugă o nouă rețea de date mobile</translation> +<translation id="7720410380936703141">ÎNCEARCĂ DIN NOU</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{O notificare}few{# notificări}other{# de notificări}}</translation> <translation id="7724603315864178912">Decupează</translation> <translation id="7745560842763881396">Afișează aplicațiile în raft</translation> @@ -1168,6 +1175,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">Se folosește <ph name="IME_NAME" /></translation> <translation id="899350903320462459">Deblochează dispozitivul ca <ph name="LOGIN_ID" /> pentru efectuarea acțiunii de notificare</translation> +<translation id="9000771174482730261">GESTIONEAZĂ SPAȚIUL DE STOCARE</translation> <translation id="9017320285115481645">Introdu codul de acces parental pentru Family Link.</translation> <translation id="9024331582947483881">ecran complet</translation> <translation id="9047624247355796468">Deschide setările pentru <ph name="NETWORK_NAME" /></translation> @@ -1213,6 +1221,7 @@ <translation id="938963181863597773">Ce am în calendar?</translation> <translation id="945522503751344254">Trimite feedback</translation> <translation id="951991426597076286">Refuză</translation> +<translation id="954052413789300507">Nu există suficient spațiu pentru <ph name="FILENAME" />. Eliberează spațiu.</translation> <translation id="974545358917229949">Se afișează <ph name="RESULT_COUNT" /> rezultate pentru <ph name="QUERY" /></translation> <translation id="98515147261107953">Peisaj</translation> <translation id="990277280839877440">Fereastra <ph name="WINDOW_TITILE" /> s-a închis.</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb index 2fac5b1e..5b486a3 100644 --- a/ash/strings/ash_strings_ru.xtb +++ b/ash/strings/ash_strings_ru.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">Рабочий стол 7</translation> <translation id="2224075387478458881">Запись экрана запрещена, так как на нем есть защищенный контент.</translation> <translation id="225680501294068881">Поиск устройств…</translation> +<translation id="2257486738914982088">При скачивании файла <ph name="FILENAME" /> произошла ошибка.</translation> <translation id="2268130516524549846">Bluetooth отключен</translation> <translation id="2268813581635650749">Выйти для всех</translation> <translation id="2269016722240250274">Приложение использует ваш микрофон</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">Вы уверены, что хотите отключить функцию автоматического нажатия?</translation> <translation id="4849058404725798627">Выделять элементы, выбранные с помощью клавиатуры</translation> <translation id="485592688953820832">Отсутствие действий (пауза)</translation> +<translation id="4860284199500934869">Чтобы скачать файл <ph name="FILENAME" />, проверьте подключение к сети.</translation> <translation id="486056901304535126">Повторная попытка будет выполнена позже. Пока скачивание не завершится, записи с речью будут передаваться для обработки в Google.</translation> <translation id="4868492592575313542">включила</translation> <translation id="4872237917498892622">Alt + Search или Shift</translation> @@ -804,6 +806,7 @@ <translation id="6452181791372256707">Отклонить</translation> <translation id="6453179446719226835">Язык изменен</translation> <translation id="6459472438155181876">Расширение экрана на <ph name="DISPLAY_NAME" /></translation> +<translation id="6477681113376365978">Не удалось скачать файл</translation> <translation id="6482559668224714696">Полноэкранная лупа</translation> <translation id="6490471652906364588">Устройство USB-C (порт справа)</translation> <translation id="6491071886865974820">Согласно требованиям <ph name="MANAGER" /> вам нужно обновить устройство <ph name="DEVICE_TYPE" /> до истечения срока.</translation> @@ -816,6 +819,8 @@ <translation id="65320610082834431">Эмодзи</translation> <translation id="6537924328260219877">Уровень сигнала – <ph name="SIGNAL_STRENGTH" />, заряд батареи – <ph name="BATTERY_STATUS" /></translation> <translation id="6542521951477560771">Трансляция на устройство "<ph name="RECEIVER_NAME" />"</translation> +<translation id="655633303491376835">"<ph name="APP_NAME" />" +Новое приложение</translation> <translation id="6559976592393364813">Обратитесь к администратору</translation> <translation id="6565007273808762236">Подключение eSIM недоступно</translation> <translation id="6570831796530454248">{0,plural, =1{Перезагрузите устройство в течение 1 часа}one{Перезагрузите устройство в течение # часа}few{Перезагрузите устройство в течение # часов}many{Перезагрузите устройство в течение # часов}other{Перезагрузите устройство в течение # часа}}</translation> @@ -847,6 +852,7 @@ <translation id="6723839937902243910">Питание</translation> <translation id="6727969043791803658">Подключено, батарея заряжена на <ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="6732800389263199929">ещё <ph name="COUNT" /></translation> +<translation id="6739144137573853180">ОТКРЫТЬ НАСТРОЙКИ</translation> <translation id="6751052314767925245">Функция принудительно включена администратором</translation> <translation id="6751826523481687655">Отслеживание эффективности включено.</translation> <translation id="6752912906630585008">Рабочий стол "<ph name="REMOVED_DESK" />" удален и объединен с рабочим столом "<ph name="RECEIVE_DESK" />".</translation> @@ -982,6 +988,7 @@ <translation id="7662283695561029522">Нажмите, чтобы настроить.</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">Добавить мобильную сеть</translation> +<translation id="7720410380936703141">ПОВТОРИТЬ</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 уведомление}one{# уведомление}few{# уведомления}many{# уведомлений}other{# уведомления}}</translation> <translation id="7724603315864178912">Вырезать</translation> <translation id="7745560842763881396">Показать приложения на панели запуска</translation> @@ -1168,6 +1175,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">Используется <ph name="IME_NAME" /></translation> <translation id="899350903320462459">Чтобы выполнить действие, предложенное в уведомлении, разблокируйте устройство с помощью аккаунта <ph name="LOGIN_ID" />.</translation> +<translation id="9000771174482730261">ОЧИСТИТЬ ХРАНИЛИЩЕ</translation> <translation id="9017320285115481645">Введите родительский код доступа Family Link.</translation> <translation id="9024331582947483881">полноэкранный режим</translation> <translation id="9047624247355796468">Открыть настройки сети "<ph name="NETWORK_NAME" />"</translation> @@ -1213,6 +1221,7 @@ <translation id="938963181863597773">Что у меня запланировано?</translation> <translation id="945522503751344254">Отправить отзыв</translation> <translation id="951991426597076286">Отклонить</translation> +<translation id="954052413789300507">Недостаточно свободного места для скачивания файла <ph name="FILENAME" />. Освободите пространство.</translation> <translation id="974545358917229949">Показано результатов поиска по запросу "<ph name="QUERY" />": <ph name="RESULT_COUNT" /></translation> <translation id="98515147261107953">Альбомная</translation> <translation id="990277280839877440">Окно "<ph name="WINDOW_TITILE" />" закрыто.</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index 113b76c..e8716a8 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">7. plocha</translation> <translation id="2224075387478458881">Nahrávanie obrazovky nie je povolené, keď je viditeľný chránený obsah</translation> <translation id="225680501294068881">Hľadajú sa zariadenia...</translation> +<translation id="2257486738914982088">Pri sťahovaní súboru <ph name="FILENAME" /> sa vyskytol problém</translation> <translation id="2268130516524549846">Rozhranie Bluetooth je deaktivované</translation> <translation id="2268813581635650749">Odhlásiť všetkých</translation> <translation id="2269016722240250274">Nejaká aplikácia používa váš mikrofón</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">Naozaj chcete vypnúť automatické kliknutia?</translation> <translation id="4849058404725798627">Zvýrazniť objekt so zameraním klávesnice</translation> <translation id="485592688953820832">Žiadna akcia (pozastaviť)</translation> +<translation id="4860284199500934869">Ak chcete stiahnuť <ph name="FILENAME" />, skontrolujte pripojenie k sieti</translation> <translation id="486056901304535126">K pokusu o stiahnutie dôjde neskôr. Než sa sťahovanie dokončí, reč bude odosielaná na spracovanie Googlu.</translation> <translation id="4868492592575313542">aktivované</translation> <translation id="4872237917498892622">Alt + Hľadať alebo Shift</translation> @@ -621,6 +623,7 @@ <translation id="5075554201838155866">Spustiť skryté titulky</translation> <translation id="5078796286268621944">Nesprávny kód PIN</translation> <translation id="5083553833479578423">Odblokujte ďalšie funkcie Asistenta.</translation> +<translation id="5106223312672646208">Prispôsobiť</translation> <translation id="5117590920725113268">Zobraziť ďalší mesiac</translation> <translation id="5136175204352732067">Bola pripojená iná klávesnica</translation> <translation id="5147567197700016471">Odomknutý</translation> @@ -804,6 +807,7 @@ <translation id="6452181791372256707">Odmietnuť</translation> <translation id="6453179446719226835">Bol zmenený jazyk.</translation> <translation id="6459472438155181876">Rozšírenie obrazovky na displej <ph name="DISPLAY_NAME" /></translation> +<translation id="6477681113376365978">Súbor sa nedá stiahnuť</translation> <translation id="6482559668224714696">Lupa na celú obrazovku</translation> <translation id="6490471652906364588">Zariadenie USB-C (port vpravo)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> vyžaduje, aby ste zariadenie <ph name="DEVICE_TYPE" /> aktualizovali do stanoveného termínu</translation> @@ -817,6 +821,8 @@ <translation id="6537924328260219877">Sila signálu <ph name="SIGNAL_STRENGTH" />, batéria telefónu <ph name="BATTERY_STATUS" /></translation> <translation id="6539852571005954999">Kontroluje sa stiahnutý súbor <ph name="FILENAME" /></translation> <translation id="6542521951477560771">Prebieha prenášanie do zariadenia <ph name="RECEIVER_NAME" /></translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +Nová inštalácia</translation> <translation id="6559976592393364813">Požiadajte o to správcu</translation> <translation id="6565007273808762236">Pripojenie eSIM nie je k dispozícii</translation> <translation id="6570831796530454248">{0,plural, =1{Aktualizujte zariadenie do hodiny}few{Aktualizujte zariadenie do # hodín}many{Aktualizujte zariadenie do # hodiny}other{Aktualizujte zariadenie do # hodín}}</translation> @@ -848,6 +854,7 @@ <translation id="6723839937902243910">Napájanie</translation> <translation id="6727969043791803658">Pripojené, <ph name="BATTERY_PERCENTAGE" /> % batérie</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6739144137573853180">PREJSŤ DO NASTAVENÍ</translation> <translation id="6751052314767925245">Presadzuje váš správca</translation> <translation id="6751826523481687655">Trasovanie výkonnosti je zapnuté</translation> <translation id="6752912906630585008">Plocha <ph name="REMOVED_DESK" /> bola odstránená a zlúčená s plochou <ph name="RECEIVE_DESK" /></translation> @@ -983,6 +990,7 @@ <translation id="7662283695561029522">Klepnutím spustíte konfiguráciu</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">Pridať novú mobilnú sieť</translation> +<translation id="7720410380936703141">SKÚSIŤ ZNOVA</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 upozornenie}few{# upozornenia}many{# notifications}other{# upozornení}}</translation> <translation id="7724603315864178912">Vystrihnúť</translation> <translation id="7745560842763881396">Zobraziť aplikácie na poličke</translation> @@ -1169,6 +1177,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">Práve sa používa <ph name="IME_NAME" /></translation> <translation id="899350903320462459">Ak chcete vykonať akciu s upozornením, odomknite zariadenie ako <ph name="LOGIN_ID" /></translation> +<translation id="9000771174482730261">SPRAVOVAŤ PRIESTOR</translation> <translation id="9017320285115481645">Zadajte prístupový kód rodiča Family Link.</translation> <translation id="9024331582947483881">celá obrazovka</translation> <translation id="9047624247355796468">Otvoriť nastavenia siete <ph name="NETWORK_NAME" /></translation> @@ -1214,6 +1223,7 @@ <translation id="938963181863597773">Čo mám v kalendári?</translation> <translation id="945522503751344254">Odoslať spätnú väzbu</translation> <translation id="951991426597076286">Odmietnuť</translation> +<translation id="954052413789300507">Nie je dostatok priestoru na súbor <ph name="FILENAME" />. Uvoľnite miesto.</translation> <translation id="974545358917229949">Zobrazujú sa výsledky (<ph name="RESULT_COUNT" />) pre <ph name="QUERY" /></translation> <translation id="98515147261107953">Na šírku</translation> <translation id="990277280839877440">Okno <ph name="WINDOW_TITILE" /> bolo zatvorené.</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index 5ca0c50..08ec21b 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -815,6 +815,7 @@ <translation id="6528179044667508675">Ne moti</translation> <translation id="65320610082834431">Emodžiji</translation> <translation id="6537924328260219877">Moč signala je <ph name="SIGNAL_STRENGTH" />, stanje baterije telefona je <ph name="BATTERY_STATUS" /></translation> +<translation id="6539852571005954999">Pregledovanje prenosa: <ph name="FILENAME" /></translation> <translation id="6542521951477560771">Predvajanje v napravi <ph name="RECEIVER_NAME" /></translation> <translation id="6559976592393364813">Vprašajte skrbnika</translation> <translation id="6565007273808762236">Povezava prek kartice eSIM ni na voljo</translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb index fac0c47..0ddd99da 100644 --- a/ash/strings/ash_strings_sr-Latn.xtb +++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">Radna površina 7</translation> <translation id="2224075387478458881">Snimanje ekrana nije dozvoljeno kada je vidljiv zaštićeni sadržaj</translation> <translation id="225680501294068881">Skeniranje uređaja...</translation> +<translation id="2257486738914982088">Došlo je do problema pri preuzimanju fajla <ph name="FILENAME" /></translation> <translation id="2268130516524549846">Bluetooth je onemogućen</translation> <translation id="2268813581635650749">Odjavi sve</translation> <translation id="2269016722240250274">Aplikacija koristi mikrofon</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">Želite li stvarno da isključite automatske klikove?</translation> <translation id="4849058404725798627">Istakni objekat pomoću fokusa tastature</translation> <translation id="485592688953820832">Ništa se ne preduzima (pauziranje)</translation> +<translation id="4860284199500934869">Proverite mrežnu vezu da biste preuzeli <ph name="FILENAME" /></translation> <translation id="486056901304535126">Probaćemo preuzimanje kasnije. Govor će biti poslat Google-u radi obrade dok se preuzimanje ne završi.</translation> <translation id="4868492592575313542">aktivirano</translation> <translation id="4872237917498892622">Alt + taster za pretragu ili Shift</translation> @@ -804,6 +806,7 @@ <translation id="6452181791372256707">Odbij</translation> <translation id="6453179446719226835">Jezik je promenjen</translation> <translation id="6459472438155181876">Proširivanje ekrana u <ph name="DISPLAY_NAME" /></translation> +<translation id="6477681113376365978">Preuzimanje fajla nije uspelo</translation> <translation id="6482559668224714696">Lupa za ceo ekran</translation> <translation id="6490471652906364588">Uređaj sa USB priključkom tipa C (desni port)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> traži da ažurirate <ph name="DEVICE_TYPE" /> pre isteka roka</translation> @@ -816,6 +819,8 @@ <translation id="65320610082834431">Emodžiji</translation> <translation id="6537924328260219877">Jačina signala <ph name="SIGNAL_STRENGTH" />, baterija telefona <ph name="BATTERY_STATUS" /></translation> <translation id="6542521951477560771">Prebacuje se na <ph name="RECEIVER_NAME" /></translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +Novo instaliranje</translation> <translation id="6559976592393364813">Pitajte administratora</translation> <translation id="6565007273808762236">eSIM veza nije dostupna</translation> <translation id="6570831796530454248">{0,plural, =1{Ažurirajte uređaj u roku od jednog sata}one{Ažurirajte uređaj u roku od # sata}few{Ažurirajte uređaj u roku od # sata}other{Ažurirajte uređaj u roku od # sati}}</translation> @@ -847,6 +852,7 @@ <translation id="6723839937902243910">Energija</translation> <translation id="6727969043791803658">Povezano, nivo baterije je <ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6739144137573853180">IDI U PODEŠAVANJA</translation> <translation id="6751052314767925245">Primenjuje administrator</translation> <translation id="6751826523481687655">Praćenje učinka je uključeno</translation> <translation id="6752912906630585008">Radna površina <ph name="REMOVED_DESK" /> je uklonjena i spojena sa radnom površinom <ph name="RECEIVE_DESK" /></translation> @@ -982,6 +988,7 @@ <translation id="7662283695561029522">Dodirnite da biste konfigurisali</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">Dodajte novu mobilnu mrežu</translation> +<translation id="7720410380936703141">PROBAJ PONOVO</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 obaveštenje}one{# obaveštenje}few{# obaveštenja}other{# obaveštenja}}</translation> <translation id="7724603315864178912">Iseci</translation> <translation id="7745560842763881396">Prikaži aplikacije na polici</translation> @@ -1168,6 +1175,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">Koristi se <ph name="IME_NAME" /></translation> <translation id="899350903320462459">Otključajte uređaj pomoću ID-a prijavljivanja <ph name="LOGIN_ID" /> da biste dobili obaveštenje</translation> +<translation id="9000771174482730261">UPRAVLJAJTE MEMORIJSKIM PROSTOROM</translation> <translation id="9017320285115481645">Unesite pristupni kôd roditelja za Family Link.</translation> <translation id="9024331582947483881">ceo ekran</translation> <translation id="9047624247355796468">Otvorite podešavanja za <ph name="NETWORK_NAME" /></translation> @@ -1213,6 +1221,7 @@ <translation id="938963181863597773">Šta je u kalendaru?</translation> <translation id="945522503751344254">Pošalji povratne informacije</translation> <translation id="951991426597076286">Odbij</translation> +<translation id="954052413789300507">Nema dovoljno prostora za <ph name="FILENAME" />. Oslobodite prostor.</translation> <translation id="974545358917229949">Prikazuju se rezultati (<ph name="RESULT_COUNT" />) za: <ph name="QUERY" /></translation> <translation id="98515147261107953">Horizontalno</translation> <translation id="990277280839877440">Prozor <ph name="WINDOW_TITILE" /> je zatvoren.</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index 7243b332..13d564e7 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">Радна површина 7</translation> <translation id="2224075387478458881">Снимање екрана није дозвољено када је видљив заштићени садржај</translation> <translation id="225680501294068881">Скенирање уређаја...</translation> +<translation id="2257486738914982088">Дошло је до проблема при преузимању фајла <ph name="FILENAME" /></translation> <translation id="2268130516524549846">Bluetooth је онемогућен</translation> <translation id="2268813581635650749">Одјави све</translation> <translation id="2269016722240250274">Апликација користи микрофон</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">Желите ли стварно да искључите аутоматске кликове?</translation> <translation id="4849058404725798627">Истакни објекат помоћу фокуса тастатуре</translation> <translation id="485592688953820832">Ништа се не предузима (паузирање)</translation> +<translation id="4860284199500934869">Проверите мрежну везу да бисте преузели <ph name="FILENAME" /></translation> <translation id="486056901304535126">Пробаћемо преузимање касније. Говор ће бити послат Google-у ради обраде док се преузимање не заврши.</translation> <translation id="4868492592575313542">активирано</translation> <translation id="4872237917498892622">Alt + тастер за претрагу или Shift</translation> @@ -804,6 +806,7 @@ <translation id="6452181791372256707">Одбиј</translation> <translation id="6453179446719226835">Језик је промењен</translation> <translation id="6459472438155181876">Проширивање екрана у <ph name="DISPLAY_NAME" /></translation> +<translation id="6477681113376365978">Преузимање фајла није успело</translation> <translation id="6482559668224714696">Лупа за цео екран</translation> <translation id="6490471652906364588">Уређај са USB прикључком типа C (десни порт)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> тражи да ажурирате <ph name="DEVICE_TYPE" /> пре истека рока</translation> @@ -816,6 +819,8 @@ <translation id="65320610082834431">Емоџији</translation> <translation id="6537924328260219877">Јачина сигнала <ph name="SIGNAL_STRENGTH" />, батерија телефона <ph name="BATTERY_STATUS" /></translation> <translation id="6542521951477560771">Пребацује се на <ph name="RECEIVER_NAME" /></translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +Ново инсталирање</translation> <translation id="6559976592393364813">Питајте администратора</translation> <translation id="6565007273808762236">eSIM веза није доступна</translation> <translation id="6570831796530454248">{0,plural, =1{Ажурирајте уређај у року од једног сата}one{Ажурирајте уређај у року од # сата}few{Ажурирајте уређај у року од # сата}other{Ажурирајте уређај у року од # сати}}</translation> @@ -847,6 +852,7 @@ <translation id="6723839937902243910">Енергија</translation> <translation id="6727969043791803658">Повезано, ниво батерије је <ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6739144137573853180">ИДИ У ПОДЕШАВАЊА</translation> <translation id="6751052314767925245">Примењује администратор</translation> <translation id="6751826523481687655">Праћење учинка је укључено</translation> <translation id="6752912906630585008">Радна површина <ph name="REMOVED_DESK" /> је уклоњена и спојена са радном површином <ph name="RECEIVE_DESK" /></translation> @@ -982,6 +988,7 @@ <translation id="7662283695561029522">Додирните да бисте конфигурисали</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">Додајте нову мобилну мрежу</translation> +<translation id="7720410380936703141">ПРОБАЈ ПОНОВО</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 обавештење}one{# обавештење}few{# обавештења}other{# обавештења}}</translation> <translation id="7724603315864178912">Исеци</translation> <translation id="7745560842763881396">Прикажи апликације на полици</translation> @@ -1168,6 +1175,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">Користи се <ph name="IME_NAME" /></translation> <translation id="899350903320462459">Откључајте уређај помоћу ИД-а пријављивања <ph name="LOGIN_ID" /> да бисте добили обавештење</translation> +<translation id="9000771174482730261">УПРАВЉАЈТЕ МЕМОРИЈСКИМ ПРОСТОРОМ</translation> <translation id="9017320285115481645">Унесите приступни кôд родитеља за Family Link.</translation> <translation id="9024331582947483881">цео екран</translation> <translation id="9047624247355796468">Отворите подешавања за <ph name="NETWORK_NAME" /></translation> @@ -1213,6 +1221,7 @@ <translation id="938963181863597773">Шта је у календару?</translation> <translation id="945522503751344254">Пошаљи повратне информације</translation> <translation id="951991426597076286">Одбиј</translation> +<translation id="954052413789300507">Нема довољно простора за <ph name="FILENAME" />. Ослободите простор.</translation> <translation id="974545358917229949">Приказују се резултати (<ph name="RESULT_COUNT" />) за: <ph name="QUERY" /></translation> <translation id="98515147261107953">Хоризонтално</translation> <translation id="990277280839877440">Прозор <ph name="WINDOW_TITILE" /> је затворен.</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index bb8fa7278..35f01d1 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">డెస్క్ 7</translation> <translation id="2224075387478458881">గోప్యమైన కంటెంట్ కనిపించినప్పుడు స్క్రీన్ రికార్డింగ్ అనుమతించబడదు</translation> <translation id="225680501294068881">పరికరాల కోసం స్కాన్ చేస్తోంది...</translation> +<translation id="2257486738914982088"><ph name="FILENAME" />ను డౌన్లోడ్ చేస్తున్నప్పుడు ఏదో తప్పు జరిగింది</translation> <translation id="2268130516524549846">బ్లూటూత్ నిలిపివేయబడింది</translation> <translation id="2268813581635650749">అన్నీ సైన్అవుట్ చేయి</translation> <translation id="2269016722240250274">ఒక యాప్ మీ మైక్రోఫోన్ను ఉపయోగిస్తోంది</translation> @@ -588,6 +589,7 @@ <translation id="4831034276697007977">ఆటోమేటిక్ క్లిక్లను మీరు ఖచ్చితంగా ఆఫ్ చేయాలనుకుంటున్నారా?</translation> <translation id="4849058404725798627">కీబోర్డ్ దృష్టి కేంద్రీకరణతో అంశాన్ని హైలైట్ చేయి</translation> <translation id="485592688953820832">చర్య వద్దు (పాజ్ చేయి)</translation> +<translation id="4860284199500934869"><ph name="FILENAME" />ను డౌన్లోడ్ చేయడానికి మీ నెట్వర్క్ కనెక్షన్ను చెక్ చేయండి</translation> <translation id="486056901304535126">మీ డౌన్లోడ్ తర్వాత మళ్లీ ప్రారంభమవుతుంది. డౌన్లోడ్ పూర్తయ్యే వరకు, ప్రాసెసింగ్ కోసం స్పీచ్ Googleకు పంపబడుతుంది.</translation> <translation id="4868492592575313542">యాక్టివేట్ చేయబడింది</translation> <translation id="4872237917498892622">Alt+Search లేదా Shift</translation> @@ -805,6 +807,7 @@ <translation id="6452181791372256707">తిరస్కరించు</translation> <translation id="6453179446719226835">భాష మార్చబడింది</translation> <translation id="6459472438155181876"><ph name="DISPLAY_NAME" />కు స్క్రీన్ను విస్తరిస్తోంది</translation> +<translation id="6477681113376365978">ఫైల్ను డౌన్లోడ్ చేయలేకపోయింది</translation> <translation id="6482559668224714696">పూర్తి స్క్రీన్ మాగ్నిఫైయర్</translation> <translation id="6490471652906364588">USB-C పరికరం (కుడి పోర్ట్)</translation> <translation id="6491071886865974820">గడువుకు ముందే ఈ <ph name="DEVICE_TYPE" />ను అప్డేట్ చేయమని <ph name="MANAGER" /> మిమ్మల్ని కోరుతోంది</translation> @@ -816,7 +819,10 @@ <translation id="6528179044667508675">అంతరాయం వద్దు</translation> <translation id="65320610082834431">ఎమోజిలు</translation> <translation id="6537924328260219877">సిగ్నల్ సామర్థ్యం <ph name="SIGNAL_STRENGTH" />, ఫోన్ బ్యాటరీ <ph name="BATTERY_STATUS" /></translation> +<translation id="6539852571005954999">డౌన్లోడ్ చేయడానికి <ph name="FILENAME" />ను స్కాన్ చేస్తోంది</translation> <translation id="6542521951477560771"><ph name="RECEIVER_NAME" />కు ప్రసారం చేస్తున్నారు</translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +కొత్తగా ఇన్స్టాల్ చేయబడింది</translation> <translation id="6559976592393364813">నిర్వాహకుడిని అడగండి</translation> <translation id="6565007273808762236">eSIM కనెక్షన్ అందుబాటులో లేదు</translation> <translation id="6570831796530454248">{0,plural, =1{ఒక గంట లోపు పరికరాన్ని అప్డేట్ చేయండి}other{# గంటల లోపు పరికరాన్ని అప్డేట్ చేయండి}}</translation> @@ -848,6 +854,7 @@ <translation id="6723839937902243910">పవర్</translation> <translation id="6727969043791803658">కనెక్ట్ చేయబడింది, <ph name="BATTERY_PERCENTAGE" />% బ్యాటరీ ఉంది</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6739144137573853180">సెట్టింగ్లకు వెళ్లండి</translation> <translation id="6751052314767925245">మీ నిర్వాహకుని ద్వారా అమలు చేయబడింది</translation> <translation id="6751826523481687655">పనితీరు స్థితిగతి కనుగొనడం ఆన్లో ఉంది</translation> <translation id="6752912906630585008">"<ph name="REMOVED_DESK" />" డెస్క్ తీసివేసి, "<ph name="RECEIVE_DESK" />" డెస్క్తో విలీనం చేయబడింది</translation> @@ -983,6 +990,7 @@ <translation id="7662283695561029522">కాన్ఫిగర్ చేయడానికి నొక్కండి</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">కొత్త సెల్యులర్ నెట్వర్క్ను జోడించు</translation> +<translation id="7720410380936703141">మళ్లీ ట్రై చేయండి</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 నోటిఫికేషన్}other{# నోటిఫికేషన్లు}}</translation> <translation id="7724603315864178912">కత్తిరించు</translation> <translation id="7745560842763881396">యాప్లను షెల్ఫ్లో చూపించు</translation> @@ -1169,6 +1177,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590"><ph name="IME_NAME" /> ఉపయోగిస్తోంది</translation> <translation id="899350903320462459">నోటిఫికేషన్ చర్యను నిర్వహించడానికి <ph name="LOGIN_ID" />గా పరికరాన్ని అన్లాక్ చేయండి</translation> +<translation id="9000771174482730261">స్టోరేజ్ను మేనేజ్ చేయండి</translation> <translation id="9017320285115481645">Family Link తల్లిదండ్రుల యాక్సెస్ కోడ్ను నమోదు చేయండి.</translation> <translation id="9024331582947483881">పూర్తి స్క్రీన్</translation> <translation id="9047624247355796468"><ph name="NETWORK_NAME" /> సెట్టింగ్లను తెరవండి</translation> @@ -1214,6 +1223,7 @@ <translation id="938963181863597773">నా క్యాలెండర్లో ఏమి ఉన్నాయి?</translation> <translation id="945522503751344254">ఫీడ్బ్యాక్ పంపండి</translation> <translation id="951991426597076286">తిరస్కరించు</translation> +<translation id="954052413789300507"><ph name="FILENAME" /> కోసం తగినంత స్పేస్ లేదు. స్పేస్ను ఖాళీ చేయండి.</translation> <translation id="974545358917229949"><ph name="QUERY" /> కోసం <ph name="RESULT_COUNT" /> ఫలితాలను ప్రదర్శిస్తోంది</translation> <translation id="98515147261107953">సమతలదిశ</translation> <translation id="990277280839877440"><ph name="WINDOW_TITILE" /> విండో మూసివేయబడింది.</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index 7cbccb7..e44212e 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -192,6 +192,7 @@ <translation id="2222841058024245321">Робочий стіл 7</translation> <translation id="2224075387478458881">Запис екрана заборонено, якщо видно захищений контент</translation> <translation id="225680501294068881">Пошук пристроїв...</translation> +<translation id="2257486738914982088">Під час завантаження файлу "<ph name="FILENAME" />" сталася помилка</translation> <translation id="2268130516524549846">Bluetooth вимкнено</translation> <translation id="2268813581635650749">Вийти з усіх</translation> <translation id="2269016722240250274">Додаток використовує ваш мікрофон</translation> @@ -587,6 +588,7 @@ <translation id="4831034276697007977">Вимкнути автоматичні кліки?</translation> <translation id="4849058404725798627">Підсвічувати об’єкт, вибраний на клавіатурі</translation> <translation id="485592688953820832">Нічого не робити (призупинити)</translation> +<translation id="4860284199500934869">Щоб завантажити файл "<ph name="FILENAME" />", перевірте з’єднання з мережею</translation> <translation id="486056901304535126">Спроба завантаження повториться пізніше. Доки завантаження не завершиться, мовлення надсилатиметься на сервери Google для обробки.</translation> <translation id="4868492592575313542">активовано</translation> <translation id="4872237917498892622">Alt+клавіша пошуку або Shift</translation> @@ -804,6 +806,7 @@ <translation id="6452181791372256707">Відхилити</translation> <translation id="6453179446719226835">Мову змінено</translation> <translation id="6459472438155181876">Розширення екрана на <ph name="DISPLAY_NAME" /></translation> +<translation id="6477681113376365978">Не вдалося завантажити файл</translation> <translation id="6482559668224714696">Лупа для всього екрана</translation> <translation id="6490471652906364588">Пристрій із портом USB типу C (праворуч)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> вимагає, щоб ви оновили пристрій <ph name="DEVICE_TYPE" /> до кінцевого терміну</translation> @@ -817,6 +820,8 @@ <translation id="6537924328260219877">Рівень сигналу – <ph name="SIGNAL_STRENGTH" />, рівень заряду акумулятора – <ph name="BATTERY_STATUS" /></translation> <translation id="6539852571005954999">Сканування завантаженого файлу "<ph name="FILENAME" />"</translation> <translation id="6542521951477560771">Трансляція на пристрій "<ph name="RECEIVER_NAME" />"</translation> +<translation id="655633303491376835"><ph name="APP_NAME" /> +Нове встановлення</translation> <translation id="6559976592393364813">Зверніться до адміністратора</translation> <translation id="6565007273808762236">З’єднання з eSIM-картою недоступне</translation> <translation id="6570831796530454248">{0,plural, =1{Оновіть пристрій протягом години}one{Оновіть пристрій протягом # години}few{Оновіть пристрій протягом # годин}many{Оновіть пристрій протягом # годин}other{Оновіть пристрій протягом # години}}</translation> @@ -848,6 +853,7 @@ <translation id="6723839937902243910">Заряд</translation> <translation id="6727969043791803658">Під'єднано, акумулятор заряджено на <ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6739144137573853180">ПЕРЕЙТИ ДО НАЛАШТУВАНЬ</translation> <translation id="6751052314767925245">Застосовується адміністратором</translation> <translation id="6751826523481687655">Відстеження ефективності ввімкнено</translation> <translation id="6752912906630585008">Робочий стіл "<ph name="REMOVED_DESK" />" видалено й об'єднано з робочим столом "<ph name="RECEIVE_DESK" />"</translation> @@ -983,6 +989,7 @@ <translation id="7662283695561029522">Торкніться, щоб налаштувати</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">Додати мобільну мережу</translation> +<translation id="7720410380936703141">ПОВТОРИТИ</translation> <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{1 cповіщення}one{# сповіщення}few{# сповіщення}many{# сповіщень}other{# сповіщення}}</translation> <translation id="7724603315864178912">Вирізати</translation> <translation id="7745560842763881396">Показати додатки на полиці</translation> @@ -1169,6 +1176,7 @@ <translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590">Використовується: <ph name="IME_NAME" /></translation> <translation id="899350903320462459">Щоб виконати дію зі сповіщенням, розблокуйте пристрій як <ph name="LOGIN_ID" /></translation> +<translation id="9000771174482730261">КЕРУВАТИ СХОВИЩЕМ</translation> <translation id="9017320285115481645">Введіть батьківський код доступу Family Link.</translation> <translation id="9024331582947483881">усього екрана</translation> <translation id="9047624247355796468">Відкрити налаштування <ph name="NETWORK_NAME" /></translation> @@ -1214,6 +1222,7 @@ <translation id="938963181863597773">Які події заплановано?</translation> <translation id="945522503751344254">Надіслати відгук</translation> <translation id="951991426597076286">Відхилити</translation> +<translation id="954052413789300507">Недостатньо місця для файлу "<ph name="FILENAME" />". Очистьте пам’ять.</translation> <translation id="974545358917229949">Показано результати (<ph name="RESULT_COUNT" />) для запиту "<ph name="QUERY" />"</translation> <translation id="98515147261107953">Альбомна</translation> <translation id="990277280839877440">Вікно <ph name="WINDOW_TITILE" /> закрито.</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb index f7a287e..4d7d47ae 100644 --- a/ash/strings/ash_strings_ur.xtb +++ b/ash/strings/ash_strings_ur.xtb
@@ -815,6 +815,7 @@ <translation id="6528179044667508675">ڈسٹرب نہ کریں</translation> <translation id="65320610082834431">ایموجیز</translation> <translation id="6537924328260219877">سگنل کی مضبوطی <ph name="SIGNAL_STRENGTH" />، فون کی بیٹری <ph name="BATTERY_STATUS" /></translation> +<translation id="6539852571005954999">اسکین ہونے والی <ph name="FILENAME" /> کو ڈاؤن لوڈ کریں</translation> <translation id="6542521951477560771"><ph name="RECEIVER_NAME" /> پر کاسٹ کیا جا رہا ہے</translation> <translation id="6559976592393364813">منتظم سے پوچھیں</translation> <translation id="6565007273808762236">eSIM کنکشن دستیاب نہیں ہے</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index 4d15e8b9..92dcd57 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -35,6 +35,7 @@ <translation id="1175572348579024023">Cuộn</translation> <translation id="1178581264944972037">Tạm dừng</translation> <translation id="1181037720776840403">Xóa</translation> +<translation id="118437560755358292">Hãy nhập mật khẩu hoặc mã PIN để tăng cường bảo mật</translation> <translation id="118532027333893379">Nhấn vào vị trí bất kỳ để chụp toàn màn hình</translation> <translation id="1190609913194133056">Trung tâm thông báo</translation> <translation id="1190678134285018527">Thiết bị cần quay lại phiên bản trước</translation> @@ -338,6 +339,7 @@ <translation id="3307642347673023554">Đã chuyển sang chế độ máy tính xách tay</translation> <translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> vẫn có thể đăng nhập vào lúc khác.</translation> <translation id="3321628682574733415">Mã dành cho cha mẹ không chính xác</translation> +<translation id="3339826665088060472">Chụp ảnh màn hình, các công cụ để chụp ảnh màn hình và ghi màn hình</translation> <translation id="3341303451326249809">Đã chụp ảnh màn hình</translation> <translation id="334252345105450327">Chụp ảnh màn hình</translation> <translation id="3351879221545518001">Bạn hiện đang truyền màn hình.</translation> @@ -394,6 +396,7 @@ <translation id="3606978283550408104">Đã kết nối màn hình Braille.</translation> <translation id="3615926715408477684">Bật chế độ dữ liệu di động tức là cũng bật Bluetooth</translation> <translation id="3616883743181209306">Đã di chuyển trình đơn vào góc trên cùng bên phải màn hình.</translation> +<translation id="3619536907358025872">Cài đặt tính năng Chụp ảnh màn hình</translation> <translation id="3621202678540785336">Thiết bị vào</translation> <translation id="3621712662352432595">Cài đặt âm thanh</translation> <translation id="3626281679859535460">Độ sáng</translation> @@ -492,6 +495,7 @@ <translation id="4269883910223712419">Quản trị viên của thiết bị này có thể:</translation> <translation id="4274537685965975248">Phím tắt Ctrl + Alt + Mũi tên xuống đã thay đổi. Để sử dụng phím End, hãy nhấn tổ hợp phím <ph name="LAUNCHER_KEY_NAME" /> + Mũi tên phải.</translation> <translation id="4279490309300973883">Đang phản chiếu</translation> +<translation id="4283888303416325161">Hãy nhập mật khẩu để tăng cường bảo mật</translation> <translation id="4285498937028063278">Bỏ ghim</translation> <translation id="429402653707266969">Bật/tắt vị trí thanh công cụ</translation> <translation id="4294319844246081198">Xin chào <ph name="GIVEN_NAME" />!</translation> @@ -761,6 +765,7 @@ <translation id="607652042414456612">Máy tính của bạn có thể phát hiện thiết bị Bluetooth gần đó và hiện thị dưới tên "<ph name="NAME" />" với địa chỉ là <ph name="ADDRESS" /></translation> <translation id="6114505516289286752">Đã tải tệp mã chuyển lời nói thành văn bản <ph name="LANGUAGE" /> xuống</translation> <translation id="6119360623251949462"><ph name="CHARGING_STATE" />. <ph name="BATTERY_SAVER_STATE" /></translation> +<translation id="6121838516699723042">Xác nhận tải <ph name="FILENAME" /> xuống</translation> <translation id="612734058257491180">Bạn không thể dùng Trợ lý Google trong phiên khách.</translation> <translation id="6134259848159370930">Tìm kiếm trong thiết bị, ứng dụng, tùy chọn cài đặt và trên web.</translation> <translation id="6137566720514957455">Mở hộp thoại xóa tài khoản cho <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb index f1da183..1b5a827 100644 --- a/ash/strings/ash_strings_zu.xtb +++ b/ash/strings/ash_strings_zu.xtb
@@ -815,6 +815,7 @@ <translation id="6528179044667508675">Ungaphazamisi</translation> <translation id="65320610082834431">Ama-emoji</translation> <translation id="6537924328260219877">Amandla esignali <ph name="SIGNAL_STRENGTH" />, Ibhethri lefoni <ph name="BATTERY_STATUS" /></translation> +<translation id="6539852571005954999">Ukudawuniloda kuskena i-<ph name="FILENAME" /></translation> <translation id="6542521951477560771">Ukusakaza ku-<ph name="RECEIVER_NAME" /></translation> <translation id="6559976592393364813">Buza umlawuli</translation> <translation id="6565007273808762236">uxhumo lwe-eSIM alutholakali</translation>
diff --git a/ash/style/highlight_border.cc b/ash/style/highlight_border.cc index 00fafc44..222ea154 100644 --- a/ash/style/highlight_border.cc +++ b/ash/style/highlight_border.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "ash/style/highlight_border.h" + #include "ash/constants/ash_features.h" #include "ash/public/cpp/style/scoped_light_mode_as_default.h" #include "ash/style/ash_color_provider.h"
diff --git a/ash/style/highlight_border.h b/ash/style/highlight_border.h index c74f3b2..4e84ad3 100644 --- a/ash/style/highlight_border.h +++ b/ash/style/highlight_border.h
@@ -11,6 +11,7 @@ namespace ash { // A rounded rectangle border that has inner (highlight) and outer color. +// Useful when go/cros-launcher-spec mentions "BorderHighlight". class ASH_EXPORT HighlightBorder : public views::Border { public: enum class Type {
diff --git a/ash/system/unified/hps_notify_controller.cc b/ash/system/unified/hps_notify_controller.cc index b40ce96..1595a03 100644 --- a/ash/system/unified/hps_notify_controller.cc +++ b/ash/system/unified/hps_notify_controller.cc
@@ -55,6 +55,10 @@ prefs::kSnoopingProtectionEnabled, /*default_value=*/false, user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF); + registry->RegisterBooleanPref( + prefs::kSnoopingProtectionNotificationSuppressionEnabled, + /*default_value=*/false, + user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF); } void HpsNotifyController::OnSessionStateChanged(
diff --git a/ash/webui/camera_app_ui/camera_app_ui.cc b/ash/webui/camera_app_ui/camera_app_ui.cc index 4a39291e..0689aed 100644 --- a/ash/webui/camera_app_ui/camera_app_ui.cc +++ b/ash/webui/camera_app_ui/camera_app_ui.cc
@@ -206,8 +206,6 @@ allowlist->RegisterAutoGrantedPermission(host_origin, ContentSettingsType::IDLE_DETECTION); - delegate_->SetLaunchDirectory(); - window()->SetProperty(kMinimizeOnBackKey, false); // Set up the data source.
diff --git a/ash/webui/camera_app_ui/camera_app_ui_delegate.h b/ash/webui/camera_app_ui/camera_app_ui_delegate.h index 640e658ac..65ddd3cd 100644 --- a/ash/webui/camera_app_ui/camera_app_ui_delegate.h +++ b/ash/webui/camera_app_ui/camera_app_ui_delegate.h
@@ -33,10 +33,6 @@ virtual ~CameraAppUIDelegate() = default; - // Sets Downloads folder as launch directory by File Handling API so that we - // can get the handle on the app side. - virtual void SetLaunchDirectory() = 0; - // Takes a WebUIDataSource, and adds load time data into it. virtual void PopulateLoadTimeData(content::WebUIDataSource* source) = 0;
diff --git a/ash/webui/camera_app_ui/resources.h b/ash/webui/camera_app_ui/resources.h index 34535b2..6aa494b 100644 --- a/ash/webui/camera_app_ui/resources.h +++ b/ash/webui/camera_app_ui/resources.h
@@ -61,7 +61,6 @@ {"expert_print_performance_logs", IDS_EXPERT_PRINT_PERFORMANCE_LOGS}, {"expert_save_metadata", IDS_EXPERT_SAVE_METADATA}, {"expert_scan_barcode", IDS_EXPERT_SCAN_BARCODE}, - {"expert_show_gif_recording_option", IDS_EXPERT_SHOW_GIF_RECORDING_OPTION}, {"export_button", IDS_EXPORT_BUTTON}, {"feedback_button", IDS_FEEDBACK_BUTTON}, {"feedback_description_placeholder", IDS_FEEDBACK_DESCRIPTION_PLACEHOLDER},
diff --git a/ash/webui/camera_app_ui/resources/css/mode/video.css b/ash/webui/camera_app_ui/resources/css/mode/video.css index f6a28b6..3f91064e 100644 --- a/ash/webui/camera_app_ui/resources/css/mode/video.css +++ b/ash/webui/camera_app_ui/resources/css/mode/video.css
@@ -2,7 +2,7 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ -body:is(:not(.video), :not(.expert), :not(.show-gif-recording-option), .taking, .camera-configuring, .should-handle-intent-result) #record-types-group { +body:is(:not(.video), .taking, .camera-configuring, .should-handle-intent-result) #record-types-group { display: none; }
diff --git a/ash/webui/camera_app_ui/resources/js/app_window.ts b/ash/webui/camera_app_ui/resources/js/app_window.ts index 1755a81..57157d0 100644 --- a/ash/webui/camera_app_ui/resources/js/app_window.ts +++ b/ash/webui/camera_app_ui/resources/js/app_window.ts
@@ -47,8 +47,8 @@ * launched. */ private readonly readyOnCCASide = new WaitableEvent<string>(); - private readonly readyOnTastSide = new WaitableEvent<void>(); - private readonly onClosed = new WaitableEvent<void>(); + private readonly readyOnTastSide = new WaitableEvent(); + private readonly onClosed = new WaitableEvent(); private inClosingItself = false; private readonly errors: ErrorInfo[] = []; private readonly perfs: PerfEntry[] = [];
diff --git a/ash/webui/camera_app_ui/resources/js/device/stream_manager.js b/ash/webui/camera_app_ui/resources/js/device/stream_manager.js index c925acf0..7cc9576c 100644 --- a/ash/webui/camera_app_ui/resources/js/device/stream_manager.js +++ b/ash/webui/camera_app_ui/resources/js/device/stream_manager.js
@@ -310,20 +310,25 @@ */ async setMultipleStreamsEnabled(deviceId, enabled) { assert(await DeviceOperator.isSupported()); - const waitEvent = new WaitableEvent(); - if (enabled) { - this.waitVirtual_ = waitEvent; - } else { - this.waitVirtualRemoved_ = waitEvent; - } const deviceOperator = await DeviceOperator.getInstance(); - await deviceOperator.setMultipleStreamsEnabled(deviceId, enabled); - await this.deviceUpdate(); if (enabled) { + /** @type {WaitableEvent<string>} */ + const waitEvent = new WaitableEvent(); + this.waitVirtual_ = waitEvent; + + await deviceOperator.setMultipleStreamsEnabled(deviceId, enabled); + await this.deviceUpdate(); + const virtualId = await waitEvent.timedWait(3000); this.virtualMap_ = {realId: deviceId, virtualId}; } else { + const waitEvent = new WaitableEvent(); + this.waitVirtualRemoved_ = waitEvent; + + await deviceOperator.setMultipleStreamsEnabled(deviceId, enabled); + await this.deviceUpdate(); + await waitEvent.timedWait(3000); this.virtualMap_ = null; }
diff --git a/ash/webui/camera_app_ui/resources/js/i18n_string.ts b/ash/webui/camera_app_ui/resources/js/i18n_string.ts index 4dc3ddb..56a1255 100644 --- a/ash/webui/camera_app_ui/resources/js/i18n_string.ts +++ b/ash/webui/camera_app_ui/resources/js/i18n_string.ts
@@ -51,7 +51,6 @@ EXPERT_PRINT_PERFORMANCE_LOGS = 'expert_print_performance_logs', EXPERT_SAVE_METADATA = 'expert_save_metadata', EXPERT_SCAN_BARCODE = 'expert_scan_barcode', - EXPERT_SHOW_GIF_RECORDING_OPTION = 'expert_show_gif_recording_option', EXPORT_BUTTON = 'export_button', FEEDBACK_BUTTON = 'feedback_button', FEEDBACK_DESCRIPTION_PLACEHOLDER = 'feedback_description_placeholder',
diff --git a/ash/webui/camera_app_ui/resources/js/js.gni b/ash/webui/camera_app_ui/resources/js/js.gni index 0ace6fa..c897194 100644 --- a/ash/webui/camera_app_ui/resources/js/js.gni +++ b/ash/webui/camera_app_ui/resources/js/js.gni
@@ -96,7 +96,7 @@ "views/settings.js", "views/view.js", "views/warning.js", - "waitable_event.js", + "waitable_event.ts", "window_controller.js", ]
diff --git a/ash/webui/camera_app_ui/resources/js/models/file_system.js b/ash/webui/camera_app_ui/resources/js/models/file_system.js index e2a40ed1..de02268 100644 --- a/ash/webui/camera_app_ui/resources/js/models/file_system.js +++ b/ash/webui/camera_app_ui/resources/js/models/file_system.js
@@ -82,6 +82,7 @@ * @return {!Promise<?DirectoryAccessEntry>} Promise for the directory result. */ async function initCameraDirectory() { + /** @type {WaitableEvent<FileSystemDirectoryHandle>} */ const handle = new WaitableEvent(); // We use the sessionStorage to decide if we should use the handle in the
diff --git a/ash/webui/camera_app_ui/resources/js/mojo/device_operator.js b/ash/webui/camera_app_ui/resources/js/mojo/device_operator.js index 91a4578..274a9bf 100644 --- a/ash/webui/camera_app_ui/resources/js/mojo/device_operator.js +++ b/ash/webui/camera_app_ui/resources/js/mojo/device_operator.js
@@ -561,6 +561,9 @@ const reprocessEvents = new Map; const callbacks = []; for (const effect of effects) { + // TODO(pihsun): This should be WaitableEvent<Blob|Error>, since we + // sometimes call event.signal with Error. + /** @type {WaitableEvent<Blob>} */ const event = new WaitableEvent(); reprocessEvents.set(effect, event); callbacks.push(event.wait());
diff --git a/ash/webui/camera_app_ui/resources/js/sound.js b/ash/webui/camera_app_ui/resources/js/sound.js index 3978bcb0..ad914cd 100644 --- a/ash/webui/camera_app_ui/resources/js/sound.js +++ b/ash/webui/camera_app_ui/resources/js/sound.js
@@ -35,6 +35,7 @@ await el.play(); elementsStatus.set(el, Status.PLAYING); + /** @type {WaitableEvent<boolean>} */ const audioStopped = new WaitableEvent(); const events = ['ended', 'pause']; const onAudioStopped = () => {
diff --git a/ash/webui/camera_app_ui/resources/js/state.js b/ash/webui/camera_app_ui/resources/js/state.js index a85ce1a3..c4ec702 100644 --- a/ash/webui/camera_app_ui/resources/js/state.js +++ b/ash/webui/camera_app_ui/resources/js/state.js
@@ -62,7 +62,6 @@ SHOULD_HANDLE_INTENT_RESULT: 'should-handle-intent-result', SHOW_METADATA: 'show-metadata', SHOW_SCAN_MODE: 'show-scan-mode', - SHOW_GIF_RECORDING_OPTION: 'show-gif-recording-option', SHUTTER_PROGRESSING: 'shutter-progressing', STREAMING: 'streaming', SUSPEND: 'suspend',
diff --git a/ash/webui/camera_app_ui/resources/js/thumbnailer.js b/ash/webui/camera_app_ui/resources/js/thumbnailer.js index 1b221f0..3fc791a 100644 --- a/ash/webui/camera_app_ui/resources/js/thumbnailer.js +++ b/ash/webui/camera_app_ui/resources/js/thumbnailer.js
@@ -47,6 +47,7 @@ async function loadVideoBlob(blob) { const el = document.createElement('video'); try { + /** @type {WaitableEvent<boolean>} */ const hasLoaded = new WaitableEvent(); el.addEventListener('error', () => { hasLoaded.signal(false);
diff --git a/ash/webui/camera_app_ui/resources/js/views/camera/mode/video.js b/ash/webui/camera_app_ui/resources/js/views/camera/mode/video.js index 0d5bdd45..a3808335 100644 --- a/ash/webui/camera_app_ui/resources/js/views/camera/mode/video.js +++ b/ash/webui/camera_app_ui/resources/js/views/camera/mode/video.js
@@ -370,9 +370,7 @@ * record type option groups. */ getToggledRecordOption_() { - if (state.get(state.State.SHOULD_HANDLE_INTENT_RESULT) || - !state.get(state.State.EXPERT) || - !state.get(state.State.SHOW_GIF_RECORDING_OPTION)) { + if (state.get(state.State.SHOULD_HANDLE_INTENT_RESULT)) { return RecordType.NORMAL; } return Object.values(RecordType).find((t) => state.get(t)) ||
diff --git a/ash/webui/camera_app_ui/resources/js/views/camera/preview.js b/ash/webui/camera_app_ui/resources/js/views/camera/preview.js index 9a2ed9c..a20f480c 100644 --- a/ash/webui/camera_app_ui/resources/js/views/camera/preview.js +++ b/ash/webui/camera_app_ui/resources/js/views/camera/preview.js
@@ -433,6 +433,7 @@ // from the preview and checked video muted state before taking photo. const track = this.getVideoTrack_(); const waitFrame = async () => { + /** @type {WaitableEvent<boolean>} */ const onReady = new WaitableEvent(); const callbackId = this.video_.requestVideoFrameCallback((now) => { onReady.signal(true);
diff --git a/ash/webui/camera_app_ui/resources/js/waitable_event.js b/ash/webui/camera_app_ui/resources/js/waitable_event.js deleted file mode 100644 index f57d35d..0000000 --- a/ash/webui/camera_app_ui/resources/js/waitable_event.js +++ /dev/null
@@ -1,74 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * A waitable event for synchronization between asynchronous jobs. - * @template T - */ -export class WaitableEvent { - /** - * @public - */ - constructor() { - /** - * @type {boolean} - * @private - */ - this.isSignaled_ = false; - - /** - * @type {function(T): void} - * @private - */ - this.resolve_; - - /** - * @type {!Promise<T>} - * @private - */ - this.promise_ = new Promise((resolve) => { - this.resolve_ = resolve; - }); - } - - /** - * @return {boolean} Whether the event is signaled - */ - isSignaled() { - return this.isSignaled_; - } - - /** - * Signals the event. - * @param {T=} value - */ - signal(value) { - if (this.isSignaled_) { - return; - } - this.isSignaled_ = true; - this.resolve_(value); - } - - /** - * @return {!Promise<T>} Resolved when the event is signaled. - */ - wait() { - return this.promise_; - } - - /** - * @param {number} timeout Timeout in ms. - * @return {!Promise<T>} Resolved when the event is signaled, or rejected when - * timed out. - */ - timedWait(timeout) { - const timeoutPromise = new Promise((_resolve, reject) => { - setTimeout(() => { - reject(new Error(`Timed out after ${timeout}ms`)); - }, timeout); - }); - return Promise.race([this.promise_, timeoutPromise]); - } -}
diff --git a/ash/webui/camera_app_ui/resources/js/waitable_event.ts b/ash/webui/camera_app_ui/resources/js/waitable_event.ts new file mode 100644 index 0000000..8ac823f --- /dev/null +++ b/ash/webui/camera_app_ui/resources/js/waitable_event.ts
@@ -0,0 +1,58 @@ +// 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. + +/** + * A waitable event for synchronization between asynchronous jobs. + */ +export class WaitableEvent<T = void> { + private isSignaledInternal = false; + private resolve: (val: T) => void; + private promise: Promise<T>; + /** + * @public + */ + constructor() { + this.promise = new Promise((resolve) => { + this.resolve = resolve; + }); + } + + /** + * @return Whether the event is signaled + */ + isSignaled(): boolean { + return this.isSignaledInternal; + } + + /** + * Signals the event. + */ + signal(value: T|undefined): void { + if (this.isSignaledInternal) { + return; + } + this.isSignaledInternal = true; + this.resolve(value); + } + + /** + * @return Resolved when the event is signaled. + */ + wait(): Promise<T> { + return this.promise; + } + + /** + * @param timeout Timeout in ms. + * @return Resolved when the event is signaled, or rejected when timed out. + */ + timedWait(timeout: number): Promise<T> { + const timeoutPromise = new Promise<T>((_resolve, reject) => { + setTimeout(() => { + reject(new Error(`Timed out after ${timeout}ms`)); + }, timeout); + }); + return Promise.race([this.promise, timeoutPromise]); + } +}
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings.grd b/ash/webui/camera_app_ui/resources/strings/camera_strings.grd index 8fe236c..db6c1e25 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings.grd +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings.grd
@@ -326,9 +326,6 @@ <message desc="Label for expert mode option: enable full-sized video snapshot." name="IDS_EXPERT_ENABLE_FULL_SIZED_VIDEO_SNAPSHOT"> Enable full-sized video snapshot </message> - <message desc="Label for expert mode option: Show GIF recording option." name="IDS_EXPERT_SHOW_GIF_RECORDING_OPTION"> - Show GIF recording option - </message> <message desc="Label for snackbar message when a link is copied" name="IDS_SNACKBAR_LINK_COPIED"> Link copied </message>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_grd/IDS_EXPERT_SHOW_GIF_RECORDING_OPTION.png.sha1 b/ash/webui/camera_app_ui/resources/strings/camera_strings_grd/IDS_EXPERT_SHOW_GIF_RECORDING_OPTION.png.sha1 deleted file mode 100644 index 0abb45e..0000000 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_grd/IDS_EXPERT_SHOW_GIF_RECORDING_OPTION.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -83b3522f481176bc46a4c4fa68d03ff417e6e0e3 \ No newline at end of file
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb index e0fe8172..4c373b1 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb
@@ -22,6 +22,7 @@ <translation id="1851616744363735765">КІДІРТІЛДІ</translation> <translation id="1862930711583847113"><ph name="FILE" /> файлы экспортталмады.</translation> <translation id="1899697626337024495">Фотосурет ажыратымдылығы</translation> +<translation id="1925845977604399247">Галереяға өту</translation> <translation id="2022953316617983419">QR коды</translation> <translation id="2036868001356139588">Таймер ұзақтығы</translation> <translation id="2050339315714019657">Портреттік</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_mk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_mk.xtb index 58b91d068..82f8411 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_mk.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_mk.xtb
@@ -66,7 +66,7 @@ <translation id="3892148308691398805">Копирај текст</translation> <translation id="4118525110028899586">Паузирај го снимањето</translation> <translation id="4121305183798804752">Откриен е документ</translation> -<translation id="4269820728363426813">Копирај адреса на врска</translation> +<translation id="4269820728363426813">Копирај ја адресата на линкот</translation> <translation id="4279490309300973883">Отсликување</translation> <translation id="4329152592498422850">Префрли на фотографирање во квадратна форма</translation> <translation id="4383571725254449280">Евиденција за изведба на печатењето</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb index a3884f5..cfe4861 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb
@@ -22,6 +22,7 @@ <translation id="1851616744363735765">ĐÃ TẠM DỪNG</translation> <translation id="1862930711583847113">Không thể xuất <ph name="FILE" /></translation> <translation id="1899697626337024495">Độ phân giải của ảnh</translation> +<translation id="1925845977604399247">Truy cập Thư viện</translation> <translation id="2022953316617983419">Mã QR</translation> <translation id="2036868001356139588">Thời lượng bộ hẹn giờ</translation> <translation id="2050339315714019657">Khổ dọc</translation>
diff --git a/ash/webui/camera_app_ui/resources/views/main.html b/ash/webui/camera_app_ui/resources/views/main.html index 0431d71..7d834e8 100644 --- a/ash/webui/camera_app_ui/resources/views/main.html +++ b/ash/webui/camera_app_ui/resources/views/main.html
@@ -575,12 +575,6 @@ <span i18n-text="expert_enable_full_sized_video_snapshot"></span> </label> <label class="menu-item inkdrop"> - <input id="expert-enable-gif-recording" class="icon" type="checkbox" - tabindex="0" data-state="show-gif-recording-option" - data-key="show-gif-recording-option"> - <span i18n-text="expert_show_gif_recording_option"></span> - </label> - <label class="menu-item inkdrop"> <input id="expert-enable-expert-mode" class="icon" type="checkbox" tabindex="0" data-state="expert" data-key="expert">
diff --git a/ash/webui/shimless_rma/resources/calibration_component_chip.html b/ash/webui/shimless_rma/resources/calibration_component_chip.html index b52e653c..3e4a5fc 100644 --- a/ash/webui/shimless_rma/resources/calibration_component_chip.html +++ b/ash/webui/shimless_rma/resources/calibration_component_chip.html
@@ -3,48 +3,51 @@ padding: 1px; } - /* TODO(gavindodd): update colors to CrOS */ - :host([skip]) #containerButton { - background-color: lightgray; + /* TODO(gavinwill): update colors to CrOS */ + :host([checked]) #componentButton { + background-color: lightskyblue; } - :host([completed]) #containerButton { - background-color: yellowgreen; + #componentButton { + align-items: normal; + border-radius: 4px; + box-shadow: var(--cr-card-shadow); + height: 70px; + margin-bottom: 20px; + margin-inline-end: 10px; + width: 190px; } - :host([failed]) #containerButton { - background-color: IndianRed; + #labelDiv { + color: grey; + flex-basis: 155px; + margin-bottom: auto; + margin-top: auto; + padding-inline-start: 20px; } - #containerDiv { - height: 40px; - width: 180px; + :host([checked]) #labelDiv { + color: blue; } - #containerButton { - border-radius: 10px; - box-shadow: 0px 2px 2px 2px #bbb; - height: 40px; - width: 180px; + #checkIcon { + margin-top: 6px; } - .icon-top-right { - height: 15px; - position: relative; - right: 20px; - top: -5px; - width: 15px; + #infoIcon { + fill: red; + margin-inline-end: 5px; } </style> -<div id="containerDiv"> - <cr-button disabled$="[[disabled]]" - id="containerButton" on-click="onComponentButtonClicked_"> +<cr-button id="componentButton" on-click="onComponentButtonClicked_"> + <div id="labelDiv"> + <iron-icon id="infoIcon" icon="shimless-icon:info" hidden="[[!failed]]"> + </iron-icon> <span id="componentName">[[componentName]]</span> - </cr-button> - - <!-- TODO(gavindodd): Replace icon with checked icon --> - <iron-icon id="skipIcon" icon="shimless-icon:wifi" - hidden$="[[!skip]]" class="icon-top-right"> + <div>[[componentId]]</div> + </div> + <iron-icon id="checkIcon" icon="shimless-icon24:check-circle" + hidden="[[!checked]]"> </iron-icon> -</div> +</cr-button>
diff --git a/ash/webui/shimless_rma/resources/calibration_component_chip.js b/ash/webui/shimless_rma/resources/calibration_component_chip.js index 6dd421a..547025b 100644 --- a/ash/webui/shimless_rma/resources/calibration_component_chip.js +++ b/ash/webui/shimless_rma/resources/calibration_component_chip.js
@@ -30,13 +30,7 @@ static get properties() { return { /** @type {boolean} */ - disabled: { - type: Boolean, - value: false, - }, - - /** @type {boolean} */ - skip: { + checked: { notify: true, reflectToAttribute: true, type: Boolean, @@ -44,32 +38,16 @@ }, /** @type {boolean} */ - completed: { - notify: true, - reflectToAttribute: true, - type: Boolean, - value: false, - }, - - /** @type {boolean} */ - failed: { - notify: true, - reflectToAttribute: true, - type: Boolean, - value: false, - }, + failed: {type: Boolean, value: false}, /** @type {string} */ componentName: {type: String, value: ''}, - - /** @type {string} */ - componentStatus: {type: String, value: ''} }; } /** @protected */ onComponentButtonClicked_() { - this.skip = !this.skip; + this.checked = !this.checked; } click() {
diff --git a/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.html b/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.html index 1cb16f52..6dac8b3 100644 --- a/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.html +++ b/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.html
@@ -20,10 +20,8 @@ <div> <template is="dom-repeat" items="{{componentCheckboxes_}}" as="component"> <calibration-component-chip id="[[component.id]]" - skip="{{component.skip}}" - completed="{{component.completed}}" - failed$="[[component.failed]]" - disabled$="[[component.disabled]]" + checked="{{component.checked}}" + failed="[[component.failed]]" component-name="[[component.name]]"> </calibration-component-chip> </template>
diff --git a/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.js b/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.js index 7368562..333012284 100644 --- a/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.js +++ b/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.js
@@ -31,10 +31,8 @@ * component: !ComponentType, * id: string, * name: string, - * skip: boolean, - * completed: boolean, + * checked: boolean, * failed: boolean, - * disabled: boolean * }} */ let ComponentCheckbox; @@ -93,23 +91,15 @@ return; } - /** @type {!Array<!ComponentCheckbox>} */ - const componentList = []; - result.components.forEach(item => { - const component = assert(item.component); - - componentList.push({ + this.componentCheckboxes_ = result.components.map(item => { + return { component: item.component, id: ComponentTypeToId[item.component], name: this.i18n(ComponentTypeToId[item.component]), - skip: item.status === CalibrationStatus.kCalibrationSkip, - completed: item.status === CalibrationStatus.kCalibrationComplete, + checked: false, failed: item.status === CalibrationStatus.kCalibrationFailed, - disabled: item.status === CalibrationStatus.kCalibrationComplete || - item.status === CalibrationStatus.kCalibrationInProgress - }); + }; }); - this.componentCheckboxes_ = componentList; }); } @@ -119,16 +109,12 @@ */ getComponentsList_() { return this.componentCheckboxes_.map(item => { - /** @type {!CalibrationStatus} */ - let status = CalibrationStatus.kCalibrationWaiting; - if (item.skip) { - status = CalibrationStatus.kCalibrationSkip; - } else if (item.completed) { - status = CalibrationStatus.kCalibrationComplete; - } else if (item.disabled) { - status = CalibrationStatus.kCalibrationInProgress; - } - return {component: item.component, status: status, progress: 0.0}; + return { + component: item.component, + status: item.checked ? CalibrationStatus.kCalibrationWaiting : + CalibrationStatus.kCalibrationSkip, + progress: 0.0 + }; }); }
diff --git a/ash/webui/shimless_rma/resources/wrapup_finalize_page.html b/ash/webui/shimless_rma/resources/wrapup_finalize_page.html index a5d9a1b..b8c5bbf7 100644 --- a/ash/webui/shimless_rma/resources/wrapup_finalize_page.html +++ b/ash/webui/shimless_rma/resources/wrapup_finalize_page.html
@@ -1,13 +1,19 @@ <style include="cr-shared-style shimless-rma-shared"> +paper-spinner-lite { + height: 300px; + width: 300px; +} </style> -<base-page> +<base-page orientation="column"> <div slot="header"> <h1>[[i18n('finalizePageTitleText')]]</h1> - </div> - <div slot="body"> <p id="finalizationMessage"> [[finalizationMessage_]] </p> </div> + <div slot="body"> + <paper-spinner-lite active hidden$="[[finalizationComplete_]]"> + </paper-spinner-lite> + </div> </base-page>
diff --git a/ash/webui/shimless_rma/resources/wrapup_finalize_page.js b/ash/webui/shimless_rma/resources/wrapup_finalize_page.js index 21626a1..f6ea4b9 100644 --- a/ash/webui/shimless_rma/resources/wrapup_finalize_page.js +++ b/ash/webui/shimless_rma/resources/wrapup_finalize_page.js
@@ -74,12 +74,7 @@ * @param {number} progress */ onFinalizationUpdated(status, progress) { - if (status === FinalizationStatus.kInProgress) { - this.finalizationMessage_ = this.i18n( - finalizationStatusTextKeys[status], Math.round(progress * 100)); - } else { - this.finalizationMessage_ = this.i18n(finalizationStatusTextKeys[status]); - } + this.finalizationMessage_ = this.i18n(finalizationStatusTextKeys[status]); this.finalizationComplete_ = status === FinalizationStatus.kComplete || status === FinalizationStatus.kFailedNonBlocking; this.dispatchEvent(new CustomEvent(
diff --git a/ash/wm/desks/templates/desks_templates_grid_view.cc b/ash/wm/desks/templates/desks_templates_grid_view.cc index a591bda9..cbe57983 100644 --- a/ash/wm/desks/templates/desks_templates_grid_view.cc +++ b/ash/wm/desks/templates/desks_templates_grid_view.cc
@@ -8,9 +8,14 @@ #include <memory> #include "ash/public/cpp/shell_window_ids.h" +#include "ash/shell.h" #include "ash/wm/desks/templates/desks_templates_animations.h" #include "ash/wm/desks/templates/desks_templates_item_view.h" +#include "ash/wm/desks/templates/desks_templates_name_view.h" #include "ash/wm/desks/templates/desks_templates_presenter.h" +#include "ash/wm/overview/overview_controller.h" +#include "ash/wm/overview/overview_highlight_controller.h" +#include "ash/wm/overview/overview_session.h" #include "ui/aura/window.h" #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/compositor/layer.h" @@ -101,6 +106,34 @@ void DesksTemplatesGridView::UpdateGridUI( const std::vector<DeskTemplate*>& desk_templates, const gfx::Rect& grid_bounds) { + // Check if any of the template items or their name views have overview focus + // and notify the highlight controller. This should only be needed when a + // template item is deleted, but currently we call `UpdateGridUI` every time + // the model changes. + // TODO(richui): Remove this when `UpdateGridUI` is not rebuilt every time. + if (!grid_items_.empty()) { + auto* highlight_controller = Shell::Get() + ->overview_controller() + ->overview_session() + ->highlight_controller(); + if (highlight_controller->IsFocusHighlightVisible()) { + // Notify the highlight controller if any of the about to be destroyed + // views have overview focus to prevent use-after-free. + for (DesksTemplatesItemView* template_view : grid_items_) { + if (template_view->IsViewHighlighted()) { + highlight_controller->OnViewDestroyingOrDisabling(template_view); + return; + } + + if (template_view->name_view()->IsViewHighlighted()) { + highlight_controller->OnViewDestroyingOrDisabling( + template_view->name_view()); + return; + } + } + } + } + // Clear the layout manager before removing the child views to avoid // use-after-free bugs due to `Layout()`s being triggered. SetLayoutManager(nullptr);
diff --git a/ash/wm/desks/templates/desks_templates_item_view.cc b/ash/wm/desks/templates/desks_templates_item_view.cc index 0444c79..20ab66f 100644 --- a/ash/wm/desks/templates/desks_templates_item_view.cc +++ b/ash/wm/desks/templates/desks_templates_item_view.cc
@@ -416,10 +416,14 @@ void DesksTemplatesItemView::OnDeleteTemplate() { // Notify the highlight controller that we're going away. - OverviewSession* overview_session = - Shell::Get()->overview_controller()->overview_session(); - DCHECK(overview_session); - overview_session->highlight_controller()->OnViewDestroyingOrDisabling(this); + OverviewHighlightController* highlight_controller = + Shell::Get() + ->overview_controller() + ->overview_session() + ->highlight_controller(); + DCHECK(highlight_controller); + highlight_controller->OnViewDestroyingOrDisabling(this); + highlight_controller->OnViewDestroyingOrDisabling(name_view_); DesksTemplatesPresenter::Get()->DeleteEntry( desk_template_->uuid().AsLowercaseString());
diff --git a/ash/wm/desks/templates/desks_templates_unittest.cc b/ash/wm/desks/templates/desks_templates_unittest.cc index cb4c7521..e2d63e1 100644 --- a/ash/wm/desks/templates/desks_templates_unittest.cc +++ b/ash/wm/desks/templates/desks_templates_unittest.cc
@@ -1789,4 +1789,29 @@ EXPECT_EQ(base::UTF8ToUTF16(template_name), name_view->GetText()); } +// Tests that there is no crash after we use the keyboard to change the name of +// a template. Regression test for https://crbug.com/1279649. +TEST_F(DesksTemplatesTest, EditTemplateNameWithKeyboardNoCrash) { + AddEntry(base::GUID::GenerateRandomV4(), "a", base::Time::Now()); + AddEntry(base::GUID::GenerateRandomV4(), "b", base::Time::Now()); + + OpenOverviewAndShowTemplatesGrid(); + DesksTemplatesNameView* name_view = + GetItemViewFromTemplatesGrid(0)->name_view(); + + // Tab until we focus the name view of the first template item. + SendKey(ui::VKEY_TAB); + SendKey(ui::VKEY_TAB); + ASSERT_EQ(name_view, GetHighlightedView()); + + // Rename template "a" to template "d". + SendKey(ui::VKEY_RETURN); + SendKey(ui::VKEY_D); + SendKey(ui::VKEY_RETURN); + WaitForDesksTemplatesUI(); + + // Verify that there is no crash after we tab again. + SendKey(ui::VKEY_TAB); +} + } // namespace ash
diff --git a/base/allocator/allocator.gni b/base/allocator/allocator.gni index 7d579d6..1f282e0 100644 --- a/base/allocator/allocator.gni +++ b/base/allocator/allocator.gni
@@ -99,7 +99,7 @@ # BRP-pool block list # - enable_backup_ref_ptr_slow_checks: enable additional safety checks that # are too expensive to have on by default. - put_ref_count_in_previous_slot = false + put_ref_count_in_previous_slot = _is_brp_supported never_remove_from_brp_pool_blocklist = _is_brp_supported enable_backup_ref_ptr_slow_checks = false
diff --git a/base/allocator/partition_allocator/DEPS b/base/allocator/partition_allocator/DEPS index 9d183d68..1a171ab 100644 --- a/base/allocator/partition_allocator/DEPS +++ b/base/allocator/partition_allocator/DEPS
@@ -33,7 +33,6 @@ "+base/memory/scoped_refptr.h", "+base/memory/tagging.h", "+base/no_destructor.h", - "+base/numerics/ranges.h", "+base/posix/eintr_wrapper.h", "+base/process/memory.h", "+base/rand_util.h",
diff --git a/base/numerics/ranges.h b/base/numerics/ranges.h index 58deb6f..ebe1302 100644 --- a/base/numerics/ranges.h +++ b/base/numerics/ranges.h
@@ -5,28 +5,11 @@ #ifndef BASE_NUMERICS_RANGES_H_ #define BASE_NUMERICS_RANGES_H_ -#include <algorithm> #include <cmath> +#include <type_traits> namespace base { -// DO NOT USE THIS FUNCTION. IT IS DUE TO BE REMOVED. https://crbug.com/1231569 -// Please use base::clamp() from base/cxx17_backports.h instead. -// -// This function, unlike base::clamp(), does not check if `min` is greater than -// `max`, and returns a bogus answer if it is. Please migrate all code that -// calls this function to use base::clamp() instead. -// -// If, for some reason the broken behavior is required, please re-create this -// min/max nesting inline in the host code and explain with a comment why it -// is needed. -template <class T> -constexpr const T& BrokenClampThatShouldNotBeUsed(const T& value, - const T& min, - const T& max) { - return std::min(std::max(value, min), max); -} - template <typename T> constexpr bool IsApproximatelyEqual(T lhs, T rhs, T tolerance) { static_assert(std::is_arithmetic<T>::value, "Argument must be arithmetic");
diff --git a/build/check_gn_headers_whitelist.txt b/build/check_gn_headers_whitelist.txt index 8f312f76..5e3b602b 100644 --- a/build/check_gn_headers_whitelist.txt +++ b/build/check_gn_headers_whitelist.txt
@@ -117,7 +117,6 @@ gpu/config/gpu_lists_version.h gpu/gles2_conform_support/gtf/gtf_stubs.h gpu/gpu_export.h -headless/lib/headless_macros.h ipc/ipc_channel_proxy_unittest_messages.h ipc/ipc_message_null_macros.h media/audio/audio_logging.h
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index f58729d..1a80232 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -7.20211214.2.1 +7.20211214.3.1
diff --git a/build/fuchsia/run_ffx_command.py b/build/fuchsia/run_ffx_command.py index d70ace2..02f07459 100755 --- a/build/fuchsia/run_ffx_command.py +++ b/build/fuchsia/run_ffx_command.py
@@ -26,14 +26,23 @@ required=True, help='FFX command to run. Runtime arguments are handled ' 'using the %%args%% placeholder.') + parser.add_argument('child_args', + nargs='*', + help='Arguments for the command.') AddCommonArgs(parser) AddTargetSpecificArgs(parser) - args, runtime_args = parser.parse_known_args() + args = parser.parse_args() - command_substituted = [ - chunk.replace('%args%', ' '.join(runtime_args)) - for chunk in shlex.split(args.command) - ] + # Prepare the arglist for "ffx". %args% is replaced with all positional + # arguments given to the script. + ffx_args = shlex.split(args.command) + # replace %args% in the command with the given arguments. + try: + args_index = ffx_args.index('%args%') + ffx_args[args_index:args_index + 1] = args.child_args + except ValueError: + # %args% is not present; use the command as-is. + pass with GetDeploymentTargetForArgs(args) as target: target.Start() @@ -43,7 +52,7 @@ # package can be instantiated after resolution. with target.GetPkgRepo() as pkg_repo: target.InstallPackage(args.package) - process = target.RunFFXCommand(command_substituted) + process = target.RunFFXCommand(ffx_args) # It's possible that components installed by this script may be # instantiated at arbitrary points in the future.
diff --git a/build/sanitizers/lsan_suppressions.cc b/build/sanitizers/lsan_suppressions.cc index 12d589cd0..6c8f3c7 100644 --- a/build/sanitizers/lsan_suppressions.cc +++ b/build/sanitizers/lsan_suppressions.cc
@@ -78,7 +78,7 @@ // Suppress AnimationSequence leak. crbug.com/1265031 "leak:ash::LockStateController::StartPostLockAnimation\n" // Suppress leak in SurfaceDrawContext. crbug.com/1265033 - "leak:skgpu::v1::SurfaceDrawContext::drawGlyphRunListWithCache\n" + "leak:skgpu::v1::SurfaceDrawContext::drawGlyphRunList\n" #endif // PLEASE READ ABOVE BEFORE ADDING NEW SUPPRESSIONS.
diff --git a/cc/base/features.cc b/cc/base/features.cc index d6834560..6027d1a4 100644 --- a/cc/base/features.cc +++ b/cc/base/features.cc
@@ -62,7 +62,9 @@ "DurationEstimatesInCompositorTimingHistory", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kNonBlockingCommit{"NonBlockingCommit", + base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kSlidingWindowForDroppedFrameCounter{ "SlidingWindowForDroppedFrameCounter", base::FEATURE_DISABLED_BY_DEFAULT}; - } // namespace features
diff --git a/cc/base/features.h b/cc/base/features.h index 6df0037..fa165f2 100644 --- a/cc/base/features.h +++ b/cc/base/features.h
@@ -53,10 +53,16 @@ CC_BASE_EXPORT extern const base::Feature kDurationEstimatesInCompositorTimingHistory; +// When enabled, the main thread does not block while commit is running on the +// impl thread. +// WARNING: This feature is not yet safe to enable. Work is needed to ensure +// that main thread cc data structures are not modified on the main thread while +// commit is running concurrently on the impl thread. +CC_BASE_EXPORT extern const base::Feature kNonBlockingCommit; + // When enabled, DroppedFrameCounter will use an adjusted sliding window // interval specified by field trial params. CC_BASE_EXPORT extern const base::Feature kSlidingWindowForDroppedFrameCounter; - } // namespace features #endif // CC_BASE_FEATURES_H_
diff --git a/cc/layers/video_layer_impl.cc b/cc/layers/video_layer_impl.cc index 0c6087a..ebaa491 100644 --- a/cc/layers/video_layer_impl.cc +++ b/cc/layers/video_layer_impl.cc
@@ -12,6 +12,7 @@ #include "base/bind.h" #include "base/check.h" #include "base/memory/ptr_util.h" +#include "cc/base/features.h" #include "cc/layers/video_frame_provider_client_impl.h" #include "cc/trees/layer_tree_frame_sink.h" #include "cc/trees/layer_tree_impl.h" @@ -33,7 +34,8 @@ int id, VideoFrameProvider* provider, media::VideoTransformation video_transform) { - DCHECK(tree_impl->task_runner_provider()->IsMainThreadBlocked()); + DCHECK(tree_impl->task_runner_provider()->IsMainThreadBlocked() || + base::FeatureList::IsEnabled(features::kNonBlockingCommit)); DCHECK(tree_impl->task_runner_provider()->IsImplThread()); scoped_refptr<VideoFrameProviderClientImpl> provider_client_impl = @@ -62,8 +64,9 @@ // on the VideoFrameProviderClientImpl, but we stop when the first // LayerImpl (the one on the pending tree) is destroyed since we know // the main thread is blocked for this commit. + DCHECK(layer_tree_impl()->task_runner_provider()->IsMainThreadBlocked() || + base::FeatureList::IsEnabled(features::kNonBlockingCommit)); DCHECK(layer_tree_impl()->task_runner_provider()->IsImplThread()); - DCHECK(layer_tree_impl()->task_runner_provider()->IsMainThreadBlocked()); provider_client_impl_->Stop(); } }
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index 07460bb..e60b7357 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc
@@ -425,6 +425,7 @@ void LayerTreeHost::WaitForCommitCompletion() { DCHECK(IsMainThread()); if (commit_completion_event_) { + TRACE_EVENT0("cc", "LayerTreeHost::WaitForCommitCompletion"); commit_completion_event_->Wait(); commit_completion_event_ = nullptr; } @@ -442,6 +443,7 @@ } void LayerTreeHost::CommitComplete(const CommitTimestamps& commit_timestamps) { + DCHECK(IsMainThread()); // This DCHECK ensures that WaitForCommitCompletion() will not block. DCHECK(IsMainThread()); DCHECK(!in_commit());
diff --git a/cc/trees/layer_tree_host_client.h b/cc/trees/layer_tree_host_client.h index 44aad4b..0e775a2 100644 --- a/cc/trees/layer_tree_host_client.h +++ b/cc/trees/layer_tree_host_client.h
@@ -108,6 +108,10 @@ virtual void BeginMainFrameNotExpectedSoon() = 0; virtual void BeginMainFrameNotExpectedUntil(base::TimeTicks time) = 0; + // This is called immediately after notifying the impl thread that it should + // do a commit, possibly before the commit has finished (depending on whether + // features::kNonBlockingCommit is enabled). It is meant for work that must + // happen prior to returning control to the main thread event loop. virtual void DidBeginMainFrame() = 0; virtual void WillUpdateLayers() = 0; virtual void DidUpdateLayers() = 0; @@ -168,6 +172,11 @@ // Mark the frame start and end time for UMA and UKM metrics that require // the time from the start of BeginMainFrame to the Commit, or early out. virtual void RecordStartOfFrameMetrics() = 0; + // This is called immediately after notifying the impl thread that it should + // do a commit, possibly before the commit has finished (depending on whether + // features::kNonBlockingCommit is enabled). It is meant to record the time + // when the main thread is finished with its part of a main frame, and will + // return control to the main thread event loop. virtual void RecordEndOfFrameMetrics( base::TimeTicks frame_begin_time, ActiveFrameSequenceTrackers trackers) = 0;
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc index b926a44..b4f6f79 100644 --- a/cc/trees/layer_tree_host_unittest.cc +++ b/cc/trees/layer_tree_host_unittest.cc
@@ -7981,7 +7981,18 @@ public: LayerTreeHostTestNoTasksBetweenWillAndDidCommit() : did_commit_(false) {} - void BeginTest() override { PostSetNeedsCommitToMainThread(); } + void BeginTest() override { + // The entire purpose of Non-Blocking Commit is to allow the main thread to + // continue doing work while commit is running on the impl thread, making + // this test obsolete. + if (base::FeatureList::IsEnabled(features::kNonBlockingCommit) && + layer_tree_host()->IsThreaded()) { + DidCommit(); + EndTest(); + } else { + PostSetNeedsCommitToMainThread(); + } + } void WillCommit(const CommitState&) override { MainThreadTaskRunner()->PostTask(
diff --git a/cc/trees/proxy_impl.cc b/cc/trees/proxy_impl.cc index 04e23e8..2079ef6 100644 --- a/cc/trees/proxy_impl.cc +++ b/cc/trees/proxy_impl.cc
@@ -49,17 +49,37 @@ } // namespace -// Ensures that a CompletionEvent is always signaled. -class ScopedCompletionEvent { +// Ensures that a CompletionEvent for commit is always signaled. +class ScopedCommitCompletionEvent { public: - explicit ScopedCompletionEvent(CompletionEvent* event) : event_(event) {} - ScopedCompletionEvent(const ScopedCompletionEvent&) = delete; - ~ScopedCompletionEvent() { event_->Signal(); } + ScopedCommitCompletionEvent( + CompletionEvent* event, + base::TimeTicks start_time, + base::SingleThreadTaskRunner* main_thread_task_runner, + base::WeakPtr<ProxyMain> proxy_main_weak_ptr) + : event_(event), + commit_timestamps_({start_time, base::TimeTicks()}), + main_thread_task_runner_(main_thread_task_runner), + proxy_main_weak_ptr_(proxy_main_weak_ptr) {} + ScopedCommitCompletionEvent(const ScopedCommitCompletionEvent&) = delete; + ~ScopedCommitCompletionEvent() { + event_->Signal(); + main_thread_task_runner_->PostTask( + FROM_HERE, base::BindOnce(&ProxyMain::DidCompleteCommit, + proxy_main_weak_ptr_, commit_timestamps_)); + } + ScopedCommitCompletionEvent& operator=(const ScopedCommitCompletionEvent&) = + delete; - ScopedCompletionEvent& operator=(const ScopedCompletionEvent&) = delete; + void SetFinishTime(base::TimeTicks finish_time) { + commit_timestamps_.finish = finish_time; + } private: - const raw_ptr<CompletionEvent> event_; + CompletionEvent* const event_; + CommitTimestamps commit_timestamps_; + base::SingleThreadTaskRunner* main_thread_task_runner_; + base::WeakPtr<ProxyMain> proxy_main_weak_ptr_; }; ProxyImpl::ProxyImpl( @@ -275,13 +295,24 @@ CommitTimestamps* commit_timestamps) { TRACE_EVENT0("cc", "ProxyImpl::NotifyReadyToCommitOnImpl"); DCHECK(!data_for_commit_.get()); - DCHECK(IsImplThread() && IsMainThreadBlocked()); + DCHECK(IsImplThread()); + DCHECK(base::FeatureList::IsEnabled(features::kNonBlockingCommit) || + IsMainThreadBlocked()); DCHECK(scheduler_); DCHECK(scheduler_->CommitPending()); // Inform the layer tree host that the commit has started, so that metrics // can determine how long we waited for thread synchronization. - commit_timestamps->start = base::TimeTicks::Now(); + // + // If NonBlockingCommit is disabled, then commit_timestamps points to a + // variable on the call stack of the main thread. If NonBlockingCommit is + // enabled, then the commit timestamps are transmitted back to the main thread + // by ScopedCommitCompletionEvent. + DCHECK_NE((bool)commit_timestamps, + base::FeatureList::IsEnabled(features::kNonBlockingCommit)); + base::TimeTicks start_time = base::TimeTicks::Now(); + if (commit_timestamps) + commit_timestamps->start = start_time; if (!host_impl_) { TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoLayerTree", @@ -298,7 +329,9 @@ host_impl_->ReadyToCommit(commit_args, begin_main_frame_metrics.get()); data_for_commit_ = std::make_unique<DataForCommit>( - std::make_unique<ScopedCompletionEvent>(completion_event), + std::make_unique<ScopedCommitCompletionEvent>( + completion_event, start_time, MainThreadTaskRunner(), + proxy_main_weak_ptr_), std::move(commit_state), unsafe_state, commit_timestamps); // Extract metrics data from the layer tree host and send them to the @@ -666,7 +699,8 @@ void ProxyImpl::ScheduledActionCommit() { TRACE_EVENT0("cc", "ProxyImpl::ScheduledActionCommit"); DCHECK(IsImplThread()); - DCHECK(IsMainThreadBlocked()); + DCHECK(base::FeatureList::IsEnabled(features::kNonBlockingCommit) || + IsMainThreadBlocked()); DCHECK(data_for_commit_.get()); DCHECK(data_for_commit_->IsValid()); @@ -680,7 +714,10 @@ auto* unsafe_state = data_for_commit_->unsafe_state; host_impl_->BeginCommit(commit_state->source_frame_number); host_impl_->FinishCommit(*commit_state, *unsafe_state); - data_for_commit_->commit_timestamps->finish = base::TimeTicks::Now(); + base::TimeTicks finish_time = base::TimeTicks::Now(); + if (data_for_commit_->commit_timestamps) + data_for_commit_->commit_timestamps->finish = finish_time; + data_for_commit_->commit_completion_event->SetFinishTime(finish_time); if (commit_state->commit_waits_for_activation) { // For some layer types in impl-side painting, the commit is held until the @@ -859,7 +896,7 @@ } ProxyImpl::DataForCommit::DataForCommit( - std::unique_ptr<ScopedCompletionEvent> commit_completion_event, + std::unique_ptr<ScopedCommitCompletionEvent> commit_completion_event, std::unique_ptr<CommitState> commit_state, ThreadUnsafeCommitState* unsafe_state, CommitTimestamps* commit_timestamps) @@ -872,7 +909,8 @@ bool ProxyImpl::DataForCommit::IsValid() const { return commit_completion_event.get() && commit_state.get() && unsafe_state && - commit_timestamps; + (base::FeatureList::IsEnabled(features::kNonBlockingCommit) || + commit_timestamps); } } // namespace cc
diff --git a/cc/trees/proxy_impl.h b/cc/trees/proxy_impl.h index 8ed50079..0eddea8 100644 --- a/cc/trees/proxy_impl.h +++ b/cc/trees/proxy_impl.h
@@ -28,7 +28,7 @@ class RenderFrameMetadataObserver; class JankInjector; -class ScopedCompletionEvent; +class ScopedCommitCompletionEvent; // This class aggregates all the interactions that the main side of the // compositor needs to have with the impl side. @@ -169,7 +169,7 @@ struct DataForCommit { DataForCommit( - std::unique_ptr<ScopedCompletionEvent> commit_completion_event, + std::unique_ptr<ScopedCommitCompletionEvent> commit_completion_event, std::unique_ptr<CommitState> commit_state, ThreadUnsafeCommitState* unsafe_state, CommitTimestamps* commit_timestamps); @@ -179,7 +179,7 @@ bool IsValid() const; // Set when the main thread is waiting on a commit to complete. - std::unique_ptr<ScopedCompletionEvent> commit_completion_event; + std::unique_ptr<ScopedCommitCompletionEvent> commit_completion_event; std::unique_ptr<CommitState> commit_state; ThreadUnsafeCommitState* unsafe_state; // This is passed from the main thread so the impl thread can record @@ -190,7 +190,7 @@ std::unique_ptr<DataForCommit> data_for_commit_; // Set when the main thread is waiting for activation to complete. - std::unique_ptr<ScopedCompletionEvent> activation_completion_event_; + std::unique_ptr<ScopedCommitCompletionEvent> activation_completion_event_; // Set when the next draw should post DidCommitAndDrawFrame to the main // thread.
diff --git a/cc/trees/proxy_main.cc b/cc/trees/proxy_main.cc index 41982d0..a3ba577b 100644 --- a/cc/trees/proxy_main.cc +++ b/cc/trees/proxy_main.cc
@@ -15,6 +15,7 @@ #include "base/trace_event/traced_value.h" #include "cc/base/completion_event.h" #include "cc/base/devtools_instrumentation.h" +#include "cc/base/features.h" #include "cc/benchmarks/benchmark_instrumentation.h" #include "cc/paint/paint_worklet_layer_painter.h" #include "cc/resources/ui_resource_manager.h" @@ -138,12 +139,6 @@ if (layer_tree_host_->scheduling_client()) layer_tree_host_->scheduling_client()->DidRunBeginMainFrame(); - // If the commit finishes, LayerTreeHost will transfer its swap promises to - // LayerTreeImpl. The destructor of ScopedSwapPromiseChecker aborts the - // remaining swap promises. - ScopedAbortRemainingSwapPromises swap_promise_checker( - layer_tree_host_->GetSwapPromiseManager()); - // We need to issue image decode callbacks whether or not we will abort this // update and commit, since the request ids are only stored in // |begin_main_frame_state|. @@ -171,6 +166,8 @@ begin_main_frame_start_time, std::move(empty_swap_promises), false /* scroll_and_viewport_changes_synced */)); + layer_tree_host_->GetSwapPromiseManager()->BreakSwapPromises( + SwapPromise::COMMIT_FAILS); return; } @@ -197,6 +194,8 @@ // previously requested pipeline stages. deferred_final_pipeline_stage_ = std::max(final_pipeline_stage_, deferred_final_pipeline_stage_); + layer_tree_host_->GetSwapPromiseManager()->BreakSwapPromises( + SwapPromise::COMMIT_FAILS); return; } @@ -292,6 +291,8 @@ // When we stop deferring commits, we should resume any previously requested // pipeline stages. deferred_final_pipeline_stage_ = final_pipeline_stage_; + layer_tree_host_->GetSwapPromiseManager()->BreakSwapPromises( + SwapPromise::COMMIT_FAILS); return; } @@ -317,7 +318,7 @@ if (updated) final_pipeline_stage_ = COMMIT_PIPELINE_STAGE; - devtools_instrumentation::ScopedCommitTrace commit_task( + commit_trace_ = std::make_unique<devtools_instrumentation::ScopedCommitTrace>( layer_tree_host_->GetId(), begin_main_frame_state->begin_frame_args.frame_id.sequence_number); @@ -364,6 +365,7 @@ layer_tree_host_->RecordEndOfFrameMetrics( begin_main_frame_start_time, begin_main_frame_state->active_sequence_trackers); + commit_trace_.reset(); return; } @@ -374,10 +376,13 @@ // point of view, but asynchronously performed on the impl thread, // coordinated by the Scheduler. CommitTimestamps commit_timestamps; + bool blocking = !base::FeatureList::IsEnabled(features::kNonBlockingCommit); { TRACE_EVENT0("cc,raf_investigation", "ProxyMain::BeginMainFrame::commit"); - DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_); + absl::optional<DebugScopedSetMainThreadBlocked> main_thread_blocked; + if (blocking) + main_thread_blocked.emplace(task_runner_provider_); ImplThreadTaskRunner()->PostTask( FROM_HERE, base::BindOnce(&ProxyImpl::NotifyReadyToCommitOnImpl, @@ -385,8 +390,9 @@ completion_event, std::move(commit_state), &unsafe_state, begin_main_frame_start_time, begin_main_frame_state->begin_frame_args, - &commit_timestamps)); - layer_tree_host_->WaitForCommitCompletion(); + blocking ? &commit_timestamps : nullptr)); + if (blocking) + layer_tree_host_->WaitForCommitCompletion(); } // For Blink implementations, this updates frame throttling and @@ -394,12 +400,21 @@ // but *not* script-created IntersectionObserver. See // blink::LocalFrameView::RunPostLifecycleSteps. layer_tree_host_->DidBeginMainFrame(); - layer_tree_host_->CommitComplete(commit_timestamps); + if (blocking) + layer_tree_host_->CommitComplete(commit_timestamps); layer_tree_host_->RecordEndOfFrameMetrics( begin_main_frame_start_time, begin_main_frame_state->active_sequence_trackers); } +void ProxyMain::DidCompleteCommit(CommitTimestamps commit_timestamps) { + if (!base::FeatureList::IsEnabled(features::kNonBlockingCommit)) + return; + if (layer_tree_host_) + layer_tree_host_->CommitComplete(commit_timestamps); + commit_trace_.reset(); +} + void ProxyMain::DidPresentCompositorFrame( uint32_t frame_token, std::vector<PresentationTimeCallbackBuffer::MainCallback> callbacks, @@ -643,16 +658,15 @@ bool ProxyMain::MainFrameWillHappenForTesting() { DCHECK(IsMainThread()); bool main_frame_will_happen = false; - { - DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_); - CompletionEvent completion; - ImplThreadTaskRunner()->PostTask( - FROM_HERE, - base::BindOnce(&ProxyImpl::MainFrameWillHappenOnImplForTesting, - base::Unretained(proxy_impl_.get()), &completion, - &main_frame_will_happen)); - completion.Wait(); - } + if (layer_tree_host_) + layer_tree_host_->WaitForCommitCompletion(); + DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_); + CompletionEvent completion; + ImplThreadTaskRunner()->PostTask( + FROM_HERE, base::BindOnce(&ProxyImpl::MainFrameWillHappenOnImplForTesting, + base::Unretained(proxy_impl_.get()), + &completion, &main_frame_will_happen)); + completion.Wait(); return main_frame_will_happen; }
diff --git a/cc/trees/proxy_main.h b/cc/trees/proxy_main.h index 3d0daf4a..31f6c4c 100644 --- a/cc/trees/proxy_main.h +++ b/cc/trees/proxy_main.h
@@ -26,6 +26,10 @@ class ProxyImpl; class RenderFrameMetadataObserver; +namespace devtools_instrumentation { +struct ScopedCommitTrace; +} + // This class aggregates all interactions that the impl side of the compositor // needs to have with the main side. // The class is created and lives on the main thread. @@ -58,6 +62,7 @@ void DidCompletePageScaleAnimation(); void BeginMainFrame( std::unique_ptr<BeginMainFrameAndCommitState> begin_main_frame_state); + void DidCompleteCommit(CommitTimestamps); void DidPresentCompositorFrame( uint32_t frame_token, std::vector<PresentationTimeCallbackBuffer::MainCallback> callbacks, @@ -160,6 +165,10 @@ // Only used when defer_commits_ is active and must be set in such cases. base::TimeTicks commits_restart_time_; + // TODO(paint-dev): it's not clear how devtools will handle interlacing of + // main thread tasks with commit tracing (crbug.com/1277952). + std::unique_ptr<devtools_instrumentation::ScopedCommitTrace> commit_trace_; + // ProxyImpl is created and destroyed on the impl thread, and should only be // accessed on the impl thread. // It is safe to use base::Unretained to post tasks to ProxyImpl on the impl
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc index a58b2c17..c3cd9e7 100644 --- a/cc/trees/single_thread_proxy.cc +++ b/cc/trees/single_thread_proxy.cc
@@ -214,7 +214,7 @@ // Strictly speaking, it's not necessary to pass a CompletionEvent to // WillCommit, since we can't have thread contention issues. The benefit to // creating one here is that it simplifies LayerTreeHost::in_commit(), which - // useful in DCHECKs sprinkled throughout the code. + // is useful in DCHECKs sprinkled throughout the code. auto completion_event_ptr = std::make_unique<CompletionEvent>( base::WaitableEvent::ResetPolicy::MANUAL); auto* completion_event = completion_event_ptr.get();
diff --git a/chrome/VERSION b/chrome/VERSION index aaa50afa..da106233d 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=99 MINOR=0 -BUILD=4767 +BUILD=4768 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java index 4ef5eee..6cee71c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
@@ -55,7 +55,6 @@ import org.chromium.chrome.browser.omnibox.UrlBarCoordinator; import org.chromium.chrome.browser.omnibox.UrlBarCoordinator.SelectionState; import org.chromium.chrome.browser.omnibox.UrlBarData; -import org.chromium.chrome.browser.omnibox.styles.OmniboxTheme; import org.chromium.chrome.browser.page_info.ChromePageInfo; import org.chromium.chrome.browser.page_info.ChromePageInfoHighlight; import org.chromium.chrome.browser.tab.Tab; @@ -66,6 +65,7 @@ import org.chromium.chrome.browser.toolbar.top.ToolbarLayout; import org.chromium.chrome.browser.toolbar.top.ToolbarPhone; import org.chromium.chrome.browser.ui.native_page.NativePage; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.components.browser_ui.widget.TintedDrawable; @@ -976,9 +976,10 @@ private void updateUseDarkColors() { updateButtonsTint(); - @OmniboxTheme - int omniboxTheme = mUseDarkColors ? OmniboxTheme.LIGHT_THEME : OmniboxTheme.DARK_THEME; - if (mUrlCoordinator.setOmniboxTheme(omniboxTheme)) { + @BrandedColorScheme + int brandedColorScheme = mUseDarkColors ? BrandedColorScheme.LIGHT_BRANDED_THEME + : BrandedColorScheme.DARK_BRANDED_THEME; + if (mUrlCoordinator.setBrandedColorScheme(brandedColorScheme)) { // Update the URL to make it use the new color scheme. updateUrlBar(); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManagerUnitTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManagerUnitTest.java index e4a8a583..d41f512 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManagerUnitTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManagerUnitTest.java
@@ -26,7 +26,7 @@ import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.Batch; -import org.chromium.chrome.browser.omnibox.styles.OmniboxTheme; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.omnibox.AutocompleteResult.GroupDetails; import org.chromium.ui.modelutil.ListObservable.ListObserver; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; @@ -89,16 +89,17 @@ /** * Verify that PropertyModels of all suggestions on managed list reflect the expected values. */ - private void verifyPropertyValues(int layoutDirection, @OmniboxTheme int omniboxTheme) { + private void verifyPropertyValues( + int layoutDirection, @BrandedColorScheme int brandedColorScheme) { for (int index = 0; index < mSuggestionModels.size(); index++) { Assert.assertEquals("Unexpected layout direction for suggestion at position " + index, layoutDirection, mSuggestionModels.get(index).model.get( SuggestionCommonProperties.LAYOUT_DIRECTION)); Assert.assertEquals("Unexpected visual theme for suggestion at position " + index, - omniboxTheme, + brandedColorScheme, mSuggestionModels.get(index).model.get( - SuggestionCommonProperties.OMNIBOX_THEME)); + SuggestionCommonProperties.COLOR_SCHEME)); } } @@ -348,16 +349,16 @@ mManager.setSourceViewInfoList(list, new SparseArray<GroupDetails>()); verifyModelEquals(list); - verifyPropertyValues(View.LAYOUT_DIRECTION_INHERIT, OmniboxTheme.LIGHT_THEME); + verifyPropertyValues(View.LAYOUT_DIRECTION_INHERIT, BrandedColorScheme.LIGHT_BRANDED_THEME); mManager.setLayoutDirection(View.LAYOUT_DIRECTION_RTL); - verifyPropertyValues(View.LAYOUT_DIRECTION_RTL, OmniboxTheme.LIGHT_THEME); + verifyPropertyValues(View.LAYOUT_DIRECTION_RTL, BrandedColorScheme.LIGHT_BRANDED_THEME); - mManager.setOmniboxTheme(OmniboxTheme.DARK_THEME); - verifyPropertyValues(View.LAYOUT_DIRECTION_RTL, OmniboxTheme.DARK_THEME); + mManager.setBrandedColorScheme(BrandedColorScheme.DARK_BRANDED_THEME); + verifyPropertyValues(View.LAYOUT_DIRECTION_RTL, BrandedColorScheme.DARK_BRANDED_THEME); - mManager.setOmniboxTheme(OmniboxTheme.INCOGNITO); - verifyPropertyValues(View.LAYOUT_DIRECTION_RTL, OmniboxTheme.INCOGNITO); + mManager.setBrandedColorScheme(BrandedColorScheme.INCOGNITO); + verifyPropertyValues(View.LAYOUT_DIRECTION_RTL, BrandedColorScheme.INCOGNITO); // Finally, set the new list and confirm that the values are still applied. list = Arrays.asList(new DropdownItemViewInfo(mHeaderProcessor, @@ -370,6 +371,6 @@ new PropertyModel(SuggestionCommonProperties.ALL_KEYS), 2)); mManager.setSourceViewInfoList(list, new SparseArray<GroupDetails>()); verifyModelEquals(list); - verifyPropertyValues(View.LAYOUT_DIRECTION_RTL, OmniboxTheme.INCOGNITO); + verifyPropertyValues(View.LAYOUT_DIRECTION_RTL, BrandedColorScheme.INCOGNITO); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessorTest.java index 402721e..caa35a8 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessorTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessorTest.java
@@ -132,7 +132,7 @@ mModel = mProcessor.createModel(); mProcessor.populateModel(mSuggestion, mModel, 0); SuggestionViewViewBinder.bind(mModel, mRootView, SuggestionViewProperties.TEXT_LINE_1_TEXT); - SuggestionViewViewBinder.bind(mModel, mRootView, SuggestionCommonProperties.OMNIBOX_THEME); + SuggestionViewViewBinder.bind(mModel, mRootView, SuggestionCommonProperties.COLOR_SCHEME); SuggestionViewViewBinder.bind( mModel, mRootView, SuggestionViewProperties.IS_SEARCH_SUGGESTION); SuggestionViewViewBinder.bind(mModel, mRootView, SuggestionViewProperties.TEXT_LINE_2_TEXT);
diff --git a/chrome/app/BUILD.gn b/chrome/app/BUILD.gn index 1ec0f190..6710a03 100644 --- a/chrome/app/BUILD.gn +++ b/chrome/app/BUILD.gn
@@ -280,9 +280,8 @@ executable = rebase_path("//build/fuchsia/run_ffx_command.py") executable_args = [ "--command", - "session add fuchsia-pkg://fuchsia.com/chrome#meta/chrome_v1.cmx", - - # TODO(bugs.fuchsia.dev/85949): Pass runtime arguments using %args%. + "session add fuchsia-pkg://fuchsia.com/chrome#meta/chrome_v1.cmx -- " + + "%args%", ] include_fuchsia_build_dir = true }
diff --git a/chrome/app/access_code_cast_strings.grdp b/chrome/app/access_code_cast_strings.grdp index 5fc1301..5f3e2a8d 100644 --- a/chrome/app/access_code_cast_strings.grdp +++ b/chrome/app/access_code_cast_strings.grdp
@@ -10,6 +10,21 @@ <message name="IDS_ACCESS_CODE_CAST_DIALOG_TITLE" desc="Title for access code cast dialog"> Cast to a new display </message> + <message name="IDS_ACCESS_CODE_CAST_ERROR_ACCESS_CODE" desc="Error message for incorrect access code"> + Access code not recognized + </message> + <message name="IDS_ACCESS_CODE_CAST_ERROR_NETWORK" desc="Error message for network communication issues"> + Network communication issues + </message> + <message name="IDS_ACCESS_CODE_CAST_ERROR_PERMISSION" desc="Error message for insufficient permission"> + You don't have permission to cast to this display + </message> + <message name="IDS_ACCESS_CODE_CAST_ERROR_TOO_MANY_REQUESTS" desc="Error message for too many cast attempts"> + You have entered an incorrect access code too many times. Try again later + </message> + <message name="IDS_ACCESS_CODE_CAST_ERROR_UNKNOWN" desc="Error message for an unknown casting error"> + Something went wrong. Try again later + </message> <message name="IDS_ACCESS_CODE_CAST_USE_CAMERA" desc="Label for the button to use the device camera to scan a QR code"> Use the camera to scan QR code </message>
diff --git a/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_ACCESS_CODE.png.sha1 b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_ACCESS_CODE.png.sha1 new file mode 100644 index 0000000..0520832 --- /dev/null +++ b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_ACCESS_CODE.png.sha1
@@ -0,0 +1 @@ +82fcd737f7ca942388ec8e9e7e1022577b5dcf69 \ No newline at end of file
diff --git a/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_NETWORK.png.sha1 b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_NETWORK.png.sha1 new file mode 100644 index 0000000..1ec150a8 --- /dev/null +++ b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_NETWORK.png.sha1
@@ -0,0 +1 @@ +c6cb096868098d1e3098dd4224a4affb4ed545c0 \ No newline at end of file
diff --git a/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_PERMISSION.png.sha1 b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_PERMISSION.png.sha1 new file mode 100644 index 0000000..19b9f142 --- /dev/null +++ b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_PERMISSION.png.sha1
@@ -0,0 +1 @@ +20d67c01bcb924082fbecdd92b554bf7ce8f9985 \ No newline at end of file
diff --git a/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_TOO_MANY_REQUESTS.png.sha1 b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_TOO_MANY_REQUESTS.png.sha1 new file mode 100644 index 0000000..6f20bda --- /dev/null +++ b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_TOO_MANY_REQUESTS.png.sha1
@@ -0,0 +1 @@ +21d0f94c812d9ff2b65e2e2da538f7aa44d58a54 \ No newline at end of file
diff --git a/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_UNKNOWN.png.sha1 b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_UNKNOWN.png.sha1 new file mode 100644 index 0000000..7a0ae2c --- /dev/null +++ b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_UNKNOWN.png.sha1
@@ -0,0 +1 @@ +ad365fe72456133e72409b2d18c2fc62074539d2 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp index 6c61f4d..1f084bd3e 100644 --- a/chrome/app/chromeos_strings.grdp +++ b/chrome/app/chromeos_strings.grdp
@@ -821,6 +821,9 @@ <message name="IDS_BLUETOOTH_PAIRING_PAIRING_NO_AVAILABLE_DEVICES" desc="Bluetooth pairing dialog: Title for the list of Bluetooth devices when no devices are available for pairing."> No devices found nearby </message> + <message name="IDS_BLUETOOTH_PAIRING_PAIRING_BLUETOOTH_DISABLED" desc="Bluetooth pairing dialog: Title for the list of Bluetooth devices when Bluetooth is disabled so no devices are found for pairing."> + Bluetooth is turned off. To see available devices, turn Bluetooth on. + </message> <message name="IDS_BLUETOOTH_PAIRING_LEARN_MORE" desc="Bluetooth pairing dialog: Message informing the user on what actions to take in order to see a device in the list of available devices."> Make sure your Bluetooth device is in pairing mode and nearby. Only pair with devices you trust. <ph name="BEGIN_LINK_LEARN_MORE"><a target="_blank" href="$1"></ph>Learn more<ph name="END_LINK_LEARN_MORE"></a></ph> </message> @@ -851,39 +854,6 @@ <message name="IDS_BLUETOOTH_PAIRING_ENTER_KEYS" desc="Bluetooth pairing dialog: Message displayed informing the user to enter the keys below on the device being paired."> Enter these keys on <ph name="DEVICE_NAME">$1<ex>Nexus S</ex></ph> </message> - <message name="IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_UNKNOWN" desc="Bluetooth pairing UI: Accessibility label used for a device of unknown type in a list of devices which can be paired."> - Device <ph name="DEVICE_INDEX">$1<ex>1</ex></ph> of <ph name="DEVICE_COUNT">$2<ex>15</ex></ph>, Unknown device named <ph name="DEVICE_NAME">$3<ex>Beats</ex></ph> - </message> - <message name="IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_COMPUTER" desc="Bluetooth pairing UI: Accessibility label used for a computer device in a list of devices which can be paired."> - Device <ph name="DEVICE_INDEX">$1<ex>1</ex></ph> of <ph name="DEVICE_COUNT">$2<ex>15</ex></ph>, Computer named <ph name="DEVICE_NAME">$3<ex>Beats</ex></ph> - </message> - <message name="IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_PHONE" desc="Bluetooth pairing UI: Accessibility label used for a phone device in a list of devices which can be paired."> - Device <ph name="DEVICE_INDEX">$1<ex>1</ex></ph> of <ph name="DEVICE_COUNT">$2<ex>15</ex></ph>, Phone named <ph name="DEVICE_NAME">$3<ex>Beats</ex></ph> - </message> - <message name="IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_HEADSET" desc="Bluetooth pairing UI: Accessibility label used for an audio device in a list of devices which can be paired."> - Device <ph name="DEVICE_INDEX">$1<ex>1</ex></ph> of <ph name="DEVICE_COUNT">$2<ex>15</ex></ph>, Audio device named <ph name="DEVICE_NAME">$3<ex>Beats</ex></ph> - </message> - <message name="IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_VIDEO_CAMERA" desc="Bluetooth pairing UI: Accessibility label used for a video camera device in a list of devices which can be paired."> - Device <ph name="DEVICE_INDEX">$1<ex>1</ex></ph> of <ph name="DEVICE_COUNT">$2<ex>15</ex></ph>, Video camera named <ph name="DEVICE_NAME">$3<ex>Beats</ex></ph> - </message> - <message name="IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_GAME_CONTROLLER" desc="Bluetooth pairing UI: Accessibility label used for a game controller device in a list of devices which can be paired."> - Device <ph name="DEVICE_INDEX">$1<ex>1</ex></ph> of <ph name="DEVICE_COUNT">$2<ex>15</ex></ph>, Game controller named <ph name="DEVICE_NAME">$3<ex>Beats</ex></ph> - </message> - <message name="IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_KEYBOARD" desc="Bluetooth pairing UI: Accessibility label used for a keyboard device in a list of devices which can be paired."> - Device <ph name="DEVICE_INDEX">$1<ex>1</ex></ph> of <ph name="DEVICE_COUNT">$2<ex>15</ex></ph>, Keyboard named <ph name="DEVICE_NAME">$3<ex>Beats</ex></ph> - </message> - <message name="IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_MOUSE" desc="Bluetooth pairing UI: Accessibility label used for a mouse device in a list of devices which can be paired."> - Device <ph name="DEVICE_INDEX">$1<ex>1</ex></ph> of <ph name="DEVICE_COUNT">$2<ex>15</ex></ph>, Mouse named <ph name="DEVICE_NAME">$3<ex>Beats</ex></ph> - </message> - <message name="IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_TABLET" desc="Bluetooth pairing UI: Accessibility label used for a tablet device in a list of devices which can be paired."> - Device <ph name="DEVICE_INDEX">$1<ex>1</ex></ph> of <ph name="DEVICE_COUNT">$2<ex>15</ex></ph>, Tablet named <ph name="DEVICE_NAME">$3<ex>Beats</ex></ph> - </message> - <message name="IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_SECONDARY_ERROR_A11Y_LABEL" desc="Bluetooth pairing dialog: Accessibility label for unpaired Bluetooth device list item, when pairing to a device fails."> - Couldn't pair to device <ph name="DEVICE_NAME">$1<ex>Beats</ex></ph>; select device to try again - </message> - <message name="IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_SECONDARY_PAIRING_A11Y_LABEL" desc="Bluetooth pairing dialog: Accessibility label for unpaired Bluetooth device list item, when pairing to the a device is in progress."> - Pairing to <ph name="DEVICE_NAME">$1<ex>Beats</ex></ph> - </message> <!-- Strings for the OOBE packaged license screen --> <message name="IDS_OOBE_PACKAGED_LICENSE_TITLE" desc="Title of the screen which advertises use of packaged license."> @@ -2877,6 +2847,9 @@ <message name="IDS_ENTERPRISE_ENROLLMENT_ERROR_SAVE_DEVICE_CONFIGURATION" desc="Error message shown on the enrollment screen when the system failed to save some part of the device configuration. E.g. token from the Device Management server."> Oops! The system failed to save device configuration. </message> + <message name="IDS_ENTERPRISE_ENROLLMENT_ERROR_MAY_NOT_BLOCK_DEV_MODE" desc="Error message shown on the enrollment screen when the incoming device policy block developer mode but a command-line switch prevents this." translateable="false"> + Device policy would block developer mode but a command-line switch prevents this. + </message> <message name="IDS_ENTERPRISE_ENROLLMENT_SCREEN_TITLE" desc="The title on the enterprise enrollment dialog."> Enterprise enrollment </message>
diff --git a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_COMPUTER.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_COMPUTER.png.sha1 deleted file mode 100644 index 697c12cd..0000000 --- a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_COMPUTER.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -384318d0fe4e3716ffb32ae3c5ad279fc246acbb \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_GAME_CONTROLLER.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_GAME_CONTROLLER.png.sha1 deleted file mode 100644 index 697c12cd..0000000 --- a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_GAME_CONTROLLER.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -384318d0fe4e3716ffb32ae3c5ad279fc246acbb \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_HEADSET.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_HEADSET.png.sha1 deleted file mode 100644 index 697c12cd..0000000 --- a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_HEADSET.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -384318d0fe4e3716ffb32ae3c5ad279fc246acbb \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_KEYBOARD.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_KEYBOARD.png.sha1 deleted file mode 100644 index 697c12cd..0000000 --- a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_KEYBOARD.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -384318d0fe4e3716ffb32ae3c5ad279fc246acbb \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_MOUSE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_MOUSE.png.sha1 deleted file mode 100644 index 697c12cd..0000000 --- a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_MOUSE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -384318d0fe4e3716ffb32ae3c5ad279fc246acbb \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_PHONE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_PHONE.png.sha1 deleted file mode 100644 index 697c12cd..0000000 --- a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_PHONE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -384318d0fe4e3716ffb32ae3c5ad279fc246acbb \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_TABLET.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_TABLET.png.sha1 deleted file mode 100644 index 697c12cd..0000000 --- a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_TABLET.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -384318d0fe4e3716ffb32ae3c5ad279fc246acbb \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_UNKNOWN.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_UNKNOWN.png.sha1 deleted file mode 100644 index 697c12cd..0000000 --- a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_UNKNOWN.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -384318d0fe4e3716ffb32ae3c5ad279fc246acbb \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_VIDEO_CAMERA.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_VIDEO_CAMERA.png.sha1 deleted file mode 100644 index 697c12cd..0000000 --- a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_VIDEO_CAMERA.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -384318d0fe4e3716ffb32ae3c5ad279fc246acbb \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_SECONDARY_ERROR_A11Y_LABEL.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_SECONDARY_ERROR_A11Y_LABEL.png.sha1 deleted file mode 100644 index d135cad..0000000 --- a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_SECONDARY_ERROR_A11Y_LABEL.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -abd68cb9e244d8a82451b5f4567a847b2d4e3def \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_SECONDARY_PAIRING_A11Y_LABEL.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_SECONDARY_PAIRING_A11Y_LABEL.png.sha1 deleted file mode 100644 index ea08739..0000000 --- a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_SECONDARY_PAIRING_A11Y_LABEL.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -18fe36a18e4e679249ef2ae6ea6490cb8bacf28d \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRING_PAIRING_BLUETOOTH_DISABLED.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRING_PAIRING_BLUETOOTH_DISABLED.png.sha1 new file mode 100644 index 0000000..9980daa --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_BLUETOOTH_PAIRING_PAIRING_BLUETOOTH_DISABLED.png.sha1
@@ -0,0 +1 @@ +b2f997a99de8e23846769f3e573edff6f883d7fa \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_ERROR_MAY_NOT_BLOCK_DEV_MODE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_ERROR_MAY_NOT_BLOCK_DEV_MODE.png.sha1 new file mode 100644 index 0000000..1ceb8c12 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_ERROR_MAY_NOT_BLOCK_DEV_MODE.png.sha1
@@ -0,0 +1 @@ +d4536006c966199da8131cd6b290e3cbcff8715d \ No newline at end of file
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd index d55d30f..55dbaf9 100644 --- a/chrome/app/chromium_strings.grd +++ b/chrome/app/chromium_strings.grd
@@ -582,8 +582,8 @@ <message name="IDS_DEFAULT_BROWSER_INFOBAR_TEXT" desc="Text to show in an infobar when Chromium is not the current default browser."> Chromium isn't your default browser </message> - <message name="IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE" desc="The title of the notification asking if the user wants to enable Enhanced Safe Browsing"> - Also turn on in Chromium? + <message name="IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_DESCRIPTION" desc="The text of the notification asking if the user wants to enable Enhanced Safe Browsing"> + You turned on Enhanced Safe Browsing in your account. Now get it for Chromium. </message> <if expr="is_win"> <!-- Try Chrome Toast Dialog -->
diff --git a/chrome/app/chromium_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_DESCRIPTION.png.sha1 b/chrome/app/chromium_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..c86ed46e --- /dev/null +++ b/chrome/app/chromium_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +7154f255ea117494bb55a9f5f1c26cc6c92338a7 \ No newline at end of file
diff --git a/chrome/app/chromium_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE.png.sha1 b/chrome/app/chromium_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE.png.sha1 deleted file mode 100644 index 72c8b86..0000000 --- a/chrome/app/chromium_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -9b3d5b4cf2774e7e115290f23cdb1bb025c35787 \ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index d006192a..7675eb1 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -6700,8 +6700,8 @@ <message name="IDS_TAILORED_SECURITY_DISPLAY_SOURCE" desc="The name of the source showing the notification"> Safe Browsing </message> - <message name="IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_DESCRIPTION" desc="The text of the notification asking if the user wants to enable Enhanced Safe Browsing"> - With Enhanced Safe Browsing, you’ll get Chrome’s strongest security + <message name="IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE" desc="The title of the notification asking if the user wants to enable Enhanced Safe Browsing"> + Turn on enhanced security? </message> <if expr="use_titlecase"> <message name="IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_ACCEPT" desc="The text on the 'accept' button asking if the user wants to enable Enhanced Safe Browsing"> @@ -6714,19 +6714,19 @@ </message> </if> <message name="IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TITLE" desc="The title of the notification telling the user that Enhanced Safe Browsing was disabled"> - Enhanced Safe Browsing is off + Turn off enhanced security? </message> <message name="IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_DESCRIPTION" desc="The text of the notification telling the user that Enhanced Safe Browsing was disabled"> - You’re getting standard protection + You turned off Enhanced Safe Browsing in your account. </message> <if expr="use_titlecase"> - <message name="IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_ON" desc="The text on the 'turn on' button asking if the user wants to re-enable Enhanced Safe Browsing"> - Turn Back On + <message name="IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_OFF" desc="The text on the 'turn off' button asking if the user wants to enable Enhanced Safe Browsing"> + Turn Off </message> </if> <if expr="not use_titlecase"> - <message name="IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_ON" desc="The text on the 'turn on' button asking if the user wants to re-enable Enhanced Safe Browsing"> - Turn back on + <message name="IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_OFF" desc="The text on the 'turn off' button asking if the user wants to enable Enhanced Safe Browsing"> + Turn off </message> </if>
diff --git a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_DESCRIPTION.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_DESCRIPTION.png.sha1 index f923e8a..219c849f 100644 --- a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_DESCRIPTION.png.sha1 +++ b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_DESCRIPTION.png.sha1
@@ -1 +1 @@ -9459d234db9b98018f613d5df8f35a941cba206b \ No newline at end of file +8cf0068b6a0599fcc5048bf3760048e115f7fe98 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TITLE.png.sha1 index f923e8a..219c849f 100644 --- a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TITLE.png.sha1 +++ b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TITLE.png.sha1
@@ -1 +1 @@ -9459d234db9b98018f613d5df8f35a941cba206b \ No newline at end of file +8cf0068b6a0599fcc5048bf3760048e115f7fe98 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_OFF.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_OFF.png.sha1 new file mode 100644 index 0000000..219c849f --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_OFF.png.sha1
@@ -0,0 +1 @@ +8cf0068b6a0599fcc5048bf3760048e115f7fe98 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_ON.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_ON.png.sha1 deleted file mode 100644 index f923e8a..0000000 --- a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_ON.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -9459d234db9b98018f613d5df8f35a941cba206b \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_DESCRIPTION.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_DESCRIPTION.png.sha1 deleted file mode 100644 index 72c8b86..0000000 --- a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_DESCRIPTION.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -9b3d5b4cf2774e7e115290f23cdb1bb025c35787 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE.png.sha1 new file mode 100644 index 0000000..c86ed46e --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE.png.sha1
@@ -0,0 +1 @@ +7154f255ea117494bb55a9f5f1c26cc6c92338a7 \ No newline at end of file
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd index 707dfb6..365fe6b 100644 --- a/chrome/app/google_chrome_strings.grd +++ b/chrome/app/google_chrome_strings.grd
@@ -588,8 +588,8 @@ <message name="IDS_DEFAULT_BROWSER_INFOBAR_TEXT" desc="Text to show in an infobar when Google Chrome is not the current default browser."> Google Chrome isn't your default browser </message> - <message name="IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE" desc="The title of the notification asking if the user wants to enable Enhanced Safe Browsing"> - Also turn on in Chrome? + <message name="IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_DESCRIPTION" desc="The text of the notification asking if the user wants to enable Enhanced Safe Browsing"> + You turned on Enhanced Safe Browsing in your account. Now get it for Chrome. </message> <if expr="is_win"> <!-- Try Chrome Toast Dialog -->
diff --git a/chrome/app/google_chrome_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_DESCRIPTION.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..9196c4c4 --- /dev/null +++ b/chrome/app/google_chrome_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +f71a99249a6f464ff8a35e9d0244ef36687d441b \ No newline at end of file
diff --git a/chrome/app/google_chrome_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE.png.sha1 deleted file mode 100644 index 72c8b86..0000000 --- a/chrome/app/google_chrome_strings_grd/IDS_TAILORED_SECURITY_CONSENTED_ENABLE_NOTIFICATION_TITLE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -9b3d5b4cf2774e7e115290f23cdb1bb025c35787 \ No newline at end of file
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp index c24e4aab..305341c 100644 --- a/chrome/app/os_settings_strings.grdp +++ b/chrome/app/os_settings_strings.grdp
@@ -4198,13 +4198,10 @@ Snooping protection </message> <message name="IDS_OS_SETTINGS_SMART_PRIVACY_SNOOPING_SUBTEXT" desc="Sub-label elaborating on the meaning of snooping protection." translateable="false"> - Notify you or temporary dim your screen when someone is snooping from behind + When someone else looks at your screen, show the Privacy 'eye' icon on the bottom right of your screen </message> - <message name="IDS_OS_SETTINGS_SMART_PRIVACY_SNOOPING_ICON" desc="The radio button option in the smart privacy section requesting an eye icon when a snooper is detected." translateable="false"> - Show me an eye icon in the status area - </message> - <message name="IDS_OS_SETTINGS_SMART_PRIVACY_SNOOPING_DIM" desc="The radio button option in the smart privacy section requesting screen dim when a snooper is detected." translateable="false"> - Temporary dim screen + <message name="IDS_OS_SETTINGS_SMART_PRIVACY_SNOOPING_NOTIFICATIONS" desc="Text for the name of the toggle in the smart privacy section requesting notification hiding when a snooper is detected." translateable="false"> + Hide notification content when someone else is detected </message> <message name="IDS_OS_SETTINGS_HW_DATA_USAGE_TOGGLE_TITLE" desc="The label of the checkbox to enable/disable device hardware data collection and usage in CloudReady 2.0."> <ph name="DEVICE_OS">$1<ex>CloudReady 2.0</ex></ph> hardware support and stability
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb index 83fe565..6bd22198 100644 --- a/chrome/app/resources/chromium_strings_ar.xtb +++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -45,7 +45,7 @@ <translation id="2572494885440352020">أداة مساعدة Chromium</translation> <translation id="2583187216237139145">يمكن لمشرف الملف الشخصي للعمل إزالة أي بيانات مرتبطة بمتصفِّح Chromium والتي يتم إنشاؤها أثناء استخدام هذا الملف الشخصي (مثل إنشاء الإشارات المرجعية والسجلّ وكلمات المرور والإعدادات الأخرى).<ph name="LEARN_MORE" /></translation> <translation id="2587578672395088481">يلزم إعادة تشغيل نظام التشغيل Chromium حتى يتم تطبيق التحديث.</translation> -<translation id="2614883797045469742">تناسب الإعدادات التلقائية معظم الأشخاص، ولكن يمكنك تخصيصها لاستخدام Chromium بالطريقة التي تعجبك.</translation> +<translation id="2614883797045469742">تناسب الإعدادات التلقائية معظم الأشخاص، ويمكنك تخصيصها لاستخدام Chromium بالطريقة التي تعجبك.</translation> <translation id="2648074677641340862">حدث خطأ في نظام التشغيل أثناء عملية التثبيت. يُرجى إعادة تنزيل Chromium.</translation> <translation id="2661879430930417727">في حال مشاركة جهاز مع الأصدقاء والعائلة، يمكنهم الحصول على تجربة تصفّح منفصلة وإعداد Chromium على النحو المفضّل لديهم.</translation> <translation id="2711502716910134313">علامة تبويب Chromium</translation> @@ -213,7 +213,7 @@ <translation id="6990124437352146030">يحتاج Chromium إلى إذن للوصول إلى الميكروفون من أجل الموقع الإلكتروني هذا.</translation> <translation id="705851970750939768">تحديث Chromium</translation> <translation id="7067091210845072982">في حال لم تتضمن صورة ما وصفًا مفيدًا، سيحاول Chromium توفير وصف لك. لإنشاء الأوصاف، سيتم إرسال الصور إلى Google.</translation> -<translation id="7147279922647361552">تخصيص بعض من أهم خيارات الخصوصية في Chromium</translation> +<translation id="7147279922647361552">تخصيص بعض أهم خيارات الخصوصية في Chromium</translation> <translation id="718435575166326686">يحتاج Chromium إلى إذن للوصول إلى الكاميرا من أجل هذا الموقع الإلكتروني.</translation> <translation id="7196312274710523067">تعذَّر إطلاق Chromium. يُرجى إعادة المحاولة.</translation> <translation id="7197677400338048821">يتعذّر على Chromium التحقُّق من كلمات المرور. يُرجى إعادة المحاولة بعد 24 ساعة.</translation>
diff --git a/chrome/app/resources/chromium_strings_az.xtb b/chrome/app/resources/chromium_strings_az.xtb index cffcb4d..ea9f94e3 100644 --- a/chrome/app/resources/chromium_strings_az.xtb +++ b/chrome/app/resources/chromium_strings_az.xtb
@@ -109,6 +109,7 @@ <translation id="4271805377592243930">Chromium ilə yardım alın</translation> <translation id="4285930937574705105">Naməlum xəta üzündən quraşdırmaq alınmadı. Əgər Chromium hazırda işləyirsə, lütfən, qapadın və yenidən cəhd edin.</translation> <translation id="4407044323746248786">Chromium'dan istənilən halda çıxılsın?</translation> +<translation id="4414390922528416758">Chromium'un ən vacib hesab etdiyi məxfilik seçimlərini fərdiləşdirin. Bu bələdçiyə hər ayar və seçim daxil deyil.</translation> <translation id="4415566066719264597">Chromium'a Arxa Fonda İşləmək İcazəsi Verin</translation> <translation id="4423735387467980091">Fərdiləşdirin və Chromium'u kontrol edin</translation> <translation id="4427306783828095590">Təkmil qoruma ilə fişinq və zərərli proqramların bloklanması üçün daha çox iş görülür</translation> @@ -294,5 +295,6 @@ <translation id="9214764063801632699">Chromium OS sistemi</translation> <translation id="93478295209880648">Chromium düzgün işləməyə bilər, çünki daha Windows XP və ya Windows Vista'da dəstəklənmir</translation> <translation id="965162752251293939">Chromium'u kim istifadə edir?</translation> +<translation id="967427899662692980">Chromium’un ən güclü güvənlik sistemini əldə edin</translation> <translation id="985602178874221306">Chromium Müəllifləri</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_bn.xtb b/chrome/app/resources/chromium_strings_bn.xtb index 92bc8f4..96db43f9 100644 --- a/chrome/app/resources/chromium_strings_bn.xtb +++ b/chrome/app/resources/chromium_strings_bn.xtb
@@ -225,6 +225,7 @@ <translation id="7339898014177206373">নতুন উইন্ডো</translation> <translation id="734373864078049451">আপনার ওয়েব, বুকমার্ক এবং Chromium-এর অন্যান্য জিনিস এখানে রয়েছে৷</translation> <translation id="7349591376906416160"><ph name="TARGET_URL_HOSTNAME" /> অ্যাক্সেস করতে <ph name="ALTERNATIVE_BROWSER_NAME" /> ব্যবহার করার জন্য আপনার সিস্টেম অ্যাডমিনিস্ট্রেটর Chromium কনফিগার করেছে।</translation> +<translation id="7366100504948874379">এছাড়া, Chromium-এ চালু করতে চান?</translation> <translation id="7398989605938454041">Chromium প্রোফাইল থেকে আপনার সব Chromium-এ থাকা ডেটা আলাদা করতে পারবেন। এর ফলে সহজেই অফিস এবং বিনোদনের প্রোফাইল আলাদা করা যায়।</translation> <translation id="7448255348454382571">Chromium OS রিস্টার্ট করুন</translation> <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation>
diff --git a/chrome/app/resources/chromium_strings_el.xtb b/chrome/app/resources/chromium_strings_el.xtb index cec12de..260f01ea 100644 --- a/chrome/app/resources/chromium_strings_el.xtb +++ b/chrome/app/resources/chromium_strings_el.xtb
@@ -109,6 +109,7 @@ <translation id="4271805377592243930">Λήψη βοήθειας σχετικά με το Chromium</translation> <translation id="4285930937574705105">Η εγκατάσταση απέτυχε λόγω απροσδιόριστου σφάλματος. Εάν το Chromium εκτελείται αυτήν τη στιγμή, κλείστε το και δοκιμάστε ξανά.</translation> <translation id="4407044323746248786">Να γίνει έξοδος από το Chromium ούτως ή άλλως;</translation> +<translation id="4414390922528416758">Προσαρμογή των επιλογών απορρήτου που το Chromium θεωρεί πιο σημαντικές. Αυτός ο οδηγός δεν περιλαμβάνει όλες τις ρυθμίσεις και επιλογές.</translation> <translation id="4415566066719264597">Να επιτρέπεται στο Chromium να εκτελείται στο παρασκήνιο</translation> <translation id="4423735387467980091">Προσαρμογή και έλεγχος του Chromium</translation> <translation id="4427306783828095590">Η βελτιωμένη προστασία κάνει περισσότερα για τον αποκλεισμό ηλεκτρονικού ψαρέματος (phishing) και κακόβουλων προγραμμάτων</translation> @@ -297,5 +298,6 @@ <translation id="9214764063801632699">Σύστημα Chromium OS</translation> <translation id="93478295209880648">Το Chromium μπορεί να μην λειτουργεί σωστά, επειδή δεν υποστηρίζεται πια σε Windows XP και Windows Vista</translation> <translation id="965162752251293939">Ποιος χρησιμοποιεί το Chromium;</translation> +<translation id="967427899662692980">Λάβετε την ισχυρότερη προστασία του Chromium</translation> <translation id="985602178874221306">Οι συντάκτες του Chromium</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb index 6c631c16..5a6daf2 100644 --- a/chrome/app/resources/chromium_strings_en-GB.xtb +++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -111,6 +111,7 @@ <translation id="4271805377592243930">Get help with Chromium</translation> <translation id="4285930937574705105">Installation failed due to unspecified error. If Google Chrome is currently running, please close it and try again.</translation> <translation id="4407044323746248786">Exit Chromium anyway?</translation> +<translation id="4414390922528416758">Customise the privacy choices that Chromium considers most important. This guide doesn't include every setting and option.</translation> <translation id="4415566066719264597">Let Chromium Run in the Background</translation> <translation id="4423735387467980091">Customise and control Chromium</translation> <translation id="4427306783828095590">Enhanced protection does more to block phishing and malware</translation> @@ -298,5 +299,6 @@ <translation id="9214764063801632699">Chromium OS system</translation> <translation id="93478295209880648">Chromium may not function correctly because it is no longer supported on Windows XP or Windows Vista</translation> <translation id="965162752251293939">Who's using Chromium?</translation> +<translation id="967427899662692980">Get Chromium's strongest security</translation> <translation id="985602178874221306">The Chromium Authors</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_eu.xtb b/chrome/app/resources/chromium_strings_eu.xtb index 2f4f01a0..080642a1 100644 --- a/chrome/app/resources/chromium_strings_eu.xtb +++ b/chrome/app/resources/chromium_strings_eu.xtb
@@ -228,6 +228,7 @@ <translation id="7339898014177206373">Leiho berria</translation> <translation id="734373864078049451">Webguneak, laster-markak eta Chromium-eko beste gauzak hemen daude.</translation> <translation id="7349591376906416160">Sistemaren administratzailearen konfigurazioaren arabera, Chromium-ek <ph name="ALTERNATIVE_BROWSER_NAME" /> arakatzailea ireki behar du <ph name="TARGET_URL_HOSTNAME" /> helbidera joateko.</translation> +<translation id="7366100504948874379">Chromium-en ere aktibatu nahi duzu?</translation> <translation id="7398989605938454041">Chromium-eko profilekin, Chromium-en dituzun gauza guztiak bereiz ditzakezu. Hala, errazago edukiko dituzu bananduta gauza pertsonalak eta lanekoak.</translation> <translation id="7448255348454382571">Berrabiarazi Chromium OS</translation> <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation>
diff --git a/chrome/app/resources/chromium_strings_fr.xtb b/chrome/app/resources/chromium_strings_fr.xtb index 2540b49f..f5eca70 100644 --- a/chrome/app/resources/chromium_strings_fr.xtb +++ b/chrome/app/resources/chromium_strings_fr.xtb
@@ -228,6 +228,7 @@ <translation id="7339898014177206373">Nouvelle fenêtre</translation> <translation id="734373864078049451">Votre contenu Web, vos favoris et toutes vos données Chromium sont conservés ici.</translation> <translation id="7349591376906416160">Votre administrateur système a configuré Chromium de sorte que <ph name="ALTERNATIVE_BROWSER_NAME" /> s'ouvre pour accéder à <ph name="TARGET_URL_HOSTNAME" />.</translation> +<translation id="7366100504948874379">Activer aussi dans Chromium ?</translation> <translation id="7398989605938454041">Utilisez les profils Chromium pour dissocier toutes vos données Chromium. Vous pouvez ainsi faire plus facilement la distinction entre vos contenus personnels et professionnels.</translation> <translation id="7448255348454382571">Redémarrer Chromium OS</translation> <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – Chromium pour les développeurs</translation>
diff --git a/chrome/app/resources/chromium_strings_gu.xtb b/chrome/app/resources/chromium_strings_gu.xtb index a54a547..a392197 100644 --- a/chrome/app/resources/chromium_strings_gu.xtb +++ b/chrome/app/resources/chromium_strings_gu.xtb
@@ -229,6 +229,7 @@ <translation id="7339898014177206373">નવી વિંડો</translation> <translation id="734373864078049451">તમારું વેબ, બુકમાર્ક અને અન્ય Chromium સામગ્રી અહીં હોય છે.</translation> <translation id="7349591376906416160">તમારા સિસ્ટમ વ્યવસ્થાપકે <ph name="TARGET_URL_HOSTNAME" />ને ઍક્સેસ કરવા Chromiumને <ph name="ALTERNATIVE_BROWSER_NAME" /> ખોલવા માટે ગોઠવેલું છે.</translation> +<translation id="7366100504948874379">Chromiumમાં પણ ચાલુ કરીએ?</translation> <translation id="7398989605938454041">Chromium પ્રોફાઇલ વડે તમે તમારી બધી વસ્તુઓ Chromium પર અલગ-અલગ રાખી શકો છો. આનાથી ઑફિસ અને મનોરંજન વચ્ચે વિભાજન કરવાનું સરળ બને છે.</translation> <translation id="7448255348454382571">Chromium OS ફરી શરૂ કરો</translation> <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation>
diff --git a/chrome/app/resources/chromium_strings_ky.xtb b/chrome/app/resources/chromium_strings_ky.xtb index 01683ac..3c16785 100644 --- a/chrome/app/resources/chromium_strings_ky.xtb +++ b/chrome/app/resources/chromium_strings_ky.xtb
@@ -111,6 +111,7 @@ <translation id="4271805377592243930">Chromium'дан жардам алыңыз</translation> <translation id="4285930937574705105">Белгисиз катадан улам, орнотулбай калды. Учурда Chromium иштеп жаткан болсо, аны жаап туруп, дагы аракет кылып көрүңүз.</translation> <translation id="4407044323746248786">Баары бир Chromium'дан чыгасызбы?</translation> +<translation id="4414390922528416758">Chromium эң маанилүү деп эсептеген купуялык тандоолорун ыңгайлаштырыңыз. Жетектемеде айрым жөндөөлөр жана параметрлер камтылган эмес.</translation> <translation id="4415566066719264597">Chromium'га фондук режимде иштөөгө уруксат берүү</translation> <translation id="4423735387467980091">Chromium'ду өзгөчөлөштүрүү жана көзөмөлдөө</translation> <translation id="4427306783828095590">Өркүндөтүлгөн коргоо параметри фишинг жана кесепеттүү программалардан жакшыраак коргойт</translation> @@ -299,5 +300,6 @@ <translation id="9214764063801632699">Chromium OS тутуму</translation> <translation id="93478295209880648">Chromium туура эмес иштеши мүмкүн, себеби ал Windows XP же Windows Vista'да мындан ары колдоого алынбайт.</translation> <translation id="965162752251293939">Chromium'ду ким колдонуп жатат?</translation> +<translation id="967427899662692980">Chromium'дун эң күчтүү коопсуздук тутумун орнотуп алыңыз</translation> <translation id="985602178874221306">Chromium'дун авторлору</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb index 9bf637d..2867228d33 100644 --- a/chrome/app/resources/chromium_strings_ml.xtb +++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -111,6 +111,7 @@ <translation id="4271805377592243930">Chromium ഉപയോഗിക്കുന്നതിനുള്ള സഹായം തേടുക</translation> <translation id="4285930937574705105">അവ്യക്തമായ പിശകിനാൽ ഇൻസ്റ്റാൾ ചെയ്യൽ പരാജയപ്പെട്ടു. Chromium നിലവിൽ പ്രവർത്തിക്കുന്നുണ്ടെങ്കിൽ, അത് അടച്ചതിനുശേഷം വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="4407044323746248786">എന്തായാലും Chromium-ത്തിൽ നിന്ന് പുറത്തുകടക്കണോ?</translation> +<translation id="4414390922528416758">ഏറ്റവും പ്രധാനപ്പെട്ടതായി Chromium കരുതുന്ന സ്വകാര്യതാ തിരഞ്ഞെടുപ്പുകൾ ഇഷ്ടാനുസൃതമാക്കുക. ഈ ഗൈഡിൽ എല്ലാ ക്രമീകരണവും ഓപ്ഷനും ഉൾപ്പെടുന്നില്ല.</translation> <translation id="4415566066719264597">Chromium-ത്തെ പശ്ചാത്തലത്തിൽ പ്രവർത്തിക്കാൻ അനുവദിക്കുക</translation> <translation id="4423735387467980091">Chromium ഇഷ്ടാനുസൃതമാക്കുക, നിയന്ത്രിക്കുക</translation> <translation id="4427306783828095590">ഫിഷിംഗും മാല്വെയറും ബ്ലോക്ക് ചെയ്യുന്നതിന് മെച്ചപ്പെടുത്തിയ പരിരക്ഷ കൂടുതൽ കാര്യങ്ങൾ ചെയ്യുന്നു</translation> @@ -299,5 +300,6 @@ <translation id="9214764063801632699">Chromium OS സിസ്റ്റം</translation> <translation id="93478295209880648">ഇനിയങ്ങോട്ട് Windows XP-യും Windows Vista-യും പിന്തുണയ്ക്കാത്തതിനാൽ Chromium ശരിയായി പ്രവർത്തിച്ചേക്കില്ല</translation> <translation id="965162752251293939">ആരൊക്കെയാണ് Chromium ഉപയോഗിക്കുന്നത്?</translation> +<translation id="967427899662692980">Chromium-ന്റെ ഏറ്റവും ശക്തമായ സുരക്ഷ നേടുക</translation> <translation id="985602178874221306">Chromium രചയിതാക്കൾ</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb index e721b13..8674355 100644 --- a/chrome/app/resources/chromium_strings_nl.xtb +++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -228,6 +228,7 @@ <translation id="7339898014177206373">Nieuw venster</translation> <translation id="734373864078049451">Hier vind je internet, bookmarks en andere Chromium-instellingen.</translation> <translation id="7349591376906416160">Je systeembeheerder heeft Chromium geconfigureerd om <ph name="ALTERNATIVE_BROWSER_NAME" /> te openen voor toegang tot <ph name="TARGET_URL_HOSTNAME" />.</translation> +<translation id="7366100504948874379">Ook aanzetten in Chromium?</translation> <translation id="7398989605938454041">Met Chromium-profielen kun je alle Chromium-gegevens gescheiden houden. Zo kun je makkelijker onderscheid maken tussen werk en privé.</translation> <translation id="7448255348454382571">Chromium OS opnieuw opstarten</translation> <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium voor ontwikkelaars</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-BR.xtb b/chrome/app/resources/chromium_strings_pt-BR.xtb index 90c6315..682d15a 100644 --- a/chrome/app/resources/chromium_strings_pt-BR.xtb +++ b/chrome/app/resources/chromium_strings_pt-BR.xtb
@@ -107,6 +107,7 @@ <translation id="4271805377592243930">Ajuda com o Chromium</translation> <translation id="4285930937574705105">Ocorreu uma falha na instalação devido a um erro não especificado. Se o Chromium estiver sendo executado, feche-o e tente novamente.</translation> <translation id="4407044323746248786">Sair do Chromium mesmo assim?</translation> +<translation id="4414390922528416758">Personalize as opções de privacidade mais importantes para o Chromium. Este guia não inclui todas as configurações e opções.</translation> <translation id="4415566066719264597">Permitir a execução do Chromium em segundo plano</translation> <translation id="4423735387467980091">Personalizar e controlar o Chromium</translation> <translation id="4427306783828095590">A Proteção reforçada é mais eficiente no combate a golpes de phishing e malware</translation> @@ -290,5 +291,6 @@ <translation id="9214764063801632699">Sistema Chromium OS</translation> <translation id="93478295209880648">É possível que o Chromium não funcione corretamente, porque ele não é mais compatível com o Windows XP ou Windows Vista</translation> <translation id="965162752251293939">Quem está usando o Chromium?</translation> +<translation id="967427899662692980">Use o nível mais alto de segurança do Chromium</translation> <translation id="985602178874221306">Autores do Chromium</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_pt-PT.xtb b/chrome/app/resources/chromium_strings_pt-PT.xtb index b7b0edaa..e0540b6 100644 --- a/chrome/app/resources/chromium_strings_pt-PT.xtb +++ b/chrome/app/resources/chromium_strings_pt-PT.xtb
@@ -109,6 +109,7 @@ <translation id="4271805377592243930">Obter ajuda relacionada com o Chromium</translation> <translation id="4285930937574705105">A instalação falhou devido a um erro não especificado. Se o Chromium estiver em execução, feche-o e tente de novo.</translation> <translation id="4407044323746248786">Pretende sair do Chromium mesmo assim?</translation> +<translation id="4414390922528416758">Personalize as escolhas de privacidade que o Chromium considera serem mais importantes. Este guia não inclui todas as definições e opções.</translation> <translation id="4415566066719264597">Permitir que o Chromium seja executado em segundo plano</translation> <translation id="4423735387467980091">Personalizar e controlar o Chromium</translation> <translation id="4427306783828095590">A proteção melhorada vai mais além para bloquear o phishing e o software malicioso.</translation> @@ -296,5 +297,6 @@ <translation id="9214764063801632699">Sistema Chromium OS</translation> <translation id="93478295209880648">O Chromium pode não funcionar corretamente, uma vez que já não é suportado no Windows XP ou no Windows Vista.</translation> <translation id="965162752251293939">Quem está a utilizar o Chromium?</translation> +<translation id="967427899662692980">Obtenha a segurança mais avançada do Chromium</translation> <translation id="985602178874221306">Os Autores do Chromium</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb index f63767f..9f675c6 100644 --- a/chrome/app/resources/chromium_strings_sk.xtb +++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -111,6 +111,7 @@ <translation id="4271805377592243930">Pomoc s prehliadačom Chromium</translation> <translation id="4285930937574705105">Inštalácia zlyhala kvôli neurčenej chybe. Ak je prehliadač Chromium momentálne spustený, zatvorte ho a skúste znova.</translation> <translation id="4407044323746248786">Chcete Chromium napriek tomu ukončiť?</translation> +<translation id="4414390922528416758">Prispôsobte si možnosti ochrany súkromia, ktoré prehliadač Chromium považuje za najdôležitejšie. Tento sprievodca neobsahuje všetky nastavenia a možnosti.</translation> <translation id="4415566066719264597">Povoliť prehliadaču Chromium spustenie na pozadí</translation> <translation id="4423735387467980091">Prispôsobiť a spravovať Chromium</translation> <translation id="4427306783828095590">Rozšírená ochrana efektívnejšie blokuje phishing aj malvér</translation> @@ -298,5 +299,6 @@ <translation id="9214764063801632699">Systém Chromium OS</translation> <translation id="93478295209880648">Chromium nemusí fungovať správne, pretože v systémoch Windows XP a Windows Vista už nie je podporovaný</translation> <translation id="965162752251293939">Kto používa Chromium?</translation> +<translation id="967427899662692980">Získajte najsilnejšie zabezpečenie prehliadača Chromium</translation> <translation id="985602178874221306">Autori prehliadača Chromium</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb index 2b9aacd..dd2ff935 100644 --- a/chrome/app/resources/chromium_strings_sl.xtb +++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -229,6 +229,7 @@ <translation id="7339898014177206373">Novo okno</translation> <translation id="734373864078049451">Tu so shranjeni vaš splet, zaznamki in druge stvari v Chromiumu.</translation> <translation id="7349591376906416160">Skrbnik sistema je Chromium nastavil tako, da za dostop do <ph name="TARGET_URL_HOSTNAME" /> odpre brskalnik <ph name="ALTERNATIVE_BROWSER_NAME" />.</translation> +<translation id="7366100504948874379">Želite vklopiti tudi v Chromiumu?</translation> <translation id="7398989605938454041">S profili v Chromiumu lahko ločite vse stvari v Chromiumu. Tako laže ločite delo in zabavo.</translation> <translation id="7448255348454382571">Vnovičen zagon OS-a Chromium</translation> <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – različica Chromiuma za razvijalce</translation>
diff --git a/chrome/app/resources/chromium_strings_te.xtb b/chrome/app/resources/chromium_strings_te.xtb index 1ba3b95..b22e8b1 100644 --- a/chrome/app/resources/chromium_strings_te.xtb +++ b/chrome/app/resources/chromium_strings_te.xtb
@@ -223,6 +223,7 @@ <translation id="7339898014177206373">కొత్త విండో</translation> <translation id="734373864078049451">మీ వెబ్, బుక్మార్క్లు మరియు ఇతర Chromium అంశాలు ఇక్కడ చూపబడతాయి.</translation> <translation id="7349591376906416160"><ph name="TARGET_URL_HOSTNAME" />ను యాక్సెస్ చేయడం కోసం <ph name="ALTERNATIVE_BROWSER_NAME" />ను తెరిచే విధంగా Chromiumను మీ సిస్టమ్ నిర్వాహకుడు కాన్ఫిగర్ చేశారు.</translation> +<translation id="7366100504948874379">Chromiumలో కూడా ఆన్ చేయాలా?</translation> <translation id="7398989605938454041">మీ మొత్తం Chromium అంశాలను, మీరు Chromium ప్రొఫైల్లతో వేరు చేయండి. ఇలా చేయడం వలన ఆఫీస్, వినోదాన్ని వేర్వేరుగా ఉంచవచ్చు.</translation> <translation id="7448255348454382571">Chromium OSని మళ్లీ ప్రారంభించండి</translation> <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation>
diff --git a/chrome/app/resources/chromium_strings_ur.xtb b/chrome/app/resources/chromium_strings_ur.xtb index 756db22..46c5118 100644 --- a/chrome/app/resources/chromium_strings_ur.xtb +++ b/chrome/app/resources/chromium_strings_ur.xtb
@@ -228,6 +228,7 @@ <translation id="7339898014177206373">نئی ونڈو</translation> <translation id="734373864078049451">آپ کی ویب، بُک مارکس اور دیگر Chromium مواد یہاں پر لائیو ہے۔</translation> <translation id="7349591376906416160">آپ کے سسٹم کے منتظم نے <ph name="TARGET_URL_HOSTNAME" /> تک رسائی حاصل کرنے کیلئے Chromium کو <ph name="ALTERNATIVE_BROWSER_NAME" /> کھولنے کیلئے کنفیگر کیا ہے۔</translation> +<translation id="7366100504948874379">Chromium میں بھی آن کرنا چاہتے ہیں؟</translation> <translation id="7398989605938454041">Chromium کی پروفائلز کے ساتھ آپ اپنی تمام Chromium چیزوں کو الگ کر سکتے ہیں۔ یہ کام اور تفریح کے درمیان تقسیم کرنا زیادہ آسان بناتا ہے۔</translation> <translation id="7448255348454382571">Chromium OS کو ری سٹارٹ کریں</translation> <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation>
diff --git a/chrome/app/resources/chromium_strings_zu.xtb b/chrome/app/resources/chromium_strings_zu.xtb index b4c4ee6..ded1f325 100644 --- a/chrome/app/resources/chromium_strings_zu.xtb +++ b/chrome/app/resources/chromium_strings_zu.xtb
@@ -229,6 +229,7 @@ <translation id="7339898014177206373">Iwindi elisha</translation> <translation id="734373864078049451">Iwebhu yakho, amabhukhimakhi, nezinye izinto ze-Chromium zihlala lapha.</translation> <translation id="7349591376906416160">Umlawuli wakho wesistimu ulungiselele i-Chromium ukuthi ivule i-<ph name="ALTERNATIVE_BROWSER_NAME" /> ukuze ifinyelele ku-<ph name="TARGET_URL_HOSTNAME" />.</translation> +<translation id="7366100504948874379">Vula futhi ku-Chromium?</translation> <translation id="7398989605938454041">Ngamaphrofayela we-Chromium ungahlukanisa zonke izinto zakho ze-Chromium. Lokhu kwenza kube lula ukuhlukanisa phakathi komsebenzi nokuzijabulisa.</translation> <translation id="7448255348454382571">Qalisa kabusha i-Chromium OS</translation> <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index b82d6632..1271334 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -6819,6 +6819,7 @@ <translation id="8054563304616131773">Voer asseblief 'n geldige e-posadres in</translation> <translation id="8054883179223321715">Beskikbaar vir spesifieke videowerwe</translation> <translation id="8054921503121346576">USB-sleutelbord gekoppel</translation> +<translation id="8057414620575339583">Kantsoektog</translation> <translation id="8058655154417507695">Vervaljaar</translation> <translation id="8058986560951482265">Rukkerig</translation> <translation id="8059417245945632445">Ondersoek toestelle</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 341a4895..85e3a4b 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -6815,6 +6815,7 @@ <translation id="8054563304616131773">እባክዎ ትክክለኛ የኢሜይል አድራሻ ያስገቡ</translation> <translation id="8054883179223321715">ለተወሰኑ የቪዲዮ ጣቢያዎች የሚገኝ</translation> <translation id="8054921503121346576">የUSB ቁልፍ ሰሌዳ ተገናኝቷል</translation> +<translation id="8057414620575339583">የጎን ፍለጋ</translation> <translation id="8058655154417507695">ጊዜው የሚያበቃበት ዓመት</translation> <translation id="8058986560951482265">ይንቀጠቀጣል</translation> <translation id="8059417245945632445">&መሣሪያዎችን መርምር</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index 7b92e98..6406aa0 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -6800,6 +6800,7 @@ <translation id="8054563304616131773">অনুগ্ৰহ কৰি এক মান্য ইমেইল ঠিকনা দিয়ক</translation> <translation id="8054883179223321715">নিৰ্দিষ্ট কিছুমান ভিডিঅ’ৰ ছাইটৰ বাবে উপলব্ধ</translation> <translation id="8054921503121346576">ইউএছবি কীব’ৰ্ড সংযোগ হ’ল</translation> +<translation id="8057414620575339583">ছাইড ছাৰ্চ</translation> <translation id="8058655154417507695">ম্যাদ উকলা বছৰ</translation> <translation id="8058986560951482265">কঁপি থাকে</translation> <translation id="8059417245945632445">&ডিভাইচ পৰীক্ষা কৰক</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 0daf726..3732d16a 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -2507,6 +2507,7 @@ <translation id="3557101512409028104">Family Link ilə veb sayt məhdudiyyətləri və ekran vaxtı limitləri ayarlaya bilərsiniz.</translation> <translation id="3559262020195162408">Cihazda qayda quraşdırıla bilmədi.</translation> <translation id="3559533181353831840">Təxminən <ph name="TIME_LEFT" /> qalıb</translation> +<translation id="3559697822483154494">Ekranın bölünməsi və masaların dəyişdirilməsi kimi əməliyyatlar üçün vibrasiya təsdiqi alın.</translation> <translation id="3560034655160545939">&Yazı yoxlanışı</translation> <translation id="3562423906127931518">Bir az səbr edin; Linux konteyneri quraşdırılır.</translation> <translation id="3562655211539199254">Telefonunuzdan son Chrome tablarına baxın</translation> @@ -4903,6 +4904,7 @@ <translation id="6112931163620622315">Telefonunuzu yoxlayın</translation> <translation id="6113434369102685411">Chrome brauzeri və <ph name="DEVICE_TYPE" /> Başladıcısı üçün defolt axtarış sisteminizi ayarlayın</translation> <translation id="6113942107547980621">Smart Lock istifadə etmək üçün telefonda əsas istifadəçi profilinə keçin</translation> +<translation id="611684075852771314">Bu qeydlər Fayllarımda aşağıdakı kimi saxlanılıb</translation> <translation id="6116921718742659598">Dil və daxiletmə ayarlarını dəyişdirin...</translation> <translation id="6119927814891883061">Cihazı <ph name="DEVICE_NAME" /> adlandırın</translation> <translation id="6120205520491252677">Ekrana başlamaq üçün bu səhifəni sancın...</translation> @@ -5679,6 +5681,7 @@ <translation id="6930036377490597025">Xarici təhlükəsizlik açarı yoxsa daxilə quraşdırılmış sensor</translation> <translation id="6930161297841867798">{NUM_EXTENSIONS,plural, =1{Artırmadan imtina edilib}other{# artırmadan imtina edilib}}</translation> <translation id="6930321203306643451">Güncəlləmə tamamlanıb</translation> +<translation id="6931690462168617033">Kliklənmə gücü</translation> <translation id="6935286146439255109">Kağız qabı yoxdur</translation> <translation id="693807610556624488">Yazı əməliyyatı bu cihazda maksimum atribut sayını keçib: "<ph name="DEVICE_NAME" />".</translation> <translation id="6938386202199793006">1 yadda saxlanmış printeriniz var.</translation> @@ -6810,6 +6813,7 @@ <translation id="8064279191081105977">Qrup <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> - <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">Bağlantı Dialoqu</translation> <translation id="8069615408251337349">Google Bulud Printi</translation> +<translation id="8070662218171013510">Vibro rəy</translation> <translation id="8071432093239591881">Şəkil kimi çap edin</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />Tətbiq datası kontakt, mesaj və foto kimi data daxil olmaqla, tətbiqin yadda saxladığı (tərtibatçı ayarlarına əsasən) istənilən data ola bilər.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Yedək data övladınızın Disk yaddaşı kvotasına təsir etməyəcək.<ph name="END_PARAGRAPH2" />
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 832b30d8..919e1cc9 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -253,6 +253,7 @@ <translation id="1244265436519979884">বর্তমানে Linux ফিরিয়ে আনার কাজ চলছে</translation> <translation id="1244303850296295656">এক্সটেনশন সমস্যা</translation> <translation id="1246863218384630739"><ph name="VM_NAME" /> ইনস্টল করা যায়নি: <ph name="HTTP_ERROR" /> সমস্যার কোড সহ একটি ছবির URL দেখাচ্ছে। অ্যাডমিনিস্ট্রেটরের সাথে যোগাযোগ করুন।</translation> +<translation id="1247071602516579380"><ph name="DEVICE_COUNT" />টির মধ্যে <ph name="DEVICE_INDEX" /> নম্বর ডিভাইস, ট্যাবলেটের নাম <ph name="DEVICE_NAME" /></translation> <translation id="1251366534849411931">প্রত্যাশিত শুরুর সেকেন্ড ব্র্যাকেট: <ph name="ERROR_LINE" /></translation> <translation id="1251480783646955802">এর ফলে সাইট ও ইনস্টল করা অ্যাপগুলির স্টোর করা <ph name="TOTAL_USAGE" /> ডেটা মুছে যাবে</translation> <translation id="1251578593170406502">মোবাইল ডেটা নেটওয়ার্কের জন্য স্ক্যান করা হচ্ছে...</translation> @@ -439,6 +440,7 @@ <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" />টি নির্বাচিত হয়েছে</translation> <translation id="1442851588227551435">অ্যাক্টিভ Kerberos টিকিট সেট করুন</translation> <translation id="1444628761356461360">এই সেটিংটি ডিভাইসের মালিকের দ্বারা <ph name="OWNER_EMAIL" /> পরিচালিত হয়৷</translation> +<translation id="1445005312224723356"><ph name="DEVICE_COUNT" />টির মধ্যে <ph name="DEVICE_INDEX" /> নম্বর ডিভাইস, ফোনের নাম <ph name="DEVICE_NAME" /></translation> <translation id="144518587530125858">থিমের জন্য '<ph name="IMAGE_PATH" />' লোড করা যায়নি৷</translation> <translation id="1449191289887455076">অ্যাসাইনমেন্ট কনফার্ম করতে, "<ph name="CURRENTKEY" />" আবার প্রেস করুন এবং <ph name="RESPONSE" /></translation> <translation id="1451375123200651445">Webpage, Single File</translation> @@ -871,6 +873,7 @@ <translation id="1855079636134697549">ক্যামেরা চালু রয়েছে</translation> <translation id="1856715684130786728">লোকেশন যোগ করুন...</translation> <translation id="1858585891038687145">সফ্টওয়্যার প্রস্তুতকারকদের শনাক্তকরণের জন্য এই সার্টিফিকেটটিকে বিশ্বাস করুন</translation> +<translation id="1859787252990099899"><ph name="DEVICE_COUNT" />টির মধ্যে <ph name="DEVICE_INDEX" /> নম্বর ডিভাইস, অজানা ডিভাইসের নাম <ph name="DEVICE_NAME" /></translation> <translation id="1861262398884155592">ফোল্ডারটি খালি</translation> <translation id="1862311223300693744">আপনি কি কোনও বিশেষ ভিপিএন, প্রক্সি, ফায়ারওয়াল বা NAS সফ্টওয়্যার ইনস্টল করে রেখেছেন?</translation> @@ -1246,6 +1249,7 @@ <translation id="2242687258748107519">ফাইল তথ্য</translation> <translation id="2246549592927364792">Google থেকে ছবির বিবরণ পেতে চান?</translation> <translation id="2247738527273549923">আপনার সংস্থা এই ডিভাইস ম্যানেজ করে</translation> +<translation id="2249061317998743208"><ph name="DEVICE_COUNT" />টির মধ্যে <ph name="DEVICE_INDEX" /> নম্বর ডিভাইস, গেম কন্ট্রোলারের নাম <ph name="DEVICE_NAME" /></translation> <translation id="2249111429176737533">ট্যাবযুক্ত উইন্ডো হিসেবে খুলুন</translation> <translation id="2249605167705922988">উদাঃ ১-৫, ৮, ১১-১৩</translation> <translation id="2251218783371366160">সিস্টেম প্রদর্শকের মাধ্যমে খুলুন</translation> @@ -2006,6 +2010,7 @@ <translation id="3007771295016901659">ট্যাব ডুপ্লিকেট করুন</translation> <translation id="3008232374986381779">আপনার <ph name="DEVICE_TYPE" />-এ Linux টুল, এডিটর ও IDE চালান। <ph name="LINK_BEGIN" />আরও জানুন<ph name="LINK_END" /></translation> <translation id="3008272652534848354">অনুমতি রিসেট করুন</translation> +<translation id="3008396025115884998"><ph name="DEVICE_COUNT" />টির মধ্যে <ph name="DEVICE_INDEX" /> নম্বর ডিভাইস, অডিও ডিভাইসের নাম <ph name="DEVICE_NAME" /></translation> <translation id="3008694618228964140">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> আপনাকে আজই ওয়াই-ফাই নেটওয়ার্কে কানেক্ট করে আপডেট ডাউনলোড করতে বলছে। অথবা, মিটারযুক্ত ইন্টারনেট কানেকশন ব্যবহার করেও ডাউনলোড করতে পারবেন (এর জন্য চার্জ দিতে হতে পারে)।}one{<ph name="MANAGER" /> আপনাকে নির্ধারিত সময়সীমা শেষ হওয়ার আগেই ওয়াই-ফাই নেটওয়ার্কে কানেক্ট করে আপডেট ডাউনলোড করতে বলছে। অথবা, মিটারযুক্ত ইন্টারনেট কানেকশন ব্যবহার করেও ডাউনলোড করতে পারবেন (এর জন্য চার্জ দিতে হতে পারে)।}other{<ph name="MANAGER" /> আপনাকে নির্ধারিত সময়সীমা শেষ হওয়ার আগেই ওয়াই-ফাই নেটওয়ার্কে কানেক্ট করে আপডেট ডাউনলোড করতে বলছে। অথবা, মিটারযুক্ত ইন্টারনেট কানেকশন ব্যবহার করেও ডাউনলোড করতে পারবেন (এর জন্য চার্জ দিতে হতে পারে)।}}</translation> <translation id="3009300415590184725">আপনি কি মোবাইল ডেটা পরিষেবা সেট-আপ প্রক্রিয়া বাতিল করার ব্যাপারে নিশ্চিত?</translation> <translation id="3009779501245596802">সূচিবদ্ধ ডেটাবেস</translation> @@ -2311,6 +2316,7 @@ <translation id="3348038390189153836">সরানোযোগ্য ডিভাইস শনাক্ত করা হয়েছে</translation> <translation id="3348131053948466246">ইমোজি সাজেস্ট করা হয়েছে। নেভিগেট করতে ঊর্ধ্বমুখী বা নিম্নমুখী তীরচিহ্ন আঁকা বোতাম প্রেস করুন। ইমোজি যোগ করতে Enter প্রেস করুন।</translation> <translation id="3349933790966648062">মেমরি ফুটপ্রিন্ট</translation> +<translation id="3354972872297836698"><ph name="DEVICE_NAME" /> ডিভাইসের সাথে পেয়ার করা যায়নি; আবার চেষ্টা করতে ডিভাইস বেছে নিন</translation> <translation id="3355936511340229503">সংযোগ ত্রুটি</translation> <translation id="3356580349448036450">সম্পূর্ণ</translation> <translation id="3359256513598016054">সার্টিফিকেট নীতি বাধ্যবাধকতা</translation> @@ -3140,6 +3146,7 @@ <translation id="4200689466366162458">কাস্টম শব্দগুলি</translation> <translation id="4200983522494130825">নতুন &ট্যাব</translation> <translation id="4201546031411513170">সেটিংসে কী সিঙ্ক করা হবে তা আপনি সবসময় বেছে নিতে পারেন।</translation> +<translation id="4202417625268941299">'উন্নত নিরাপদ ব্রাউজিং' ফিচার ব্যবহার করে, Chrome-এর সবচেয়ে ভাল নিরাপত্তা পান</translation> <translation id="420283545744377356">স্ক্রিন সেভার বন্ধ করুন</translation> <translation id="4206144641569145248">ভিনগ্রহবাসী</translation> <translation id="4206323443866416204">প্রতিক্রিয়ার প্রতিবেদন</translation> @@ -3646,6 +3653,7 @@ <translation id="4759238208242260848">ডাউনলোড</translation> <translation id="4761104368405085019">আপনার মাইক্রোফোন ব্যবহার করুন</translation> <translation id="4762718786438001384">ডিভাইসের ডিস্কের স্থান আশংকাজনকভাবে কম</translation> +<translation id="4762898026821161650"><ph name="DEVICE_COUNT" />টির মধ্যে <ph name="DEVICE_INDEX" /> নম্বর ডিভাইস, কম্পিউটারের নাম <ph name="DEVICE_NAME" /></translation> <translation id="4763408175235639573">আপনি যখন এই পৃষ্ঠাটি দেখেছিলেন তখন নিম্নোক্ত কুকিগুলি সেট হয়েছিল</translation> <translation id="4765582662863429759">Android Messages-কে আপনার ফোন থেকে Chromebook-এ টেক্সট রিলে করতে অনুমতি দেয়</translation> <translation id="4768332406694066911">আপনার পরিচয় শনাক্ত করে এমন সংস্থাগুলি থেকে শংসাপত্র আপনার কাছে আছে</translation> @@ -3827,6 +3835,7 @@ <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" সিরিয়াল পোর্টে কানেক্ট করতে চাইছে</translation> <translation id="4944310289250773232"><ph name="SAML_DOMAIN" />-এর মাধ্যমে যাচাইকরণ পরিষেবা হোস্ট করা হয়েছে</translation> <translation id="4945439665401275950">আঙ্গুলের ছাপ সেট আপ করতে, আপনার সন্তানকে পাওয়ার বোতাম টাচ করতে বলুন। আপনার সন্তানের আঙ্গুলের ছাপ সম্পর্কিত ডেটা নিরাপদে সেভ করা হয় এবং সবসময় <ph name="DEVICE_TYPE" />-এ থাকে।</translation> +<translation id="4946459324029651239">আপনি স্ট্যান্ডার্ড সুরক্ষা পাচ্ছেন</translation> <translation id="495164417696120157">{COUNT,plural, =1{একটি ফাইল}one{#টি ফাইল}other{#টি ফাইল}}</translation> <translation id="495170559598752135">ক্রিয়াসমূহ</translation> <translation id="4953808748584563296">ডিফল্ট কমলা রঙের অবতার</translation> @@ -4410,6 +4419,7 @@ <translation id="5575528586625653441">ডেমো রেজিস্টার করার অনুরোধ নিয়ে একটি সমস্যা হয়েছে।</translation> <translation id="557722062034137776">আপনার ডিভাইসকে আবার রিসেট করলে তা আপনার Google অ্যাকাউন্টগুলি বা এই অ্যাকাউন্টগুলিতে সিঙ্ক হওয়া যেকোনো ডেটাতে প্রভাব ফেলবে না৷ যদিও, স্থানীয়ভাবে সেভ করা সমস্ত ফাইল মুছে ফেলা হবে৷</translation> <translation id="5578059481725149024">অটো সাইন-ইন</translation> +<translation id="5581134892342029705"><ph name="LANGUAGE" /> ভাষায় অনুবাদ করা হয়ে গেছে</translation> <translation id="558170650521898289">Microsoft Windows Hardware Driver Verification </translation> <translation id="5581972110672966454">ডোমেনে ডিভাইসটি যোগ করা যাচ্ছে না। আবার চেষ্টা করুন অথবা আপনার ডিভাইসের মালিক বা অ্যাডমিনিস্ট্রেটরের সাথে যোগাযোগ করুন। সমস্যার কোড: <ph name="ERROR_CODE" /></translation> <translation id="5582839680698949063">প্রধান মেনু</translation> @@ -5824,6 +5834,7 @@ <translation id="7057184853669165321">{NUM_MINS,plural, =1{১ মিনিট আগে নিরাপত্তা সংক্রান্ত পরীক্ষা চালানো হয়েছে}one{{NUM_MINS} মিনিট আগে নিরাপত্তা সংক্রান্ত পরীক্ষা চালানো হয়েছে}other{{NUM_MINS} মিনিট আগে নিরাপত্তা সংক্রান্ত পরীক্ষা চালানো হয়েছে}}</translation> <translation id="7057767408836081338">অ্যাপ ডেটা পাওয়া যায়নি। যাইহোক, অ্যাপ রান করানোর চেষ্টা করা হচ্ছে...</translation> <translation id="7058024590501568315">লুকানো নেটওয়ার্ক</translation> +<translation id="70582545822664495"><ph name="DEVICE_COUNT" />টির মধ্যে <ph name="DEVICE_INDEX" /> নম্বর ডিভাইস, মাউসের নাম <ph name="DEVICE_NAME" /></translation> <translation id="7059858479264779982">স্বয়ংক্রিয় লঞ্চ সেট করুন</translation> <translation id="7062222374113411376">সম্প্রতি বন্ধ করা সাইটগুলিকে ডেটা পাঠানো ও গ্রহণ শেষ করতে অনুমতি দিন (প্রস্তাবিত)</translation> <translation id="7063129466199351735">শর্টকাটগুলি প্রক্রিয়া করা হচ্ছে...</translation> @@ -5987,6 +5998,7 @@ <translation id="7257173066616499747">ওয়াই-ফাই নেটওয়ার্কগুলি</translation> <translation id="725758059478686223">প্রিন্টিং পরিষেবা</translation> <translation id="7257666756905341374">আপনি যে ডেটা কপি ও পেস্ট করেন তা পড়ুন</translation> +<translation id="7258006747130724016"><ph name="DEVICE_COUNT" />টির মধ্যে <ph name="DEVICE_INDEX" /> নম্বর ডিভাইস, ভিডিও ক্যামেরার নাম <ph name="DEVICE_NAME" /></translation> <translation id="7258192266780953209">পরিবর্তন</translation> <translation id="7258225044283673131">অ্যাপ্লিকেশনটি কাজ করছে না। অ্যাপটি বন্ধ করতে "জোর করে বন্ধ করুন" বিকল্পটি বেছে নিন।</translation> <translation id="7262004276116528033">এই সাইন-ইন করা পরিষেবাটি <ph name="SAML_DOMAIN" /> দ্বারা হোস্ট করা হয়</translation> @@ -6782,6 +6794,7 @@ <translation id="8037117027592400564">সিন্থেসাইজড স্পিচ ব্যবহার করে কথিত সব পাঠ্য পড়ুন</translation> <translation id="8037357227543935929">জিজ্ঞাসা করুন (ডিফল্ট)</translation> <translation id="803771048473350947">ফাইল</translation> +<translation id="8038399858950372766"><ph name="DEVICE_COUNT" />টির মধ্যে <ph name="DEVICE_INDEX" /> নম্বর ডিভাইস, কীবোর্ডের নাম <ph name="DEVICE_NAME" /></translation> <translation id="8041089156583427627">প্রতিক্রিয়া পাঠান</translation> <translation id="8042142357103597104">টেক্সটের অস্বচ্ছতা</translation> <translation id="8044262338717486897"><ph name="LINUX_APP_NAME" /> উত্তর দিচ্ছে না।</translation> @@ -6805,6 +6818,7 @@ <translation id="8054563304616131773">অনুগ্রহ করে একটি সঠিক ইমেল আইডি লিখুন</translation> <translation id="8054883179223321715">নির্দিষ্ট ভিডিও সাইটের জন্য উপলভ্য আছে</translation> <translation id="8054921503121346576">USB কীবোর্ড সংযুক্ত হয়েছে</translation> +<translation id="8057414620575339583">সাইড সার্চ</translation> <translation id="8058655154417507695">মেয়াদ শেষের বছর</translation> <translation id="8058986560951482265">কাঁপতে থাকে</translation> <translation id="8059417245945632445">এবং ডিভাইসগুলি পরিদর্শন</translation> @@ -6920,6 +6934,7 @@ <translation id="8168071266284693455">আপনার সব ডিভাইসে বুকমার্ক, পাসওয়ার্ড, ইতিহাস এবং আরও অনেক কিছু সিঙ্ক করা আছে</translation> <translation id="8168435359814927499">কন্টেন্ট</translation> <translation id="8169165065843881617">{NUM_TABS,plural, =1{রিডিং তালিকাতে ট্যাব যোগ করুন}one{রিডিং তালিকাতে ট্যাব যোগ করুন}other{রিডিং তালিকাতে ট্যাব যোগ করুন}}</translation> +<translation id="8169849063724750395">আবার চালু করুন</translation> <translation id="8171334254070436367">সব কার্ড লুকান</translation> <translation id="8174047975335711832">ডিভাইস সংক্রান্ত তথ্য</translation> <translation id="8174876712881364124">Google ড্রাইভে ব্যাক-আপ নিন। যেকোনও সহজেই আপনার ডেটা ফিরিয়ে আনুন বা ডিভাইস পাল্টান। আপনার ব্যাক-আপে অ্যাপ ডেটা থাকে। আপনার ব্যাক-আপ ডেটা Google-এ আপলোড করা হবে এবং আপনার সন্তানের Google অ্যাকাউন্টের পাসওয়ার্ড ব্যবহার করে সেগুলিকে এনক্রিপ্ট করা হবে। <ph name="BEGIN_LINK1" />আরও জানুন<ph name="END_LINK1" /></translation> @@ -6993,6 +7008,7 @@ <translation id="8249615410597138718">আপনার ডিভাইসে পাঠান</translation> <translation id="8249672078237421304">আপনি যে ভাষাতে পড়েন সেই ভাষাতে না থাকা পৃষ্ঠাগুলি অনুবাদ করার প্রস্তাব দিন</translation> <translation id="8251441930213048644">এখনই রিফ্রেশ করুন</translation> +<translation id="8251509999076836464"><ph name="DEVICE_NAME" />-এর সাথে পেয়ার করা হচ্ছে</translation> <translation id="8251578425305135684">থাম্বনেল সরানো হয়েছে৷</translation> <translation id="825238165904109940">সবসময় সম্পূর্ণ ইউআরএল দেখুন</translation> <translation id="8252569384384439529">আপলোড হচ্ছে…</translation> @@ -7230,9 +7246,11 @@ <translation id="8528074251912154910">ভাষা যোগ করুন</translation> <translation id="8528962588711550376">প্রবেশ করুন হচ্ছে৷</translation> <translation id="8529925957403338845">ঝটপট টিথারিং কানেকশন কাজ করছে না</translation> +<translation id="8531701051932785007">'উন্নত নিরাপদ ব্রাউজিং' ফিচার বন্ধ করা আছে</translation> <translation id="8534656636775144800">ওহো! ডোমেনটি যোগ করার সময় কোনও সমস্যা হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন।</translation> <translation id="8535005006684281994">Netscape সার্টিফিকেট পুনর্নবীকরণ ইউআরএল</translation> <translation id="8536956381488731905">কী প্রেস করার সময় যে শব্দ হয়</translation> +<translation id="8538718737588735385">আবার চালু করুন</translation> <translation id="8539727552378197395">না (কেবলমাত্র Http)</translation> <translation id="8539766201049804895">আপগ্রেড করুন</translation> <translation id="8540136935098276800">সঠিকভাবে ফর্ম্যাট করা একটি ইউআরএল লিখুন</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 9d106fe8..fad7a03c 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -6817,6 +6817,7 @@ <translation id="8054563304616131773">Upišite važeću adresu e-pošte</translation> <translation id="8054883179223321715">Dostupno za određene web lokacije za videozapise</translation> <translation id="8054921503121346576">USB tastatura je povezana</translation> +<translation id="8057414620575339583">Bočno pretraživanje</translation> <translation id="8058655154417507695">Godina isteka</translation> <translation id="8058986560951482265">Isprekidano</translation> <translation id="8059417245945632445">&Pregledaj uređaje</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 9b1b1c59..3563085 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -6784,6 +6784,7 @@ <translation id="8054563304616131773">Geben Sie eine gültige E-Mail-Adresse ein.</translation> <translation id="8054883179223321715">Für bestimmte Video-Websites verfügbar</translation> <translation id="8054921503121346576">USB-Tastatur angeschlossen</translation> +<translation id="8057414620575339583">Suche in Seitenleiste</translation> <translation id="8058655154417507695">Ablaufjahr</translation> <translation id="8058986560951482265">Ruckeln</translation> <translation id="8059417245945632445">&Geräte untersuchen</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index cfa09dc..06194c9 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -2524,6 +2524,7 @@ <translation id="3557101512409028104">Ορίστε περιορισμούς ιστοτόπων και όρια χρόνου χρήσης με το Family Link</translation> <translation id="3559262020195162408">Αποτυχία εγκατάστασης πολιτικής στη συσκευή.</translation> <translation id="3559533181353831840">Απομένουν περίπου <ph name="TIME_LEFT" /></translation> +<translation id="3559697822483154494">Λήψη δόνησης επιβεβαίωσης για ενέργειες όπως ο διαχωρισμός οθόνης και η εναλλαγή γραφείων.</translation> <translation id="3560034655160545939">&Ορθογραφικός έλεγχος</translation> <translation id="3562423906127931518">Αυτή η διαδικασία μπορεί να διαρκέσει μερικά λεπτά. Ρύθμιση του κοντέινερ Linux.</translation> <translation id="3562655211539199254">Δείτε τις πρόσφατες καρτέλες Chrome από το τηλέφωνό σας.</translation> @@ -4926,6 +4927,7 @@ <translation id="6112931163620622315">Ελέγξτε το τηλέφωνό σας</translation> <translation id="6113434369102685411">Ρυθμίστε την προεπιλεγμένη μηχανή αναζήτησης για το πρόγραμμα περιήγησης Chrome και την Εφαρμογή εκκίνησης <ph name="DEVICE_TYPE" />.</translation> <translation id="6113942107547980621">Για να χρησιμοποιήσετε το Smart Lock, κάντε εναλλαγή στο προφίλ κύριου χρήστη στο τηλέφωνό σας</translation> +<translation id="611684075852771314">Αυτά τα αρχεία καταγραφής έχουν αποθηκευτεί στην ενότητα Τα αρχεία μου ως</translation> <translation id="6116921718742659598">Αλλαγή γλώσσας και ρυθμίσεις εισόδου</translation> <translation id="6119927814891883061">Ονομασία συσκευής ως <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Καρφίτσωμα αυτής της σελίδας στην Οθόνη έναρξης…</translation> @@ -5702,6 +5704,7 @@ <translation id="6930036377490597025">Εξωτερικό κλειδί ασφαλείας ή ενσωματωμένος αισθητήρας</translation> <translation id="6930161297841867798">{NUM_EXTENSIONS,plural, =1{Απορρίφθηκε μια επέκταση}other{Απορρίφθηκαν # επεκτάσεις}}</translation> <translation id="6930321203306643451">Η αναβάθμιση ολοκληρώθηκε</translation> +<translation id="6931690462168617033">Ισχύς κλικ</translation> <translation id="6935286146439255109">Ο δίσκος χαρτιού λείπει</translation> <translation id="693807610556624488">Η λειτουργία εγγραφής υπερβαίνει το μέγιστο μέγεθος του χαρακτηριστικού στη συσκευή: "<ph name="DEVICE_NAME" />".</translation> <translation id="6938386202199793006">Έχετε 1 αποθηκευμένο εκτυπωτή.</translation> @@ -6835,6 +6838,7 @@ <translation id="8064279191081105977">Ομάδα <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> - <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">Παράθυρο διαλόγου σύνδεσης</translation> <translation id="8069615408251337349">Google Cloud Print</translation> +<translation id="8070662218171013510">Ανάδραση αφής</translation> <translation id="8071432093239591881">Εκτύπωση ως εικόνα</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />Τα δεδομένα εφαρμογής μπορεί να είναι οποιουδήποτε είδους δεδομένα έχουν αποθηκευτεί από μια εφαρμογή (βάσει των ρυθμίσεων προγραμματιστή σας), συμπεριλαμβανομένων δεδομένων όπως επαφών, μηνυμάτων και φωτογραφιών.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Τα δεδομένα αντιγράφων ασφαλείας δεν υπολογίζονται στο όριο του αποθηκευτικού χώρου του παιδιού σας στο Drive.<ph name="END_PARAGRAPH2" />
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index e983e18a..dc5a82e 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -2524,6 +2524,7 @@ <translation id="3557101512409028104">Set website restrictions and screen time limits with Family Link</translation> <translation id="3559262020195162408">Failed to install policy on the device.</translation> <translation id="3559533181353831840">About <ph name="TIME_LEFT" /> left</translation> +<translation id="3559697822483154494">Receive vibration confirmation for actions like split-screen and switching desks.</translation> <translation id="3560034655160545939">&Spell check</translation> <translation id="3562423906127931518">This process may take a few minutes. Setting up the Linux container.</translation> <translation id="3562655211539199254">View recent Chrome tabs from your phone</translation> @@ -4925,6 +4926,7 @@ <translation id="6112931163620622315">Check your phone</translation> <translation id="6113434369102685411">Set your default search engine for Chrome browser and <ph name="DEVICE_TYPE" /> Launcher</translation> <translation id="6113942107547980621">To use Smart Lock, switch to the primary user profile on your phone</translation> +<translation id="611684075852771314">These logs have been saved in My Files as</translation> <translation id="6116921718742659598">Change language and input settings</translation> <translation id="6119927814891883061">Name device to <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Pin this page to Start screen...</translation> @@ -5701,6 +5703,7 @@ <translation id="6930036377490597025">External security key or built-in sensor</translation> <translation id="6930161297841867798">{NUM_EXTENSIONS,plural, =1{An extension has been rejected}other{# extensions have been rejected}}</translation> <translation id="6930321203306643451">Upgrade complete</translation> +<translation id="6931690462168617033">Click strength</translation> <translation id="6935286146439255109">A paper tray is missing</translation> <translation id="693807610556624488">Write operation exceeds the maximum length of the attribute to: "<ph name="DEVICE_NAME" />".</translation> <translation id="6938386202199793006">You have 1 saved printer.</translation> @@ -6834,6 +6837,7 @@ <translation id="8064279191081105977">Group <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /> – <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">Connection dialogue</translation> <translation id="8069615408251337349">Google Cloud Print</translation> +<translation id="8070662218171013510">Haptic feedback</translation> <translation id="8071432093239591881">Print as image</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />App data can be any data that an app has saved (based on developer settings), including data such as contacts, messages and photos.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Backup data will not count toward your child's Drive storage quota.<ph name="END_PARAGRAPH2" />
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 621d07a..9b2ba2c 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -250,6 +250,7 @@ <translation id="1244265436519979884">Linux-en edukiontzia leheneratzen</translation> <translation id="1244303850296295656">Luzapenaren errorea</translation> <translation id="1246863218384630739">Ezin izan da instalatu <ph name="VM_NAME" />: irudiaren URLak <ph name="HTTP_ERROR" /> errore-kodea itzuli du. Jarri administratzailearekin harremanetan.</translation> +<translation id="1247071602516579380"><ph name="DEVICE_COUNT" /> gailutatik <ph name="DEVICE_INDEX" />garrena, <ph name="DEVICE_NAME" /> izeneko tableta</translation> <translation id="1251366534849411931">Ezkerreko giltza behar da: <ph name="ERROR_LINE" /></translation> <translation id="1251480783646955802">Webguneek eta instalatutako aplikazioek gordetako datuen <ph name="TOTAL_USAGE" /> garbituko dira</translation> <translation id="1251578593170406502">Datu-konexio bidezko sareak bilatzen…</translation> @@ -436,6 +437,7 @@ <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> hautatu dira</translation> <translation id="1442851588227551435">Ezarri Kerberos-eko zerbitzu-eskaera aktibo bat</translation> <translation id="1444628761356461360">Ezarpen hau gailuaren jabeak (<ph name="OWNER_EMAIL" />) kudeatzen du.</translation> +<translation id="1445005312224723356"><ph name="DEVICE_COUNT" /> gailutatik <ph name="DEVICE_INDEX" />garrena, <ph name="DEVICE_NAME" /> izeneko telefonoa</translation> <translation id="144518587530125858">Ezin izan da "<ph name="IMAGE_PATH" />" kargatu itxura gisa.</translation> <translation id="1449191289887455076">Esleipena berresteko eta <ph name="RESPONSE" />, sakatu "<ph name="CURRENTKEY" />" berriro</translation> <translation id="1451375123200651445">Webgunea, fitxategi bakarra</translation> @@ -859,6 +861,7 @@ <translation id="1855079636134697549">Aktibatu da kamera</translation> <translation id="1856715684130786728">Gehitu kokapena…</translation> <translation id="1858585891038687145">Jo fidagarritzat software-egileak identifikatzeko ziurtagiri hau</translation> +<translation id="1859787252990099899"><ph name="DEVICE_COUNT" /> gailutatik <ph name="DEVICE_INDEX" />garrena, identifikatu ezin den <ph name="DEVICE_NAME" /> izeneko gailua</translation> <translation id="1861262398884155592">Hutsik dago karpeta</translation> <translation id="1862311223300693744">Ba al duzu VPN, proxy, suebaki edo NAS software berezirik instalatuta?</translation> <translation id="1863182668524159459">Ez da aurkitu serieko atakarik</translation> @@ -1233,6 +1236,7 @@ <translation id="2242687258748107519">Fitxategiari buruzko informazioa</translation> <translation id="2246549592927364792">Google-k irudien azalpenak ematea nahi duzu?</translation> <translation id="2247738527273549923">Zure erakundeak kudeatzen du gailua</translation> +<translation id="2249061317998743208"><ph name="DEVICE_COUNT" /> gailutatik <ph name="DEVICE_INDEX" />garrena, <ph name="DEVICE_NAME" /> izeneko bideo-jokoen kontrolagailua</translation> <translation id="2249111429176737533">Ireki leiho fitxadun gisa</translation> <translation id="2249605167705922988">adibidez: 1-5, 8, 11-13</translation> <translation id="2251218783371366160">Ireki sistema-ikustailearen bidez</translation> @@ -1990,6 +1994,7 @@ <translation id="3007771295016901659">Bikoiztu fitxa</translation> <translation id="3008232374986381779">Abiarazi Linux-erako tresnak, editoreak eta IDEak <ph name="DEVICE_TYPE" /> gailuan. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation> <translation id="3008272652534848354">Berrezarri baimenak</translation> +<translation id="3008396025115884998"><ph name="DEVICE_COUNT" /> gailutatik <ph name="DEVICE_INDEX" />garrena, <ph name="DEVICE_NAME" /> izeneko audio-gailua</translation> <translation id="3008694618228964140">{NUM_DAYS,plural, =1{Gaur wifi-sare batera konektatzeko eta eguneratze bat deskargatzeko eskatzen du <ph name="MANAGER" /> domeinuak. Bestela, deskarga ezazu neurtutako konexio batetik (baliteke zerbait ordaindu behar izatea).}other{Epemuga baino lehen wifi-sare batera konektatzeko eta eguneratze bat deskargatzeko eskatzen du <ph name="MANAGER" /> domeinuak. Bestela, deskargatu eguneratzea neurtutako konexio batetik (baliteke zerbait ordaindu behar izatea).}}</translation> <translation id="3009300415590184725">Ziur mugikorreko datuen zerbitzua konfiguratzeko prozesua bertan behera utzi nahi duzula?</translation> <translation id="3009779501245596802">Datu-base indexatuak</translation> @@ -2295,6 +2300,7 @@ <translation id="3348038390189153836">Gailu aldagarria hauteman da</translation> <translation id="3348131053948466246">Emojiak iradoki dira. Nabigatzeko, sakatu Gora edo Behera gezia; txertatzeko, sakatu Sartu tekla.</translation> <translation id="3349933790966648062">Memoriaren erabilera</translation> +<translation id="3354972872297836698">Ezin izan da parekatu <ph name="DEVICE_NAME" /> gailuarekin; berriro saiatzeko, hautatu gailua</translation> <translation id="3355936511340229503">Konexio-errorea</translation> <translation id="3356580349448036450">Osatuta</translation> <translation id="3359256513598016054">Ziurtagiri-gidalerroaren murriztapenak</translation> @@ -3125,6 +3131,7 @@ <translation id="4200689466366162458">Hitz pertsonalizatuak</translation> <translation id="4200983522494130825">Fi&txa berria</translation> <translation id="4201546031411513170">Zer sinkronizatu nahi duzun aukeratzeko, joan Ezarpenak atalera.</translation> +<translation id="4202417625268941299">Arakatze seguru hobetua aktibatuz gero, Chrome-ren segurtasun-aukerarik sendoena lortuko duzu</translation> <translation id="420283545744377356">Desaktibatu pantaila-babeslea</translation> <translation id="4206144641569145248">Estralurtarra</translation> <translation id="4206323443866416204">Iritzi-txostena</translation> @@ -3630,6 +3637,7 @@ <translation id="4759238208242260848">Deskargak</translation> <translation id="4761104368405085019">Erabili mikrofonoa</translation> <translation id="4762718786438001384">Oso toki gutxi dago gailuaren diskoan</translation> +<translation id="4762898026821161650"><ph name="DEVICE_COUNT" /> gailutatik <ph name="DEVICE_INDEX" />garrena, <ph name="DEVICE_NAME" /> izeneko ordenagailua</translation> <translation id="4763408175235639573">Cookie hauek ezarri dira orria ikusi duzunean:</translation> <translation id="4765582662863429759">Testu-mezuak telefonotik Chromebook gailura bidaltzea baimentzen dio Android Mezuak aplikazioari</translation> <translation id="4768332406694066911">Identifikatzen zaituzten erakunde hauen ziurtagiriak dituzu</translation> @@ -3811,6 +3819,7 @@ <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" luzapenak serieko ataka batera konektatu nahi du</translation> <translation id="4944310289250773232"><ph name="SAML_DOMAIN" /> da autentifikazio-zerbitzuaren ostalaria</translation> <translation id="4945439665401275950">Hatz-marka konfiguratzeko, eskatu haurrari etengailua sakatzeko. Haurraren hatz-markaren datuak modu seguruan gordeko dira eta ez dira inoiz aterako <ph name="DEVICE_TYPE" /> gailutik.</translation> +<translation id="4946459324029651239">Babes estandarra ari zara jasotzen</translation> <translation id="495164417696120157">{COUNT,plural, =1{fitxategi bat}other{# fitxategi}}</translation> <translation id="495170559598752135">Ekintzak</translation> <translation id="4953808748584563296">Abatar laranja lehenetsia</translation> @@ -4394,6 +4403,7 @@ <translation id="5575528586625653441">Arazo bat izan da demoa erregistratzeko eskaerarekin.</translation> <translation id="557722062034137776">Gailua berrezartzeak ez die eragingo zure Google-ko kontuei edo kontu horiekin sinkronizatutako datuei. Hala ere, gailuan bertan gorde dituzun fitxategi guztiak ezabatuko dira.</translation> <translation id="5578059481725149024">Saio-hasiera automatikoa</translation> +<translation id="5581134892342029705">Osatu da itzulpena <ph name="LANGUAGE" /> hizkuntzara</translation> <translation id="558170650521898289">Microsoft Windows hardware-kontrolatzaileen egiaztapena</translation> <translation id="5581972110672966454">Ezin da gehitu gailua domeinuan. Saiatu berriro edo jarri harremanetan gailuaren jabearekin edo administratzailearekin. Errore-kodea: <ph name="ERROR_CODE" />.</translation> <translation id="5582839680698949063">Menu nagusia</translation> @@ -5807,6 +5817,7 @@ <translation id="7057184853669165321">{NUM_MINS,plural, =1{Duela minutu bat egin da segurtasun-egiaztapena}other{Duela {NUM_MINS} minutu egin da segurtasun-egiaztapena}}</translation> <translation id="7057767408836081338">Ezin izan dira eskuratu aplikazioko datuak. Hala ere aplikazioa abiarazten saiatzen ari gara…</translation> <translation id="7058024590501568315">Sare ezkutua</translation> +<translation id="70582545822664495"><ph name="DEVICE_COUNT" /> gailutatik <ph name="DEVICE_INDEX" />garrena, <ph name="DEVICE_NAME" /> izeneko sagua</translation> <translation id="7059858479264779982">Ezarri abiarazte automatikoa</translation> <translation id="7062222374113411376">Baimendu berriki itxitako webguneei datuak bidaltzen eta jasotzen amaitzea (gomendatua)</translation> <translation id="7063129466199351735">Lasterbideak prozesatzen…</translation> @@ -5970,6 +5981,7 @@ <translation id="7257173066616499747">Wi-Fi sareak</translation> <translation id="725758059478686223">Inprimaketa-zerbitzua</translation> <translation id="7257666756905341374">Irakurri kopiatzen eta itsasten dituzun datuak</translation> +<translation id="7258006747130724016"><ph name="DEVICE_COUNT" /> gailutatik <ph name="DEVICE_INDEX" />garrena, <ph name="DEVICE_NAME" /> izeneko bideo-kamera</translation> <translation id="7258192266780953209">Eraldaketak</translation> <translation id="7258225044283673131">Aplikazioak ez du erantzuten. Ixteko, hautatu "Behartu ixtera".</translation> <translation id="7262004276116528033">Saioa hasteko zerbitzuaren ostalaria <ph name="SAML_DOMAIN" /> da</translation> @@ -6764,6 +6776,7 @@ <translation id="8037117027592400564">Irakurri testu idatzi guztiak ahots sintetizatua erabilita</translation> <translation id="8037357227543935929">Galdetu (lehenetsia)</translation> <translation id="803771048473350947">Fitxategia</translation> +<translation id="8038399858950372766"><ph name="DEVICE_COUNT" /> gailutatik <ph name="DEVICE_INDEX" />garrena, <ph name="DEVICE_NAME" /> izeneko teklatua</translation> <translation id="8041089156583427627">Bidali oharrak</translation> <translation id="8042142357103597104">Testuaren opakutasuna</translation> <translation id="8044262338717486897"><ph name="LINUX_APP_NAME" /> aplikazioak ez du erantzuten.</translation> @@ -6903,6 +6916,7 @@ <translation id="8168071266284693455">Laster-markak, pasahitzak, historia eta abar gailu guztietan sinkronizatu dira</translation> <translation id="8168435359814927499">Edukia</translation> <translation id="8169165065843881617">{NUM_TABS,plural, =1{Gehitu fitxa irakurketa-zerrendan}other{Gehitu fitxak irakurketa-zerrendan}}</translation> +<translation id="8169849063724750395">Aktiba ezazu berriro</translation> <translation id="8171334254070436367">Ezkutatu txartel guztiak</translation> <translation id="8174047975335711832">Gailuaren informazioa</translation> <translation id="8174876712881364124">Egin babeskopiak Google Drive-n; horrela, errazagoa izango da datuak leheneratzea edo beste gailu batera eramatea. Aplikazioetako datuak ere sartzen dira babeskopietan. Babeskopiak Google-ra kargatzen dira eta enkriptatu egiten dira haurraren Google-ko kontuko pasahitza erabilita. <ph name="BEGIN_LINK1" />Lortu informazio gehiago<ph name="END_LINK1" /></translation> @@ -6976,6 +6990,7 @@ <translation id="8249615410597138718">Bidali zure gailuetara</translation> <translation id="8249672078237421304">Eskaini zeure burua beste hizkuntzetan idatzitako orriak itzultzeko</translation> <translation id="8251441930213048644">Freskatu</translation> +<translation id="8251509999076836464"><ph name="DEVICE_NAME" /> gailuarekin parekatzen</translation> <translation id="8251578425305135684">Irudi txikia kendu egin da.</translation> <translation id="825238165904109940">Erakutsi beti URL osoak</translation> <translation id="8252569384384439529">Kargatzen…</translation> @@ -7213,9 +7228,11 @@ <translation id="8528074251912154910">Gehitu hizkuntzak</translation> <translation id="8528962588711550376">Saioa hasten.</translation> <translation id="8529925957403338845">Ezin izan da konektatu Konexioa bizkor partekatzeko eginbidearekin</translation> +<translation id="8531701051932785007">Arakatze seguru hobetua desaktibatuta dago</translation> <translation id="8534656636775144800">Arazoren bat izan da domeinuan sartzen saiatzean. Saiatu berriro.</translation> <translation id="8535005006684281994">Netscape ziurtagiria berritzeko URLa</translation> <translation id="8536956381488731905">Aktibatu soinua teklak sakatzean</translation> +<translation id="8538718737588735385">Aktiba ezazu berriro</translation> <translation id="8539727552378197395">Ez (Http soilik)</translation> <translation id="8539766201049804895">Bertsio-berritu</translation> <translation id="8540136935098276800">Idatzi formatu egokia duen URL bat</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index bc923cdd..298269e2 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -6816,6 +6816,7 @@ <translation id="8054563304616131773">لطفاً یک نشانی ایمیل معتبر وارد کنید</translation> <translation id="8054883179223321715">دردسترس برای بعضی از سایتهای ویدیویی</translation> <translation id="8054921503121346576">صفحهکلید USB متصل شد</translation> +<translation id="8057414620575339583">جستجوی جانبی</translation> <translation id="8058655154417507695">سال انقضا</translation> <translation id="8058986560951482265">جریان نامنظم</translation> <translation id="8059417245945632445">&بازرسی دستگاهها</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 0307f67c..598c8651 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -251,6 +251,7 @@ <translation id="1244265436519979884">Restauration Linux…</translation> <translation id="1244303850296295656">Erreur au niveau des extensions.</translation> <translation id="1246863218384630739">Impossible d'installer <ph name="VM_NAME" />, car l'URL de l'image a renvoyé une erreur <ph name="HTTP_ERROR" />. Veuillez contacter votre administrateur.</translation> +<translation id="1247071602516579380">Appareil <ph name="DEVICE_INDEX" /> sur <ph name="DEVICE_COUNT" />, tablette nommée "<ph name="DEVICE_NAME" />"</translation> <translation id="1251366534849411931">Accolade ouvrante attendue : <ph name="ERROR_LINE" /></translation> <translation id="1251480783646955802">Cette action effacera <ph name="TOTAL_USAGE" /> des données stockées par les sites et les applications installées</translation> <translation id="1251578593170406502">Recherche de réseaux de données mobiles…</translation> @@ -437,6 +438,7 @@ <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> sélectionnés</translation> <translation id="1442851588227551435">Définir un ticket Kerberos actif</translation> <translation id="1444628761356461360">Ce paramètre est géré par le propriétaire de l'appareil : <ph name="OWNER_EMAIL" />.</translation> +<translation id="1445005312224723356">Appareil <ph name="DEVICE_INDEX" /> sur <ph name="DEVICE_COUNT" />, téléphone nommé "<ph name="DEVICE_NAME" />"</translation> <translation id="144518587530125858">Impossible de charger "<ph name="IMAGE_PATH" />" pour le thème.</translation> <translation id="1449191289887455076">Appuyez de nouveau sur <ph name="CURRENTKEY" /> pour confirmer cette association et <ph name="RESPONSE" /></translation> <translation id="1451375123200651445">Page Web, un seul fichier</translation> @@ -860,6 +862,7 @@ <translation id="1855079636134697549">La caméra est allumée</translation> <translation id="1856715684130786728">Ajouter un emplacement…</translation> <translation id="1858585891038687145">Considérer ce certificat comme fiable pour identifier les développeurs de logiciels</translation> +<translation id="1859787252990099899">Appareil <ph name="DEVICE_INDEX" /> sur <ph name="DEVICE_COUNT" />, appareil inconnu nommé "<ph name="DEVICE_NAME" />"</translation> <translation id="1861262398884155592">Ce dossier est vide</translation> <translation id="1862311223300693744">Avez-vous installé un VPN, un proxy, un pare-feu ou un serveur NAS spécifique ?</translation> <translation id="1863182668524159459">Ports série introuvables</translation> @@ -1234,6 +1237,7 @@ <translation id="2242687258748107519">Informations sur le fichier</translation> <translation id="2246549592927364792">Obtenir des descriptions d'images de Google ?</translation> <translation id="2247738527273549923">Cet appareil est géré par votre organisation</translation> +<translation id="2249061317998743208">Appareil <ph name="DEVICE_INDEX" /> sur <ph name="DEVICE_COUNT" />, manette de jeu nommée "<ph name="DEVICE_NAME" />"</translation> <translation id="2249111429176737533">Ouvrir dans une fenêtre à onglets</translation> <translation id="2249605167705922988">par exemple : 1-5, 8, 11-13</translation> <translation id="2251218783371366160">Ouvrir avec le lecteur système</translation> @@ -1992,6 +1996,7 @@ <translation id="3007771295016901659">Dupliquer l'onglet</translation> <translation id="3008232374986381779">Exécutez les outils, les éditeurs et les IDE Linux sur votre <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="3008272652534848354">Réinitialiser les autorisations</translation> +<translation id="3008396025115884998">Appareil <ph name="DEVICE_INDEX" /> sur <ph name="DEVICE_COUNT" />, appareil audio nommé "<ph name="DEVICE_NAME" />"</translation> <translation id="3008694618228964140">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> vous demande de vous connecter au Wi-Fi aujourd'hui afin de télécharger une mise à jour. Vous pouvez aussi la télécharger via une connexion facturée à l'usage (susceptible d'entraîner des frais).}one{<ph name="MANAGER" /> vous demande de vous connecter au Wi-Fi pour télécharger une mise à jour avant la date limite. Vous pouvez aussi la télécharger via une connexion facturée à l'usage (susceptible d'entraîner des frais).}other{<ph name="MANAGER" /> vous demande de vous connecter au Wi-Fi pour télécharger une mise à jour avant la date limite. Vous pouvez aussi la télécharger via une connexion facturée à l'usage (susceptible d'entraîner des frais).}}</translation> <translation id="3009300415590184725">Voulez-vous vraiment annuler la configuration du service Internet mobile ?</translation> <translation id="3009779501245596802">Bases de données indexées</translation> @@ -2297,6 +2302,7 @@ <translation id="3348038390189153836">Nouveau matériel détecté</translation> <translation id="3348131053948466246">Emoji suggérés. Appuyez sur la flèche vers le haut ou vers le bas pour sélectionner un emoji, puis sur Entrée pour l'insérer.</translation> <translation id="3349933790966648062">Espace mémoire utilisé</translation> +<translation id="3354972872297836698">Impossible d'associer à l'appareil <ph name="DEVICE_NAME" /> ; sélectionnez l'appareil pour réessayer</translation> <translation id="3355936511340229503">Erreur de connexion</translation> <translation id="3356580349448036450">Terminé</translation> <translation id="3359256513598016054">Contraintes des stratégies de certificat</translation> @@ -3127,6 +3133,7 @@ <translation id="4200689466366162458">Mots personnalisés</translation> <translation id="4200983522494130825">Nouvel ongle&t</translation> <translation id="4201546031411513170">Vous avez toujours la possibilité de sélectionner les éléments à synchroniser dans les paramètres.</translation> +<translation id="4202417625268941299">La navigation sécurisée avec protection renforcée vous offre la sécurité la plus avancée sur Chrome</translation> <translation id="420283545744377356">Désactiver l'économiseur d'écran</translation> <translation id="4206144641569145248">Extraterrestre</translation> <translation id="4206323443866416204">Rapport de commentaires</translation> @@ -3632,6 +3639,7 @@ <translation id="4759238208242260848">Téléchargements</translation> <translation id="4761104368405085019">Utiliser votre micro</translation> <translation id="4762718786438001384">Très peu d'espace disque disponible sur l'appareil</translation> +<translation id="4762898026821161650">Appareil <ph name="DEVICE_INDEX" /> sur <ph name="DEVICE_COUNT" />, ordinateur nommé "<ph name="DEVICE_NAME" />"</translation> <translation id="4763408175235639573">Les cookies suivants étaient autorisés lorsque vous avez consulté cette page</translation> <translation id="4765582662863429759">Autorise Android Messages à transmettre les SMS de votre téléphone à votre Chromebook</translation> <translation id="4768332406694066911">Certains certificats provenant de ces organisations vous identifient.</translation> @@ -3813,6 +3821,7 @@ <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" tente de se connecter à un port de série</translation> <translation id="4944310289250773232">Ce service d'authentification est hébergé par <ph name="SAML_DOMAIN" /></translation> <translation id="4945439665401275950">Pour configurer l'empreinte de votre enfant, demandez-lui d'appuyer sur le bouton Marche/Arrêt. Les données de son empreinte sont stockées de façon sécurisée et ne quittent jamais ce <ph name="DEVICE_TYPE" />.</translation> +<translation id="4946459324029651239">Vous avez la protection standard</translation> <translation id="495164417696120157">{COUNT,plural, =1{un fichier}one{# fichier}other{# fichiers}}</translation> <translation id="495170559598752135">Actions</translation> <translation id="4953808748584563296">Avatar orange par défaut</translation> @@ -4396,6 +4405,7 @@ <translation id="5575528586625653441">Un problème est survenu avec la demande d'enregistrement en mode de démonstration.</translation> <translation id="557722062034137776">La réinitialisation de votre appareil n'a aucune incidence sur vos comptes Google ni sur leurs données synchronisées. Toutefois, tous les fichiers enregistrés en local sur votre appareil vont être supprimés.</translation> <translation id="5578059481725149024">Connexion automatique</translation> +<translation id="5581134892342029705">Traduction en <ph name="LANGUAGE" /> terminée</translation> <translation id="558170650521898289">Vérification de pilote matériel Microsoft Windows</translation> <translation id="5581972110672966454">Impossible d'associer l'appareil au domaine. Veuillez réessayer, ou contactez le propriétaire ou l'administrateur de l'appareil. Code d'erreur : <ph name="ERROR_CODE" />.</translation> <translation id="5582839680698949063">Menu principal</translation> @@ -5810,6 +5820,7 @@ <translation id="7057184853669165321">{NUM_MINS,plural, =1{Contrôle de sécurité effectué il y a 1 minute}one{Contrôle de sécurité effectué il y a {NUM_MINS} minute}other{Contrôle de sécurité effectué il y a {NUM_MINS} minutes}}</translation> <translation id="7057767408836081338">Impossible d'obtenir les données de l'application. Nous essayons malgré tout de lancer l'application…</translation> <translation id="7058024590501568315">Réseau masqué</translation> +<translation id="70582545822664495">Appareil <ph name="DEVICE_INDEX" /> sur <ph name="DEVICE_COUNT" />, tablette nommée "<ph name="DEVICE_NAME" />"</translation> <translation id="7059858479264779982">Lancement automatique</translation> <translation id="7062222374113411376">Autoriser les sites fermés récemment à terminer l'envoi et la réception de données (recommandé)</translation> <translation id="7063129466199351735">Traitement des raccourcis en cours…</translation> @@ -5973,6 +5984,7 @@ <translation id="7257173066616499747">Réseaux Wi-Fi</translation> <translation id="725758059478686223">Service d'impression</translation> <translation id="7257666756905341374">Accéder aux données que vous copiez et collez</translation> +<translation id="7258006747130724016">Appareil <ph name="DEVICE_INDEX" /> sur <ph name="DEVICE_COUNT" />, caméra nommée "<ph name="DEVICE_NAME" />"</translation> <translation id="7258192266780953209">Transformations</translation> <translation id="7258225044283673131">L'application ne répond pas. Sélectionnez "Forcer la fermeture" pour la fermer.</translation> <translation id="7262004276116528033">Ce service de connexion est hébergé par <ph name="SAML_DOMAIN" />.</translation> @@ -6769,6 +6781,7 @@ <translation id="8037117027592400564">Accéder à l'ensemble du texte énoncé à l'aide de la synthèse vocale</translation> <translation id="8037357227543935929">Demander (par défaut)</translation> <translation id="803771048473350947">Fichier</translation> +<translation id="8038399858950372766">Appareil <ph name="DEVICE_INDEX" /> sur <ph name="DEVICE_COUNT" />, clavier nommé "<ph name="DEVICE_NAME" />"</translation> <translation id="8041089156583427627">Envoyer</translation> <translation id="8042142357103597104">Opacité du texte</translation> <translation id="8044262338717486897">L'application <ph name="LINUX_APP_NAME" /> ne répond pas.</translation> @@ -6907,6 +6920,7 @@ <translation id="8168071266284693455">Vos favoris, mots de passe, données d'historique et plus sont synchronisés sur tous vos appareils</translation> <translation id="8168435359814927499">Contenu</translation> <translation id="8169165065843881617">{NUM_TABS,plural, =1{Ajouter l'onglet à la liste de lecture}one{Ajouter l'onglet à la liste de lecture}other{Ajouter les onglets à la liste de lecture}}</translation> +<translation id="8169849063724750395">Réactiver</translation> <translation id="8171334254070436367">Masquer toutes les fiches</translation> <translation id="8174047975335711832">Informations sur l'appareil</translation> <translation id="8174876712881364124">Sauvegarder dans Google Drive. Restaurez des données ou changez d'appareil facilement et à tout moment. La sauvegarde inclut les données d'applications. Les sauvegardes sont importées dans Google et chiffrées à l'aide du mot de passe du compte Google de votre enfant. <ph name="BEGIN_LINK1" />En savoir plus<ph name="END_LINK1" /></translation> @@ -6980,6 +6994,7 @@ <translation id="8249615410597138718">Envoyer à vos appareils</translation> <translation id="8249672078237421304">Me proposer de traduire les pages qui sont écrites dans une langue que je ne connais pas</translation> <translation id="8251441930213048644">Actualiser</translation> +<translation id="8251509999076836464">Association à <ph name="DEVICE_NAME" />…</translation> <translation id="8251578425305135684">Miniature supprimée</translation> <translation id="825238165904109940">Toujours afficher les URL en entier</translation> <translation id="8252569384384439529">Importation…</translation> @@ -7217,9 +7232,11 @@ <translation id="8528074251912154910">Ajouter des langues</translation> <translation id="8528962588711550376">Connexion en cours</translation> <translation id="8529925957403338845">Échec du partage de connexion</translation> +<translation id="8531701051932785007">La navigation sécurisée avec protection renforcée est désactivée</translation> <translation id="8534656636775144800">Petit problème… Une erreur s'est produite lors de la tentative d'association au domaine. Veuillez réessayer.</translation> <translation id="8535005006684281994">URL de renouvellement du certificat Netscape</translation> <translation id="8536956381488731905">Son à chaque touche</translation> +<translation id="8538718737588735385">Réactiver</translation> <translation id="8539727552378197395">Non (HttpOnly)</translation> <translation id="8539766201049804895">Mettre à niveau</translation> <translation id="8540136935098276800">Saisissez une URL dont le format est correct</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 4ebdde3..e2a89ae0 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -251,6 +251,7 @@ <translation id="1244265436519979884">હાલમાં Linuxને પહેલાંના જેવું કરવાની પ્રક્રિયા ચાલુ છે</translation> <translation id="1244303850296295656">એક્સટેંશન ભૂલ</translation> <translation id="1246863218384630739"><ph name="VM_NAME" /> ઇન્સ્ટૉલ કરી શક્યાં નહીં: છબીના URL દ્વારા ભૂલનો કોડ <ph name="HTTP_ERROR" /> પરત આપવામાં આવ્યો છે. કૃપા કરીને તમારા વ્યવસ્થાપકનો સંપર્ક કરો.</translation> +<translation id="1247071602516579380"><ph name="DEVICE_COUNT" />માંથી <ph name="DEVICE_INDEX" /> ડિવાઇસ, <ph name="DEVICE_NAME" /> નામનું ટૅબ્લેટ</translation> <translation id="1251366534849411931">અપેક્ષિત ખુલતો વાંકળિયો કૌંસ: <ph name="ERROR_LINE" /></translation> <translation id="1251480783646955802">આમ કરવાથી સાઇટ અને ઇન્સ્ટૉલ કરેલી ઍપ દ્વારા સ્ટોર કરવામાં આવેલો <ph name="TOTAL_USAGE" /> ડેટા સાફ કરવામાં આવશે</translation> <translation id="1251578593170406502">મોબાઇલ ડેટા નેટવર્ક માટે સ્કૅન કરી રહ્યાં છીએ…</translation> @@ -437,6 +438,7 @@ <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> પસંદ કરી</translation> <translation id="1442851588227551435">સક્રિય Kerberos ટિકિટ સેટ કરો</translation> <translation id="1444628761356461360">આ સેટિંગ ડિવાઇસના માલિક <ph name="OWNER_EMAIL" /> દ્વારા મેનેજ થાય છે.</translation> +<translation id="1445005312224723356"><ph name="DEVICE_COUNT" />માંથી <ph name="DEVICE_INDEX" /> ડિવાઇસ, <ph name="DEVICE_NAME" /> નામનો ફોન</translation> <translation id="144518587530125858">થીમ માટે '<ph name="IMAGE_PATH" />' લોડ કરી શકાયું નથી.</translation> <translation id="1449191289887455076">સોંપણી કન્ફર્મ કરવા માટે, ફરી “<ph name="CURRENTKEY" />” દબાવો અને <ph name="RESPONSE" /></translation> <translation id="1451375123200651445">વેબપેજ, એકલ ફાઇલ</translation> @@ -856,6 +858,7 @@ <translation id="1855079636134697549">કૅમેરા ચાલુ કર્યો છે</translation> <translation id="1856715684130786728">સ્થાન ઉમેરો...</translation> <translation id="1858585891038687145">સૉફ્ટવેર માર્કર્સને ઓળખવા માટે આ પ્રમાણપત્ર પર વિશ્વાસ કરો</translation> +<translation id="1859787252990099899"><ph name="DEVICE_COUNT" />માંથી <ph name="DEVICE_INDEX" /> ડિવાઇસ, <ph name="DEVICE_NAME" /> નામનું અજાણ્યું ડિવાઇસ</translation> <translation id="1861262398884155592">આ ફોલ્ડર ખાલી છે</translation> <translation id="1862311223300693744">શું તમે કોઈ વિશિષ્ટ VPN, પ્રૉક્સી, ફાયરવૉલ અથવા NAS સૉફ્ટવેર ઇન્સ્ટૉલ કરેલું છે?</translation> <translation id="1863182668524159459">કોઈ સીરિયલ પોર્ટ મળ્યાં નથી</translation> @@ -1230,6 +1233,7 @@ <translation id="2242687258748107519">ફાઇલ માહિતી</translation> <translation id="2246549592927364792">Google તરફથી છબીનાં વર્ણનો મેળવીએ?</translation> <translation id="2247738527273549923">તમારું ડિવાઇસ તમારી સંસ્થા દ્વારા મેનેજ કરવામાં આવે છે</translation> +<translation id="2249061317998743208"><ph name="DEVICE_COUNT" />માંથી <ph name="DEVICE_INDEX" /> ડિવાઇસ, <ph name="DEVICE_NAME" /> નામનું ગેમ કન્ટ્રોલર</translation> <translation id="2249111429176737533">ટૅબવાળી વિંડો તરીકે ખોલો</translation> <translation id="2249605167705922988">ઉદા. ત. 1-5, 8, 11-13</translation> <translation id="2251218783371366160">સિસ્ટમ દર્શક સાથે ખોલો</translation> @@ -1989,6 +1993,7 @@ <translation id="3007771295016901659">ડુપ્લિકેટ ટૅબ</translation> <translation id="3008232374986381779">તમારા <ph name="DEVICE_TYPE" /> પર Linux સાધનો, એડિટર અને IDEs ચલાવો. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="3008272652534848354">પરવાનગીઓ રીસેટ કરો</translation> +<translation id="3008396025115884998"><ph name="DEVICE_COUNT" />માંથી <ph name="DEVICE_INDEX" /> ડિવાઇસ, <ph name="DEVICE_NAME" /> નામનું ઑડિયો ડિવાઇસ</translation> <translation id="3008694618228964140">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> માટે જરૂરી છે કે તમે અપડેટ ડાઉનલોડ કરવા માટે આજે વાઇ-ફાઇ સાથે કનેક્ટ કરો. અથવા મીટર્ડ (ડેટા નિયંત્રણ) કનેક્શન પરથી ડાઉનલોડ કરો (શુલ્ક લાગુ થઈ શકે છે).}one{<ph name="MANAGER" /> માટે જરૂરી છે કે તમે સમયસીમા સમાપ્ત થાય તે પહેલાં વાઇ-ફાઇ સાથે કનેક્ટ કરો અને અપડેટ ડાઉનલોડ કરો. અથવા મીટર્ડ (ડેટા નિયંત્રણ) કનેક્શન પરથી ડાઉનલોડ કરો (શુલ્ક લાગુ થઈ શકે છે).}other{<ph name="MANAGER" /> માટે જરૂરી છે કે તમે સમયસીમા સમાપ્ત થાય તે પહેલાં વાઇ-ફાઇ સાથે કનેક્ટ કરો અને અપડેટ ડાઉનલોડ કરો. અથવા મીટર્ડ (ડેટા નિયંત્રણ) કનેક્શન પરથી ડાઉનલોડ કરો (શુલ્ક લાગુ થઈ શકે છે).}}</translation> <translation id="3009300415590184725">શું તમે ખરેખર મોબાઇલ ડેટા સેવા સેટઅપ પ્રક્રિયાને રદ કરવા માંગો છો?</translation> <translation id="3009779501245596802">અનુક્રમિત ડેટાબેસેસ</translation> @@ -2294,6 +2299,7 @@ <translation id="3348038390189153836">કાઢી નાખવા યોગ્ય ઉપકરણ મળ્યું</translation> <translation id="3348131053948466246">સૂચવેલા ઇમોજી. નૅવિગેટ કરવા માટે ઉપર અથવા નીચેની ઍરો કી દબાવો અને મનપસંદ ઇમોજીને શામેલ કરવા enter કી દબાવો.</translation> <translation id="3349933790966648062">મેમરી ફૂટપ્રિન્ટ</translation> +<translation id="3354972872297836698"><ph name="DEVICE_NAME" /> ડિવાઇસ સાથે જોડાણ કરી શક્યા નથી; ફરી પ્રયાસ કરવા માટે ડિવાઇસ પસંદ કરો</translation> <translation id="3355936511340229503">કનેક્શન ભૂલ</translation> <translation id="3356580349448036450">પૂર્ણ</translation> <translation id="3359256513598016054">પ્રમાણપત્ર નીતિની મર્યાદાઓ</translation> @@ -3124,6 +3130,7 @@ <translation id="4200689466366162458">કસ્ટમ શબ્દો</translation> <translation id="4200983522494130825">નવું &ટૅબ</translation> <translation id="4201546031411513170">શું સિંક કરવું તે હંમેશાં તમે સેટિંગમાં પસંદ કરી શકો છો.</translation> +<translation id="4202417625268941299">Safe Browsingમાં વધારેલી સુરક્ષા વડે તમે Chromeની સૌથી સશક્ત સુરક્ષા મેળવશો</translation> <translation id="420283545744377356">સ્ક્રીન સેવર બંધ કરો</translation> <translation id="4206144641569145248">એલિયન</translation> <translation id="4206323443866416204">પ્રતિસાદ રિપોર્ટ</translation> @@ -3629,6 +3636,7 @@ <translation id="4759238208242260848">ડાઉનલોડ્સ</translation> <translation id="4761104368405085019">તમારા માઇક્રોફોનનો ઉપયોગ કરો</translation> <translation id="4762718786438001384">ઉપકરણ ડિસ્ક સ્થાન અત્યંત ઓછું છે</translation> +<translation id="4762898026821161650"><ph name="DEVICE_COUNT" />માંથી <ph name="DEVICE_INDEX" /> ડિવાઇસ, <ph name="DEVICE_NAME" /> નામનું કમ્પ્યુટર</translation> <translation id="4763408175235639573">જ્યારે તમે આ પેજ જોયું, ત્યારે નીચેની કુકી સેટ થઈ હતી</translation> <translation id="4765582662863429759">Android Messagesને તમારા ફોન પરથી તમારી Chromebook પર ટેક્સ્ટને પ્રસારિત કરવાની મંજૂરી આપે છે</translation> <translation id="4768332406694066911">તમારી પાસે આ સંસ્થાઓના પ્રમાણપત્ર છે કે જે તમને ઓળખે છે</translation> @@ -3810,6 +3818,7 @@ <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" સિરીઅલ પોર્ટ સાથે કનેક્ટ કરવા માગે છે</translation> <translation id="4944310289250773232">આ પ્રમાણીકરણ સેવા <ph name="SAML_DOMAIN" /> દ્વારા હોસ્ટ કરવામાં આવે છે</translation> <translation id="4945439665401275950">ફિંગરપ્રિન્ટનું સેટઅપ કરવા માટે, તમારા બાળકને પાવર બટનને ટચ કરવા જણાવો. તમારા બાળકની ફિંગરપ્રિન્ટનો ડેટા સુરક્ષિત રીતે સ્ટોર કરવામાં આવે છે અને તે હંમેશાં આ <ph name="DEVICE_TYPE" />માં જ રહે છે.</translation> +<translation id="4946459324029651239">તમે માનક સુરક્ષા મેળવી રહ્યાં છો</translation> <translation id="495164417696120157">{COUNT,plural, =1{એક ફાઇલ}one{# ફાઇલ}other{# ફાઇલ}}</translation> <translation id="495170559598752135">ક્રિયાઓ</translation> <translation id="4953808748584563296">ડિફોલ્ટ નારંગી અવતાર</translation> @@ -4393,6 +4402,7 @@ <translation id="5575528586625653441">ડેમો નોંધણીની વિનંતીમાં સમસ્યા આવી.</translation> <translation id="557722062034137776">તમારા ડિવાઇસને ફરીથી સેટ કરવાથી તમારા Google એકાઉન્ટ અથવા આ એકાઉન્ટ સાથે સિંક કરાયેલા કોઈ પણ ડેટા પર અસર થશે નહીં. જોકે, તમારા ડિવાઇસ પર સ્થાનિક રીતે સાચવેલી બધી ફાઇલ ડિલીટ કરવામાં આવશે.</translation> <translation id="5578059481725149024">સ્વતઃ સાઇન-ઇન</translation> +<translation id="5581134892342029705"><ph name="LANGUAGE" />માં અનુવાદ પૂર્ણ થયો</translation> <translation id="558170650521898289">Microsoft Windows Hardware Driver Verification</translation> <translation id="5581972110672966454">ડોમેન સાથે ડિવાઇસને જોડી શકાતું નથી. કૃપા કરીને ફરીથી પ્રયાસ કરો અથવા તમારા ડિવાઇસના માલિક અથવા વ્યવસ્થાપકનો સંપર્ક કરો. ભૂલનો કોડ: <ph name="ERROR_CODE" />.</translation> <translation id="5582839680698949063">મુખ્ય મેનૂ</translation> @@ -5808,6 +5818,7 @@ <translation id="7057184853669165321">{NUM_MINS,plural, =1{સલામતી માટે તપાસ 1 મિનિટ અગાઉ કરવામાં આવી હતી}one{સલામતી માટે તપાસ {NUM_MINS} મિનિટ અગાઉ કરવામાં આવી હતી}other{સલામતી માટે તપાસ {NUM_MINS} મિનિટ અગાઉ કરવામાં આવી હતી}}</translation> <translation id="7057767408836081338">ઍપનો ડેટા મેળવવામાં નિષ્ફળ રહ્યાં, તેમ છતાં હજી પણ ઍપ ચલાવવાનો પ્રયાસ કરી રહ્યાં છીએ...</translation> <translation id="7058024590501568315">છુપાવવામાં આવેલું નેટવર્ક</translation> +<translation id="70582545822664495"><ph name="DEVICE_COUNT" />માંથી <ph name="DEVICE_INDEX" /> ડિવાઇસ, <ph name="DEVICE_NAME" /> નામનું માઉસ</translation> <translation id="7059858479264779982">સ્વતઃ-લોંચ સેટ કરો</translation> <translation id="7062222374113411376">ડેટા મોકલવાનું અને મેળવવાનું સમાપ્ત કરવા માટે તાજેતરમાં બંધ કરેલી સાઇટને મંજૂરી આપો (સુઝાવ આપીએ છીએ)</translation> <translation id="7063129466199351735">શોર્ટકટ્સની પ્રક્રિયા કરી રહ્યું છે...</translation> @@ -5971,6 +5982,7 @@ <translation id="7257173066616499747">Wi-Fi નેટવર્ક્સ</translation> <translation id="725758059478686223">પ્રિન્ટિંગ સેવા</translation> <translation id="7257666756905341374">તમે કૉપિ અને પેસ્ટ કરો એ ડેટાને વાંચો</translation> +<translation id="7258006747130724016"><ph name="DEVICE_COUNT" />માંથી <ph name="DEVICE_INDEX" /> ડિવાઇસ, <ph name="DEVICE_NAME" /> નામનો વીડિયો કૅમેરા</translation> <translation id="7258192266780953209">રૂપાંતરણો</translation> <translation id="7258225044283673131">ઍપ્લિકેશન ચાલી રહી નથી. ઍપ બંધ કરવા માટે "ફરજિયાત બંધ" પસંદ કરો.</translation> <translation id="7262004276116528033">આ સાઇન-ઇન સેવા <ph name="SAML_DOMAIN" /> દ્વારા હોસ્ટ થયેલી છે.</translation> @@ -6761,6 +6773,7 @@ <translation id="8037117027592400564">સિન્થેસાઇઝ કરેલ વાણીનો ઉપયોગ કરીને બધી બોલાયેલ ટેક્સ્ટને વાંચો</translation> <translation id="8037357227543935929">પૂછો (ડિફૉલ્ટ)</translation> <translation id="803771048473350947">ફાઇલ</translation> +<translation id="8038399858950372766"><ph name="DEVICE_COUNT" />માંથી <ph name="DEVICE_INDEX" /> ડિવાઇસ, <ph name="DEVICE_NAME" /> નામનું કીબોર્ડ</translation> <translation id="8041089156583427627">પ્રતિસાદ મોકલો</translation> <translation id="8042142357103597104">ટેક્સ્ટની અસ્પષ્ટતા</translation> <translation id="8044262338717486897"><ph name="LINUX_APP_NAME" /> ચાલી રહી નથી.</translation> @@ -6899,6 +6912,7 @@ <translation id="8168071266284693455">તમારા બુકમાર્ક, પાસવર્ડ, ઇતિહાસ જેવું બીજું ઘણું તમારા બધા ડિવાઇસ પર સિંક કરવામાં આવે છે</translation> <translation id="8168435359814927499">કન્ટેન્ટ</translation> <translation id="8169165065843881617">{NUM_TABS,plural, =1{વાંચન સૂચિમાં ટૅબ ઉમેરો}one{વાંચન સૂચિમાં ટૅબ ઉમેરો}other{વાંચન સૂચિમાં ટૅબ ઉમેરો}}</translation> +<translation id="8169849063724750395">ફરી ચાલુ કરો</translation> <translation id="8171334254070436367">બધા કાર્ડ છુપાવો</translation> <translation id="8174047975335711832">ઉપકરણ માહિતી</translation> <translation id="8174876712881364124">Google ડ્રાઇવમાં બૅકઅપ લો. કોઈપણ સમયે ડેટા સરળતાથી પાછો મેળવો અથવા ડિવાઇસ સ્વિચ કરો. આ બૅકઅપમાં ઍપનો ડેટા શામેલ હોય છે. બૅકઅપને Google પર અપલોડ કરવામાં આવે છે અને તમારા બાળકના Google એકાઉન્ટ પાસવર્ડનો ઉપયોગ કરીને એન્ક્રિપ્ટ કરવામાં આવે છે. <ph name="BEGIN_LINK1" />વધુ જાણો<ph name="END_LINK1" /></translation> @@ -6972,6 +6986,7 @@ <translation id="8249615410597138718">તમારા ડિવાઇસ પર મોકલો</translation> <translation id="8249672078237421304">તમે વાંચો છો તે ભાષામાં ન હોય તેવા પેજનો અનુવાદ કરવાનું ઑફર કરો</translation> <translation id="8251441930213048644">હવે રિફ્રેશ કરો</translation> +<translation id="8251509999076836464"><ph name="DEVICE_NAME" />સાથે જોડાણ કરી રહ્યાં છીએ</translation> <translation id="8251578425305135684">થંબનેલ દૂર કર્યું.</translation> <translation id="825238165904109940">હંમેશાં પૂર્ણ URLs બતાવો</translation> <translation id="8252569384384439529">અપલોડ કરી રહ્યાં છીએ...</translation> @@ -7209,9 +7224,11 @@ <translation id="8528074251912154910">ભાષાઓ ઉમેરો</translation> <translation id="8528962588711550376">સાઇન ઇન થઈ રહ્યું છે.</translation> <translation id="8529925957403338845">ફટાફટ ટિથરિંગ કનેક્શન નિષ્ફળ</translation> +<translation id="8531701051932785007">Safe Browsingમાં વધારેલી સુરક્ષા બંધ છે</translation> <translation id="8534656636775144800">અરેરે! ડોમેન સાથે જોડાવાનો પ્રયાસ કરતી વખતે કંઈક ખોટું થયું હતું. કૃપા કરીને ફરી પ્રયાસ કરો.</translation> <translation id="8535005006684281994">નેટસ્કેપ પ્રમાણપત્ર નવીકરણ URL</translation> <translation id="8536956381488731905">કી દબાવવા પર સાઉન્ડ</translation> +<translation id="8538718737588735385">ફરી ચાલુ કરો</translation> <translation id="8539727552378197395">ના (ફક્ત Http)</translation> <translation id="8539766201049804895">અપગ્રેડ કરો</translation> <translation id="8540136935098276800">સાચી રીતે ફોર્મેટ કરેલું URL દાખલ કરો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index fa0a45fe2..6c2e309 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -6804,6 +6804,7 @@ <translation id="8054563304616131773">कृपया मान्य ईमेल पता डालें</translation> <translation id="8054883179223321715">वीडियो वाली कुछ खास साइटों के लिए उपलब्ध</translation> <translation id="8054921503121346576">USB कीबोर्ड कनेक्ट किया गया</translation> +<translation id="8057414620575339583">जानकारी खोजने के लिए, स्क्रीन की बाईं ओर दिखने वाला पैनल</translation> <translation id="8058655154417507695">समाप्ति वर्ष</translation> <translation id="8058986560951482265">जर्की (रुक-रुककर)</translation> <translation id="8059417245945632445">&उपकरणों का परीक्षण करें</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 4d62c865..7ee5201 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -6805,6 +6805,7 @@ <translation id="8054563304616131773">Unesite važeću e-adresu</translation> <translation id="8054883179223321715">Dostupno za određene web-lokacije za videozapise</translation> <translation id="8054921503121346576">USB tipkovnica povezana</translation> +<translation id="8057414620575339583">Bočno pretraživanje</translation> <translation id="8058655154417507695">Godina isteka</translation> <translation id="8058986560951482265">Isprekidano</translation> <translation id="8059417245945632445">&Provjeri uređaje</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index b5c6fca..473a9af5 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -6804,6 +6804,7 @@ <translation id="8054563304616131773">Մուտքագրեք վավեր էլ․ հասցե</translation> <translation id="8054883179223321715">Սարքը համատեղելի է միայն որոշակի կայքերի հետ</translation> <translation id="8054921503121346576">USB ստեղնաշարը միացված է</translation> +<translation id="8057414620575339583">Որոնման կողագոտի</translation> <translation id="8058655154417507695">Ժամկետի սպառման տարեթիվը</translation> <translation id="8058986560951482265">Ցնցվող</translation> <translation id="8059417245945632445">&Հետազոտել սարքերը</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index a8eea407..181571e 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -1684,6 +1684,7 @@ <translation id="2707024448553392710">Компонентті жүктеу</translation> <translation id="270921614578699633">Орташадан астам</translation> <translation id="2709516037105925701">Автотолтыру</translation> +<translation id="2710014902399506864">Жаңа телефон қосу</translation> <translation id="2710101514844343743">Пайдалану және диагностика деректері</translation> <translation id="271033894570825754">Жаңа</translation> <translation id="2712173769900027643">Рұқсат сұрау</translation> @@ -2042,6 +2043,7 @@ <translation id="3055590424724986000">Таңдалған провайдерді пайдалану</translation> <translation id="3058498974290601450">Синхрондау функциясын кез келген уақытта "Параметрлер" бөлімінен қоса аласыз.</translation> <translation id="3058517085907878899">Құрылғы атауы</translation> +<translation id="3059195548603439580">Жүйе құрылғыларын іздеп жатырсыз ба? Келесіге бетке өтіңіз:</translation> <translation id="3060379269883947824">Select to Speak функциясын қосу</translation> <translation id="3060952009917586498">Құрылғы тілін өзгертіңіз. Қазір <ph name="LANGUAGE" /> тілі қолданылып жатыр.</translation> <translation id="3060987956645097882">Телефоныңызбен байланыс орнату мүмкін болмады. Телефоныңыз жаныңызда, құлпы ашық және Bluetooth бен Wi-Fi қосылып тұруы керек.</translation> @@ -2699,6 +2701,7 @@ <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{USB құрылғысы арқылы байланысу}other{# USB құрылғысы арқылы байланысу}}</translation> <translation id="3764974059056958214">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> құрылғысына <ph name="ATTACHMENTS" /> жіберілуде.}other{<ph name="DEVICE_NAME" /> құрылғысына <ph name="ATTACHMENTS" /> жіберілуде.}}</translation> <translation id="3765246971671567135">Офлайн демо режиміндегі саясат оқылмады.</translation> +<translation id="3766115177661377251">Жаңа құрылғыға трансляциялау</translation> <translation id="3766811143887729231"><ph name="REFRESH_RATE" /> Гц</translation> <translation id="377050016711188788">Балмұздақ</translation> <translation id="3771290962915251154">Ата-ана бақылауы қосылып тұрғандықтан, бұл параметр өшірілді.</translation> @@ -3487,6 +3490,7 @@ <translation id="4590324241397107707">Дерекқор жады</translation> <translation id="4592891116925567110">Стилуспен сурет салу қолданбасы</translation> <translation id="4593021220803146968">&<ph name="URL" /> мекенжайына өту</translation> +<translation id="4594577641390224176">Жүйе туралы бетті іздеп жатырсыз ба? Келесіге бетке өтіңіз:</translation> <translation id="4595560905247879544">Қолданбалар мен кеңейтімдерді басқарушы (<ph name="CUSTODIAN_NAME" />) ғана өзгерте алады.</translation> <translation id="4596295440756783523">Файлда осы серверлерді анықтайтын сертификаттарыңыз бар</translation> <translation id="4598556348158889687">Жадты басқару</translation> @@ -4873,6 +4877,7 @@ <translation id="6085886413119427067">Қорғалған байланыс арқылы веб-сайттарға қосылу әдісін анықтайды.</translation> <translation id="6086004606538989567">Растаған аккаунтыңыздың бұл құрылғыны пайдалануға рұқсаты жоқ.</translation> <translation id="6086846494333236931">Әкімші орнатқан</translation> +<translation id="6087746524533454243">Браузер туралы бетті іздеп жатырсыз ба? Келесіге бетке өтіңіз:</translation> <translation id="6087960857463881712">Сүйкімді бет</translation> <translation id="608912389580139775">Бұл бетті оқу тізіміне қосу үшін "Бетбелгі" белгішесін басыңыз.</translation> <translation id="6091761513005122595">Ортақ файл орнатылды.</translation> @@ -4971,6 +4976,7 @@ <translation id="6198102561359457428">Шығып, қайта кіріңіз…</translation> <translation id="6198252989419008588">PIN кодын өзгерту</translation> <translation id="6200047250927636406">Файлды қабылдамау</translation> +<translation id="6200151268994853226">Кеңейтімді басқару</translation> <translation id="6201608810045805374">Бұл аккаунт өшірілсін бе?</translation> <translation id="6202304368170870640">Құрылғыларға кіру немесе құлпын ашу үшін PIN кодыңызды пайдалануыңызға болады.</translation> <translation id="6206311232642889873">Кескінді көші&ру</translation> @@ -5257,6 +5263,7 @@ <translation id="6497789971060331894">Тінтуірмен кері айналдыру</translation> <translation id="6498249116389603658">&Барлық тілдер</translation> <translation id="6499143127267478107">Прокси сценарийіндегі хост анықталуда…</translation> +<translation id="6499764981457476645">Маңайда ешқандай құрылғы табылмады</translation> <translation id="6501086852992132091"><ph name="APP_ORIGIN" /> мына файлды ашқысы келеді:</translation> <translation id="6501957628055559556">Барлық контейнер</translation> <translation id="650266656685499220">Альбомдарды жасау үшін Google Photos қолданбасына өтіңіз.</translation> @@ -5722,6 +5729,7 @@ <translation id="6979440798594660689">Дыбысын өшіру (әдепкі)</translation> <translation id="6979737339423435258">Барлық уақыт</translation> <translation id="6981553172137913845">Интернетті құпия пайдаланғыңыз келсе, инкогнито терезесін ашуға болады. Ол үшін нүктелер белгішесінің мәзірін басыңыз</translation> +<translation id="6981761993313539853">Bluetooth құрылғыңыз жұптау режимінде және маңайда болсын. Сенімді құрылғылармен ғана жұптаңыз. <ph name="BEGIN_LINK_LEARN_MORE" />Толығырақ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Арнайы мүмкіндіктер</translation> <translation id="6983507711977005608">Жылдам тетеринг желісін ажырату</translation> <translation id="6983783921975806247">Тіркелген OID</translation> @@ -6629,6 +6637,7 @@ <translation id="7898725031477653577">Әрқашан аудару</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7901914889562552258">Бет көрсеткіштері арқылы Chrome жақсара түседі</translation> +<translation id="7903290522161827520">Браузер компоненттерін іздеп жатырсыз ба? Келесіге бетке өтіңіз:</translation> <translation id="7903345046358933331">Бет жауап бермеді. Оның жауап беруін күтуіңізге немесе жабуыңызға болады.</translation> <translation id="7903742244674067440">Файлда осы сертификат беруші орталықтарды анықтайтын сертификаттарыңыз бар</translation> <translation id="7903925330883316394">Утилита: <ph name="UTILITY_TYPE" /></translation> @@ -7004,6 +7013,7 @@ <translation id="8271268254812352141">Тінтуірдің оң жақ түймесін басып немесе мәтінді басып тұрып, мәтіннің анықтамасын, аудармасын көруге немесе өлшем бірліктерін ауыстыруға болады. Аударма тілдерін <ph name="LINK_BEGIN" />веб-сайт тілдері<ph name="LINK_END" /> бөлімінде реттейсіз.</translation> <translation id="8271379370373330993">Ата-ана, келесі қадамдарды сіз орындауыңыз керек. Аккаунтты реттеп болғасын, <ph name="DEVICE_TYPE" /> құрылғысын балаға қайтара аласыз.</translation> <translation id="8272443605911821513">"Қосымша құралдар" мәзіріндегі кеңейтімдерді басу арқылы кеңейтімдерді басқарыңыз.</translation> +<translation id="8272677921396592934">QR кодын сканерлеу үшін камераны пайдалану</translation> <translation id="8274332263553132018">Файлды трансляциялау</translation> <translation id="8274921654076766238">Ұлғайтқышты пернетақта көмегімен қозғау</translation> <translation id="8274924778568117936">Жаңарту аяқталмайынша <ph name="DEVICE_TYPE" /> құрылғыңызды өшірмеңіз немесе жаппаңыз. <ph name="DEVICE_TYPE" /> құрылғыңыз орнату аяқталғаннан кейін қайта қосылады.</translation> @@ -7683,6 +7693,7 @@ <translation id="9004754973617721124"><ph name="SITE_NAME" />, оның астындағы барлық сайт және оның орнатылған қолданбалары үшін сайт деректері мен рұқсаттары өшірілсін бе?</translation> <translation id="9004952710076978168">Белгісіз принтерге арналған хабарландыру алынды.</translation> <translation id="9008201768610948239">Елемеу</translation> +<translation id="9008201858626224558"><ph name="SUBPAGE_TITLE" /> мәліметтер бетіндегі артқа түймесі</translation> <translation id="9009369504041480176">Жүктелуде (<ph name="PROGRESS_PERCENT" />%)…</translation> <translation id="9009708085379296446">Осы бетті өзгерткіңіз келді ме?</translation> <translation id="9011163749350026987">Белгішені әрқашан көрсету</translation> @@ -7865,6 +7876,7 @@ <translation id="917510707618656279">Сайт Bluetooth құрылғыларын пайдаланғысы келгенде, рұқсат сұраy</translation> <translation id="9176476835295860688">Пайдаланылуы және диагностикасы туралы деректерді жіберу. Бұл құрылғыдан Google-ға диагностика, құрылғы мен қолданбаны пайдалану деректері автоматты түрде жіберіліп тұрады. Олар жүйе мен қолданбаның тұрақты жұмыс істеуіне және басқа да жақсартулар енгізуге көмектеседі. Кейбір жиынтық деректер Google қолданбаларын жетілдіруге және Android әзірлеушілері сияқты серіктестердің жұмысына көмектеседі. Бұл <ph name="BEGIN_LINK1" />параметрді<ph name="END_LINK1" /> иесі орнатқан. Егер "Интернет пен қолданбаларды пайдаланудың қосымша тарихы" параметрі қосулы болса, бұл деректер сіздің Google аккаунтыңызға сақталуы мүмкін. <ph name="BEGIN_LINK2" />Толығырақ<ph name="END_LINK2" /></translation> <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – Bluetooth құрылғысы қосылды</translation> +<translation id="9178061802301856367">Кіру деректерін жою</translation> <translation id="9179524979050048593">Кіру экранындағы пайдаланушы аты</translation> <translation id="9180281769944411366">Бұл процесс бірнеше минутқа созылуы мүмкін. Linux контейнері іске қосылуда.</translation> <translation id="9180380851667544951">Сайт экраныңызды бөлісе алады</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 90b0880e..68e7e37 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -6797,6 +6797,7 @@ <translation id="8054563304616131773">ದಯವಿಟ್ಟು ಮಾನ್ಯವಾದ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ.</translation> <translation id="8054883179223321715">ನಿರ್ದಿಷ್ಟ ವೀಡಿಯೊ ಸೈಟ್ಗಳಿಗೆ ಲಭ್ಯವಿದೆ</translation> <translation id="8054921503121346576">USB ಕೀಬೋರ್ಡ್ ಸಂಪರ್ಕಗೊಂಡಿದೆ</translation> +<translation id="8057414620575339583">ಸೈಡ್ ಸರ್ಚ್</translation> <translation id="8058655154417507695">ಮುಕ್ತಾಯದ ವರ್ಷ</translation> <translation id="8058986560951482265">ಜೆರ್ಕಿ</translation> <translation id="8059417245945632445">&ಸಾಧನಗಳನ್ನು ಪರಿಶೀಲಿಸಿ</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index 90b0f57..dcb89421 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -2524,6 +2524,7 @@ <translation id="3557101512409028104">Family Link аркылуу вебсайттарга жана түзмөктү колдонуу убакытына чектөөлөрдү коюу</translation> <translation id="3559262020195162408">Түзмөккө саясат орнотулбай койду.</translation> <translation id="3559533181353831840">Болжол менен <ph name="TIME_LEFT" /> калды</translation> +<translation id="3559697822483154494">Экранды бөлүү жана иш такталарды которуу сыяктуу аракеттер ырасталганда, дирилдейт.</translation> <translation id="3560034655160545939">&Орфографиялык текшерүү</translation> <translation id="3562423906127931518">Бир нече мүнөткө созулушу мүмкүн. Linux контейнери жөндөлүүдө.</translation> <translation id="3562655211539199254">Chrome'догу акыркы өтмөктөрдү телефонуңуздан көрө аласыз</translation> @@ -4925,6 +4926,7 @@ <translation id="6112931163620622315">Телефонуңузду текшериңиз</translation> <translation id="6113434369102685411">Chrome серепчиси менен <ph name="DEVICE_TYPE" /> Жүргүзгүчү үчүн демейки издөө каражатын жөндөңүз</translation> <translation id="6113942107547980621">Smart Lock'ту колдонуу үчүн телефонуңуздагы негизги колдонуучунун профилин которуштуруңуз</translation> +<translation id="611684075852771314">Бул таржымалдар Менин файлдарымда сакталган:</translation> <translation id="6116921718742659598">Тил жана текст киргизүү жөндөөлөрүн өзгөртүү</translation> <translation id="6119927814891883061">Түзмөктүн аталышын <ph name="DEVICE_NAME" /> деп коюу</translation> <translation id="6120205520491252677">Бул бетти баштоо экранына кадап коюу…</translation> @@ -5701,6 +5703,7 @@ <translation id="6930036377490597025">Тышкы коопсуздук ачкычы же орнотулган сенсор</translation> <translation id="6930161297841867798">{NUM_EXTENSIONS,plural, =1{Кеңейтүү четке кагылды}other{# кеңейтүү четке кагылды}}</translation> <translation id="6930321203306643451">Жаңыртуу аягына чыкты</translation> +<translation id="6931690462168617033">Чыкылдатуу күчү</translation> <translation id="6935286146439255109">Кагаз тактасы жок</translation> <translation id="693807610556624488">"<ph name="DEVICE_NAME" />" түзмөгүнө дайындарды жазып жатканда атрибут өтө узун болуп кетти.</translation> <translation id="6938386202199793006">1 сакталган принтериңиз бар.</translation> @@ -6833,6 +6836,7 @@ <translation id="8064279191081105977"><ph name="GROUP_NAME" /> тобу – <ph name="GROUP_CONTENTS" /> – <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">Байланыш диалогу</translation> <translation id="8069615408251337349">Google Булуттагы Принтер</translation> +<translation id="8070662218171013510">Сенсордук жооп</translation> <translation id="8071432093239591881">Сүрөт форматында басып чыгаруу</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />Колдонмо дайындарына иштеп чыгуучунун жөндөөлөрүнүн негизинде сакталган бардык дайындар, анын ичинде байланыштар, билдирүүлөр жана сүрөттөр сыяктуу дайындар кириши мүмкүн.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Дайындардын камдык көчүрмөлөрү балаңыздын Drive сактагычынан орун ээлебейт.<ph name="END_PARAGRAPH2" />
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 56b538e..ce55bb5 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -6810,6 +6810,7 @@ <translation id="8054563304616131773">Įveskite tinkamą el. pašto adresą</translation> <translation id="8054883179223321715">Pasiekiama konkrečioms vaizdo įrašų svetainėms</translation> <translation id="8054921503121346576">USB klaviatūra prijungta</translation> +<translation id="8057414620575339583">Šoninė paieška</translation> <translation id="8058655154417507695">Galiojimo laiko pabaigos metai</translation> <translation id="8058986560951482265">Trūkčioja</translation> <translation id="8059417245945632445">&Tikrinti įrenginius</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index c19b813..70a21b0 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -2508,6 +2508,7 @@ <translation id="3557101512409028104">Family Link ഉപയോഗിച്ച് വെബ്സൈറ്റ് നിയന്ത്രണങ്ങളും സ്ക്രീൻ സമയ പരിധികളും സജ്ജീകരിക്കുക</translation> <translation id="3559262020195162408">ഉപകരണത്തിൽ നയം ഇൻസ്റ്റാൾ ചെയ്യാനായില്ല.</translation> <translation id="3559533181353831840">ഏകദേശം <ph name="TIME_LEFT" /> ശേഷിക്കുന്നു</translation> +<translation id="3559697822483154494">സ്ക്രീൻ വിഭജന മോഡും സ്വിച്ചിംഗ് ഡെസ്ക്കുകളും പോലുള്ള പ്രവർത്തനങ്ങൾക്ക് വൈബ്രേഷൻ സ്ഥിരീകരണം സ്വീകരിക്കുക.</translation> <translation id="3560034655160545939">&അക്ഷരത്തെറ്റ് പരിശോധന</translation> <translation id="3562423906127931518">ഈ പ്രക്രിയയ്ക്ക് കുറച്ച് സമയമെടുത്തേക്കാം. Linux കണ്ടെയ്നർ സജ്ജീകരിക്കുന്നു.</translation> <translation id="3562655211539199254">നിങ്ങളുടെ ഫോണിലെ അടുത്തിടെയുള്ള Chrome ടാബുകൾ കാണുക</translation> @@ -4909,6 +4910,7 @@ <translation id="6112931163620622315">നിങ്ങളുടെ ഫോൺ പരിശോധിക്കുക</translation> <translation id="6113434369102685411">Chrome ബ്രൗസറിനും <ph name="DEVICE_TYPE" /> ലോഞ്ചറിനും നിങ്ങളുടെ ഡിഫോൾട്ട് തിരയൽ യന്ത്രം സജ്ജീകരിക്കുക</translation> <translation id="6113942107547980621">Smart Lock ഉപയോഗിക്കാൻ നിങ്ങളുടെ ഫോണിലെ പ്രാഥമിക ഉപയോക്തൃ പ്രൊഫൈലിലേക്ക് സ്വിച്ച് ചെയ്യുക</translation> +<translation id="611684075852771314">ഈ ലോഗുകൾ ഇനിപ്പറയുന്നതായി 'എന്റെ ഫയലുകൾ' എന്നതിൽ സംരക്ഷിച്ചിരിക്കുന്നു</translation> <translation id="6116921718742659598">ഭാഷയും ഇൻപുട്ട് ക്രമീകരണങ്ങളും മാറ്റുക</translation> <translation id="6119927814891883061">ഉപകരണത്തിന് <ph name="DEVICE_NAME" /> എന്ന് പേര് നൽകുക</translation> <translation id="6120205520491252677">ഈ പേജ് ആരംഭ സ്ക്രീനിലേക്ക് പിൻ ചെയ്യുക...</translation> @@ -5685,6 +5687,7 @@ <translation id="6930036377490597025">ബാഹ്യ സുരക്ഷാ കീ അല്ലെങ്കിൽ അന്തർനിർമ്മിത സെൻസർ</translation> <translation id="6930161297841867798">{NUM_EXTENSIONS,plural, =1{ഒരു വിപുലീകരണം നിരസിച്ചു}other{# വിപുലീകരണങ്ങൾ നിരസിച്ചു}}</translation> <translation id="6930321203306643451">അപ്ഗ്രേഡ് പൂർത്തിയായി</translation> +<translation id="6931690462168617033">ക്ലിക്ക് സെൻസിറ്റിവിറ്റി</translation> <translation id="6935286146439255109">പേപ്പർ ട്രേ കാണുന്നില്ല</translation> <translation id="693807610556624488">എഴുതൽ പ്രവർത്തനം ഇനി പറയുന്നതിലേക്കുള്ള ആട്രിബ്യൂട്ടിന്റെ പരമാവധി ദൈർഘ്യം കവിയുന്നു : "<ph name="DEVICE_NAME" />".</translation> <translation id="6938386202199793006">നിങ്ങൾക്ക് സംരക്ഷിച്ചിരിക്കുന്ന ഒരു പ്രിന്റർ ഉണ്ട്.</translation> @@ -6802,6 +6805,7 @@ <translation id="8054563304616131773">സാധുതയുള്ള ഒരു ഇമെയില്വിലാസം നല്കുക.</translation> <translation id="8054883179223321715">നിർദ്ദിഷ്ട വീഡിയോ സൈറ്റുകൾക്ക് ലഭ്യമാണ്</translation> <translation id="8054921503121346576">USB കീബോർഡ് കണക്റ്റുചെയ്തു</translation> +<translation id="8057414620575339583">സൈഡ് സെർച്ച്</translation> <translation id="8058655154417507695">കാലാവധി കഴിയുന്ന വർഷം</translation> <translation id="8058986560951482265">ചാഞ്ചാട്ടമുള്ളത്</translation> <translation id="8059417245945632445">&ഉപകരണങ്ങൾ പരിശോധിക്കുക</translation> @@ -6816,6 +6820,7 @@ <translation id="8064279191081105977">ഗ്രൂപ്പ് <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> - <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">കണക്ഷൻ ഡയലോഗ്</translation> <translation id="8069615408251337349">Google Cloud Print</translation> +<translation id="8070662218171013510">തൊട്ടുളള ഫീഡ്ബാക്ക്</translation> <translation id="8071432093239591881">ചിത്രമായി പ്രിന്റ് ചെയ്യുക</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />ആപ്പ് ഡാറ്റ എന്നത്, കോൺടാക്റ്റുകൾ, സന്ദേശങ്ങൾ, ഫോട്ടോകൾ എന്നിവ പോലെ രഹസ്യ സ്വഭാവമുള്ള ഡാറ്റ ഉൾപ്പെടെ ഒരു ആപ്പ് സംരക്ഷിച്ച (ഡെവലപ്പർ ക്രമീകരണം അടിസ്ഥാനമാക്കി) ഏത് ഡാറ്റയുമാകാം.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />ബാക്കപ്പ് ഡാറ്റ, നിങ്ങളുടെ കുട്ടിയുടെ ഡ്രൈവ് സ്റ്റോറേജിലെ ഇടം കുറയ്ക്കില്ല.<ph name="END_PARAGRAPH2" />
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 5b08002..1036d08 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -6814,6 +6814,7 @@ <translation id="8054563304616131773">Хүчинтэй имэйл хаягаа оруулна уу</translation> <translation id="8054883179223321715">Тодорхой видео сайтуудад боломжтой</translation> <translation id="8054921503121346576">USB гар холбогдсон байна.</translation> +<translation id="8057414620575339583">Хажуугийн хайлт</translation> <translation id="8058655154417507695">Дуусах он</translation> <translation id="8058986560951482265">Тасалддаг</translation> <translation id="8059417245945632445">& Төхөөрөмжүүдийг хянан, шалгах</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 1e38424..3ff9741 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -6802,6 +6802,7 @@ <translation id="8054563304616131773">कृपया एक वैध ईमेल ॲड्रेस एंटर करा</translation> <translation id="8054883179223321715">विशिष्ट व्हिडिओ साइटसाठी उपलब्ध</translation> <translation id="8054921503121346576">USB कीबोर्ड कनेक्ट झाला</translation> +<translation id="8057414620575339583">बाजूला असलेला शोध</translation> <translation id="8058655154417507695">कालबाह्य होण्याचे वर्ष</translation> <translation id="8058986560951482265">अस्थिर आहे</translation> <translation id="8059417245945632445">&डिव्हाइसेसचा निरीक्षण करा</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 6a9d6e666..f18f77f 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -250,6 +250,7 @@ <translation id="1244265436519979884">Linux-herstel wordt momenteel uitgevoerd</translation> <translation id="1244303850296295656">Fout met extensie</translation> <translation id="1246863218384630739">Kan <ph name="VM_NAME" /> niet installeren: image-URL heeft een <ph name="HTTP_ERROR" />-foutcode geretourneerd. Neem contact op met je beheerder.</translation> +<translation id="1247071602516579380">Apparaat <ph name="DEVICE_INDEX" /> van <ph name="DEVICE_COUNT" />, tablet met de naam <ph name="DEVICE_NAME" /></translation> <translation id="1251366534849411931">Verwachte openingsaccolade <ph name="ERROR_LINE" /></translation> <translation id="1251480783646955802">Hiermee wis je <ph name="TOTAL_USAGE" /> van de gegevens die zijn opgeslagen door sites en geïnstalleerde apps</translation> <translation id="1251578593170406502">Scannen naar mobiele gegevensnetwerken...</translation> @@ -436,6 +437,7 @@ <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> geselecteerd</translation> <translation id="1442851588227551435">Actief Kerberos-ticket instellen</translation> <translation id="1444628761356461360">Deze instelling wordt beheerd door de eigenaar van het apparaat, <ph name="OWNER_EMAIL" />.</translation> +<translation id="1445005312224723356">Apparaat <ph name="DEVICE_INDEX" /> van <ph name="DEVICE_COUNT" />, telefoon met de naam <ph name="DEVICE_NAME" /></translation> <translation id="144518587530125858">Kan '<ph name="IMAGE_PATH" />' niet laden voor thema.</translation> <translation id="1449191289887455076">Druk nog een keer op <ph name="CURRENTKEY" /> om de toewijzing te bevestigen en <ph name="RESPONSE" />.</translation> <translation id="1451375123200651445">Webpagina, één bestand</translation> @@ -859,6 +861,7 @@ <translation id="1855079636134697549">Camera staat aan</translation> <translation id="1856715684130786728">Locatie toevoegen...</translation> <translation id="1858585891038687145">Dit certificaat vertrouwen voor het identificeren van softwareontwikkelaars</translation> +<translation id="1859787252990099899">Apparaat <ph name="DEVICE_INDEX" /> van <ph name="DEVICE_COUNT" />, onbekend apparaat met de naam <ph name="DEVICE_NAME" /></translation> <translation id="1861262398884155592">Deze map is leeg</translation> <translation id="1862311223300693744">Heb je speciale VPN-, proxy-, firewall- of NAS-software geïnstalleerd?</translation> <translation id="1863182668524159459">Geen seriële poorten gevonden</translation> @@ -1233,6 +1236,7 @@ <translation id="2242687258748107519">Bestandsinformatie</translation> <translation id="2246549592927364792">Afbeeldingsbeschrijvingen ophalen van Google?</translation> <translation id="2247738527273549923">Je apparaat wordt beheerd door je organisatie</translation> +<translation id="2249061317998743208">Apparaat <ph name="DEVICE_INDEX" /> van <ph name="DEVICE_COUNT" />, gamecontroller met de naam <ph name="DEVICE_NAME" /></translation> <translation id="2249111429176737533">Openen als venster met tabbladen</translation> <translation id="2249605167705922988">bijv. 1-5, 8, 11-13</translation> <translation id="2251218783371366160">Openen met systeemviewer</translation> @@ -1990,6 +1994,7 @@ <translation id="3007771295016901659">Tabblad dupliceren</translation> <translation id="3008232374986381779">Voer Linux-tools, -editors en -IDE's op je <ph name="DEVICE_TYPE" /> uit. <ph name="LINK_BEGIN" />Meer informatie<ph name="LINK_END" /></translation> <translation id="3008272652534848354">Rechten resetten</translation> +<translation id="3008396025115884998">Apparaat <ph name="DEVICE_INDEX" /> van <ph name="DEVICE_COUNT" />, audioapparaat met de naam <ph name="DEVICE_NAME" /></translation> <translation id="3008694618228964140">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> vereist dat je vandaag verbinding maakt met wifi om een update te downloaden. Je kunt de update ook downloaden via een verbinding met datalimiet (er kunnen kosten van toepassing zijn).}other{<ph name="MANAGER" /> vereist dat je vóór de deadline verbinding maakt met wifi en een update downloadt. Je kunt de update ook downloaden via een verbinding met datalimiet (er kunnen kosten van toepassing zijn).}}</translation> <translation id="3009300415590184725">Weet je zeker dat je het instellen van een mobiele dataservice wilt annuleren?</translation> <translation id="3009779501245596802">Geïndexeerde databases</translation> @@ -2295,6 +2300,7 @@ <translation id="3348038390189153836">Verwisselbaar apparaat gedetecteerd</translation> <translation id="3348131053948466246">Voorgestelde emoji's. Druk op de pijl-omhoog of pijl-omlaag om te navigeren en druk op Enter om het geselecteerde item in te voegen.</translation> <translation id="3349933790966648062">Geheugenvoetafdruk</translation> +<translation id="3354972872297836698">Kan niet koppelen met apparaat <ph name="DEVICE_NAME" />, selecteer het apparaat om het opnieuw te proberen</translation> <translation id="3355936511340229503">Verbindingsfout</translation> <translation id="3356580349448036450">Voltooid</translation> <translation id="3359256513598016054">Beleidsbeperkingen voor certificaat</translation> @@ -3125,6 +3131,7 @@ <translation id="4200689466366162458">Aangepaste woorden</translation> <translation id="4200983522494130825">Nieuw &tabblad</translation> <translation id="4201546031411513170">Je kunt altijd in de instellingen bepalen wat je wilt synchroniseren.</translation> +<translation id="4202417625268941299">Met de uitgebreide versie van Safe Browsing krijg je de sterkste beveiliging van Chrome</translation> <translation id="420283545744377356">Screensaver uitzetten</translation> <translation id="4206144641569145248">Alien</translation> <translation id="4206323443866416204">Feedbackrapport</translation> @@ -3630,6 +3637,7 @@ <translation id="4759238208242260848">Downloads</translation> <translation id="4761104368405085019">Je microfoon gebruiken</translation> <translation id="4762718786438001384">Er is zeer weinig schijfruimte beschikbaar op het apparaat</translation> +<translation id="4762898026821161650">Apparaat <ph name="DEVICE_INDEX" /> van <ph name="DEVICE_COUNT" />, computer met de naam <ph name="DEVICE_NAME" /></translation> <translation id="4763408175235639573">De volgende cookies zijn opgeslagen toen je deze pagina bekeek</translation> <translation id="4765582662863429759">Hiermee kan Android Berichten sms'jes van je telefoon naar je Chromebook doorsturen</translation> <translation id="4768332406694066911">Je hebt certificaten van deze organisaties waarmee je wordt geïdentificeerd</translation> @@ -3809,6 +3817,7 @@ <translation id="4943691134276646401">'<ph name="CHROME_EXTENSION_NAME" />' wil verbinden met een seriële poort</translation> <translation id="4944310289250773232">Deze verificatieservice wordt gehost door <ph name="SAML_DOMAIN" /></translation> <translation id="4945439665401275950">Laat je kind de aan/uit-knop aanraken om een vingerafdruk in te stellen. De vingerafdrukgegevens van je kind worden beveiligd opgeslagen en blijven uitsluitend op de <ph name="DEVICE_TYPE" /> staan.</translation> +<translation id="4946459324029651239">Je krijgt standaardbeveiliging</translation> <translation id="495164417696120157">{COUNT,plural, =1{een bestand}other{# bestanden}}</translation> <translation id="495170559598752135">Acties</translation> <translation id="4953808748584563296">Standaard oranje avatar</translation> @@ -4392,6 +4401,7 @@ <translation id="5575528586625653441">Er is een probleem opgetreden met een demoregistratieverzoek.</translation> <translation id="557722062034137776">Als je je apparaat opnieuw instelt, heeft dit geen effect op je Google-accounts of gegevens die zijn gesynchroniseerd met deze accounts. Alle bestanden die lokaal op je apparaat zijn opgeslagen, worden wel verwijderd.</translation> <translation id="5578059481725149024">Automatisch inloggen</translation> +<translation id="5581134892342029705">Vertaling naar <ph name="LANGUAGE" /> klaar</translation> <translation id="558170650521898289">Controle van Windows-apparaatstuurprogramma's</translation> <translation id="5581972110672966454">Kan het apparaat niet aan het domein koppelen. Probeer het opnieuw of neem contact op met de eigenaar of beheerder van het apparaat. Foutcode: <ph name="ERROR_CODE" />.</translation> <translation id="5582839680698949063">Hoofdmenu</translation> @@ -5805,6 +5815,7 @@ <translation id="7057184853669165321">{NUM_MINS,plural, =1{Veiligheidscheck is 1 minuut geleden uitgevoerd}other{Veiligheidscheck is {NUM_MINS} minuten geleden uitgevoerd}}</translation> <translation id="7057767408836081338">App-gegevens kunnen niet worden opgehaald. Er wordt toch geprobeerd de app uit te voeren.</translation> <translation id="7058024590501568315">Verborgen netwerk</translation> +<translation id="70582545822664495">Apparaat <ph name="DEVICE_INDEX" /> van <ph name="DEVICE_COUNT" />, muis met de naam <ph name="DEVICE_NAME" /></translation> <translation id="7059858479264779982">Instellen op automatisch starten</translation> <translation id="7062222374113411376">Toestaan dat onlangs gesloten sites het verzenden en ontvangen van gegevens voltooien (aanbevolen)</translation> <translation id="7063129466199351735">Snelle links verwerken...</translation> @@ -5968,6 +5979,7 @@ <translation id="7257173066616499747">Wifi-netwerken</translation> <translation id="725758059478686223">Afdrukservice</translation> <translation id="7257666756905341374">Gegevens lezen die je kopieert en plakt</translation> +<translation id="7258006747130724016">Apparaat <ph name="DEVICE_INDEX" /> van <ph name="DEVICE_COUNT" />, videocamera met de naam <ph name="DEVICE_NAME" /></translation> <translation id="7258192266780953209">Transformaties</translation> <translation id="7258225044283673131">De app reageert niet. Selecteer 'Nu sluiten' om de app te sluiten.</translation> <translation id="7262004276116528033">Deze inlogservice wordt gehost door <ph name="SAML_DOMAIN" />.</translation> @@ -6762,6 +6774,7 @@ <translation id="8037117027592400564">Alle tekst lezen die wordt gesproken met gesynthetiseerde spraak</translation> <translation id="8037357227543935929">Vragen (standaard)</translation> <translation id="803771048473350947">Archief</translation> +<translation id="8038399858950372766">Apparaat <ph name="DEVICE_INDEX" /> van <ph name="DEVICE_COUNT" />, toetsenbord met de naam <ph name="DEVICE_NAME" /></translation> <translation id="8041089156583427627">Feedback sturen</translation> <translation id="8042142357103597104">Ondoorzichtigheid van tekst</translation> <translation id="8044262338717486897"><ph name="LINUX_APP_NAME" /> reageert niet.</translation> @@ -6901,6 +6914,7 @@ <translation id="8168071266284693455">Je bookmarks, wachtwoorden, geschiedenis en meer zijn gesynchroniseerd op al je apparaten</translation> <translation id="8168435359814927499">Content</translation> <translation id="8169165065843881617">{NUM_TABS,plural, =1{Tabblad toevoegen aan leeslijst}other{Tabbladen toevoegen aan leeslijst}}</translation> +<translation id="8169849063724750395">Weer aanzetten</translation> <translation id="8171334254070436367">Alle kaarten verbergen</translation> <translation id="8174047975335711832">Apparaatgegevens</translation> <translation id="8174876712881364124">Een back-up maken in Google Drive. Gemakkelijk gegevens herstellen of op elk gewenst moment van apparaat wisselen. Deze back-up omvat app-gegevens. Back-ups worden geüpload naar Google en versleuteld met het wachtwoord van het Google-account van je kind. <ph name="BEGIN_LINK1" />Meer informatie<ph name="END_LINK1" /></translation> @@ -6974,6 +6988,7 @@ <translation id="8249615410597138718">Verzenden naar je apparaten</translation> <translation id="8249672078237421304">Aanbieden om pagina's te vertalen die in een voor jou onbekende taal zijn</translation> <translation id="8251441930213048644">Nu vernieuwen</translation> +<translation id="8251509999076836464">Koppelen met <ph name="DEVICE_NAME" /></translation> <translation id="8251578425305135684">Miniatuur verwijderd.</translation> <translation id="825238165904109940">Altijd volledige URL's bekijken</translation> <translation id="8252569384384439529">Uploaden...</translation> @@ -7211,9 +7226,11 @@ <translation id="8528074251912154910">Talen toevoegen</translation> <translation id="8528962588711550376">Inloggen.</translation> <translation id="8529925957403338845">Verbinding via instant-tethering mislukt</translation> +<translation id="8531701051932785007">Uitgebreide versie van Safe Browsing staat uit</translation> <translation id="8534656636775144800">Er is een fout opgetreden bij het verbinden met het domein. Probeer het opnieuw.</translation> <translation id="8535005006684281994">URL voor verlengen van Netscape-certificaat</translation> <translation id="8536956381488731905">Geluid bij toetsaanslag</translation> +<translation id="8538718737588735385">Weer aanzetten</translation> <translation id="8539727552378197395">Nee (HttpOnly)</translation> <translation id="8539766201049804895">Upgraden</translation> <translation id="8540136935098276800">Geef een correct opgemaakte URL op</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index c9c2dbc8..043529f 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -6808,6 +6808,7 @@ <translation id="8054563304616131773">Skriv inn en gyldig e-postadresse</translation> <translation id="8054883179223321715">Tilgjengelig for spesifikke videonettsteder</translation> <translation id="8054921503121346576">USB-tastatur tilkoblet</translation> +<translation id="8057414620575339583">Sidesøk</translation> <translation id="8058655154417507695">Utløpsår</translation> <translation id="8058986560951482265">Hakker</translation> <translation id="8059417245945632445">&Inspiser enheter</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 2ed1f87..a14aa4a 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -6799,6 +6799,7 @@ <translation id="8054563304616131773">Wpisz prawidłowy adres e-mail</translation> <translation id="8054883179223321715">Dostępne w przypadku konkretnych stron z filmami</translation> <translation id="8054921503121346576">Podłączono klawiaturę USB</translation> +<translation id="8057414620575339583">Wyszukiwanie na boku</translation> <translation id="8058655154417507695">Rok utraty ważności</translation> <translation id="8058986560951482265">Przeskakuje</translation> <translation id="8059417245945632445">&Sprawdź urządzenia</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 143e462..e884c31 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -2526,6 +2526,7 @@ <translation id="3557101512409028104">Defina restrições de sites e limites de tempo de uso com o Family Link</translation> <translation id="3559262020195162408">Falha ao instalar a política no dispositivo.</translation> <translation id="3559533181353831840">Tempo restante: <ph name="TIME_LEFT" /></translation> +<translation id="3559697822483154494">Receber vibrações de confirmação para ações como divisão de tela e mudança de espaço de trabalho.</translation> <translation id="3560034655160545939">&Verificação ortográfica</translation> <translation id="3562423906127931518">O processo pode levar alguns minutos. Configurando o contêiner Linux.</translation> <translation id="3562655211539199254">Ver guias recentes do Chrome no seu smartphone</translation> @@ -4928,6 +4929,7 @@ <translation id="6112931163620622315">Verifique seu smartphone</translation> <translation id="6113434369102685411">Defina seu mecanismo de pesquisa padrão para o navegador Chrome e o acesso rápido do <ph name="DEVICE_TYPE" /></translation> <translation id="6113942107547980621">Para usar o Smart Lock, acesse o perfil de usuário principal no smartphone</translation> +<translation id="611684075852771314">Esses registros foram salvos em "Meus arquivos" como</translation> <translation id="6116921718742659598">Alterar configurações de idioma e de entrada</translation> <translation id="6119927814891883061">Nomear dispositivo como <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Fixar esta página na tela inicial...</translation> @@ -5704,6 +5706,7 @@ <translation id="6930036377490597025">Chave de segurança externa ou sensor integrado</translation> <translation id="6930161297841867798">{NUM_EXTENSIONS,plural, =1{Uma extensão foi rejeitada}one{# extensão foi rejeitada}other{# extensões foram rejeitadas}}</translation> <translation id="6930321203306643451">Atualização concluída</translation> +<translation id="6931690462168617033">Força do clique</translation> <translation id="6935286146439255109">A bandeja de papel não foi encontrada</translation> <translation id="693807610556624488">A operação de escrita excede o comprimento máximo do atributo para "<ph name="DEVICE_NAME" />".</translation> <translation id="6938386202199793006">Você tem 1 impressora salva.</translation> @@ -6837,6 +6840,7 @@ <translation id="8064279191081105977">Grupo <ph name="GROUP_NAME" />: <ph name="GROUP_CONTENTS" /> - <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">Caixa de diálogo de conexão</translation> <translation id="8069615408251337349">Google Cloud Print</translation> +<translation id="8070662218171013510">Retorno tátil</translation> <translation id="8071432093239591881">Imprimir como imagem</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />Os dados de apps podem ser quaisquer dados que um app tenha salvado (com base nas configurações de desenvolvedores), incluindo dados como contatos, mensagens e fotos.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Os dados de backup não serão contabilizados na cota de armazenamento do Drive do seu filho.<ph name="END_PARAGRAPH2" />
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 941b5e3..2a42075 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -2505,6 +2505,7 @@ <translation id="3557101512409028104">Defina restrições de Websites e limites de tempo de utilização com o Family Link</translation> <translation id="3559262020195162408">Falha ao instalar a política no dispositivo.</translation> <translation id="3559533181353831840">Resta(m) cerca de <ph name="TIME_LEFT" /></translation> +<translation id="3559697822483154494">Receba a confirmação com vibração para ações como ativar o ecrã dividido e alternar entre espaços de trabalho.</translation> <translation id="3560034655160545939">&Verificação ortográfica</translation> <translation id="3562423906127931518">Este processo pode demorar alguns minutos. A configurar o contentor do Linux…</translation> <translation id="3562655211539199254">Veja os separadores recentes do Chrome do telemóvel.</translation> @@ -4902,6 +4903,7 @@ <translation id="6112931163620622315">Verificar o seu telemóvel</translation> <translation id="6113434369102685411">Selecione o motor de pesquisa predefinido para o navegador Chrome e o Launcher <ph name="DEVICE_TYPE" />.</translation> <translation id="6113942107547980621">Para utilizar o Smart Lock, mude para o perfil de utilizador principal no seu telemóvel</translation> +<translation id="611684075852771314">Estes registos foram guardados em Os meus ficheiros como</translation> <translation id="6116921718742659598">Alterar idioma e definições de introdução</translation> <translation id="6119927814891883061">Atribuir o nome <ph name="DEVICE_NAME" /> ao dispositivo</translation> <translation id="6120205520491252677">Fixar esta página ao ecrã Inicial...</translation> @@ -5678,6 +5680,7 @@ <translation id="6930036377490597025">Chave de segurança externa ou sensor incorporado</translation> <translation id="6930161297841867798">{NUM_EXTENSIONS,plural, =1{Uma extensão foi rejeitada}one{# extensão(ões) foi(ram) rejeitada(s)}other{# extensões foram rejeitadas}}</translation> <translation id="6930321203306643451">Atualização concluída</translation> +<translation id="6931690462168617033">Força do clique</translation> <translation id="6935286146439255109">Não existe um tabuleiro de papel</translation> <translation id="693807610556624488">A operação de escrita excede o comprimento máximo do atributo para: "<ph name="DEVICE_NAME" />".</translation> <translation id="6938386202199793006">Tem 1 impressora guardada.</translation> @@ -6808,6 +6811,7 @@ <translation id="8064279191081105977">Grupo <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /> – <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">Caixa de diálogo de ligação</translation> <translation id="8069615408251337349">Google Cloud Print</translation> +<translation id="8070662218171013510">Resposta tátil</translation> <translation id="8071432093239591881">Imprimir como imagem</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />Os dados de apps podem ser quaisquer dados que uma aplicação tenha guardado (com base nas definições do programador), incluindo dados como contactos, mensagens e fotos.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Os dados da cópia de segurança não são contabilizados para a quota do armazenamento do Drive da criança.<ph name="END_PARAGRAPH2" />
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 354fe4d4..c403293 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -6790,6 +6790,7 @@ <translation id="8054563304616131773">Introdu o adresă de e-mail validă</translation> <translation id="8054883179223321715">Disponibil pentru anumite site-uri cu videoclipuri</translation> <translation id="8054921503121346576">Tastatură USB conectată</translation> +<translation id="8057414620575339583">Căutare laterală</translation> <translation id="8058655154417507695">Anul expirării</translation> <translation id="8058986560951482265">Redare sacadată</translation> <translation id="8059417245945632445">&Inspectați dispozitivele</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 98d23f6..cd192ca 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -6790,6 +6790,7 @@ <translation id="8054563304616131773">Введите действительный адрес электронной почты</translation> <translation id="8054883179223321715">Совместимо только с определенными сайтами</translation> <translation id="8054921503121346576">USB-клавиатура подключена</translation> +<translation id="8057414620575339583">Боковая панель поиска</translation> <translation id="8058655154417507695">Год окончания срока действия</translation> <translation id="8058986560951482265">Нестабильное</translation> <translation id="8059417245945632445">&Проверка устройств</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index b187aeca..af050f9c 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -2511,6 +2511,7 @@ <translation id="3557101512409028104">Pomocou aplikácie Family Link môžete nastaviť obmedzenia webov a obmedzenia času používania</translation> <translation id="3559262020195162408">Pravidlo sa nepodarilo v zariadení nainštalovať.</translation> <translation id="3559533181353831840">Zostáva približne <ph name="TIME_LEFT" /></translation> +<translation id="3559697822483154494">Dostávajte potvrdenie vibráciami v prípade akcií, napríklad pri použití rozdelenej obrazovky a prepnutí plôch.</translation> <translation id="3560034655160545939">&Kontrola pravopisu</translation> <translation id="3562423906127931518">Tento proces môže trvať niekoľko minút. Nastavuje sa kontajner systému Linux.</translation> <translation id="3562655211539199254">Zobrazte si nedávne karty Chromu z telefónu</translation> @@ -4911,6 +4912,7 @@ <translation id="6112931163620622315">Skontrolujte telefón</translation> <translation id="6113434369102685411">Nastavte si predvolený vyhľadávač pre prehliadač Chrome a Spúštač v zariadení <ph name="DEVICE_TYPE" /></translation> <translation id="6113942107547980621">Ak chcete používať funkcie Smart Lock, prepnite na profil hlavného používateľa v telefóne</translation> +<translation id="611684075852771314">Tieto denníky boli uložené v priečinku Moje súbory ako</translation> <translation id="6116921718742659598">Zmeniť nastavenia jazyka a vstupu</translation> <translation id="6119927814891883061">Pomenovať zariadenie <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Pripnúť túto stránku na Úvodnú obrazovku...</translation> @@ -5687,6 +5689,7 @@ <translation id="6930036377490597025">Externý bezpečnostný kľúč alebo vstavaný senzor</translation> <translation id="6930161297841867798">{NUM_EXTENSIONS,plural, =1{Rozšírenie bolo odmietnuté}few{# rozšírenia boli odmietnuté}many{# extensions have been rejected}other{# rozšírení bolo odmietnutých}}</translation> <translation id="6930321203306643451">Inovácia je dokončená</translation> +<translation id="6931690462168617033">Sila kliknutia</translation> <translation id="6935286146439255109">Chýba zásobník na papier</translation> <translation id="693807610556624488">Operácia zápisu prekročila maximálnu dĺžku atribútu na zariadení <ph name="DEVICE_NAME" />.</translation> <translation id="6938386202199793006">Máte jednu uloženú tlačiareň.</translation> @@ -6804,6 +6807,7 @@ <translation id="8054563304616131773">Zadajte platnú e-mailovú adresu</translation> <translation id="8054883179223321715">K dispozícii pre konkrétne weby s videom</translation> <translation id="8054921503121346576">Klávesnica s konektorom USB bola pripojená</translation> +<translation id="8057414620575339583">Bočné vyhľadávanie</translation> <translation id="8058655154417507695">Rok ukončenia platnosti</translation> <translation id="8058986560951482265">Opakovane sa zastavuje</translation> <translation id="8059417245945632445">&Preskúmať zariadenia</translation> @@ -6818,6 +6822,7 @@ <translation id="8064279191081105977">Skupina <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /> – <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">Dialógové okno pripojenia</translation> <translation id="8069615408251337349">Google Cloud Print</translation> +<translation id="8070662218171013510">Hmatová odozva</translation> <translation id="8071432093239591881">Vytlačiť ako obrázok</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />Dáta aplikácií môžu byť ľubovoľné dáta, ktoré aplikácie uložili (v závislosti od nastavení vývojára), vrátane potenciálne citlivých informácií, ako sú kontakty, správy a fotky.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Zálohované dáta sa nezapočítavajú do kvóty úložiska Disku.<ph name="END_PARAGRAPH2" />
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 27103dc..98617830 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -255,6 +255,7 @@ <translation id="1244265436519979884">Trenutno poteka obnavljanje vsebnika za Linux</translation> <translation id="1244303850296295656">Napaka razširitve</translation> <translation id="1246863218384630739">Navideznega računalnika <ph name="VM_NAME" /> ni bilo mogoče namestiti: URL slike je vrnil kodo napake <ph name="HTTP_ERROR" />. Obrnite se na skrbnika.</translation> +<translation id="1247071602516579380">Naprava <ph name="DEVICE_INDEX" /> od <ph name="DEVICE_COUNT" />, tablični računalnik, imenovan <ph name="DEVICE_NAME" /></translation> <translation id="1251366534849411931">Pričakovan zaviti oklepaj: <ph name="ERROR_LINE" /></translation> <translation id="1251480783646955802">S tem boste izbrisali <ph name="TOTAL_USAGE" /> podatkov, ki so jih shranila spletna mesta in nameščene aplikacije.</translation> <translation id="1251578593170406502">Iskanje mobilnih podatkovnih omrežij …</translation> @@ -441,6 +442,7 @@ <translation id="144283815522798837">Št. izbranih: <ph name="NUMBER_OF_ITEMS_SELECTED" /></translation> <translation id="1442851588227551435">Nastavitev aktivnega kartončka za Kerberos</translation> <translation id="1444628761356461360">To nastavitev upravlja lastnik naprave <ph name="OWNER_EMAIL" />.</translation> +<translation id="1445005312224723356">Naprava <ph name="DEVICE_INDEX" /> od <ph name="DEVICE_COUNT" />, telefon, imenovan <ph name="DEVICE_NAME" /></translation> <translation id="144518587530125858">Ni bilo mogoče naložiti slike »<ph name="IMAGE_PATH" />« za temo.</translation> <translation id="1449191289887455076">Znova pritisnite »<ph name="CURRENTKEY" />«, če želite potrditi dodelitev in <ph name="RESPONSE" />.</translation> <translation id="1451375123200651445">Spletna stran, ena datoteka</translation> @@ -873,6 +875,7 @@ <translation id="1855079636134697549">Kamera je vklopljena.</translation> <translation id="1856715684130786728">Dodaj lokacijo ...</translation> <translation id="1858585891038687145">Zaupaj temu potrdilu za prepoznavanje proizvajalcev programske opreme</translation> +<translation id="1859787252990099899">Naprava <ph name="DEVICE_INDEX" /> od <ph name="DEVICE_COUNT" />, neznana naprava, imenovana <ph name="DEVICE_NAME" /></translation> <translation id="1861262398884155592">Ta mapa je prazna</translation> <translation id="1862311223300693744">Ali imate nameščeno posebno omrežje VPN, strežnik proxy, požarni zid ali programsko opremo NAS?</translation> @@ -1248,6 +1251,7 @@ <translation id="2242687258748107519">Podatki o datoteki</translation> <translation id="2246549592927364792">Želite pridobivati opise slik iz Googla?</translation> <translation id="2247738527273549923">To napravo upravlja vaša organizacija.</translation> +<translation id="2249061317998743208">Naprava <ph name="DEVICE_INDEX" /> od <ph name="DEVICE_COUNT" />, krmilnik za igre, imenovan <ph name="DEVICE_NAME" /></translation> <translation id="2249111429176737533">Odprta kot okno na zavihku</translation> <translation id="2249605167705922988">npr. 1–5, 8, 11–13</translation> <translation id="2251218783371366160">Odpri s sistemskim pregledovalnikom</translation> @@ -2009,6 +2013,7 @@ <translation id="3007771295016901659">Duplicate Tab</translation> <translation id="3008232374986381779">Izvajanje orodij, urejevalnikov in IDE-jev za Linux v napravi <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> <translation id="3008272652534848354">Ponastavi dovoljenja</translation> +<translation id="3008396025115884998">Naprava <ph name="DEVICE_INDEX" /> od <ph name="DEVICE_COUNT" />, zvočna naprava, imenovana <ph name="DEVICE_NAME" /></translation> <translation id="3008694618228964140">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> zahteva, da se še danes povežete z omrežjem Wi-Fi in prenesete posodobitev. Prenesete jo lahko tudi prek povezave z omejenim prenosom podatkov (prenos podatkov se morda zaračuna).}one{<ph name="MANAGER" /> zahteva, da se povežete z omrežjem Wi-Fi in prenesete posodobitev pred rokom. Prenesete jo lahko tudi prek povezave z omejenim prenosom podatkov (prenos podatkov se morda zaračuna).}two{<ph name="MANAGER" /> zahteva, da se povežete z omrežjem Wi-Fi in prenesete posodobitev pred rokom. Prenesete jo lahko tudi prek povezave z omejenim prenosom podatkov (prenos podatkov se morda zaračuna).}few{<ph name="MANAGER" /> zahteva, da se povežete z omrežjem Wi-Fi in prenesete posodobitev pred rokom. Prenesete jo lahko tudi prek povezave z omejenim prenosom podatkov (prenos podatkov se morda zaračuna).}other{<ph name="MANAGER" /> zahteva, da se povežete z omrežjem Wi-Fi in prenesete posodobitev pred rokom. Prenesete jo lahko tudi prek povezave z omejenim prenosom podatkov (prenos podatkov se morda zaračuna).}}</translation> <translation id="3009300415590184725">Ali ste prepričani, da želite preklicati postopek nastavitve mobilne podatkovne storitve?</translation> <translation id="3009779501245596802">Indeksirane zbirke podatkov</translation> @@ -2314,6 +2319,7 @@ <translation id="3348038390189153836">Zaznane zamenljive naprave</translation> <translation id="3348131053948466246">Predlagan je bil emodži. Pritisnite tipko za navzdol ali navzdol in Enter, če ga želite vnesti.</translation> <translation id="3349933790966648062">Količina uporabljenega pomnilnika</translation> +<translation id="3354972872297836698">Seznanitve z napravo <ph name="DEVICE_NAME" /> ni bilo mogoče opraviti; izberite napravo, če želite poskusiti znova</translation> <translation id="3355936511340229503">Napaka povezave</translation> <translation id="3356580349448036450">Dokončano</translation> <translation id="3359256513598016054">Omejitve pravilnika potrdila</translation> @@ -3144,6 +3150,7 @@ <translation id="4200689466366162458">Besede po meri</translation> <translation id="4200983522494130825">Nov &zavihek</translation> <translation id="4201546031411513170">V nastavitvah lahko kadar koli izberete, kaj želite sinhronizirati.</translation> +<translation id="4202417625268941299">Z izboljšanim varnim brskanjem dobite Chromovo najmočnejšo zaščito.</translation> <translation id="420283545744377356">Izklop ohranjevalnika zaslona</translation> <translation id="4206144641569145248">Zunajzemeljsko bitje</translation> <translation id="4206323443866416204">Poročilo s povratnimi informacijami</translation> @@ -3650,6 +3657,7 @@ <translation id="4759238208242260848">Prenosi</translation> <translation id="4761104368405085019">Uporabite mikrofon</translation> <translation id="4762718786438001384">V napravi kritično primanjkuje prostora na disku</translation> +<translation id="4762898026821161650">Naprava <ph name="DEVICE_INDEX" /> od <ph name="DEVICE_COUNT" />, računalnik, imenovan <ph name="DEVICE_NAME" /></translation> <translation id="4763408175235639573">Ko ste si ogledovali to stran, so bili poslani ti piškotki</translation> <translation id="4765582662863429759">Aplikaciji Android Messages omogoča posredovanje sporočil SMS iz telefona v Chromebook</translation> <translation id="4768332406694066911">Imate potrdila teh organizacij, ki vas identificirajo</translation> @@ -3831,6 +3839,7 @@ <translation id="4943691134276646401">»<ph name="CHROME_EXTENSION_NAME" />« se želi povezati z zaporednimi vrati</translation> <translation id="4944310289250773232">Storitev preverjanja pristnosti gosti <ph name="SAML_DOMAIN" /></translation> <translation id="4945439665401275950">Če želite nastaviti prstni odtis, naj se otrok dotakne gumba za vklop. Podatki o prstnih odtisih otroka so varno shranjeni in nikoli ne zapustijo naprave <ph name="DEVICE_TYPE" />.</translation> +<translation id="4946459324029651239">Imate standardno zaščito.</translation> <translation id="495164417696120157">{COUNT,plural, =1{datoteko}one{# datoteko}two{# datoteki}few{# datoteke}other{# datotek}}</translation> <translation id="495170559598752135">Dejanja</translation> <translation id="4953808748584563296">Privzeti oranžni avatar</translation> @@ -4414,6 +4423,7 @@ <translation id="5575528586625653441">Prišlo je do težave z zahtevo za registracijo predstavitve.</translation> <translation id="557722062034137776">Ponastavitev naprave ne bo vplivala na vaše Google Račune ali kakršne koli druge podatke, sinhronizirane s temi računi. Izbrisani pa bodo vsi podatki, shranjeni lokalno v napravi.</translation> <translation id="5578059481725149024">Samodejna prijava</translation> +<translation id="5581134892342029705">Prevod v jezik <ph name="LANGUAGE" /> je dokončan</translation> <translation id="558170650521898289">Preverjanje gonilnikov strojne opreme za sistem Microsoft Windows</translation> <translation id="5581972110672966454">Naprave ni mogoče pridružiti domeni. Poskusite znova ali se obrnite na lastnika ali skrbnika naprave. Koda napake: <ph name="ERROR_CODE" />.</translation> <translation id="5582839680698949063">Glavni meni</translation> @@ -5829,6 +5839,7 @@ <translation id="7057184853669165321">{NUM_MINS,plural, =1{Varnostno preverjanje je bilo izvedeno pred 1 minuto}one{Varnostno preverjanje je bilo izvedeno pred {NUM_MINS} minuto}two{Varnostno preverjanje je bilo izvedeno pred {NUM_MINS} minutama}few{Varnostno preverjanje je bilo izvedeno pred {NUM_MINS} minutami}other{Varnostno preverjanje je bilo izvedeno pred {NUM_MINS} minutami}}</translation> <translation id="7057767408836081338">Pridobivanje podatkov aplikacije ni uspelo. Aplikacija se kljub temu poskuša zagnati …</translation> <translation id="7058024590501568315">Skrito omrežje</translation> +<translation id="70582545822664495">Naprava <ph name="DEVICE_INDEX" /> od <ph name="DEVICE_COUNT" />, miška, imenovana <ph name="DEVICE_NAME" /></translation> <translation id="7059858479264779982">Nastavi za samodejni zagon</translation> <translation id="7062222374113411376">Nedavno zaprtim spletnim mestom dovoli dokončanje pošiljanja in prejemanja podatkov (priporočeno)</translation> <translation id="7063129466199351735">Obdelava bližnjic ...</translation> @@ -5992,6 +6003,7 @@ <translation id="7257173066616499747">Omrežja Wi-Fi</translation> <translation id="725758059478686223">Storitev tiskanja</translation> <translation id="7257666756905341374">Branje podatkov, ki jih kopirate in prilepite</translation> +<translation id="7258006747130724016">Naprava <ph name="DEVICE_INDEX" /> od <ph name="DEVICE_COUNT" />, kamera, imenovana <ph name="DEVICE_NAME" /></translation> <translation id="7258192266780953209">Pretvorbe</translation> <translation id="7258225044283673131">Aplikacija se ne odziva. Če želite zapreti aplikacijo, izberite »Vsili zapiranje«.</translation> <translation id="7262004276116528033">Prijavno storitev gosti <ph name="SAML_DOMAIN" /></translation> @@ -6788,6 +6800,7 @@ <translation id="8037117027592400564">Branje in izgovarjava vsega besedila z uporabo sintetiziranega govora</translation> <translation id="8037357227543935929">Zahteva (privzeto)</translation> <translation id="803771048473350947">Datoteka</translation> +<translation id="8038399858950372766">Naprava <ph name="DEVICE_INDEX" /> od <ph name="DEVICE_COUNT" />, tipkovnica, imenovana <ph name="DEVICE_NAME" /></translation> <translation id="8041089156583427627">Pošlji povratne informacije</translation> <translation id="8042142357103597104">Neprosojnost besedila</translation> <translation id="8044262338717486897"><ph name="LINUX_APP_NAME" /> se ne odziva.</translation> @@ -6926,6 +6939,7 @@ <translation id="8168071266284693455">Zaznamki, gesla, zgodovina in drugi podatki so sinhronizirani v vseh vaših napravah</translation> <translation id="8168435359814927499">Vsebina</translation> <translation id="8169165065843881617">{NUM_TABS,plural, =1{Dodaj zavihek na bralni seznam}one{Dodaj zavihke na bralni seznam}two{Dodaj zavihke na bralni seznam}few{Dodaj zavihke na bralni seznam}other{Dodaj zavihke na bralni seznam}}</translation> +<translation id="8169849063724750395">Vnovični vklop</translation> <translation id="8171334254070436367">Skrij vse kartice</translation> <translation id="8174047975335711832">Podatki o napravi</translation> <translation id="8174876712881364124">Varnostno kopiranje v Google Drive. Po želji lahko preprosto obnovite podatke ali napravo zamenjate z drugo. Ta varnostna kopija vključuje podatke aplikacij. Varnostne kopije so naložene v Google in šifrirane z geslom za Google Račun otroka. <ph name="BEGIN_LINK1" />Več o tem<ph name="END_LINK1" /></translation> @@ -6999,6 +7013,7 @@ <translation id="8249615410597138718">Pošiljanje v naprave</translation> <translation id="8249672078237421304">Ponudi prevajanje strani, ki niso v vašem jeziku</translation> <translation id="8251441930213048644">Osveži zdaj</translation> +<translation id="8251509999076836464">Seznanjanje z napravo <ph name="DEVICE_NAME" /></translation> <translation id="8251578425305135684">Sličica je odstranjena.</translation> <translation id="825238165904109940">Vedno pokaži celotne URL-je</translation> <translation id="8252569384384439529">Nalaganje …</translation> @@ -7236,9 +7251,11 @@ <translation id="8528074251912154910">Dodaj jezike</translation> <translation id="8528962588711550376">Prijavljanje.</translation> <translation id="8529925957403338845">Vzpostavljanje takojšnje povezave z internetom prek mobilnega telefona ni uspelo</translation> +<translation id="8531701051932785007">Izboljšano varno brskanje je izklopljeno</translation> <translation id="8534656636775144800">Ojoj. Pri poskusu pridružitve domeni je prišlo do težav. Poskusite znova.</translation> <translation id="8535005006684281994">Spletni naslov podaljšanja Netscapeovega potrdila</translation> <translation id="8536956381488731905">Zvok ob pritisku tipke</translation> +<translation id="8538718737588735385">Vnovični vklop</translation> <translation id="8539727552378197395">Ne (samo http)</translation> <translation id="8539766201049804895">Nadgradi</translation> <translation id="8540136935098276800">Vnesite pravilno oblikovan URL</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index b77e695..58b653ea 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -6788,6 +6788,7 @@ <translation id="8054563304616131773">Unesite važeću imejl adresu</translation> <translation id="8054883179223321715">Dostupno za određene sajtove za video snimke</translation> <translation id="8054921503121346576">USB tastatura je povezana</translation> +<translation id="8057414620575339583">Bočna pretraga</translation> <translation id="8058655154417507695">Godina isteka</translation> <translation id="8058986560951482265">Isprekidan</translation> <translation id="8059417245945632445">&Ispitaj uređaje</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 67bfc9af..971b6153 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -6788,6 +6788,7 @@ <translation id="8054563304616131773">Унесите важећу имејл адресу</translation> <translation id="8054883179223321715">Доступно за одређене сајтове за видео снимке</translation> <translation id="8054921503121346576">USB тастатура је повезана</translation> +<translation id="8057414620575339583">Бочна претрага</translation> <translation id="8058655154417507695">Година истека</translation> <translation id="8058986560951482265">Испрекидан</translation> <translation id="8059417245945632445">&Испитај уређаје</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index e152d20..d1b8622312 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -252,6 +252,7 @@ <translation id="1244265436519979884">ప్రస్తుతం Linux పునరుద్ధరణ ప్రోగ్రెస్లో ఉంది</translation> <translation id="1244303850296295656">ఎక్స్టెన్షన్ ఎర్రర్</translation> <translation id="1246863218384630739"><ph name="VM_NAME" />ను ఇన్స్టాల్ చేయడం సాధ్యపడలేదు: ఇమేజ్ URL <ph name="HTTP_ERROR" /> ఎర్రర్ కోడ్ను అందించింది. దయచేసి మీ అడ్మినిస్ట్రేటర్ను సంప్రదించండి.</translation> +<translation id="1247071602516579380"><ph name="DEVICE_COUNT" />లో <ph name="DEVICE_INDEX" /> పరికరం, <ph name="DEVICE_NAME" /> అనే పేరుతో ఉన్న టాబ్లెట్</translation> <translation id="1251366534849411931">తెరిచి ఉన్న వంకర కలుపు ఉండాలి: <ph name="ERROR_LINE" /></translation> <translation id="1251480783646955802">దీని వలన సైట్లు, ఇన్స్టాల్ చేయబడిన యాప్లు స్టోర్ చేసిన <ph name="TOTAL_USAGE" /> డేటా తొలగిపోతుంది.</translation> <translation id="1251578593170406502">మొబైల్ డేటా నెట్వర్క్ల కోసం స్కాన్ చేస్తోంది...</translation> @@ -438,6 +439,7 @@ <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> ఎంచుకోబడింది/ఎంచుకోబడ్డాయి</translation> <translation id="1442851588227551435">యాక్టివ్ Kerberos టిక్కెట్ను సెట్ చేయండి</translation> <translation id="1444628761356461360">ఈ సెట్టింగ్ను పరికరం యజమాని అయిన <ph name="OWNER_EMAIL" /> నిర్వహిస్తున్నారు.</translation> +<translation id="1445005312224723356"><ph name="DEVICE_COUNT" />లో <ph name="DEVICE_INDEX" /> పరికరం, <ph name="DEVICE_NAME" /> అనే పేరుతో ఉన్న ఫోన్</translation> <translation id="144518587530125858">థీమ్ కోసం '<ph name="IMAGE_PATH" />'ను లోడ్ చేయడం సాధ్యపడలేదు.</translation> <translation id="1449191289887455076">కేటాయింపును నిర్ధారించి, <ph name="RESPONSE" /> కోసం "<ph name="CURRENTKEY" />"ని మళ్లీ నొక్కండి</translation> <translation id="1451375123200651445">వెబ్ పేజీ, ఒకే ఫైల్</translation> @@ -869,6 +871,7 @@ <translation id="1855079636134697549">కెమెరా ఆన్ చేయబడింది</translation> <translation id="1856715684130786728">స్థానాన్ని జోడించు...</translation> <translation id="1858585891038687145">సాఫ్ట్వేర్ రూపకర్తలను గుర్తించడం కోసం ఈ ప్రమాణపత్రాన్ని విశ్వసిస్తుంది</translation> +<translation id="1859787252990099899"><ph name="DEVICE_COUNT" />లో <ph name="DEVICE_INDEX" /> పరికరం, <ph name="DEVICE_NAME" /> అనే పేరుతో ఉన్న తెలియని పరికరం</translation> <translation id="1861262398884155592">ఈ ఫోల్డర్ ఖాళీగా ఉంది</translation> <translation id="1862311223300693744">మీరు ఏదైనా ప్రత్యేక VPN, ప్రాక్సీ, ఫైర్వాల్ లేదా NAS సాఫ్ట్వేర్ను ఇన్స్టాల్ చేశారా?</translation> @@ -1244,6 +1247,7 @@ <translation id="2242687258748107519">ఫైల్ సమాచారం</translation> <translation id="2246549592927364792">Google నుండి చిత్ర వివరణలను పొందాలా?</translation> <translation id="2247738527273549923">మీ పరికరం మీ సంస్థ ద్వారా మేనేజ్ చేయబడుతుంది.</translation> +<translation id="2249061317998743208"><ph name="DEVICE_COUNT" />లో <ph name="DEVICE_INDEX" /> పరికరం, <ph name="DEVICE_NAME" /> అనే పేరుతో ఉన్న గేమ్ కంట్రోలర్</translation> <translation id="2249111429176737533">ట్యాబ్ చేసిన విండో లాగా తెరువు</translation> <translation id="2249605167705922988">ఉదా. 1-5, 8, 11-13</translation> <translation id="2251218783371366160">సిస్టమ్ వ్యూయర్తో తెరువు</translation> @@ -2005,6 +2009,7 @@ <translation id="3007771295016901659">ట్యాబ్ యొక్క నకిలీని రూపొందించు</translation> <translation id="3008232374986381779">మీ <ph name="DEVICE_TYPE" />లో Linux టూల్లు, ఎడిటర్లు, IDEలను రన్ చేయండి. <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation> <translation id="3008272652534848354">అనుమతులను రీసెట్ చేయి</translation> +<translation id="3008396025115884998"><ph name="DEVICE_COUNT" />లో <ph name="DEVICE_INDEX" /> పరికరం, <ph name="DEVICE_NAME" /> అనే పేరుతో ఉన్న ఆడియో పరికరం</translation> <translation id="3008694618228964140">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> కోసం అప్డేట్ను డౌన్లోడ్ చేయడానికి మీరు ఈరోజే Wi-Fiకి కనెక్ట్ కావలసి ఉంటుంది. లేదా డేటా నియంత్రణ ఉన్న కనెక్షన్ నుండి డౌన్లోడ్ చేయండి (ఛార్జీలు వర్తించవచ్చు).}other{<ph name="MANAGER" /> కోసం అప్డేట్ను డౌన్లోడ్ చేయడానికి మీరు గడువు తేదీలోపు Wi-Fiకి కనెక్ట్ కావలసి ఉంటుంది. లేదా డేటా నియంత్రణ ఉన్న కనెక్షన్ నుండి డౌన్లోడ్ చేయండి (ఛార్జీలు వర్తించవచ్చు).}}</translation> <translation id="3009300415590184725">మొబైల్ డేటా సేవ సెటప్ ప్రాసెస్ను మీరు ఖచ్చితంగా రద్దు చేయాలనుకుంటున్నారా?</translation> <translation id="3009779501245596802">సూచికలోని డేటాబేస్లు</translation> @@ -2310,6 +2315,7 @@ <translation id="3348038390189153836">తొలగించగల పరికరం కనుగొనబడింది</translation> <translation id="3348131053948466246">సూచించిన ఎమోజి. నావిగేట్ చేయడానికి పైకి లేదా కిందకి నొక్కండి, జొప్పించడానికి 'Enter' నొక్కండి.</translation> <translation id="3349933790966648062">మెమరీ ఫుట్ప్రింట్</translation> +<translation id="3354972872297836698"><ph name="DEVICE_NAME" /> పరికరానికి పెయిర్ చేయడం సాధ్యపడలేదు; మళ్ళీ ట్రై చేయడానికి పరికరాన్ని ఎంచుకోండి</translation> <translation id="3355936511340229503">కనెక్షన్ ఎర్రర్</translation> <translation id="3356580349448036450">పూర్తయింది</translation> <translation id="3359256513598016054">సర్టిఫికెట్ విధాన పరిమితులు</translation> @@ -3140,6 +3146,7 @@ <translation id="4200689466366162458">అనుకూల పదాలు</translation> <translation id="4200983522494130825">కొత్త &టాబ్</translation> <translation id="4201546031411513170">మీరు ఎప్పుడైనా సెట్టింగ్ల ద్వారా వేటిని సింక్ చేయాలో ఎంచుకోవచ్చు.</translation> +<translation id="4202417625268941299">మెరుగైన సురక్షిత బ్రౌజింగ్, మీకు Chromeలో అత్యంత సురక్షితమైన సెక్యూరిటీని అందిస్తుంది</translation> <translation id="420283545744377356">స్క్రీన్ సేవర్ను ఆఫ్ చేయి</translation> <translation id="4206144641569145248">గ్రహాంతరవాసి</translation> <translation id="4206323443866416204">అభిప్రాయ రిపోర్ట్</translation> @@ -3646,6 +3653,7 @@ <translation id="4759238208242260848">డౌన్లోడ్లు</translation> <translation id="4761104368405085019">మీ మైక్రోఫోన్ను ఉపయోగించండి</translation> <translation id="4762718786438001384">పరికరంలో డిస్క్ స్థలం చాలా తక్కువగా ఉంది</translation> +<translation id="4762898026821161650"><ph name="DEVICE_COUNT" />లో <ph name="DEVICE_INDEX" /> పరికరం, <ph name="DEVICE_NAME" /> అనే పేరుతో ఉన్న కంప్యూటర్</translation> <translation id="4763408175235639573">మీరు ఈ పేజీని వీక్షించినప్పుడు కింది కుక్కీలు సెట్ చేయబడ్డాయి</translation> <translation id="4765582662863429759">మీ ఫోన్లో ఉన్న వచనాన్ని మీ Chromebookలో చూపడానికి Android సందేశాలుని అనుమతిస్తుంది</translation> <translation id="4768332406694066911">మిమ్మల్ని గుర్తించే ఈ సంస్థల నుండి మీకు ప్రమాణపత్రాలు ఉన్నాయి</translation> @@ -3827,6 +3835,7 @@ <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" ఈ సీరియల్ పోర్ట్లలో ఒకదానితో కనెక్ట్ (అనుసంధానం) కావాలని కోరుకుంటుంది</translation> <translation id="4944310289250773232">ఈ ప్రమాణీకరణ సేవ <ph name="SAML_DOMAIN" /> ద్వారా హోస్ట్ చేయబడుతోంది</translation> <translation id="4945439665401275950">వేలిముద్రను సెటప్ చేయడానికి, మీ చిన్నారి చేత పవర్ బటన్పై తాకించండి. మీ చిన్నారి వేలిముద్ర సురక్షితంగా స్టోర్ చేయబడుతుంది, ఎప్పటికీ ఈ <ph name="DEVICE_TYPE" />లోనే ఉంటుంది.</translation> +<translation id="4946459324029651239">మీరు స్టాండర్డ్ రక్షణను పొందుతున్నారు</translation> <translation id="495164417696120157">{COUNT,plural, =1{ఫైల్}other{# ఫైళ్లు}}</translation> <translation id="495170559598752135">చర్యలు</translation> <translation id="4953808748584563296">డిఫాల్ట్ నారింజ రంగు అవతార్</translation> @@ -4410,6 +4419,7 @@ <translation id="5575528586625653441">డెమో నమోదు రిక్వెస్ట్కు సంబంధించి ఒక సమస్య ఏర్పడింది.</translation> <translation id="557722062034137776">మీ పరికరాన్ని రీసెట్ చేయడం వలన మీ Google ఖాతాలపై లేదా ఈ ఖాతాలకు సింక్ చేయబడిన ఏదైనా డేటాపై ఎటువంటి ప్రభావం ఉండదు. అయితే, మీ పరికరంలో స్థానికంగా సేవ్ చేయబడిన అన్ని ఫైళ్లు తొలగించబడతాయి.</translation> <translation id="5578059481725149024">ఆటోమేటిక్ సైన్-ఇన్</translation> +<translation id="5581134892342029705"><ph name="LANGUAGE" /> భాషకు అనువాదం పూర్తయింది</translation> <translation id="558170650521898289">Microsoft Windows హార్డ్వేర్ డ్రైవర్ ధృవీకరణ</translation> <translation id="5581972110672966454">పరికరాన్ని డొమైన్కు చేర్చడం సాధ్యపడదు. దయచేసి మళ్లీ ట్రై చేయండి లేదా మీ పరికర ఓనర్ను లేదా అడ్మినిస్ట్రేటర్ను సంప్రదించండి. ఎర్రర్ కోడ్: <ph name="ERROR_CODE" />.</translation> <translation id="5582839680698949063">ప్రధాన మెనూ</translation> @@ -5823,6 +5833,7 @@ <translation id="7057184853669165321">{NUM_MINS,plural, =1{భద్రతా తనిఖీ జరిగి 1 నిమిషం అయింది}other{భద్రతా తనిఖీ జరిగి {NUM_MINS} నిమిషాలు అయింది}}</translation> <translation id="7057767408836081338">యాప్ డేటాను పొందడంలో సమస్య ఉంది, యాప్ను రన్ చేయడానికి ప్రయత్నిస్తోంది...</translation> <translation id="7058024590501568315">దాచబడిన నెట్వర్క్</translation> +<translation id="70582545822664495"><ph name="DEVICE_COUNT" />లో <ph name="DEVICE_INDEX" /> పరికరం, <ph name="DEVICE_NAME" /> అనే పేరుతో ఉన్న మౌస్</translation> <translation id="7059858479264779982">స్వీయ-ప్రారంభానికి సెట్ చేయి</translation> <translation id="7062222374113411376">డేటాను పంపడం మరియు స్వీకరించడం పూర్తి చేయడానికి ఇటీవల మూసివేసిన సైట్లను అనుమతించు (సిఫార్సు చేయబడింది)</translation> <translation id="7063129466199351735">షార్ట్కట్లను ప్రాసెస్ చేస్తోంది...</translation> @@ -5986,6 +5997,7 @@ <translation id="7257173066616499747">Wi-Fi నెట్వర్క్లు</translation> <translation id="725758059478686223">ముద్రణ సేవ</translation> <translation id="7257666756905341374">మీరు కాపీ చేసి అతికించే డేటాను చదవడం</translation> +<translation id="7258006747130724016"><ph name="DEVICE_COUNT" />లో <ph name="DEVICE_INDEX" /> పరికరం, <ph name="DEVICE_NAME" /> అనే పేరుతో ఉన్న వీడియో కెమెరా</translation> <translation id="7258192266780953209">పరివర్తనాలు</translation> <translation id="7258225044283673131">అప్లికేషన్ స్పందించడం లేదు. యాప్ను మూసివేయడానికి "బలవంతంగా మూసివేయి" ఎంచుకోండి.</translation> <translation id="7262004276116528033">ఈ సైన్-ఇన్ సేవను <ph name="SAML_DOMAIN" /> హోస్ట్ చేస్తోంది</translation> @@ -6778,6 +6790,7 @@ <translation id="8037117027592400564">సంశ్లేషణ ప్రసంగాన్ని ఉపయోగించి మాట్లాడిన మొత్తం వచనాన్ని చదవడం</translation> <translation id="8037357227543935929">అడగాలి (డిఫాల్ట్)</translation> <translation id="803771048473350947">ఫైల్</translation> +<translation id="8038399858950372766"><ph name="DEVICE_COUNT" />లో <ph name="DEVICE_INDEX" /> పరికరం, <ph name="DEVICE_NAME" /> అనే పేరుతో ఉన్న కీబోర్డ్</translation> <translation id="8041089156583427627">ప్రతిస్పందనను పంపండి</translation> <translation id="8042142357103597104">వచన అపారదర్శకత</translation> <translation id="8044262338717486897"><ph name="LINUX_APP_NAME" /> స్పందించడం లేదు.</translation> @@ -6801,6 +6814,7 @@ <translation id="8054563304616131773">దయచేసి చెల్లుబాటు అయ్యే ఈమెయిల్ అడ్రస్ను నమోదు చేయండి</translation> <translation id="8054883179223321715">నిర్దిష్ట వీడియో సైట్ల కోసం అందుబాటులో ఉంది</translation> <translation id="8054921503121346576">USB కీబోర్డ్ కనెక్ట్ చేయబడింది</translation> +<translation id="8057414620575339583">సైడ్ సెర్చ్ టూల్</translation> <translation id="8058655154417507695">గడువు ముగింపు సంవత్సరం</translation> <translation id="8058986560951482265">మధ్యమధ్యలో అంతరాయాలు</translation> <translation id="8059417245945632445">&పరికరాలను పర్యవేక్షించు</translation> @@ -6916,6 +6930,7 @@ <translation id="8168071266284693455">మీ బుక్మార్క్లు, పాస్వర్డ్లు హిస్టరీ, మరెన్నో మీ అన్ని పరికరాల్లో సింక్ చేయబడ్డాయి</translation> <translation id="8168435359814927499">కంటెంట్</translation> <translation id="8169165065843881617">{NUM_TABS,plural, =1{చదవాల్సిన లిస్ట్కు ట్యాబ్ను జోడించండి}other{చదవాల్సిన లిస్ట్కు ట్యాబ్లను జోడించండి}}</translation> +<translation id="8169849063724750395">మళ్లీ ఆన్ చేయండి</translation> <translation id="8171334254070436367">అన్ని కార్డ్లను దాచు</translation> <translation id="8174047975335711832">పరికర సమాచారం</translation> <translation id="8174876712881364124">Google డిస్క్కు బ్యాకప్ చేయండి. ఏ సమయంలో అయినా సులభంగా డేటాని పునరుద్ధరించండి లేదా పరికరాన్ని మార్చండి. ఈ బ్యాకప్లో యాప్ డేటా ఉంటుంది. బ్యాకప్లు Googleకి అప్లోడ్ చేయబడతాయి మరియు మీ చిన్నారి Google ఖాతా పాస్వర్డ్ని ఉపయోగించి ఎన్క్రిప్ట్ చేయబడతాయి. <ph name="BEGIN_LINK1" />మరింత తెలుసుకోండి<ph name="END_LINK1" /></translation> @@ -6989,6 +7004,7 @@ <translation id="8249615410597138718">మీ పరికరాలకు పంపండి</translation> <translation id="8249672078237421304">మీరు చదివే భాషలో లేని పేజీలను అనువదించే సౌలభ్యం</translation> <translation id="8251441930213048644">ఇప్పుడు రిఫ్రెష్ చేయి</translation> +<translation id="8251509999076836464"><ph name="DEVICE_NAME" />కు పెయిర్ అవుతోంది</translation> <translation id="8251578425305135684">థంబ్నెయిల్ తొలగించబడింది.</translation> <translation id="825238165904109940">ఎల్లప్పుడూ పూర్తి URLలను చూపించు</translation> <translation id="8252569384384439529">అప్లోడ్ చేస్తోంది...</translation> @@ -7226,9 +7242,11 @@ <translation id="8528074251912154910">భాషలను జోడించు</translation> <translation id="8528962588711550376">సైన్ ఇన్ అవుతోంది.</translation> <translation id="8529925957403338845">తక్షణ టెథెరింగ్ కనెక్షన్ విఫలమైంది</translation> +<translation id="8531701051932785007">మెరుగైన సురక్షిత బ్రౌజింగ్ ఆఫ్ చేయబడింది</translation> <translation id="8534656636775144800">అయ్యో! డొమైన్ను చేర్చడానికి ప్రయత్నిస్తున్నప్పుడు ఏదో తప్పు జరిగింది. దయచేసి మళ్లీ ప్రయత్నించండి.</translation> <translation id="8535005006684281994">Netscape సర్టిఫికెట్ పునరుద్ధరణ URL</translation> <translation id="8536956381488731905">కీని నొక్కినప్పుడు ధ్వని</translation> +<translation id="8538718737588735385">మళ్లీ ఆన్ చేయండి</translation> <translation id="8539727552378197395">లేదు (Httpమాత్రమే)</translation> <translation id="8539766201049804895">అప్గ్రేడ్ చేయి</translation> <translation id="8540136935098276800">సరిగ్గా ఫార్మాట్ చేసిన URLను ఎంటర్ చేయండి</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 7a5c2cc..3ec45673 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -6822,6 +6822,7 @@ <translation id="8054563304616131773">Введіть дійсну електронну адресу</translation> <translation id="8054883179223321715">Доступно для певних сайтів із відео</translation> <translation id="8054921503121346576">Під’єднано клавіатуру USB</translation> +<translation id="8057414620575339583">Бічна панель пошуку</translation> <translation id="8058655154417507695">Рік закінчення терміну дії</translation> <translation id="8058986560951482265">Відтворюється уривками</translation> <translation id="8059417245945632445">&Перевірити пристрої</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 843dc55..3b19f80 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -250,6 +250,7 @@ <translation id="1244265436519979884">Linux بحالی فی الحال جاری ہے</translation> <translation id="1244303850296295656">ایکسٹینشن میں خرابی</translation> <translation id="1246863218384630739"><ph name="VM_NAME" /> کو انسٹال نہیں کیا جا سکا: تصویری URL نے <ph name="HTTP_ERROR" /> خرابی کا کوڈ واپس کر دیا۔ براہ کرم اپنے منتظم سے رابطہ کریں۔</translation> +<translation id="1247071602516579380"><ph name="DEVICE_COUNT" /> میں سے <ph name="DEVICE_INDEX" /> آلہ، <ph name="DEVICE_NAME" /> نام والا ٹیبلیٹ</translation> <translation id="1251366534849411931">ابتدائی خمیدہ قوسین کی توقع ہے: <ph name="ERROR_LINE" /></translation> <translation id="1251480783646955802">اس سے سائٹس اور انسٹال کردہ ایپس کا <ph name="TOTAL_USAGE" /> اسٹور کردہ ڈیٹا صاف ہو جائے گا</translation> <translation id="1251578593170406502">موبائل ڈیٹا نیٹ ورکس کو اسکین کیا جا رہا ہے...</translation> @@ -436,6 +437,7 @@ <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> کو منتخب کیا گیا</translation> <translation id="1442851588227551435">Kerberos کا فعال ٹکٹ سیٹ کریں</translation> <translation id="1444628761356461360">یہ ترتیب آلہ کے مالک، <ph name="OWNER_EMAIL" /> کے زیر انتظام ہے۔</translation> +<translation id="1445005312224723356"><ph name="DEVICE_COUNT" /> میں سے <ph name="DEVICE_INDEX" /> آلہ، <ph name="DEVICE_NAME" /> نام والا فون</translation> <translation id="144518587530125858">تھیم کیلئے '<ph name="IMAGE_PATH" />' کو لوڈ نہیں کیا جا سکا۔</translation> <translation id="1449191289887455076">تفویض اور <ph name="RESPONSE" /> کی تصدیق کرنے کے لیے "<ph name="CURRENTKEY" />" دوبارہ دبائيں</translation> <translation id="1451375123200651445">ویب صفحہ، واحد فائل</translation> @@ -859,6 +861,7 @@ <translation id="1855079636134697549">کیمرا آن ہے</translation> <translation id="1856715684130786728">مقام شامل کریں…</translation> <translation id="1858585891038687145">سافٹ ویئر بنانے والوں کی شناخت کرنے کیلئے اس سرٹیفیکیٹ پر بھروسہ کریں</translation> +<translation id="1859787252990099899"><ph name="DEVICE_COUNT" /> میں سے <ph name="DEVICE_INDEX" /> آلہ، <ph name="DEVICE_NAME" /> نام والا نامعلوم آلہ</translation> <translation id="1861262398884155592">یہ فولڈر خالی ہے</translation> <translation id="1862311223300693744">کیا آپ نے کوئی خصوصی VPN، پراکسی، فائروال یا NAS سافٹ ویئر انسٹال کیا ہوا ہے؟</translation> <translation id="1863182668524159459">کوئی سیریل پورٹ نہیں ملا</translation> @@ -1233,6 +1236,7 @@ <translation id="2242687258748107519">فائل کی معلومات</translation> <translation id="2246549592927364792">Google سے تصویر کی تفصیلات حاصل کریں؟</translation> <translation id="2247738527273549923">آپ کا آلہ آپ کی تنظیم کے زیر انتظام ہے</translation> +<translation id="2249061317998743208"><ph name="DEVICE_COUNT" /> میں سے <ph name="DEVICE_INDEX" /> آلہ، <ph name="DEVICE_NAME" /> نام والا گیم کنٹرولر</translation> <translation id="2249111429176737533">ٹیب کردہ ونڈو کے طور پر کھولیں</translation> <translation id="2249605167705922988">مثلاً 1-5, 8, 11-13</translation> <translation id="2251218783371366160">سسٹم ویور کے ساتھ کھولیں</translation> @@ -1990,6 +1994,7 @@ <translation id="3007771295016901659">ڈپلیکیٹ ٹیب</translation> <translation id="3008232374986381779">اپنے <ph name="DEVICE_TYPE" /> پر Linux ٹولز، ایڈیٹرز اور IDEs چلائیں۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="3008272652534848354">اجازتیں دوبارہ ترتیب دیں</translation> +<translation id="3008396025115884998"><ph name="DEVICE_COUNT" /> میں سے <ph name="DEVICE_INDEX" /> آلہ، <ph name="DEVICE_NAME" /> نام والا آڈیو آلہ</translation> <translation id="3008694618228964140">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> کا تقاضہ ہے کہ آج آپ Wi-Fi سے منسلک ہوں اور ایک اپ ڈیٹ ڈاؤن لوڈ کریں۔ یا میٹرڈ کنکشن سے ڈاؤن لوڈ کریں (چارجز لاگو ہو سکتے ہیں)۔}other{<ph name="MANAGER" /> کا تقاضہ ہے کہ آپ آخری تاریخ سے پہلے Wi-Fi سے منسلک ہوں اور ایک اپ ڈیٹ ڈاؤن لوڈ کریں۔ یا میٹرڈ کنکشن سے ڈاؤن لوڈ کریں (چارجز لاگو ہو سکتے ہیں)۔}}</translation> <translation id="3009300415590184725">کیا آپ واقعی موبائل ڈیٹا سروس سیٹ اپ کارروائی کو منسوخ کرنا چاہتے ہیں؟</translation> <translation id="3009779501245596802">انڈیکس کردہ ڈیٹا بیسز</translation> @@ -2295,6 +2300,7 @@ <translation id="3348038390189153836">ہٹانے لائق آلہ کا پتا چلا</translation> <translation id="3348131053948466246">تجویز کردہ ایموجی۔ نیویگیٹ کرنے کے لیے اوپر یا نیچے کا تیر دبائیں اور داخل کرنے کے لیے اینٹر دبائیں۔</translation> <translation id="3349933790966648062">میموری فوٹ پرنٹ</translation> +<translation id="3354972872297836698"><ph name="DEVICE_NAME" /> آلے سے جوڑا نہیں بنایا جا سکا؛ دوبارہ کوشش کرنے کے لیے آلہ منتخب کریں</translation> <translation id="3355936511340229503">کنکشن کی خرابی</translation> <translation id="3356580349448036450">مکمل</translation> <translation id="3359256513598016054">سرٹیفکیٹ کی پالیسی کی پابندیاں</translation> @@ -3125,6 +3131,7 @@ <translation id="4200689466366162458">حسب ضرورت الفاظ</translation> <translation id="4200983522494130825">نیا &ٹیب</translation> <translation id="4201546031411513170">آپ ترتیبات میں کسی بھی وقت اس بات کا انتخاب کر سکتے ہیں کہ کس چیز کی مطابقت پذیری کرنی ہے۔</translation> +<translation id="4202417625268941299">بہتر کردہ محفوظ براؤزنگ کے ساتھ، آپ Chrome کی مضبوط ترین سیکیورٹی حاصل کریں گے</translation> <translation id="420283545744377356">اسکرین سیور آف کریں</translation> <translation id="4206144641569145248">ایلیئن</translation> <translation id="4206323443866416204">تاثرات کی رپورٹ</translation> @@ -3630,6 +3637,7 @@ <translation id="4759238208242260848">ڈاؤن لوڈز</translation> <translation id="4761104368405085019">اپنا مائیکروفون استعمال کریں</translation> <translation id="4762718786438001384">آلہ کے ڈسک کی جگہ انتہائی کم ہے</translation> +<translation id="4762898026821161650"><ph name="DEVICE_COUNT" /> میں سے <ph name="DEVICE_INDEX" /> آلہ، <ph name="DEVICE_NAME" /> نام والا کمپیوٹر</translation> <translation id="4763408175235639573">جب آپ نے یہ صفحہ ملاحظہ کیا تو مندرجہ ذیل کوکیز سیٹ کی گئی تھیں</translation> <translation id="4765582662863429759">Android پیغامات کو آپ کے فون سے آپ کے Chromebook پر متنی پیغامت بھیجنے کی اجازت دیتی ہے</translation> <translation id="4768332406694066911">آپ کی شناخت کرنے والی ان تنظیموں کی جانب سے آپ کے پاس سرٹیفیکیٹس ہیں</translation> @@ -3811,6 +3819,7 @@ <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" ایک سیریل پورٹ سے منسلک ہونا چاہتا ہے</translation> <translation id="4944310289250773232">یہ توثیقی سروس <ph name="SAML_DOMAIN" /> کی زیر میزبانی ہے</translation> <translation id="4945439665401275950">فنگر پرنٹ کو سیٹ اپ کرنے کے لیے، اپنے بچے کو پاور بٹن ٹچ کرنے دیں۔ آپ کے بچے کے فنگر پرنٹ ڈیٹا کو محفوظ طریقے سے اسٹور کیا جاتا ہے اور یہ کبھی بھی آپ کے <ph name="DEVICE_TYPE" /> سے باہر نہیں جاتا۔</translation> +<translation id="4946459324029651239">آپ کو معیاری تحفظ حاصل ہو رہا ہے</translation> <translation id="495164417696120157">{COUNT,plural, =1{ایک فائل}other{# فائلز}}</translation> <translation id="495170559598752135">کارروائیاں</translation> <translation id="4953808748584563296">ڈیفالٹ نارنجی اوتار</translation> @@ -4393,6 +4402,7 @@ <translation id="5575528586625653441">ڈیمو کی رجسٹریشن کی درخواست کے ساتھ ایک مسئلہ پیش آگیا۔</translation> <translation id="557722062034137776">آپ کے آلہ کو دوبارہ ترتیب دینے سے آپ کے Google اکاؤنٹس یا ان اکاؤنٹس کے کسی بھی مطابقت پذیر ڈیٹا پر اثر نہیں پڑے گا۔ تاہم، آپ کے آلہ پر مقامی طور پر محفوظ کردہ سبھی فائلیں حذف کر دی جائیں گی۔</translation> <translation id="5578059481725149024">خودکار سائن ان</translation> +<translation id="5581134892342029705"><ph name="LANGUAGE" /> میں ترجمہ مکمل ہو گیا ہے</translation> <translation id="558170650521898289">Microsoft Windows ہارڈ ویئر ڈرائیور کی توثیق</translation> <translation id="5581972110672966454">ڈومین میں آلہ کو شامل نہیں کیا جا سکا۔ براہ کرم دوبارہ کوشش کریں یا اپنے آلہ کے مالک یا منتظم سے رابطہ کریں۔ خرابی کا کوڈ: <ph name="ERROR_CODE" />۔</translation> <translation id="5582839680698949063">اصل مینو</translation> @@ -5806,6 +5816,7 @@ <translation id="7057184853669165321">{NUM_MINS,plural, =1{سیفٹی چیک 1 منٹ پہلے کیا گیا}other{سیفٹی چیک {NUM_MINS} منٹ پہلے کیا گیا}}</translation> <translation id="7057767408836081338">ایپ کا ڈیٹا حاصل کرنے میں ناکام، بہر صورت ایپ کو چلانے کی کوشش کی جار رہی ہے...</translation> <translation id="7058024590501568315">پوشیدہ نیٹ ورک</translation> +<translation id="70582545822664495"><ph name="DEVICE_COUNT" /> میں سے <ph name="DEVICE_INDEX" /> آلہ، <ph name="DEVICE_NAME" /> نام والا ماؤس</translation> <translation id="7059858479264779982">خود کار طور پر شروع کریں پر سیٹ کریں</translation> <translation id="7062222374113411376">حال ہی میں بند کی گئی سائٹس کو ڈیٹا بھیجنے اور حاصل کرنے کو مکمل کرنے کی اجازت دیں (تجویز کردہ)</translation> <translation id="7063129466199351735">شارٹ کٹس پر کارروائی کی جا رہی ہے…</translation> @@ -5969,6 +5980,7 @@ <translation id="7257173066616499747">Wi-Fi نیٹ ورکس</translation> <translation id="725758059478686223">پرنٹنگ سروس</translation> <translation id="7257666756905341374">آپ جو ڈیٹا کاپی اور پیسٹ کرتے ہیں اسے پڑھیں</translation> +<translation id="7258006747130724016"><ph name="DEVICE_COUNT" /> میں سے <ph name="DEVICE_INDEX" /> آلہ، <ph name="DEVICE_NAME" /> نام والا ویڈیو کیمرا</translation> <translation id="7258192266780953209">تبدیلیاں</translation> <translation id="7258225044283673131">ایپلیکیشن جواب نہیں دے رہی ہے۔ ایپ بند کرنے کیلئے، "زبردستی بند کریں" منتخب کریں۔</translation> <translation id="7262004276116528033">اس سائن ان سروس کی میزبانی <ph name="SAML_DOMAIN" /> کرتا ہے</translation> @@ -6764,6 +6776,7 @@ <translation id="8037117027592400564">سنتھیسائز کردہ اسپیچ کا استعمال کر کے بولے گئے سبھی متن کو پڑھیں</translation> <translation id="8037357227543935929">پوچھیں (ڈیفالٹ)</translation> <translation id="803771048473350947">فائل</translation> +<translation id="8038399858950372766"><ph name="DEVICE_COUNT" /> میں سے <ph name="DEVICE_INDEX" /> آلہ، <ph name="DEVICE_NAME" /> نام والا کی بورڈ</translation> <translation id="8041089156583427627">تاثرات بھیجیں</translation> <translation id="8042142357103597104">متن کا دھندلا پن</translation> <translation id="8044262338717486897"><ph name="LINUX_APP_NAME" /> جواب نہیں دے رہی ہے۔</translation> @@ -6902,6 +6915,7 @@ <translation id="8168071266284693455">آپ کے سبھی آلات پر آپ کے بُک مارکس، پاس ورڈز، سرگزشت اور مزید بہت کچھ کو سِنک کیا جاتا ہے</translation> <translation id="8168435359814927499">مواد</translation> <translation id="8169165065843881617">{NUM_TABS,plural, =1{پڑھنے کی فہرست میں ٹیب شامل کریں}other{پڑھنے کی فہرست میں ٹیبز شامل کریں}}</translation> +<translation id="8169849063724750395">دوبارہ آن کریں</translation> <translation id="8171334254070436367">سبھی کارڈز کو چھپائیں</translation> <translation id="8174047975335711832">آلہ کی معلومات</translation> <translation id="8174876712881364124">Google Drive پر بیک اپ لیں۔ آسانی سے ڈیٹا بحال کریں یا کسی بھی وقت آلہ سوئچ کریں۔ اس بیک اپ میں ایپ ڈیٹا شامل ہوتا ہے۔ بیک اپس کو Google پر اپ لوڈ کیا جاتا ہے اور آپ کے بچے کے Google اکاؤنٹ کا پاس ورڈ استعمال کر کے انہیں مرموز کیا جاتا ہے۔ <ph name="BEGIN_LINK1" />مزید جانیں<ph name="END_LINK1" /></translation> @@ -6975,6 +6989,7 @@ <translation id="8249615410597138718">اپنے آلات پر بھیجیں</translation> <translation id="8249672078237421304">ان صفحات کا ترجمہ کرنے کی پیشکش کریں جو آپ کے مطالعہ کی زبان میں نہیں ہیں</translation> <translation id="8251441930213048644">اب ریفریش کریں</translation> +<translation id="8251509999076836464"><ph name="DEVICE_NAME" /> سے جوڑا بنایا جا رہا ہے</translation> <translation id="8251578425305135684">تھمب نیل کو ہٹا دیا گیا۔</translation> <translation id="825238165904109940">ہمیشہ مکمل URLs دکھائیں</translation> <translation id="8252569384384439529">اپ لوڈ ہو رہی ہے...</translation> @@ -7212,9 +7227,11 @@ <translation id="8528074251912154910">زبانیں شامل کریں</translation> <translation id="8528962588711550376">سائن ان کیا جا رہا ہے۔</translation> <translation id="8529925957403338845">فوری ٹیدرنگ کا کنکشن ناکام ہو گیا</translation> +<translation id="8531701051932785007">بہتر کردہ محفوظ براؤزنگ آف ہے</translation> <translation id="8534656636775144800">افوہ! ڈومین میں شامل ہونے کی کوشش کرتے وقت کچھ غلط ہو گیا۔ براہ کرم دوبارہ کوشش کریں۔</translation> <translation id="8535005006684281994">Netscape سرٹیفیکیٹ تجدید URL</translation> <translation id="8536956381488731905">کلید دبانے پر آواز</translation> +<translation id="8538718737588735385">دوبارہ آن کریں</translation> <translation id="8539727552378197395">کوئی (HttpOnly) نہیں ہے</translation> <translation id="8539766201049804895">اپ گریڈ کریں</translation> <translation id="8540136935098276800">صحیح طور پر فارمیٹ کیا ہوا URL درج کریں</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 69ebf66..9313356a 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -1698,6 +1698,7 @@ <translation id="2707024448553392710">Thành phần đang tải xuống</translation> <translation id="270921614578699633">Trên trung bình</translation> <translation id="2709516037105925701">Tự động điền</translation> +<translation id="2710014902399506864">Thêm điện thoại mới</translation> <translation id="2710101514844343743">Dữ liệu chẩn đoán và dữ liệu về mức sử dụng</translation> <translation id="271033894570825754">Mới</translation> <translation id="2712173769900027643">Xin phép</translation> @@ -2056,6 +2057,7 @@ <translation id="3055590424724986000">Với nhà cung cấp mà bạn lựa chọn</translation> <translation id="3058498974290601450">Bạn có thể bật tính năng đồng bộ hóa bất cứ lúc nào trong phần cài đặt</translation> <translation id="3058517085907878899">Tên thiết bị</translation> +<translation id="3059195548603439580">Bạn đang tìm các thành phần hệ thống? Hãy truy cập</translation> <translation id="3060379269883947824">Bật chọn để nói</translation> <translation id="3060952009917586498">Thay đổi ngôn ngữ của thiết bị. Ngôn ngữ hiện tại là <ph name="LANGUAGE" />.</translation> <translation id="3060987956645097882">Chúng tôi không thể thiết lập đường kết nối với điện thoại của bạn. Hãy đảm bảo điện thoại của bạn đang ở gần, mở khóa, đồng thời đã bật Bluetooth và Wi-Fi.</translation> @@ -2712,6 +2714,7 @@ <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Kết nối với một thiết bị USB}other{Kết nối với # thiết bị USB}}</translation> <translation id="3764974059056958214">{COUNT,plural, =1{Đang gửi <ph name="ATTACHMENTS" /> tới thiết bị <ph name="DEVICE_NAME" />}other{Đang gửi <ph name="ATTACHMENTS" /> tới thiết bị <ph name="DEVICE_NAME" />}}</translation> <translation id="3765246971671567135">Không thể đọc chính sách về chế độ minh họa ngoại tuyến.</translation> +<translation id="3766115177661377251">Truyền sang màn hình mới</translation> <translation id="3766811143887729231"><ph name="REFRESH_RATE" /> Hz</translation> <translation id="377050016711188788">Kem</translation> <translation id="3771290962915251154">Tùy chọn cài đặt này bị tắt do các quyền kiểm soát của cha mẹ đang bật</translation> @@ -3500,6 +3503,7 @@ <translation id="4590324241397107707">Bộ nhớ cơ sở dữ liệu</translation> <translation id="4592891116925567110">Ứng dụng vẽ bằng bút cảm ứng</translation> <translation id="4593021220803146968">Đ&i đến <ph name="URL" /></translation> +<translation id="4594577641390224176">Bạn đang tìm hệ thống giới thiệu trang? Hãy truy cập</translation> <translation id="4595560905247879544">Chỉ người quản lý mới có thể sửa đổi ứng dụng và tiện ích (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">Bạn có các chứng chỉ trên tệp có thể nhận dạng các máy chủ này</translation> <translation id="4598556348158889687">Quản lý bộ nhớ</translation> @@ -4883,6 +4887,7 @@ <translation id="6085886413119427067">Xác định cách kết nối với các trang web qua đường kết nối an toàn</translation> <translation id="6086004606538989567">Tài khoản mà bạn đã xác minh không được phép truy cập vào thiết bị này.</translation> <translation id="6086846494333236931">Do quản trị viên của bạn cài đặt</translation> +<translation id="6087746524533454243">Bạn đang tìm trình duyệt giới thiệu trang? Hãy truy cập</translation> <translation id="6087960857463881712">Khuôn mặt vui nhộn</translation> <translation id="608912389580139775">Để thêm trang này vào danh sách đọc, hãy nhấp vào biểu tượng Dấu trang</translation> <translation id="6091761513005122595">Đã kết nối thành công với thư mục chia sẻ.</translation> @@ -4981,6 +4986,7 @@ <translation id="6198102561359457428">Đăng xuất rồi đăng nhập lại...</translation> <translation id="6198252989419008588">Thay đổi mã PIN</translation> <translation id="6200047250927636406">Loại bỏ tệp</translation> +<translation id="6200151268994853226">Quản lý tiện ích</translation> <translation id="6201608810045805374">Xoá tài khoản này?</translation> <translation id="6202304368170870640">Bạn có thể sử dụng mã PIN để đăng nhập hoặc mở khóa thiết bị của mình.</translation> <translation id="6206311232642889873">Sao ché&p Hình ảnh</translation> @@ -5267,6 +5273,7 @@ <translation id="6497789971060331894">Đảo ngược hướng cuộn chuột</translation> <translation id="6498249116389603658">&Tất cả ngôn ngữ của bạn</translation> <translation id="6499143127267478107">Đang khắc phục máy chủ trong tập lệnh proxy...</translation> +<translation id="6499764981457476645">Không tìm thấy thiết bị nào ở gần</translation> <translation id="6501086852992132091"><ph name="APP_ORIGIN" /> muốn mở tệp này:</translation> <translation id="6501957628055559556">Tất cả vùng chứa</translation> <translation id="650266656685499220">Để tạo album, hãy chuyển đến Google Photos</translation> @@ -5732,6 +5739,7 @@ <translation id="6979440798594660689">Tắt tiếng (mặc định)</translation> <translation id="6979737339423435258">Từ trước đến nay</translation> <translation id="6981553172137913845">Để duyệt web ở chế độ riêng tư, hãy nhấp vào trình đơn có biểu tượng ba dấu chấm để mở một cửa sổ Ẩn danh</translation> +<translation id="6981761993313539853">Hãy đảm bảo thiết bị Bluetooth của bạn đang ở gần và đã bật chế độ ghép nối. Chỉ ghép nối với các thiết bị mà bạn tin tưởng. <ph name="BEGIN_LINK_LEARN_MORE" />Tìm hiểu thêm<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Hỗ trợ tiếp cận</translation> <translation id="6983507711977005608">Ngắt kết nối mạng Chia sẻ Internet tức thì</translation> <translation id="6983783921975806247">OID đã Đăng ký</translation> @@ -6638,6 +6646,7 @@ <translation id="7898725031477653577">Luôn dịch</translation> <translation id="7901405293566323524">Trung tâm điều khiển điện thoại</translation> <translation id="7901914889562552258">Cải thiện Chrome bằng cách sử dụng các chỉ số trang</translation> +<translation id="7903290522161827520">Bạn đang tìm các thành phần trình duyệt? Hãy truy cập</translation> <translation id="7903345046358933331">Trang không hồi đáp. Bạn có thể chờ trang hồi đáp hoặc đóng trang.</translation> <translation id="7903742244674067440">Bạn có các chứng chỉ trên tệp có thể nhận dạng các tổ chức cấp chứng chỉ này</translation> <translation id="7903925330883316394">Tiện ích: <ph name="UTILITY_TYPE" /></translation> @@ -7011,6 +7020,7 @@ <translation id="8271268254812352141">Xem định nghĩa, bản dịch hoặc kết quả chuyển đổi đơn vị bằng cách nhấp chuột phải hoặc chạm và giữ văn bản. Tùy chỉnh ngôn ngữ dịch trong <ph name="LINK_BEGIN" />Ngôn ngữ cho trang web<ph name="LINK_END" />.</translation> <translation id="8271379370373330993">Cha mẹ chỉ cần thực hiện một vài bước nữa là xong. Bạn có thể đưa <ph name="DEVICE_TYPE" /> lại cho trẻ sau khi thiết lập tài khoản.</translation> <translation id="8272443605911821513">Quản lý tiện ích của bạn bằng cách nhấp vào Tiện ích trong menu "Công cụ khác".</translation> +<translation id="8272677921396592934">Dùng máy ảnh để quét mã QR</translation> <translation id="8274332263553132018">Truyền tệp</translation> <translation id="8274921654076766238">Phóng to theo tiêu điểm lấy bằng bàn phím</translation> <translation id="8274924778568117936">Không tắt hoặc đóng <ph name="DEVICE_TYPE" /> cho đến khi cập nhật xong. <ph name="DEVICE_TYPE" /> của bạn sẽ khởi động lại sau khi cài đặt xong.</translation> @@ -7688,6 +7698,7 @@ <translation id="9004754973617721124">Xóa tất cả dữ liệu trang web và quyền của <ph name="SITE_NAME" />, cũng như mọi trang web và ứng dụng đã cài đặt thuộc nhóm này?</translation> <translation id="9004952710076978168">Đã nhận được thông báo cho máy in không xác định.</translation> <translation id="9008201768610948239">Bỏ qua</translation> +<translation id="9008201858626224558">Nút quay lại trang chi tiết của <ph name="SUBPAGE_TITLE" /></translation> <translation id="9009369504041480176">Đang tải lên (<ph name="PROGRESS_PERCENT" />%)...</translation> <translation id="9009708085379296446">Có phải bạn muốn thay đổi trang này không?</translation> <translation id="9011163749350026987">Luôn hiển thị biểu tượng</translation> @@ -7870,6 +7881,7 @@ <translation id="917510707618656279">Hỏi khi một trang web muốn truy cập vào các thiết bị Bluetooth</translation> <translation id="9176476835295860688">Gửi dữ liệu chẩn đoán và dữ liệu về mức sử dụng. Thiết bị này hiện tự động gửi dữ liệu chẩn đoán, dữ liệu về mức sử dụng ứng dụng và thiết bị cho Google. Những thông tin này sẽ giúp tăng độ ổn định của hệ thống và ứng dụng cũng như cải thiện các mặt khác. Một số dữ liệu tổng hợp cũng sẽ hữu ích cho các ứng dụng và đối tác của Google, chẳng hạn như những nhà phát triển Android. Mục <ph name="BEGIN_LINK1" />cài đặt<ph name="END_LINK1" /> này do chủ sở hữu thực thi. Nếu bạn bật mục cài đặt bổ sung Hoạt động trên web và ứng dụng thì dữ liệu này có thể được lưu vào Tài khoản Google của bạn. <ph name="BEGIN_LINK2" />Tìm hiểu thêm<ph name="END_LINK2" /></translation> <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - Đã kết nối thiết bị Bluetooth</translation> +<translation id="9178061802301856367">Xoá dữ liệu đăng nhập</translation> <translation id="9179524979050048593">Tên người dùng trên màn hình đăng nhập</translation> <translation id="9180281769944411366">Quá trình này có thể mất vài phút. Đang khởi động vùng chứa Linux.</translation> <translation id="9180380851667544951">Trang web có thể chia sẻ màn hình của bạn</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index ba82abc..06daec4a 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -253,6 +253,7 @@ <translation id="1244265436519979884">Ukubuyiselwa kwe-Linux manje kuyaqhubeka</translation> <translation id="1244303850296295656">Iphutha lesandiso</translation> <translation id="1246863218384630739">Ayikwazanga ukufaka i-<ph name="VM_NAME" />: I-URL yomfanekiso ibuyisele ikhodi lephutha le-<ph name="HTTP_ERROR" />. Sicela uxhumane nomlawuli wakho.</translation> +<translation id="1247071602516579380">Idivayisi ye-<ph name="DEVICE_INDEX" /> kwezingu-<ph name="DEVICE_COUNT" />, Ithebulethi ebizwa ngokuthi i-<ph name="DEVICE_NAME" /></translation> <translation id="1251366534849411931">I-brace egoqekile yokuvuleka okulindelwe: <ph name="ERROR_LINE" /></translation> <translation id="1251480783646955802">Lokhu kuzosula idatha engu-<ph name="TOTAL_USAGE" /> egcinwe amasayithi nezinhlelo zokusebenza ezifakiwe</translation> <translation id="1251578593170406502">Iskena amanethiwekhi wedatha yeselula...</translation> @@ -439,6 +440,7 @@ <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> okukhethiwe</translation> <translation id="1442851588227551435">Setha ithikithi le-Kerberos elisebenzayo</translation> <translation id="1444628761356461360">Lokhu kulungiselelwa kuphethwe umnikazi wedivayisi, <ph name="OWNER_EMAIL" />.</translation> +<translation id="1445005312224723356">Idivayisi engu-<ph name="DEVICE_INDEX" /> kwezingu-<ph name="DEVICE_COUNT" />, Ifoni ebizwa ngokuthi i-<ph name="DEVICE_NAME" /></translation> <translation id="144518587530125858">Ayikwazanga ukulayisha i-'<ph name="IMAGE_PATH" />' yetimu.</translation> <translation id="1449191289887455076">Cindezela i-“<ph name="CURRENTKEY" />” futhi ukuqinisekisa umsebenzi ne-<ph name="RESPONSE" /></translation> <translation id="1451375123200651445">Ikhasi lewebhu, ifayela eyodwa</translation> @@ -869,6 +871,7 @@ <translation id="1855079636134697549">Ikhamera ivuliwe</translation> <translation id="1856715684130786728">Engeza indawo...</translation> <translation id="1858585891038687145">Themba lesi sitifiketi ukuze sikhombe omaka besofthiwe</translation> +<translation id="1859787252990099899">Idivayisi ye-<ph name="DEVICE_INDEX" /> kwezingu-<ph name="DEVICE_COUNT" />, Idivayisi engaziwa ebizwa ngokuthi i-<ph name="DEVICE_NAME" /></translation> <translation id="1861262398884155592">Le folda ayinalutho</translation> <translation id="1862311223300693744">Ingabe unayo isofthiwe ekhethekile ye-VPN, yommeleli, yohlelo lokuvikela noma ye-NAS efakiwe?</translation> @@ -1244,6 +1247,7 @@ <translation id="2242687258748107519">Ulwazi lwefayela</translation> <translation id="2246549592927364792">Thola izincazelo zesithombe kusuka ku-Google?</translation> <translation id="2247738527273549923">Idivayisi yakho iphethwe inhlangano yakho</translation> +<translation id="2249061317998743208">Idivayisi engu-<ph name="DEVICE_INDEX" /> kwezingu-<ph name="DEVICE_COUNT" />, Isilawuli segeyimu esibizwa ngokuthi i-<ph name="DEVICE_NAME" /></translation> <translation id="2249111429176737533">Kuvule njengewindi elinethebhu</translation> <translation id="2249605167705922988">isb. 1-5, 8, 11-13</translation> <translation id="2251218783371366160">Vula ngesibukeli sesistimu</translation> @@ -2005,6 +2009,7 @@ <translation id="3007771295016901659">Phinda ithebhu</translation> <translation id="3008232374986381779">Qalisa amathuluzi e-Linux, abahleli, nama-IDE ku-<ph name="DEVICE_TYPE" /> yakho. <ph name="LINK_BEGIN" />Funda kabanzi<ph name="LINK_END" /></translation> <translation id="3008272652534848354">Setha kabusha izimvume</translation> +<translation id="3008396025115884998">Idivayisi ye-<ph name="DEVICE_INDEX" /> kwezingu-<ph name="DEVICE_COUNT" />, Idivayisi yomsindo ebizwa ngokuthi i-<ph name="DEVICE_NAME" /></translation> <translation id="3008694618228964140">{NUM_DAYS,plural, =1{I-<ph name="MANAGER" /> idinga ukuthi uxhumeke ku-Wi-Fi namuhla ukuze ulande isibuyekezo. Noma, ulande ngokuxhuma okwenziwe imitha (kungaba nezinkokhelo).}one{I-<ph name="MANAGER" /> idinga ukuthi uxhume ku-Wi-Fi bese ulanda isibuyekezo ngaphambi kwesikhathi esimisiwe. Noma, ulande ngokuxhuma okwenziwe imitha (kungaba nezinkokhelo).}other{I-<ph name="MANAGER" /> idinga ukuthi uxhume ku-Wi-Fi bese ulanda isibuyekezo ngaphambi kwesikhathi esimisiwe. Noma, ulande ngokuxhuma okwenziwe imitha (kungaba nezinkokhelo).}}</translation> <translation id="3009300415590184725">Ingabe uqinisekile ukuthi ufuna ukukhansela inqubo yokusetha yesevisi yedatha yeselula?</translation> <translation id="3009779501245596802">Izizinda zemininingwane ezikhonjiwe</translation> @@ -2310,6 +2315,7 @@ <translation id="3348038390189153836">Kutholwe idivayisi engasuseka</translation> <translation id="3348131053948466246">I-emoji iphakanyisiwe. Cindezela umcibisholo waphezulu noma waphansi ukuze uzulazule kanye no-enter ukuze ufake.</translation> <translation id="3349933790966648062">I-Footprint yememori</translation> +<translation id="3354972872297836698">Ayikwazanga ukubhangqa ku-<ph name="DEVICE_NAME" />; khetha idivayisi ukuzama futhi</translation> <translation id="3355936511340229503">Iphutha lokuxhumeka</translation> <translation id="3356580349448036450">Qedile</translation> <translation id="3359256513598016054">Izithiyo zenqubomgomo yesitifiketi</translation> @@ -3139,6 +3145,7 @@ <translation id="4200689466366162458">Amagama angokwezifiso</translation> <translation id="4200983522494130825">Ithebhu entsha</translation> <translation id="4201546031411513170">Ungahlala ukhetha ukuthi yini okumele ivunyelaniswe kuzilungiselelo.</translation> +<translation id="4202417625268941299">Ngokuphequlula Ngokuphepha Okugqamile, uzothola ukuvikeleka kwe-Chrome okunamandla</translation> <translation id="420283545744377356">Vula isilondolozi sesikrini</translation> <translation id="4206144641569145248">I-alien</translation> <translation id="4206323443866416204">Umbiko wokuphendula</translation> @@ -3645,6 +3652,7 @@ <translation id="4759238208242260848">Ukulanda</translation> <translation id="4761104368405085019">Sebenzisa imakrofoni yakho</translation> <translation id="4762718786438001384">Isikhala sediski yedivayisi sincane kakhulu</translation> +<translation id="4762898026821161650">Idivayisi ye-<ph name="DEVICE_INDEX" /> kwezingu-<ph name="DEVICE_COUNT" />, Ikhompyutha ebizwa ngokuthi i-<ph name="DEVICE_NAME" /></translation> <translation id="4763408175235639573">Amakhukhi alandelayo athunyelwe ngenkathi ubuka leli khasi</translation> <translation id="4765582662863429759">Ivumela i-Android Messages ukwethemba imibhalo kusuka efonini yakho kuya ku-Chromebook yakho</translation> <translation id="4768332406694066911">Unezitifiketi ezivela kulezi zinhlangano ezikukhombayo</translation> @@ -3826,6 +3834,7 @@ <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" ifuna ukuxhuma embobeni yesiriyeli</translation> <translation id="4944310289250773232">Le sevisi yokufakazela ubuqiniso isingethwe i-<ph name="SAML_DOMAIN" /></translation> <translation id="4945439665401275950">Ukuze usethe isigxivizo somunwe, vumela ingane yakho ukuthi ithinte inkinobho yamandla. Idatha yesigxivizo somunwe yengane yakho igcinwa ngokuvikelekile futhi ayishiyi i-<ph name="DEVICE_TYPE" />.</translation> +<translation id="4946459324029651239">Uthola ukuvikelwa okujwayelekile</translation> <translation id="495164417696120157">{COUNT,plural, =1{ifayela}one{amafayela angu-#}other{amafayela angu-#}}</translation> <translation id="495170559598752135">Izenzo</translation> <translation id="4953808748584563296">Isithombe esizenzakalelayo esiwolintshi</translation> @@ -4411,6 +4420,7 @@ <translation id="5575528586625653441">Inkinga ngesicelo sokubhalisa idemo ivelile.</translation> <translation id="557722062034137776">Ukusetha kabusha idivayisi yakho ngeke kuze kuthinte ama-akhawunti wakho we-Google noma enye idatha evumelaniswe kulawa ma-akhawunti. Kodwa, wonke amafayela alondolozwe endaweni kudivayisi yakho azosuswa.</translation> <translation id="5578059481725149024">Ngena ngemvume ngokuzenzakalela</translation> +<translation id="5581134892342029705">Ukuhumushela kwisi-<ph name="LANGUAGE" /> kuqedile</translation> <translation id="558170650521898289">Ukuqinisekiswa kwesishayeli sezingxenyekazi zekhompyutha kwe-Microsoft Windows</translation> <translation id="5581972110672966454">Ayikwazi ukujoyina idivayisi esizindeni. Sicela uzame futhi noma uxhumane nomnikazi noma umlawuli wedivayisi yakho. Ikhodi yephutha: <ph name="ERROR_CODE" />.</translation> <translation id="5582839680698949063">Imenyu eyinhloko</translation> @@ -5825,6 +5835,7 @@ <translation id="7057184853669165321">{NUM_MINS,plural, =1{Ukuhlola kokuphepha kusebenze eminithini elingu-1 eledlule}one{Ukuhlola kokuphepha kusebenze emaminithini angu-{NUM_MINS} adlule}other{Ukuhlola kokuphepha kusebenze emaminithini angu-{NUM_MINS} adlule}}</translation> <translation id="7057767408836081338">Yehlulekile ukuthola idatha yohlelo lokusebenza, izama ukuqalisa uhlelo lokusebenza noma kunjalo...</translation> <translation id="7058024590501568315">Inethiwekhi efihliwe</translation> +<translation id="70582545822664495">Idivayisi engu-<ph name="DEVICE_INDEX" /> kwezingu-<ph name="DEVICE_COUNT" />, Imawuzi ebizwa ngokuthi i-<ph name="DEVICE_NAME" /></translation> <translation id="7059858479264779982">Sethela ukuqalisa ngokuzenzakalela</translation> <translation id="7062222374113411376">Vumela amasayithi asanda kuvalwa ukuqeda ukuthumela noma ukwamukela idatha</translation> <translation id="7063129466199351735">Icubungula izinqamuleli...</translation> @@ -5988,6 +5999,7 @@ <translation id="7257173066616499747">Amanethiwekhi we-Wi-Fi</translation> <translation id="725758059478686223">Isevisi yokuphrinta</translation> <translation id="7257666756905341374">Funda idatha oyikopishayo uphinde uyinamathisele</translation> +<translation id="7258006747130724016">Idivayisi ye-<ph name="DEVICE_INDEX" /> kwezingu-<ph name="DEVICE_COUNT" />, Ikhamera yevidiyo ebizwa ngokuthi i-<ph name="DEVICE_NAME" /></translation> <translation id="7258192266780953209">Ukuguqulwa</translation> <translation id="7258225044283673131">Uhlelo lokusebenza aluphenduli. Khetha okuthi "Phoqa ukuvala" ukuze uvale uhlelo lokusebenza.</translation> <translation id="7262004276116528033">Le sevisi yokungena ngemvume isingathwa yi-<ph name="SAML_DOMAIN" /></translation> @@ -6783,6 +6795,7 @@ <translation id="8037117027592400564">Funda wonke umbhalo okhulunywayo usebenzisa inkulumo ekhulisiwe</translation> <translation id="8037357227543935929">Buza (okuzenzakalelayo)</translation> <translation id="803771048473350947">Ifayela</translation> +<translation id="8038399858950372766">Idivayisi ye-<ph name="DEVICE_INDEX" /> kwezingu-<ph name="DEVICE_COUNT" />, Ikhibhodi ebizwa ngokuthi i-<ph name="DEVICE_NAME" /></translation> <translation id="8041089156583427627">Thumela impendulo</translation> <translation id="8042142357103597104">I-Opacity yombhalo</translation> <translation id="8044262338717486897">I-<ph name="LINUX_APP_NAME" /> ayiphenduli.</translation> @@ -6921,6 +6934,7 @@ <translation id="8168071266284693455">Amabhukhimakhi akho, amaphasiwedi, umlando, nokunye kuyavunyelaniswa kuwo wonke amadivayisi akho</translation> <translation id="8168435359814927499">Okuqukethwe</translation> <translation id="8169165065843881617">{NUM_TABS,plural, =1{Engeza Ithebhu Kuhlu Lokufunda}one{Engeza Amathebhu Kuhlu Lokufunda}other{Engeza Amathebhu Kuhlu Lokufunda}}</translation> +<translation id="8169849063724750395">Phinda uvule</translation> <translation id="8171334254070436367">Fihla wonke amakhadi</translation> <translation id="8174047975335711832">Ulwazi lwedivayisi</translation> <translation id="8174876712881364124">Ukwenza isipele ku-Google Drayivu. Buyisa kalula idatha noma shintsha idivayisi noma kunini. Lesi sipele sibandakanya idatha yohlelo lokusebenza. Izipele zilayishwa ku-Google futhi zibethelwe kusetshenziswa iphasiwedi ye-akhawunti ye-Google yengane yakho. <ph name="BEGIN_LINK1" />Funda kabanzi<ph name="END_LINK1" /></translation> @@ -6994,6 +7008,7 @@ <translation id="8249615410597138718">Thumela kumadivayisi akho</translation> <translation id="8249672078237421304">Nikezela ngokuhumusha amakhasi angekho kulimi olifundayo</translation> <translation id="8251441930213048644">Vuselela manje</translation> +<translation id="8251509999076836464">Ibhangqa ku-<ph name="DEVICE_NAME" /></translation> <translation id="8251578425305135684">Isithombe esincane sisusiwe.</translation> <translation id="825238165904109940">Njalo nje Bonisa ama-URL Agcwele</translation> <translation id="8252569384384439529">Iyalayisha...</translation> @@ -7231,9 +7246,11 @@ <translation id="8528074251912154910">Engeza izilimi</translation> <translation id="8528962588711550376">Ingena ngemvume.</translation> <translation id="8529925957403338845">Ukuxhumeka okusheshayo kokusebenzisa ifoni njengemodemu kuhlulekile</translation> +<translation id="8531701051932785007">Ukuphequlula Ngokuphepha Okugqamile kuvaliwe</translation> <translation id="8534656636775144800">Eshu! Kukhona okungahambanga kahle ngenkathi uzama ukujoyina isizinda. Sicela uzame futhi.</translation> <translation id="8535005006684281994">I-URL yokuvuselela yesitifiketi se-Netscape</translation> <translation id="8536956381488731905">Umsindo wokucindezela ukhiye</translation> +<translation id="8538718737588735385">Phinda uvule</translation> <translation id="8539727552378197395">Ayikho (HttpOnly)</translation> <translation id="8539766201049804895">Thuthukisa</translation> <translation id="8540136935098276800">Faka i-URL efomethwe ngokulungile</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb index 4c49f2a9..c946395 100644 --- a/chrome/app/resources/google_chrome_strings_ar.xtb +++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -50,7 +50,7 @@ <translation id="2121284319307530122">إعادة تشغيل متصفِّح Chrome لتحديثه</translation> <translation id="2123055963409958220">يمكنك المساعدة في تحسين Chrome بالإبلاغ عن <ph name="BEGIN_LINK" />الإعدادات الحالية<ph name="END_LINK" /></translation> <translation id="2151406531797534936">يُرجى إعادة تشغيل Chrome الآن</translation> -<translation id="2189289170880510015">تخصيص بعض من أهم خيارات الخصوصية في Chrome</translation> +<translation id="2189289170880510015">تخصيص بعض أهم خيارات الخصوصية في Chrome</translation> <translation id="2258103955319320201">للوصول إلى بياناتك في متصفّح Chrome من جميع أجهزتك، سجِّل الدخول وفعِّل المزامنة.</translation> <translation id="2290014774651636340">مفاتيح واجهة برمجة تطبيقات Google مفقودة. وسيترتب على ذلك توقف بعض وظائف Google Chrome عن العمل.</translation> <translation id="2290095356545025170">هل تريد فعلًا إزالة Google Chrome؟</translation> @@ -115,7 +115,7 @@ <translation id="3596080736082218006">{COUNT,plural, =0{يطلب المشرف إعادة تشغيل Chrome لتطبيق تحديث.}=1{يطلب المشرف إعادة تشغيل Chrome لتطبيق تحديث. لن تتم إعادة فتح نافذة التصفح المتخفي.}two{يطلب المشرف إعادة تشغيل Chrome لتطبيق تحديث. لن تتم إعادة فتح نافذتَي التصفح المتخفي.}few{يطلب المشرف إعادة تشغيل Chrome لتطبيق تحديث. لن تتم إعادة فتح نوافذ التصفّح المتخفي البالغ عددها #.}many{يطلب المشرف إعادة تشغيل Chrome لتطبيق تحديث. لن تتم إعادة فتح نوافذ التصفّح المتخفي البالغ عددها #.}other{يطلب المشرف إعادة تشغيل Chrome لتطبيق تحديث. لن تتم إعادة فتح نوافذ التصفّح المتخفي البالغ عددها #.}}</translation> <translation id="3622797965165704966">الآن أصبح استخدام Chrome مع حسابك في Google وفي أجهزة الكمبيوتر المشتركة أكثر سهولة.</translation> <translation id="3673813398384385993">رصد Chrome أنّ الإضافة "<ph name="EXTENSION_NAME" />" تحتوي على برامج ضارة.</translation> -<translation id="3678552270983184277">تناسب الإعدادات التلقائية معظم الأشخاص، ولكن يمكنك تخصيصها لاستخدام Chrome بالطريقة التي تعجبك.</translation> +<translation id="3678552270983184277">تناسب الإعدادات التلقائية معظم الأشخاص، ويمكنك تخصيصها لاستخدام Chrome بالطريقة التي تعجبك.</translation> <translation id="3718181793972440140">سيعمل هذا على حذف عنصر واحد من هذا الجهاز. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome كـ <ph name="USER_EMAIL" />.</translation> <translation id="3735758079232443276">غيّرت الإضافة "<ph name="EXTENSION_NAME" />" الصفحة التي تظهر عند بدء Chrome.</translation> <translation id="3779473566290487688">للحصول على تحديثات Google Chrome في المستقبل، يجب أن تستخدم جهازًا يعمل بنظام التشغيل OS X 10.11 أو إصدار أحدث. يعمل جهاز الكمبيوتر هذا بنظام التشغيل OS X 10.10.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_az.xtb b/chrome/app/resources/google_chrome_strings_az.xtb index 304effb..5c86903 100644 --- a/chrome/app/resources/google_chrome_strings_az.xtb +++ b/chrome/app/resources/google_chrome_strings_az.xtb
@@ -245,6 +245,7 @@ <translation id="7398801000654795464">Chrome'a <ph name="USER_EMAIL_ADDRESS" /> olaraq daxil olmuşdunuz. Lütfən, yenidən daxil olmaq üçün eyni hesabdan istifadə edin.</translation> <translation id="7408085963519505752">Chrome OS şərtləri</translation> <translation id="7419046106786626209">Chrome OS datanızı sinxronizasiya edə bilmədi, çünki sinxronizasiya domeniniz üçün əlçatan deyil.</translation> +<translation id="7481213027396403996">Chrome’un ən güclü güvənlik sistemini əldə edin</translation> <translation id="7486227612705979895">Ünvan panelində təkliflər irəli sürmək üçün Chrome Diskinizə daxil olacaq</translation> <translation id="7535429826459677826">Google Chrome Dev</translation> <translation id="7573289029918943991">Cihazınızın güncəl olub-olmadığına baxmaq üçün <ph name="LINK_BEGIN" />Chrome OS Ayarlarına<ph name="LINK_END" /> keçin</translation> @@ -304,6 +305,7 @@ <translation id="8862326446509486874">Sistem səviyyəli quraşdırma üçün uyğun hüquqlarınız yoxdur. Quraşdırıcını yenidən Administrator olaraq işə salmağa cəhd edin.</translation> <translation id="8914504000324227558">Chrome'u yenidən başladın</translation> <translation id="8922193594870374009"><ph name="ORIGIN" /> cihazından Android telefonunuza nömrə göndərmək üçün hər iki cihazda Chrome'a daxil olun.</translation> +<translation id="8927704157641862988">Chrome'un ən vacib hesab etdiyi məxfilik seçimlərini fərdiləşdirin. Bu bələdçiyə hər ayar və seçim daxil deyil.</translation> <translation id="8986207147630327271">Bu brauzerə iş profili əlavə edirsiniz və administratorunuza yalnız iş profili üzərində nəzarət verirsiniz.</translation> <translation id="8999208279178790196">{0,plural, =0{Chrome güncəlləməsi əlçatandır}=1{Chrome güncəlləməsi əlçatandır}other{Chrome güncəlləməsi # gün əlçatan olub}}</translation> <translation id="9026991721384951619">Chrome OS datanızı sinxronizasiya edə bilmir, çünki hesaba giriş məlumatlarınız köhnədir.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb index 5b933cc..b7755607 100644 --- a/chrome/app/resources/google_chrome_strings_bn.xtb +++ b/chrome/app/resources/google_chrome_strings_bn.xtb
@@ -288,6 +288,7 @@ <translation id="8540666473246803645">Google Chrome</translation> <translation id="8550334526674375523">এই অফিস প্রোফাইল আপনার ব্যক্তিগত প্রোফাইল থেকে সম্পূর্ণ আলাদা।</translation> <translation id="8556340503434111824">Google Chrome-এর একটি নতুন ভার্সন উপলভ্য এবং এটি আগের তুলনায় দ্রুততর৷</translation> +<translation id="855774455305595697">এছাড়া, Chrome-এ চালু করতে চান?</translation> <translation id="8571790202382503603">Chrome প্রোফাইলের সাহায্যে আপনি সব Chrome-এ থাকা ডেটা আলাদা করতে পারবেন। এর ফলে সহজেই অফিস এবং বিনোদনের প্রোফাইল আলাদা করা যায়।</translation> <translation id="8614913330719544658">Google Chrome প্রতিক্রিয়া করছে না৷ এখনই পুনঃলঞ্চ করবেন?</translation> <translation id="861702415419836452">আপনার আশেপাশের 3D ম্যাপ তৈরি করতে এই সাইটটির জন্য Chrome-কে আপনার ক্যামেরা অ্যাক্সেস করার অনুমতি দিতে হবে</translation>
diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb index 95aa5d0c..577dafe 100644 --- a/chrome/app/resources/google_chrome_strings_el.xtb +++ b/chrome/app/resources/google_chrome_strings_el.xtb
@@ -246,6 +246,7 @@ <translation id="7398801000654795464">Συνδεθήκατε στο Chrome ως <ph name="USER_EMAIL_ADDRESS" />. Χρησιμοποιήστε τον ίδιο λογαριασμό για να συνδεθείτε ξανά.</translation> <translation id="7408085963519505752">Όροι Chrome OS</translation> <translation id="7419046106786626209">Το Chrome OS δεν μπόρεσε να συγχρονίσει τα δεδομένα σας, επειδή ο συγχρονισμός δεν είναι διαθέσιμος για τον τομέα σας.</translation> +<translation id="7481213027396403996">Λάβετε την ισχυρότερη ασφάλεια του Chrome</translation> <translation id="7486227612705979895">Το Chrome θα αποκτήσει πρόσβαση στο Drive, για να κάνει προτάσεις στη γραμμή διευθύνσεων</translation> <translation id="7535429826459677826">Google Chrome Dev</translation> <translation id="7573289029918943991">Για να διαπιστώσετε εάν η συσκευή σας είναι ενημερωμένη, μεταβείτε στις <ph name="LINK_BEGIN" />Ρυθμίσεις του Chrome OS<ph name="LINK_END" /></translation> @@ -305,6 +306,7 @@ <translation id="8862326446509486874">Δεν έχετε τα απαραίτητα δικαιώματα για εγκατάσταση σε επίπεδο συστήματος. Δοκιμάστε να εκτελέσετε ξανά το πρόγραμμα εγκατάστασης ως Διαχειριστής.</translation> <translation id="8914504000324227558">Επανεκκίνηση του Chrome</translation> <translation id="8922193594870374009">Για να στείλετε έναν αριθμό από το <ph name="ORIGIN" /> στο τηλέφωνό σας Android, συνδεθείτε στο Chrome και στις δύο συσκευές.</translation> +<translation id="8927704157641862988">Προσαρμογή των επιλογών απορρήτου που το Chrome θεωρεί πιο σημαντικές. Αυτός ο οδηγός δεν περιλαμβάνει όλες τις ρυθμίσεις και επιλογές.</translation> <translation id="8986207147630327271">Προσθέτετε ένα προφίλ εργασίας σε αυτό το πρόγραμμα περιήγησης και παραχωρείτε τον έλεγχο στον διαχειριστή σας μόνο για το προφίλ εργασίας.</translation> <translation id="8999208279178790196">{0,plural, =0{Υπάρχει μια διαθέσιμη ενημέρωση του Chrome}=1{Υπάρχει μια διαθέσιμη ενημέρωση του Chrome}other{Υπάρχει μια διαθέσιμη ενημέρωση του Chrome για # ημέρες}}</translation> <translation id="9026991721384951619">Το Chrome OS δεν μπόρεσε να συγχρονίσει τα δεδομένα σας, επειδή τα στοιχεία σύνδεσης στο λογαριασμό σας δεν είναι ενημερωμένα.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb index 99d625f..bc51ed2 100644 --- a/chrome/app/resources/google_chrome_strings_en-GB.xtb +++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -249,6 +249,7 @@ <translation id="7398801000654795464">You were signed in to Chrome as <ph name="USER_EMAIL_ADDRESS" />. Please use the same account to sign in again.</translation> <translation id="7408085963519505752">Chrome OS terms</translation> <translation id="7419046106786626209">Chrome OS could not sync your data because Sync is not available for your domain.</translation> +<translation id="7481213027396403996">Get Chrome's strongest security</translation> <translation id="7486227612705979895">Chrome will access your Drive to make suggestions in the address bar</translation> <translation id="7535429826459677826">Google Chrome Dev</translation> <translation id="7573289029918943991">To see if your device is up to date, go to <ph name="LINK_BEGIN" />Chrome OS Settings<ph name="LINK_END" /></translation> @@ -308,6 +309,7 @@ <translation id="8862326446509486874">You do not have appropriate rights for system-level installation. Try running the installer again as Administrator.</translation> <translation id="8914504000324227558">Relaunch Chrome</translation> <translation id="8922193594870374009">To send a number from <ph name="ORIGIN" /> to your Android phone, sign in to Chrome on both devices.</translation> +<translation id="8927704157641862988">Customise the privacy choices that Chrome considers most important. This guide doesn't include every setting and option.</translation> <translation id="8986207147630327271">You are adding a work profile to this browser and giving your administrator control over just the work profile.</translation> <translation id="8999208279178790196">{0,plural, =0{A Chrome update is available}=1{A Chrome update is available}other{A Chrome update has been available for # days}}</translation> <translation id="9026991721384951619">Chrome OS could not sync your data because your account sign-in details are out of date.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_eu.xtb b/chrome/app/resources/google_chrome_strings_eu.xtb index 598d30d..ce2bd22 100644 --- a/chrome/app/resources/google_chrome_strings_eu.xtb +++ b/chrome/app/resources/google_chrome_strings_eu.xtb
@@ -291,6 +291,7 @@ <translation id="8540666473246803645">Google Chrome</translation> <translation id="8550334526674375523">Laneko profila eta profil pertsonala guztiz bereizita daude.</translation> <translation id="8556340503434111824">Google Chrome-ren bertsio berri bat erabilgarri dago; inoiz baino bizkorragoa da.</translation> +<translation id="855774455305595697">Chrome-n ere aktibatu nahi duzu?</translation> <translation id="8571790202382503603">Chrome-ko profilekin, Chrome-n dituzun gauza guztiak bereiz ditzakezu. Hala, errazago edukiko dituzu bananduta gauza pertsonalak eta lanekoak.</translation> <translation id="8614913330719544658">Google Chrome-k ez du erantzuten. Berrabiarazi nahi duzu?</translation> <translation id="861702415419836452">Chrome-k kamera atzitzeko baimena behar du, ingurunearen hiru dimentsioko mapa bat sortzeko</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr.xtb b/chrome/app/resources/google_chrome_strings_fr.xtb index 3a5674c..c56566db 100644 --- a/chrome/app/resources/google_chrome_strings_fr.xtb +++ b/chrome/app/resources/google_chrome_strings_fr.xtb
@@ -290,6 +290,7 @@ <translation id="8540666473246803645">Google Chrome</translation> <translation id="8550334526674375523">Ce profil professionnel est parfaitement séparé de votre profil personnel.</translation> <translation id="8556340503434111824">Une nouvelle version de Google Chrome encore plus rapide est disponible.</translation> +<translation id="855774455305595697">Activer aussi dans Chrome ?</translation> <translation id="8571790202382503603">Utilisez les profils Chrome pour dissocier toutes vos données Chrome. Vous pouvez ainsi faire plus facilement la distinction entre vos contenus personnels et professionnels.</translation> <translation id="8614913330719544658">Google Chrome ne répond pas. Voulez-vous le relancer maintenant ?</translation> <translation id="861702415419836452">Chrome a besoin de votre autorisation pour accéder à votre appareil photo afin de créer un plan 3D de votre environnement</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb index 3c373d7..54e4ef1 100644 --- a/chrome/app/resources/google_chrome_strings_gu.xtb +++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -292,6 +292,7 @@ <translation id="8540666473246803645">Google Chrome</translation> <translation id="8550334526674375523">ઑફિસની આ પ્રોફાઇલ તમારી વ્યક્તિગત પ્રોફાઇલથી સાવ અલગ છે.</translation> <translation id="8556340503434111824">Google Chromeનું એક નવું વર્ઝન ઉપલબ્ધ છે અને તે પહેલાં કરતાંએ વધુ ઝડપી છે.</translation> +<translation id="855774455305595697">Chromeમાં પણ ચાલુ કરીએ?</translation> <translation id="8571790202382503603">Chrome પ્રોફાઇલ વડે તમે તમારી બધી વસ્તુઓ Chrome પર અલગ-અલગ રાખી શકો છો. આનાથી ઑફિસ અને મનોરંજન વચ્ચે વિભાજન કરવાનું સરળ બને છે.</translation> <translation id="8614913330719544658">Google Chrome પ્રતિસાદ આપતું નથી. હવે ફરીથી લોંચ કરીએ?</translation> <translation id="861702415419836452">તમારા આસપાસનો 3D નકશો બનાવવા માટે, Chromeને તમારા કૅમેરાના ઍક્સેસની પરવાનગી જરૂરી છે</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ky.xtb b/chrome/app/resources/google_chrome_strings_ky.xtb index 6cd8438..28936a9 100644 --- a/chrome/app/resources/google_chrome_strings_ky.xtb +++ b/chrome/app/resources/google_chrome_strings_ky.xtb
@@ -250,6 +250,7 @@ <translation id="7398801000654795464">Chrome'го <ph name="USER_EMAIL_ADDRESS" /> катары кирдиңиз. Кайра кирүү үчүн ушул каттоо эсебин колдонуңуз.</translation> <translation id="7408085963519505752">Chrome OS шарттары</translation> <translation id="7419046106786626209">Chrome OS дайын-даректериңизди шайкештештире алган жок, себеби домениңизде Шайкештештирүү аракети жеткиликтүү эмес.</translation> +<translation id="7481213027396403996">Chrome'дун эң күчтүү коопсуздук тутумун колдонуңуз</translation> <translation id="7486227612705979895">Дарек тилкесинде сунуштарды көрсөтүү үчүн Chrome кызматы Drive сактагычыңызды колдонот</translation> <translation id="7535429826459677826">Google Chrome Dev</translation> <translation id="7573289029918943991">Түзмөгүңүздүн жаңыртылганын текшерүү үчүн <ph name="LINK_BEGIN" />Chrome OS Жөндөөлөрүнө<ph name="LINK_END" /> өтүңүз</translation> @@ -309,6 +310,7 @@ <translation id="8862326446509486874">Тутум деңгээлинде орнотууга тийиштүү укугуңуз жок. Орноткучту Администратор катары кайра иштетип көрүңүз.</translation> <translation id="8914504000324227558">Chrome'ду кайрадан ишке киргизүү</translation> <translation id="8922193594870374009">Номерди <ph name="ORIGIN" /> сайтынан Android телефонуңузга жөнөтүү үчүн эки түзмөгүңүздөн тең Chrome'го кириңиз.</translation> +<translation id="8927704157641862988">Chrome эң маанилүү деп эсептеген купуялык тандоолорун ыңгайлаштырыңыз. Жетектемеде айрым жөндөөлөр жана параметрлер камтылган эмес.</translation> <translation id="8986207147630327271">Жумуш профилин ушул серепчиге кошуп, администраторго жумуш профилин гана көзөмөлдөөгө уруксат берип жатасыз.</translation> <translation id="8999208279178790196">{0,plural, =0{Chrome'дун жаңы версиясы жеткиликтүү}=1{Chrome'дун жаңы версиясы жеткиликтүү}other{Chrome'дун жаңы версиясы # күндөн бери жеткиликтүү}}</translation> <translation id="9026991721384951619">Аккаунтуңуздун кирүү чоо-жайы эскирип калгандыктан, Chrome OS дайын-даректериңизди шайкештештире алган жок.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb index bec99c4..86def7c6 100644 --- a/chrome/app/resources/google_chrome_strings_ml.xtb +++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -250,6 +250,7 @@ <translation id="7398801000654795464">നിങ്ങൾ Chrome-ൽ <ph name="USER_EMAIL_ADDRESS" /> എന്നായി സൈൻ ഇൻ ചെയ്തു. വീണ്ടും സൈൻ ഇൻ ചെയ്യുന്നതിന് സമാന അക്കൗണ്ട് ഉപയോഗിക്കുക.</translation> <translation id="7408085963519505752">Chrome OS നിബന്ധനകൾ</translation> <translation id="7419046106786626209">നിങ്ങളുടെ ഡൊമെയ്നിനായി സമന്വയം ലഭ്യമല്ലാത്തതിനാൽ Chrome OS-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല.</translation> +<translation id="7481213027396403996">Chrome-ന്റെ ഏറ്റവും ശക്തമായ സുരക്ഷ നേടുക</translation> <translation id="7486227612705979895">വിലാസ ബാറിൽ നിർദ്ദേശങ്ങൾ സൃഷ്ടിക്കാൻ, Chrome നിങ്ങളുടെ ഡ്രൈവ് ആക്സസ് ചെയ്യും</translation> <translation id="7535429826459677826">Google Chrome Dev</translation> <translation id="7573289029918943991">നിങ്ങളുടെ ഉപകരണം അപ് ടു ഡേറ്റ് ആണോയെന്ന് കാണാൻ <ph name="LINK_BEGIN" />Chrome OS ക്രമീകരണത്തിലേക്ക്<ph name="LINK_END" /> പോവുക</translation> @@ -309,6 +310,7 @@ <translation id="8862326446509486874">സിസ്റ്റം തലത്തിൽ ഇന്സ്റ്റാള് ചെയ്യുന്നതിന് നിങ്ങള്ക്ക് ഉചിതമായ അവകാശങ്ങളില്ല. അഡ്മിനിസ്ട്രേറ്ററായി ഇന്സ്റ്റാളര് റണ് ചെയ്യിക്കാൻ വീണ്ടും ശ്രമിക്കൂ.</translation> <translation id="8914504000324227558">Chrome വീണ്ടും സമാരംഭിക്കുക</translation> <translation id="8922193594870374009"><ph name="ORIGIN" /> എന്നതിൽ നിന്ന് നിങ്ങളുടെ Android ഫോണിലേക്ക് ഒരു നമ്പർ അയയ്ക്കാൻ, രണ്ട് ഉപകരണങ്ങളിൽ നിന്നും Chrome-ൽ സൈൻ ഇൻ ചെയ്യുക.</translation> +<translation id="8927704157641862988">ഏറ്റവും പ്രധാനപ്പെട്ടതായി Chrome കരുതുന്ന സ്വകാര്യതാ തിരഞ്ഞെടുപ്പുകൾ ഇഷ്ടാനുസൃതമാക്കുക. ഈ ഗൈഡിൽ എല്ലാ ക്രമീകരണവും ഓപ്ഷനും ഉൾപ്പെടുന്നില്ല.</translation> <translation id="8986207147630327271">നിങ്ങൾ ഈ ബ്രൗസറിലേക്ക് ഒരു ഔദ്യോഗിക പ്രൊഫൈൽ ചേർക്കുകയും നിങ്ങളുടെ അഡ്മിന് ഔദ്യോഗിക പ്രൊഫൈലിലേക്ക് മാത്രം നിയന്ത്രണം നൽകുകയും ചെയ്യുന്നു.</translation> <translation id="8999208279178790196">{0,plural, =0{Chrome-നൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്}=1{Chrome-നൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്}other{# ദിവസമായി Chrome-നൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്}}</translation> <translation id="9026991721384951619">നിങ്ങളുടെ അക്കൗണ്ടിന്റെ സൈൻ ഇൻ വിശദാംശങ്ങൾ കാലഹരണപ്പെട്ടതിനാൽ Chrome OS-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb index b8a9aba8..a007cf9 100644 --- a/chrome/app/resources/google_chrome_strings_nl.xtb +++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -288,6 +288,7 @@ <translation id="8540666473246803645">Google Chrome</translation> <translation id="8550334526674375523">Dit werkprofiel is volledig gescheiden van je persoonlijke profiel.</translation> <translation id="8556340503434111824">Er is een nieuwe versie van Google Chrome en deze is sneller dan ooit.</translation> +<translation id="855774455305595697">Ook aanzetten in Chrome?</translation> <translation id="8571790202382503603">Met Chrome-profielen kun je alle Chrome-gegevens gescheiden houden. Zo kun je makkelijker onderscheid maken tussen werk en privé.</translation> <translation id="8614913330719544658">Google Chrome reageert niet meer. Nu opnieuw starten?</translation> <translation id="861702415419836452">Chrome heeft toegangsrechten voor de camera nodig om een 3D-kaart van je omgeving te maken.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-BR.xtb b/chrome/app/resources/google_chrome_strings_pt-BR.xtb index 0af740d1..c5811c6 100644 --- a/chrome/app/resources/google_chrome_strings_pt-BR.xtb +++ b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
@@ -241,6 +241,7 @@ <translation id="7398801000654795464">Você estava conectado ao Google Chrome como <ph name="USER_EMAIL_ADDRESS" />. Use a mesma conta para fazer login novamente.</translation> <translation id="7408085963519505752">Termos do Chrome OS</translation> <translation id="7419046106786626209">O Chrome OS não pôde sincronizar seus dados porque a sincronização não está disponível para seu domínio.</translation> +<translation id="7481213027396403996">Use o nível mais alto de segurança do Chrome</translation> <translation id="7486227612705979895">O Chrome acessará seu Drive para fazer sugestões na barra de endereço</translation> <translation id="7535429826459677826">Google Chrome Dev</translation> <translation id="7573289029918943991">Para verificar se o dispositivo está atualizado, acesse as <ph name="LINK_BEGIN" />Configurações do Chrome OS<ph name="LINK_END" /></translation> @@ -300,6 +301,7 @@ <translation id="8862326446509486874">Você não tem os direitos adequados para instalação no nível do sistema. Tente executar o instalador novamente como administrador.</translation> <translation id="8914504000324227558">Reiniciar o Google Chrome</translation> <translation id="8922193594870374009">Para enviar um número de <ph name="ORIGIN" /> ao seu smartphone Android, faça login no Chrome nos dois dispositivos.</translation> +<translation id="8927704157641862988">Personalize as opções de privacidade mais importantes para o Chrome. Este guia não inclui todas as configurações e opções.</translation> <translation id="8986207147630327271">Você está adicionando um perfil de trabalho a este navegador. O administrador poderá controlar apenas o perfil de trabalho.</translation> <translation id="8999208279178790196">{0,plural, =0{Uma atualização do Chrome está disponível}=1{Uma atualização do Chrome está disponível}one{Uma atualização do Chrome está disponível há # dia}other{Uma atualização do Chrome está disponível há # dias}}</translation> <translation id="9026991721384951619">O Chrome OS não pôde sincronizar seus dados porque os detalhes de login da sua conta estão desatualizados.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-PT.xtb b/chrome/app/resources/google_chrome_strings_pt-PT.xtb index 7eefef04..5c2f1bb 100644 --- a/chrome/app/resources/google_chrome_strings_pt-PT.xtb +++ b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
@@ -242,6 +242,7 @@ <translation id="7398801000654795464">Iniciou sessão no Chrome com a conta <ph name="USER_EMAIL_ADDRESS" />. Utilize a mesma conta para iniciar sessão novamente.</translation> <translation id="7408085963519505752">Termos do Chrome OS</translation> <translation id="7419046106786626209">O Chrome OS não conseguiu sincronizar os dados porque a sincronização não está disponível para o seu domínio.</translation> +<translation id="7481213027396403996">Obtenha a segurança mais avançada do Chrome</translation> <translation id="7486227612705979895">O Chrome vai aceder ao Drive para fornecer sugestões na barra de endereço.</translation> <translation id="7535429826459677826">Google Chrome Dev</translation> <translation id="7573289029918943991">Para ver se o seu dispositivo está atualizado, aceda às <ph name="LINK_BEGIN" />Definições do Chrome OS<ph name="LINK_END" />.</translation> @@ -300,6 +301,7 @@ <translation id="8862326446509486874">Não tem os direitos adequados para uma instalação ao nível do sistema. Tente executar o programa de instalação novamente como Administrador.</translation> <translation id="8914504000324227558">Reiniciar o Chrome</translation> <translation id="8922193594870374009">Para enviar um número de <ph name="ORIGIN" /> para o seu telemóvel Android, inicie sessão no Chrome em ambos os dispositivos.</translation> +<translation id="8927704157641862988">Personalize as escolhas de privacidade que o Chrome considera serem mais importantes. Este guia não inclui todas as definições e opções.</translation> <translation id="8986207147630327271">Está a adicionar um perfil de trabalho a este navegador e a conceder ao seu administrador controlo apenas sobre o perfil de trabalho.</translation> <translation id="8999208279178790196">{0,plural, =0{Está disponível uma atualização do Chrome}=1{Está disponível uma atualização do Chrome}one{Está disponível uma atualização do Chrome há # dia(s)}other{Está disponível uma atualização do Chrome há # dias}}</translation> <translation id="9026991721384951619">O Chrome OS não conseguiu sincronizar os dados porque os detalhes de início de sessão da sua conta estão desatualizados.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb index faf292fa..e7767f57 100644 --- a/chrome/app/resources/google_chrome_strings_sk.xtb +++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -247,6 +247,7 @@ <translation id="7398801000654795464">Do prehliadača Chrome ste boli prihlásený/-á ako <ph name="USER_EMAIL_ADDRESS" />. Ak sa chcete prihlásiť znova, použite rovnaký účet.</translation> <translation id="7408085963519505752">Zmluvné podmienky systému OS Chrome</translation> <translation id="7419046106786626209">Systému OS Chrome sa nepodarilo synchronizovať vaše údaje, pretože možnosť synchronizácie nie je pre vašu doménu k dispozícii.</translation> +<translation id="7481213027396403996">Získajte najsilnejšie zabezpečenie Chromu</translation> <translation id="7486227612705979895">Chrome bude mať prístup na váš Disk, aby mohol v paneli s adresou zobrazovať návrhy</translation> <translation id="7535429826459677826">Google Chrome verzie pre vývojárov</translation> <translation id="7573289029918943991">Ak sa chcete pozrieť, či je zariadenie aktualizované, prejdite do <ph name="LINK_BEGIN" />Nastavení operačného systému Chrome OS<ph name="LINK_END" /></translation> @@ -306,6 +307,7 @@ <translation id="8862326446509486874">Nemáte potrebné práva na inštaláciu na úrovni systému. Skúste inštalátor spustiť znova ako správca.</translation> <translation id="8914504000324227558">Znova spustiť prehliadač Chrome</translation> <translation id="8922193594870374009">Ak chcete zo zariadenia <ph name="ORIGIN" /> odoslať číslo do svojho telefónu s Androidom, prihláste sa v oboch zariadeniach do Chromu.</translation> +<translation id="8927704157641862988">Prispôsobte si možnosti ochrany súkromia, ktoré Chrome považuje za najdôležitejšie. Tento sprievodca neobsahuje všetky nastavenia a možnosti.</translation> <translation id="8986207147630327271">Do tohto prehliadača pridávate pracovný profil a svojmu správcovi udeľujete kontrolu iba nad ním.</translation> <translation id="8999208279178790196">{0,plural, =0{Je k dispozícii aktualizácia Chromu}=1{Je k dispozícii aktualizácia Chromu}few{Aktualizácia Chromu je k dispozícii už # dni}many{Aktualizácia Chromu je k dispozícii už # dňa}other{Aktualizácia Chromu je k dispozícii už # dní}}</translation> <translation id="9026991721384951619">Systému OS Chrome sa nepodarilo synchronizovať vaše údaje, pretože vaše prihlasovacie údaje účtu sú zastarané.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb index a9ef4a34..f893398 100644 --- a/chrome/app/resources/google_chrome_strings_sl.xtb +++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -292,6 +292,7 @@ <translation id="8540666473246803645">Google Chrome</translation> <translation id="8550334526674375523">Ta delovni profil je v celoti ločen od osebnega profila.</translation> <translation id="8556340503434111824">Na voljo je nova različica Google Chroma, ki je najhitrejša doslej.</translation> +<translation id="855774455305595697">Želite vklopiti tudi v Chromu?</translation> <translation id="8571790202382503603">S profili v Chromu lahko ločite vse stvari v Chromu. Tako laže ločite delo in zabavo.</translation> <translation id="8614913330719544658">Google Chrome se ne odziva. Ga želite znova zagnati?</translation> <translation id="861702415419836452">Chrome potrebuje dovoljenje za dostop do fotoaparata zaradi ustvarjanja tridimenzionalnega zemljevida okolice.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb index 09821ed5..1bf64ed 100644 --- a/chrome/app/resources/google_chrome_strings_te.xtb +++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -284,6 +284,7 @@ <translation id="8540666473246803645">Google Chrome</translation> <translation id="8550334526674375523">ఈ వర్క్ ప్రొఫైల్, మీ వ్యక్తిగత ప్రొఫైల్ నుండి పూర్తిగా భిన్నంగా ఉంది.</translation> <translation id="8556340503434111824">Google Chrome యొక్క కొత్త వెర్షన్ అందుబాటులో ఉంది, ఇది మునుపటి కంటే వేగవంతంగా ఉంటుంది.</translation> +<translation id="855774455305595697">Chromeలో కూడా ఆన్ చేయాలా?</translation> <translation id="8571790202382503603">మీ మొత్తం Chrome అంశాలను మీ Chrome ప్రొఫైల్లతో వేరు చేయండి. ఇలా చేయడం వలన ఆఫీస్, వినోదాన్ని వేర్వేరుగా ఉంచవచ్చు.</translation> <translation id="8614913330719544658">Google Chrome స్పందించడం లేదు. ఇప్పుడే పునఃప్రారంభించాలా?</translation> <translation id="861702415419836452">మీ పరిసరాల 3D మ్యాప్ను సృష్టించడానికి Chromeకు మీ కెమెరాను యాక్సెస్ చేసే అనుమతి కావాలి</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ur.xtb b/chrome/app/resources/google_chrome_strings_ur.xtb index a12b75ac..7159f001 100644 --- a/chrome/app/resources/google_chrome_strings_ur.xtb +++ b/chrome/app/resources/google_chrome_strings_ur.xtb
@@ -291,6 +291,7 @@ <translation id="8540666473246803645">Google Chrome</translation> <translation id="8550334526674375523">یہ دفتری پروفائل آپ کی ذاتی پروفائل سے پوری طرح علیحدہ ہے۔</translation> <translation id="8556340503434111824">Google Chrome کا ایک نیا ورژن دستیاب ہے اور پہلے سے کہیں زیادہ تیز ہے۔</translation> +<translation id="855774455305595697">Chrome میں بھی آن کرنا چاہتے ہیں؟</translation> <translation id="8571790202382503603">Chrome کی پروفائلز کے ساتھ آپ اپنے تمام Chrome کی چیزوں کو الگ کر سکتے ہیں۔ یہ کام اور تفریح کے درمیان تقسیم کرنا زیادہ آسان بناتا ہے۔</translation> <translation id="8614913330719544658">Google Chrome جواب نہیں دے رہا ہے۔ ابھی دوبارہ شروع کریں؟</translation> <translation id="861702415419836452">اپنے اطراف کا 3D نقشہ تخلیق کرنے کی خاطر Chrome کو آپ کے کیمرے تک رسائی کی اجازت درکار ہے</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zu.xtb b/chrome/app/resources/google_chrome_strings_zu.xtb index b2e0e1b..bf8a8dc 100644 --- a/chrome/app/resources/google_chrome_strings_zu.xtb +++ b/chrome/app/resources/google_chrome_strings_zu.xtb
@@ -292,6 +292,7 @@ <translation id="8540666473246803645">Google Chrome</translation> <translation id="8550334526674375523">Le phrofayela yomsebenzi ihluke ngokugcwele kusukela kuphrofayela yakho siqu.</translation> <translation id="8556340503434111824">Kukhona inguqulo entsha ye-Google Chrome etholakalayo, futhi ishesha kakhulu kunakuqala.</translation> +<translation id="855774455305595697">Vula futhi ku-Chrome?</translation> <translation id="8571790202382503603">Ngamaphrofayela we-Chrome ungahlukanisa zonke izinto zakho ze-Chrome. Lokhu kwenza kube lula ukuhlukanisa phakathi komsebenzi nokuzijabulisa.</translation> <translation id="8614913330719544658">I-Google Chrome ayiphenduli. Qalisa kabusha manje?</translation> <translation id="861702415419836452">I-Chrome idinga imvume yokufinyelela kwikhamera yakho ukudala imephu engu-3D yendawo yakho ekuzungezile</translation>
diff --git a/chrome/app/vector_icons/BUILD.gn b/chrome/app/vector_icons/BUILD.gn index 78f8949..6742753 100644 --- a/chrome/app/vector_icons/BUILD.gn +++ b/chrome/app/vector_icons/BUILD.gn
@@ -106,7 +106,6 @@ "security.icon", "send_tab_to_self.icon", "sharing_hub_screenshot.icon", - "shield_bad.icon", "side_panel.icon", "side_panel_touch.icon", "sign_out.icon",
diff --git a/chrome/app/vector_icons/shield_bad.icon b/chrome/app/vector_icons/shield_bad.icon deleted file mode 100644 index 0e90337..0000000 --- a/chrome/app/vector_icons/shield_bad.icon +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -CANVAS_DIMENSIONS, 24, -MOVE_TO, 9.9f, 15.5f, -LINE_TO, 12, 13.4f, -LINE_TO, 14.1f, 15.5f, -LINE_TO, 15.5f, 14.1f, -LINE_TO, 13.4f, 12, -LINE_TO, 15.5f, 9.9f, -LINE_TO, 14.1f, 8.5f, -LINE_TO, 12, 10.6f, -LINE_TO, 9.9f, 8.5f, -LINE_TO, 8.5f, 9.9f, -LINE_TO, 10.6f, 12, -LINE_TO, 8.5f, 14.1f, -CLOSE, -MOVE_TO, 12, 22, -R_QUADRATIC_TO, -3.47f, -0.87f, -5.74f, -3.99f, -QUADRATIC_TO, 4, 14.9f, 4, 11.1f, -V_LINE_TO, 5, -R_LINE_TO, 8, -3, -R_LINE_TO, 8, 3, -R_V_LINE_TO, 6.1f, -R_QUADRATIC_TO, 0, 3.8f, -2.26f, 6.91f, -QUADRATIC_TO, 15.48f, 21.13f, 12, 22, -CLOSE, -R_MOVE_TO, 0, -10, -CLOSE, -R_MOVE_TO, 0, 7.9f, -R_QUADRATIC_TO, 2.6f, -0.82f, 4.3f, -3.3f, -R_QUADRATIC_TO, 1.7f, -2.47f, 1.7f, -5.5f, -V_LINE_TO, 6.38f, -R_LINE_TO, -6, -2.25f, -R_LINE_TO, -6, 2.25f, -V_LINE_TO, 11.1f, -R_QUADRATIC_TO, 0, 3.03f, 1.7f, 5.5f, -R_QUADRATIC_TO, 1.7f, 2.47f, 4.3f, 3.3f, -CLOSE \ No newline at end of file
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 4433abc0..4109bff 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -4968,6 +4968,11 @@ flag_descriptions::kNtpModulesRedesignedLayoutDescription, kOsDesktop, FEATURE_VALUE_TYPE(ntp_features::kNtpModulesRedesignedLayout)}, + {"ntp-realbox-match-omnibox-theme", + flag_descriptions::kNtpRealboxMatchOmniboxThemeName, + flag_descriptions::kNtpRealboxMatchOmniboxThemeDescription, kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kRealboxMatchOmniboxTheme)}, + {"ntp-realbox-pedals", flag_descriptions::kNtpRealboxPedalsName, flag_descriptions::kNtpRealboxPedalsDescription, kOsDesktop, FEATURE_VALUE_TYPE(omnibox::kNtpRealboxPedals)}, @@ -4980,6 +4985,11 @@ {"ntp-realbox-tail-suggest", flag_descriptions::kNtpRealboxTailSuggestName, flag_descriptions::kNtpRealboxTailSuggestDescription, kOsDesktop, FEATURE_VALUE_TYPE(omnibox::kNtpRealboxTailSuggest)}, + + {"ntp-realbox-use-google-g-icon", + flag_descriptions::kNtpRealboxUseGoogleGIconName, + flag_descriptions::kNtpRealboxUseGoogleGIconDescription, kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kRealboxUseGoogleGIcon)}, #endif // !defined(OS_ANDROID) #if defined(DCHECK_IS_CONFIGURABLE)
diff --git a/chrome/browser/apps/app_service/app_icon/app_icon_factory.cc b/chrome/browser/apps/app_service/app_icon/app_icon_factory.cc index 0938986d..c3e6273 100644 --- a/chrome/browser/apps/app_service/app_icon/app_icon_factory.cc +++ b/chrome/browser/apps/app_service/app_icon/app_icon_factory.cc
@@ -168,6 +168,20 @@ return gfx::ImageSkia::CreateFromBitmap(bitmap, icon_scale); } +// Calls |callback| with the compressed icon |data|. +void CompleteIconWithCompressed(apps::LoadIconCallback callback, + std::vector<uint8_t> data) { + if (data.empty()) { + std::move(callback).Run(std::make_unique<apps::IconValue>()); + return; + } + auto iv = std::make_unique<apps::IconValue>(); + iv->icon_type = apps::IconType::kCompressed; + iv->compressed = std::move(data); + iv->is_placeholder_icon = false; + std::move(callback).Run(std::move(iv)); +} + } // namespace namespace apps { @@ -421,6 +435,16 @@ icon_loader->ApplyIconEffects(icon_effects, std::move(iv)); } +void ConvertUncompressedIconToCompressedIcon(IconValuePtr iv, + LoadIconCallback callback) { + iv->uncompressed.MakeThreadSafe(); + base::ThreadPool::PostTaskAndReplyWithResult( + FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE}, + base::BindOnce(&apps::EncodeImageToPngBytes, iv->uncompressed, + /*rep_icon_scale=*/1.0f), + base::BindOnce(&CompleteIconWithCompressed, std::move(callback))); +} + void LoadIconFromExtension(IconType icon_type, int size_hint_in_dip, content::BrowserContext* context,
diff --git a/chrome/browser/apps/app_service/app_icon/app_icon_factory.h b/chrome/browser/apps/app_service/app_icon/app_icon_factory.h index ccacb9c4..747910e 100644 --- a/chrome/browser/apps/app_service/app_icon/app_icon_factory.h +++ b/chrome/browser/apps/app_service/app_icon/app_icon_factory.h
@@ -133,6 +133,10 @@ IconValuePtr iv, LoadIconCallback callback); +// Encodes |iv| as a compressed PNG icon. +void ConvertUncompressedIconToCompressedIcon(IconValuePtr iv, + LoadIconCallback callback); + // Loads an icon from an extension. void LoadIconFromExtension(IconType icon_type, int size_hint_in_dip,
diff --git a/chrome/browser/apps/app_service/publishers/arc_apps.cc b/chrome/browser/apps/app_service/publishers/arc_apps.cc index 73f92ca..64e316d3 100644 --- a/chrome/browser/apps/app_service/publishers/arc_apps.cc +++ b/chrome/browser/apps/app_service/publishers/arc_apps.cc
@@ -25,8 +25,6 @@ #include "base/feature_list.h" #include "base/files/file_path.h" #include "base/metrics/histogram_macros.h" -#include "base/task/post_task.h" -#include "base/task/thread_pool.h" #include "chrome/browser/apps/app_service/app_icon/dip_px_util.h" #include "chrome/browser/apps/app_service/app_launch_params.h" #include "chrome/browser/apps/app_service/app_service_proxy.h" @@ -71,27 +69,9 @@ namespace { -void CompleteWithCompressed(apps::LoadIconCallback callback, - std::vector<uint8_t> data) { - if (data.empty()) { - std::move(callback).Run(std::make_unique<apps::IconValue>()); - return; - } - auto iv = std::make_unique<apps::IconValue>(); - iv->icon_type = apps::IconType::kCompressed; - iv->compressed = std::move(data); - iv->is_placeholder_icon = false; - std::move(callback).Run(std::move(iv)); -} - void UpdateIconImage(apps::LoadIconCallback callback, apps::IconValuePtr iv) { if (iv->icon_type == apps::IconType::kCompressed) { - iv->uncompressed.MakeThreadSafe(); - base::ThreadPool::PostTaskAndReplyWithResult( - FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE}, - base::BindOnce(&apps::EncodeImageToPngBytes, iv->uncompressed, - /*rep_icon_scale=*/1.0f), - base::BindOnce(&CompleteWithCompressed, std::move(callback))); + ConvertUncompressedIconToCompressedIcon(std::move(iv), std::move(callback)); return; } std::move(callback).Run(std::move(iv));
diff --git a/chrome/browser/apps/app_service/publishers/web_apps_crosapi.cc b/chrome/browser/apps/app_service/publishers/web_apps_crosapi.cc index 9f555104..8a65822 100644 --- a/chrome/browser/apps/app_service/publishers/web_apps_crosapi.cc +++ b/chrome/browser/apps/app_service/publishers/web_apps_crosapi.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/apps/app_service/publishers/web_apps_crosapi.h" +#include <memory> #include <utility> #include <vector> @@ -12,7 +13,6 @@ #include "base/callback_helpers.h" #include "base/location.h" #include "base/logging.h" -#include "chrome/browser/apps/app_service/app_icon/app_icon_factory.h" #include "chrome/browser/apps/app_service/app_launch_params.h" #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" @@ -72,11 +72,22 @@ } const uint32_t icon_effects = icon_key.icon_effects; + + IconType crosapi_icon_type = icon_type; + apps::mojom::IconKeyPtr crosapi_icon_key = + ConvertIconKeyToMojomIconKey(icon_key); + if (crosapi_icon_type == apps::IconType::kCompressed) { + // The effects are applied here in Ash. + crosapi_icon_type = apps::IconType::kUncompressed; + crosapi_icon_key->icon_effects = apps::IconEffects::kNone; + } + controller_->LoadIcon( - app_id, ConvertIconKeyToMojomIconKey(icon_key), icon_type, - size_hint_in_dip, + app_id, std::move(crosapi_icon_key), crosapi_icon_type, size_hint_in_dip, base::BindOnce(&WebAppsCrosapi::OnLoadIcon, weak_factory_.GetWeakPtr(), - icon_effects, size_hint_in_dip, std::move(callback))); + icon_type, size_hint_in_dip, + static_cast<apps::IconEffects>(icon_effects), + std::move(callback))); } void WebAppsCrosapi::LaunchAppWithParams(AppLaunchParams&& params, @@ -100,7 +111,7 @@ void WebAppsCrosapi::LoadIcon(const std::string& app_id, apps::mojom::IconKeyPtr icon_key, - apps::mojom::IconType icon_type, + apps::mojom::IconType mojom_icon_type, int32_t size_hint_in_dip, bool allow_placeholder_icon, LoadIconCallback callback) { @@ -114,12 +125,13 @@ return; } - const uint32_t icon_effects = icon_key->icon_effects; + const IconType icon_type = ConvertMojomIconTypeToIconType(mojom_icon_type); + const apps::IconEffects icon_effects = + static_cast<apps::IconEffects>(icon_key->icon_effects); controller_->LoadIcon( - app_id, std::move(icon_key), ConvertMojomIconTypeToIconType(icon_type), - size_hint_in_dip, + app_id, std::move(icon_key), icon_type, size_hint_in_dip, base::BindOnce(&WebAppsCrosapi::OnLoadIcon, weak_factory_.GetWeakPtr(), - icon_effects, size_hint_in_dip, + icon_type, size_hint_in_dip, icon_effects, IconValueToMojomIconValueCallback(std::move(callback)))); } @@ -407,13 +419,33 @@ controller_.reset(); } -void WebAppsCrosapi::OnLoadIcon(uint32_t icon_effects, +void WebAppsCrosapi::OnLoadIcon(IconType icon_type, int size_hint_in_dip, + apps::IconEffects icon_effects, apps::LoadIconCallback callback, IconValuePtr icon_value) { + if (!icon_value) { + std::move(callback).Run(IconValuePtr()); + return; + } // We apply the masking effect here, as masking is not implemented in Lacros. - ApplyIconEffects(static_cast<IconEffects>(icon_effects), size_hint_in_dip, - std::move(icon_value), std::move(callback)); + // (There is no resource file in the Lacros side to apply the icon effects.) + ApplyIconEffects(icon_effects, size_hint_in_dip, std::move(icon_value), + base::BindOnce(&WebAppsCrosapi::OnApplyIconEffects, + weak_factory_.GetWeakPtr(), icon_type, + std::move(callback))); +} + +void WebAppsCrosapi::OnApplyIconEffects(IconType icon_type, + apps::LoadIconCallback callback, + IconValuePtr icon_value) { + if (icon_type == apps::IconType::kCompressed) { + ConvertUncompressedIconToCompressedIcon(std::move(icon_value), + std::move(callback)); + return; + } + + std::move(callback).Run(std::move(icon_value)); } } // namespace apps
diff --git a/chrome/browser/apps/app_service/publishers/web_apps_crosapi.h b/chrome/browser/apps/app_service/publishers/web_apps_crosapi.h index 8e490db..486ce479 100644 --- a/chrome/browser/apps/app_service/publishers/web_apps_crosapi.h +++ b/chrome/browser/apps/app_service/publishers/web_apps_crosapi.h
@@ -9,6 +9,7 @@ #include <vector> #include "base/memory/weak_ptr.h" +#include "chrome/browser/apps/app_service/app_icon/app_icon_factory.h" #include "chrome/browser/apps/app_service/app_icon/icon_key_util.h" #include "chrome/browser/apps/app_service/app_service_proxy_forward.h" #include "chrome/browser/apps/app_service/launch_result_type.h" @@ -134,10 +135,14 @@ GetMenuModelCallback callback, crosapi::mojom::MenuItemsPtr crosapi_menu_items); - void OnLoadIcon(uint32_t icon_effects, + void OnLoadIcon(IconType icon_type, int size_hint_in_dip, + apps::IconEffects icon_effects, apps::LoadIconCallback callback, IconValuePtr icon_value); + void OnApplyIconEffects(IconType icon_type, + apps::LoadIconCallback callback, + IconValuePtr icon_value); mojo::RemoteSet<apps::mojom::Subscriber> subscribers_; mojo::Receiver<crosapi::mojom::AppPublisher> receiver_{this};
diff --git a/chrome/browser/ash/arc/input_method_manager/arc_input_method_manager_service_unittest.cc b/chrome/browser/ash/arc/input_method_manager/arc_input_method_manager_service_unittest.cc index 75050dca..5cc008f 100644 --- a/chrome/browser/ash/arc/input_method_manager/arc_input_method_manager_service_unittest.cc +++ b/chrome/browser/ash/arc/input_method_manager/arc_input_method_manager_service_unittest.cc
@@ -277,7 +277,6 @@ } void SetUp() override { - ui::IMEBridge::Initialize(); input_method_manager_ = new TestInputMethodManager(); im::InputMethodManager::Initialize(input_method_manager_); profile_ = std::make_unique<TestingProfile>();
diff --git a/chrome/browser/ash/arc/input_method_manager/input_connection_impl_unittest.cc b/chrome/browser/ash/arc/input_method_manager/input_connection_impl_unittest.cc index 72a382a..2c837f35 100644 --- a/chrome/browser/ash/arc/input_method_manager/input_connection_impl_unittest.cc +++ b/chrome/browser/ash/arc/input_method_manager/input_connection_impl_unittest.cc
@@ -195,7 +195,6 @@ } void SetUp() override { - ui::IMEBridge::Initialize(); ash::input_method::InputMethodManager::Initialize( new TestInputMethodManager); bridge_ = std::make_unique<TestInputMethodManagerBridge>();
diff --git a/chrome/browser/ash/input_method/assistive_suggester_unittest.cc b/chrome/browser/ash/input_method/assistive_suggester_unittest.cc index 03aaf5f..69d616f 100644 --- a/chrome/browser/ash/input_method/assistive_suggester_unittest.cc +++ b/chrome/browser/ash/input_method/assistive_suggester_unittest.cc
@@ -106,7 +106,6 @@ // Emoji is default to true now, so need to set emoji pref false to test // IsAssistiveFeatureEnabled correctly. profile_->GetPrefs()->SetBoolean(prefs::kEmojiSuggestionEnabled, false); - ui::IMEBridge::Initialize(); } content::BrowserTaskEnvironment task_environment_; @@ -413,8 +412,6 @@ /*disabled_features=*/{}); profile_->GetPrefs()->SetBoolean(prefs::kAssistPredictiveWritingEnabled, true); - - ui::IMEBridge::Initialize(); } content::BrowserTaskEnvironment task_environment_; @@ -656,8 +653,6 @@ profile_->GetPrefs()->SetBoolean(prefs::kEmojiSuggestionEnterpriseAllowed, true); profile_->GetPrefs()->SetBoolean(prefs::kEmojiSuggestionEnabled, true); - - ui::IMEBridge::Initialize(); } content::BrowserTaskEnvironment task_environment_;
diff --git a/chrome/browser/ash/input_method/assistive_window_controller_unittest.cc b/chrome/browser/ash/input_method/assistive_window_controller_unittest.cc index 06147901..58586a6 100644 --- a/chrome/browser/ash/input_method/assistive_window_controller_unittest.cc +++ b/chrome/browser/ash/input_method/assistive_window_controller_unittest.cc
@@ -52,7 +52,7 @@ class AssistiveWindowControllerTest : public ChromeAshTestBase { protected: - AssistiveWindowControllerTest() { ui::IMEBridge::Initialize(); } + AssistiveWindowControllerTest() = default; ~AssistiveWindowControllerTest() override { ui::IMEBridge::Shutdown(); } void SetUp() override {
diff --git a/chrome/browser/ash/input_method/autocorrect_manager_unittest.cc b/chrome/browser/ash/input_method/autocorrect_manager_unittest.cc index dbbd8263..e9bd2db6 100644 --- a/chrome/browser/ash/input_method/autocorrect_manager_unittest.cc +++ b/chrome/browser/ash/input_method/autocorrect_manager_unittest.cc
@@ -77,7 +77,6 @@ }; TEST(AutocorrectManagerTest, HandleAutocorrectSetsAutocorrectRange) { - ui::IMEBridge::Initialize(); ui::MockIMEInputContextHandler mock_ime_input_context_handler; ui::IMEBridge::Get()->SetInputContextHandler(&mock_ime_input_context_handler); MockSuggestionHandler mock_suggestion_handler; @@ -90,7 +89,6 @@ } TEST(AutocorrectManagerTest, OnKeyEventHidesUnderlineAfterEnoughKeyPresses) { - ui::IMEBridge::Initialize(); ui::MockIMEInputContextHandler mock_ime_input_context_handler; ui::IMEBridge::Get()->SetInputContextHandler(&mock_ime_input_context_handler); MockSuggestionHandler mock_suggestion_handler; @@ -109,7 +107,6 @@ } TEST(AutocorrectManagerTest, MovingCursorInsideRangeShowsAssistiveWindow) { - ui::IMEBridge::Initialize(); ui::MockIMEInputContextHandler mock_ime_input_context_handler; ui::IMEBridge::Get()->SetInputContextHandler(&mock_ime_input_context_handler); ::testing::StrictMock<MockSuggestionHandler> mock_suggestion_handler; @@ -131,7 +128,6 @@ } TEST(AutocorrectManagerTest, MovingCursorOutsideRangeHidesAssistiveWindow) { - ui::IMEBridge::Initialize(); ui::MockIMEInputContextHandler mock_ime_input_context_handler; ui::IMEBridge::Get()->SetInputContextHandler(&mock_ime_input_context_handler); ::testing::StrictMock<MockSuggestionHandler> mock_suggestion_handler; @@ -165,7 +161,6 @@ } TEST(AutocorrectManagerTest, UndoAutocorrectSingleWordInComposition) { - ui::IMEBridge::Initialize(); ui::FakeTextInputClient fake_text_input_client(ui::TEXT_INPUT_TYPE_TEXT); ui::InputMethodAsh ime(nullptr); ui::IMEBridge::Get()->SetInputContextHandler(&ime); @@ -187,7 +182,6 @@ } TEST(AutocorrectManagerTest, UndoAutocorrectMultipleWordInComposition) { - ui::IMEBridge::Initialize(); ui::FakeTextInputClient fake_text_input_client(ui::TEXT_INPUT_TYPE_TEXT); ui::InputMethodAsh ime(nullptr); ui::IMEBridge::Get()->SetInputContextHandler(&ime); @@ -209,7 +203,6 @@ } TEST(AutocorrectManagerTest, RecordVirtualKeyboardMetricsWhenVisible) { - ui::IMEBridge::Initialize(); ui::MockIMEInputContextHandler mock_ime_input_context_handler; ui::IMEBridge::Get()->SetInputContextHandler(&mock_ime_input_context_handler); ::testing::StrictMock<MockSuggestionHandler> mock_suggestion_handler; @@ -225,7 +218,6 @@ TEST(AutocorrectManagerTest, DoesNotRecordVirtualKeyboardMetricsWhenNotVisible) { - ui::IMEBridge::Initialize(); ui::MockIMEInputContextHandler mock_ime_input_context_handler; ui::IMEBridge::Get()->SetInputContextHandler(&mock_ime_input_context_handler); ::testing::StrictMock<MockSuggestionHandler> mock_suggestion_handler;
diff --git a/chrome/browser/ash/input_method/grammar_manager_unittest.cc b/chrome/browser/ash/input_method/grammar_manager_unittest.cc index 96488807..2a8b510 100644 --- a/chrome/browser/ash/input_method/grammar_manager_unittest.cc +++ b/chrome/browser/ash/input_method/grammar_manager_unittest.cc
@@ -110,7 +110,6 @@ protected: void SetUp() override { profile_ = std::make_unique<TestingProfile>(); - ui::IMEBridge::Initialize(); ui::IMEBridge::Get()->SetInputContextHandler( &mock_ime_input_context_handler_); chromeos::machine_learning::ServiceConnection::
diff --git a/chrome/browser/ash/input_method/input_method_configuration.cc b/chrome/browser/ash/input_method/input_method_configuration.cc index df56bfb..3c7e111 100644 --- a/chrome/browser/ash/input_method/input_method_configuration.cc +++ b/chrome/browser/ash/input_method/input_method_configuration.cc
@@ -28,8 +28,6 @@ virtual ~InputMethodConfiguration() = default; void Initialize() { - ui::IMEBridge::Initialize(); - auto* impl = new InputMethodManagerImpl( std::make_unique<InputMethodDelegateImpl>(), std::make_unique<ComponentExtensionIMEManagerDelegateImpl>(),
diff --git a/chrome/browser/ash/input_method/input_method_engine_unittest.cc b/chrome/browser/ash/input_method/input_method_engine_unittest.cc index 4bd9a7b..50d106e 100644 --- a/chrome/browser/ash/input_method/input_method_engine_unittest.cc +++ b/chrome/browser/ash/input_method/input_method_engine_unittest.cc
@@ -141,7 +141,6 @@ languages_.emplace_back("en-US"); layouts_.emplace_back("us"); InitInputMethod(); - ui::IMEBridge::Initialize(); mock_ime_input_context_handler_ = std::make_unique<ui::MockIMEInputContextHandler>(); ui::IMEBridge::Get()->SetInputContextHandler(
diff --git a/chrome/browser/ash/input_method/input_method_manager_impl_unittest.cc b/chrome/browser/ash/input_method/input_method_manager_impl_unittest.cc index 46d70d0..447ddbd8 100644 --- a/chrome/browser/ash/input_method/input_method_manager_impl_unittest.cc +++ b/chrome/browser/ash/input_method/input_method_manager_impl_unittest.cc
@@ -147,8 +147,6 @@ ~InputMethodManagerImplTest() override = default; void SetUp() override { - ui::InitializeInputMethodForTesting(); - std::vector<ComponentExtensionIME> ime_list; InitImeList(ime_list); @@ -181,7 +179,6 @@ keyboard_ = new FakeImeKeyboard; manager_->SetImeKeyboardForTesting(keyboard_); mock_engine_handler_ = std::make_unique<MockInputMethodEngine>(); - ui::IMEBridge::Initialize(); ui::IMEBridge::Get()->SetCurrentEngineHandler(mock_engine_handler_.get()); menu_manager_ = ui::ime::InputMethodMenuManager::GetInstance();
diff --git a/chrome/browser/ash/input_method/native_input_method_engine_browsertest.cc b/chrome/browser/ash/input_method/native_input_method_engine_browsertest.cc index d865b165..e294262e 100644 --- a/chrome/browser/ash/input_method/native_input_method_engine_browsertest.cc +++ b/chrome/browser/ash/input_method/native_input_method_engine_browsertest.cc
@@ -139,7 +139,6 @@ void SetUp() override { mojo::core::Init(); InProcessBrowserTest::SetUp(); - ui::IMEBridge::Initialize(); } void SetUpOnMainThread() override { @@ -378,7 +377,6 @@ IN_PROC_BROWSER_TEST_F(NativeInputMethodEngineTest, DoesntSuggestWhenTheCursorIsWithinGrammarError) { ui::MockIMEInputContextHandler mock_ime_input_context_handler; - ui::IMEBridge::Initialize(); ui::IMEBridge::Get()->SetInputContextHandler(&mock_ime_input_context_handler); base::HistogramTester histogram_tester; @@ -412,7 +410,6 @@ IN_PROC_BROWSER_TEST_F(NativeInputMethodEngineTest, SuggestsWhenTheCursorIsOutsideGrammarError) { ui::MockIMEInputContextHandler mock_ime_input_context_handler; - ui::IMEBridge::Initialize(); ui::IMEBridge::Get()->SetInputContextHandler(&mock_ime_input_context_handler); mock_ime_input_context_handler.AddGrammarFragments( @@ -1130,11 +1127,6 @@ ~NativeInputMethodEngineAssistiveOff() override = default; protected: - void SetUp() override { - InProcessBrowserTest::SetUp(); - ui::IMEBridge::Initialize(); - } - void SetUpOnMainThread() override { engine_ = std::make_unique<NativeInputMethodEngine>(); ui::IMEBridge::Get()->SetCurrentEngineHandler(engine_.get());
diff --git a/chrome/browser/ash/input_method/native_input_method_engine_unittest.cc b/chrome/browser/ash/input_method/native_input_method_engine_unittest.cc index 36a83d1..d156c8d5 100644 --- a/chrome/browser/ash/input_method/native_input_method_engine_unittest.cc +++ b/chrome/browser/ash/input_method/native_input_method_engine_unittest.cc
@@ -182,9 +182,6 @@ void SetUp() override { EnableDefaultFeatureList(); - // Needed by NativeInputMethodEngine to interact with the input field. - ui::IMEBridge::Initialize(); - // Needed by NativeInputMethodEngine for the virtual keyboard. keyboard_controller_client_test_helper_ = ChromeKeyboardControllerClientTestHelper::InitializeWithFake(); @@ -710,9 +707,6 @@ features::kAssistPersonalInfoName}, /*disabled_features=*/{}); - // Needed by NativeInputMethodEngine to interact with the input field. - ui::IMEBridge::Initialize(); - // Needed by NativeInputMethodEngine for the virtual keyboard. keyboard_controller_client_test_helper_ = ChromeKeyboardControllerClientTestHelper::InitializeWithFake();
diff --git a/chrome/browser/ash/login/demo_mode/demo_session.cc b/chrome/browser/ash/login/demo_mode/demo_session.cc index f063faeb..f089bca 100644 --- a/chrome/browser/ash/login/demo_mode/demo_session.cc +++ b/chrome/browser/ash/login/demo_mode/demo_session.cc
@@ -533,14 +533,14 @@ } Profile* profile = ProfileManager::GetActiveUserProfile(); DCHECK(profile); - extensions::ExtensionRegistry* extension_registry = - extensions::ExtensionRegistry::Get(profile); - if (!extension_registry_observations_.IsObservingSource(extension_registry)) - extension_registry_observations_.AddObservation(extension_registry); extensions::AppWindowRegistry* app_window_registry = extensions::AppWindowRegistry::Get(profile); if (!app_window_registry_observations_.IsObservingSource(app_window_registry)) app_window_registry_observations_.AddObservation(app_window_registry); + auto& app_registry_cache = + apps::AppServiceProxyFactory::GetForProfile(profile)->AppRegistryCache(); + if (!app_registry_cache_observation_.IsObservingSource(&app_registry_cache)) + app_registry_cache_observation_.AddObservation(&app_registry_cache); extensions_external_loader_->LoadApp(id); } @@ -608,21 +608,6 @@ screensaver_activated_; } -void DemoSession::OnExtensionInstalled(content::BrowserContext* browser_context, - const extensions::Extension* extension, - bool is_update) { - if (extension->id() != GetHighlightsAppId()) - return; - Profile* profile = ProfileManager::GetActiveUserProfile(); - DCHECK(profile); - apps::AppServiceProxyFactory::GetForProfile(profile) - ->BrowserAppLauncher() - ->LaunchAppWithParams(apps::AppLaunchParams( - extension->id(), apps::mojom::LaunchContainer::kLaunchContainerWindow, - WindowOpenDisposition::NEW_WINDOW, - apps::mojom::LaunchSource::kFromChromeInternal)); -} - void DemoSession::OnAppWindowActivated(extensions::AppWindow* app_window) { if (app_window->extension_id() != GetScreensaverAppId()) return; @@ -631,4 +616,21 @@ RemoveSplashScreen(); } +void DemoSession::OnAppUpdate(const apps::AppUpdate& update) { + if (update.AppId() != GetHighlightsAppId()) + return; + Profile* profile = ProfileManager::GetActiveUserProfile(); + DCHECK(profile); + apps::AppServiceProxyFactory::GetForProfile(profile)->LaunchAppWithParams( + apps::AppLaunchParams( + update.AppId(), apps::mojom::LaunchContainer::kLaunchContainerWindow, + WindowOpenDisposition::NEW_WINDOW, + apps::mojom::LaunchSource::kFromChromeInternal)); +} + +void DemoSession::OnAppRegistryCacheWillBeDestroyed( + apps::AppRegistryCache* cache) { + app_registry_cache_observation_.RemoveObservation(cache); +} + } // namespace ash
diff --git a/chrome/browser/ash/login/demo_mode/demo_session.h b/chrome/browser/ash/login/demo_mode/demo_session.h index 458d4998..18789c4 100644 --- a/chrome/browser/ash/login/demo_mode/demo_session.h +++ b/chrome/browser/ash/login/demo_mode/demo_session.h
@@ -15,12 +15,11 @@ #include "base/scoped_multi_source_observation.h" #include "base/scoped_observation.h" #include "chrome/browser/ash/login/demo_mode/demo_extensions_external_loader.h" +#include "components/services/app_service/public/cpp/app_registry_cache.h" #include "components/session_manager/core/session_manager.h" #include "components/session_manager/core/session_manager_observer.h" #include "components/user_manager/user_manager.h" #include "extensions/browser/app_window/app_window_registry.h" -#include "extensions/browser/extension_registry.h" -#include "extensions/browser/extension_registry_observer.h" class PrefRegistrySimple; @@ -34,9 +33,9 @@ // Tracks global demo session state, such as whether the demo session has // started and the state of demo mode resources. class DemoSession : public session_manager::SessionManagerObserver, - public extensions::ExtensionRegistryObserver, public user_manager::UserManager::UserSessionStateObserver, - public extensions::AppWindowRegistry::Observer { + public extensions::AppWindowRegistry::Observer, + public apps::AppRegistryCache::Observer { public: // Type of demo mode configuration. // Warning: DemoModeConfig is stored in local state. Existing entries should @@ -194,7 +193,7 @@ // success. void LoadAndLaunchHighlightsApp(); - // Installs the CRX file from an update URL. Observes `ExtensionRegistry` to + // Installs the CRX file from an update URL. Observes `AppRegistryCache` to // launch the app upon installation. void InstallAppFromUpdateUrl(const std::string& id); @@ -212,10 +211,10 @@ // session_manager::SessionManagerObserver: void OnSessionStateChanged() override; - // extensions::ExtensionRegistryObserver: - void OnExtensionInstalled(content::BrowserContext* browser_context, - const extensions::Extension* extension, - bool is_update) override; + // apps::AppRegistryCache::Observer: + void OnAppUpdate(const apps::AppUpdate& update) override; + void OnAppRegistryCacheWillBeDestroyed( + apps::AppRegistryCache* cache) override; // Whether the device was offline-enrolled into demo mode, i.e. enrolled using // pre-built policies. Offline enrolled demo sessions do not have working @@ -235,14 +234,14 @@ session_manager::SessionManagerObserver> session_manager_observation_{this}; - base::ScopedMultiSourceObservation<extensions::ExtensionRegistry, - extensions::ExtensionRegistryObserver> - extension_registry_observations_{this}; - base::ScopedMultiSourceObservation<extensions::AppWindowRegistry, extensions::AppWindowRegistry::Observer> app_window_registry_observations_{this}; + base::ScopedMultiSourceObservation<apps::AppRegistryCache, + apps::AppRegistryCache::Observer> + app_registry_cache_observation_{this}; + scoped_refptr<DemoExtensionsExternalLoader> extensions_external_loader_; // The fallback timer that ensures the splash screen is removed in case the
diff --git a/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc b/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc index bab05ed8..984d446 100644 --- a/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc +++ b/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc
@@ -300,6 +300,9 @@ case policy::EnrollmentStatus::OFFLINE_POLICY_DECODING_FAILED: return DemoSetupError(ErrorCode::kOfflinePolicyError, RecoveryMethod::kOnlineOnly, debug_message); + case policy::EnrollmentStatus::MAY_NOT_BLOCK_DEV_MODE: + return DemoSetupError(ErrorCode::kUnexpectedError, + RecoveryMethod::kUnknown, debug_message); } NOTREACHED() << "Demo mode setup received unsupported enrollment status"; return DemoSetupError(ErrorCode::kUnexpectedError, RecoveryMethod::kUnknown,
diff --git a/chrome/browser/ash/login/enrollment/enrollment_local_policy_server_browsertest.cc b/chrome/browser/ash/login/enrollment/enrollment_local_policy_server_browsertest.cc index 1ee7e2e..58b106b 100644 --- a/chrome/browser/ash/login/enrollment/enrollment_local_policy_server_browsertest.cc +++ b/chrome/browser/ash/login/enrollment/enrollment_local_policy_server_browsertest.cc
@@ -416,6 +416,41 @@ EXPECT_TRUE(InstallAttributes::Get()->IsCloudManaged()); } +// Device policy blocks dev mode and this is not prohibited by a command-line +// flag. +IN_PROC_BROWSER_TEST_F(EnrollmentLocalPolicyServerBase, + DeviceBlockDevmodeAllowed) { + enterprise_management::ChromeDeviceSettingsProto proto; + proto.mutable_system_settings()->set_block_devmode(true); + policy_server_.UpdateDevicePolicy(proto); + + TriggerEnrollmentAndSignInSuccessfully(); + + enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepSuccess); + test::OobeJS().ExpectTrue("Oobe.isEnrollmentSuccessfulForTest()"); + EXPECT_TRUE(StartupUtils::IsDeviceRegistered()); + EXPECT_TRUE(InstallAttributes::Get()->IsCloudManaged()); +} + +// Device policy blocks dev mode and a command-line flag prevents this from +// applying. +IN_PROC_BROWSER_TEST_F(EnrollmentLocalPolicyServerBase, + DeviceBlockDevmodeDisallowed) { + base::CommandLine::ForCurrentProcess()->AppendSwitch( + ash::switches::kDisallowPolicyBlockDevMode); + enterprise_management::ChromeDeviceSettingsProto proto; + proto.mutable_system_settings()->set_block_devmode(true); + policy_server_.UpdateDevicePolicy(proto); + + TriggerEnrollmentAndSignInSuccessfully(); + + enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepError); + enrollment_ui_.ExpectErrorMessage( + IDS_ENTERPRISE_ENROLLMENT_ERROR_MAY_NOT_BLOCK_DEV_MODE, + /*can_retry=*/false); + enrollment_ui_.CancelAfterError(); +} + // Simple manual enrollment with device attributes prompt. IN_PROC_BROWSER_TEST_F(EnrollmentLocalPolicyServerBase, ManualEnrollmentWithDeviceAttributes) {
diff --git a/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_impl.cc b/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_impl.cc index 2444328..54159f4 100644 --- a/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_impl.cc +++ b/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_impl.cc
@@ -526,6 +526,9 @@ case policy::EnrollmentStatus::OFFLINE_POLICY_DECODING_FAILED: UMA(policy::kMetricEnrollmentRegisterPolicyResponseInvalid); break; + case policy::EnrollmentStatus::MAY_NOT_BLOCK_DEV_MODE: + UMA(policy::kMetricEnrollmentMayNotBlockDevMode); + break; } }
diff --git a/chrome/browser/ash/login/test/enrollment_ui_mixin.cc b/chrome/browser/ash/login/test/enrollment_ui_mixin.cc index fc91535..391acf5 100644 --- a/chrome/browser/ash/login/test/enrollment_ui_mixin.cc +++ b/chrome/browser/ash/login/test/enrollment_ui_mixin.cc
@@ -48,7 +48,10 @@ } const UIPath kEnrollmentErrorMsg = {kEnrollmentUI, "errorMsg"}; -const UIPath kEnrollmentErrorButtonPath = {kEnrollmentUI, "errorRetryButton"}; +const UIPath kEnrollmentErrorRetryButtonPath = {kEnrollmentUI, + "errorRetryButton"}; +const UIPath kEnrollmentErrorCancelButtonPath = {kEnrollmentUI, + "errorGenericCancelButton"}; const UIPath kEnrollmentSuccessButtonPath = {kEnrollmentUI, "successDoneButton"}; const UIPath kEnrollmentAttributeErrorButtonPath = {kEnrollmentUI, @@ -89,17 +92,23 @@ OobeJS().ExpectElementContainsText(l10n_util::GetStringUTF8(error_message_id), kEnrollmentErrorMsg); if (can_retry) { - OobeJS().ExpectVisiblePath(kEnrollmentErrorButtonPath); + OobeJS().ExpectVisiblePath(kEnrollmentErrorRetryButtonPath); } else { - OobeJS().ExpectHiddenPath(kEnrollmentErrorButtonPath); + OobeJS().ExpectHiddenPath(kEnrollmentErrorRetryButtonPath); } } void EnrollmentUIMixin::RetryAfterError() { - OobeJS().ClickOnPath(kEnrollmentErrorButtonPath); + OobeJS().ClickOnPath(kEnrollmentErrorRetryButtonPath); WaitForStep(ui::kEnrollmentStepSignin); } +void EnrollmentUIMixin::CancelAfterError() { + SetExitHandler(); + OobeJS().ClickOnPath(kEnrollmentErrorCancelButtonPath); + WaitForScreenExit(); +} + void EnrollmentUIMixin::LeaveDeviceAttributeErrorScreen() { OobeJS().ClickOnPath(kEnrollmentAttributeErrorButtonPath); }
diff --git a/chrome/browser/ash/login/test/enrollment_ui_mixin.h b/chrome/browser/ash/login/test/enrollment_ui_mixin.h index 2737dd1..3ee2348 100644 --- a/chrome/browser/ash/login/test/enrollment_ui_mixin.h +++ b/chrome/browser/ash/login/test/enrollment_ui_mixin.h
@@ -62,6 +62,7 @@ void ExpectErrorMessage(int error_message_id, bool can_retry); void RetryAfterError(); + void CancelAfterError(); // Fills out the UI with device attribute information and submits it. void SubmitDeviceAttributes(const std::string& asset_id,
diff --git a/chrome/browser/ash/policy/core/device_cloud_policy_store_ash.cc b/chrome/browser/ash/policy/core/device_cloud_policy_store_ash.cc index 8898fef..63c7a881 100644 --- a/chrome/browser/ash/policy/core/device_cloud_policy_store_ash.cc +++ b/chrome/browser/ash/policy/core/device_cloud_policy_store_ash.cc
@@ -14,6 +14,7 @@ #include "base/task/sequenced_task_runner.h" #include "chrome/browser/ash/login/startup_utils.h" #include "chrome/browser/ash/policy/core/device_policy_decoder.h" +#include "chrome/browser/ash/policy/dev_mode/dev_mode_policy_util.h" #include "chrome/browser/ash/policy/value_validation/onc_device_policy_value_validator.h" #include "chromeos/tpm/install_attributes.h" #include "components/ownership/owner_key_util.h" @@ -172,6 +173,14 @@ return; } + if (GetDeviceBlockDevModePolicyValue(*(validator->payload())) && + !IsDeviceBlockDevModePolicyAllowed()) { + LOG(ERROR) << "Rejected device policy: DeviceBlockDevmode not allowed"; + status_ = STATUS_BAD_STATE; + NotifyStoreError(); + return; + } + device_settings_service_->Store( std::move(validator->policy()), base::BindOnce(&DeviceCloudPolicyStoreAsh::OnPolicyStored,
diff --git a/chrome/browser/ash/policy/core/device_cloud_policy_store_ash_unittest.cc b/chrome/browser/ash/policy/core/device_cloud_policy_store_ash_unittest.cc index 87b6d479..fb1fb2e 100644 --- a/chrome/browser/ash/policy/core/device_cloud_policy_store_ash_unittest.cc +++ b/chrome/browser/ash/policy/core/device_cloud_policy_store_ash_unittest.cc
@@ -8,6 +8,7 @@ #include <memory> #include <string> +#include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/compiler_specific.h" #include "base/run_loop.h" @@ -342,4 +343,23 @@ EXPECT_EQ(std::string(), store_->policy_signature_public_key()); } +TEST_F(DeviceCloudPolicyStoreAshTest, StoreDeviceBlockDevmodeAllowed) { + PrepareExistingPolicy(); + device_policy_->payload().mutable_system_settings()->set_block_devmode(true); + store_->Store(device_policy_->policy()); + FlushDeviceSettings(); + ExpectSuccess(); +} + +TEST_F(DeviceCloudPolicyStoreAshTest, StoreDeviceBlockDevmodeDisallowed) { + base::CommandLine::ForCurrentProcess()->AppendSwitch( + ash::switches::kDisallowPolicyBlockDevMode); + PrepareExistingPolicy(); + device_policy_->payload().mutable_system_settings()->set_block_devmode(true); + device_policy_->Build(); + store_->Store(device_policy_->policy()); + FlushDeviceSettings(); + EXPECT_EQ(store_->status(), CloudPolicyStore::STATUS_BAD_STATE); +} + } // namespace policy
diff --git a/chrome/browser/ash/policy/dev_mode/dev_mode_policy_util.cc b/chrome/browser/ash/policy/dev_mode/dev_mode_policy_util.cc new file mode 100644 index 0000000..f792b266 --- /dev/null +++ b/chrome/browser/ash/policy/dev_mode/dev_mode_policy_util.cc
@@ -0,0 +1,57 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ash/policy/dev_mode/dev_mode_policy_util.h" + +#include "ash/constants/ash_switches.h" +#include "base/command_line.h" +#include "base/logging.h" +#include "base/system/sys_info.h" +#include "components/policy/proto/chrome_device_policy.pb.h" +#include "components/policy/proto/device_management_backend.pb.h" + +namespace em = enterprise_management; + +namespace policy { + +bool GetDeviceBlockDevModePolicyValue( + const em::PolicyFetchResponse& policy_fetch_response) { + em::PolicyData policy_data; + if (!policy_data.ParseFromString(policy_fetch_response.policy_data())) { + LOG(ERROR) << "Failed to parse policy data"; + return false; + } + + em::ChromeDeviceSettingsProto payload; + if (!payload.ParseFromString(policy_data.policy_value())) { + LOG(ERROR) << "Failed to parse policy value"; + return false; + } + + return GetDeviceBlockDevModePolicyValue(payload); +} + +bool GetDeviceBlockDevModePolicyValue( + const em::ChromeDeviceSettingsProto& device_policy) { + bool block_devmode = false; + if (device_policy.has_system_settings()) { + const em::SystemSettingsProto& container = device_policy.system_settings(); + if (container.has_block_devmode()) { + block_devmode = container.block_devmode(); + } + } + + return block_devmode; +} + +bool IsDeviceBlockDevModePolicyAllowed() { + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + chromeos::switches::kDisallowPolicyBlockDevMode)) { + base::SysInfo::CrashIfChromeOSNonTestImage(); + return false; + } + return true; +} + +} // namespace policy
diff --git a/chrome/browser/ash/policy/dev_mode/dev_mode_policy_util.h b/chrome/browser/ash/policy/dev_mode/dev_mode_policy_util.h new file mode 100644 index 0000000..15d63f9 --- /dev/null +++ b/chrome/browser/ash/policy/dev_mode/dev_mode_policy_util.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 CHROME_BROWSER_ASH_POLICY_DEV_MODE_DEV_MODE_POLICY_UTIL_H_ +#define CHROME_BROWSER_ASH_POLICY_DEV_MODE_DEV_MODE_POLICY_UTIL_H_ + +namespace enterprise_management { +class ChromeDeviceSettingsProto; +class PolicyFetchResponse; +} // namespace enterprise_management + +namespace policy { + +// Interprets |policy_fetch_response| as a device policy fetch response. +// Returns true if the 'DeviceBlockDevmode' policy is set to true in the parsed +// device policy. +// Returns false if any embedded layer (PolicyData / ChromeDeviceSettingsProto) +// could not be parsed. +bool GetDeviceBlockDevModePolicyValue( + const enterprise_management::PolicyFetchResponse& policy_fetch_response); + +// Returns true if the 'DeviceBlockDevmode' policy is set to true in the passed +// device policy. +bool GetDeviceBlockDevModePolicyValue( + const enterprise_management::ChromeDeviceSettingsProto& device_policy); + +// If this returns true, blocking developer mode by enterprise device policy +// should be disallowed. +// - Fail enterprise enrollment if enrolling would block dev mode. +// - Don't apply new device policy if it would block dev mode. +// Can only return false on Chrome OS test images. +bool IsDeviceBlockDevModePolicyAllowed(); + +} // namespace policy + +#endif // CHROME_BROWSER_ASH_POLICY_DEV_MODE_DEV_MODE_POLICY_UTIL_H_
diff --git a/chrome/browser/ash/policy/enrollment/enrollment_handler.cc b/chrome/browser/ash/policy/enrollment/enrollment_handler.cc index 7d29bb3f..19c7a6e3 100644 --- a/chrome/browser/ash/policy/enrollment/enrollment_handler.cc +++ b/chrome/browser/ash/policy/enrollment/enrollment_handler.cc
@@ -25,6 +25,7 @@ #include "chrome/browser/ash/policy/active_directory/active_directory_join_delegate.h" #include "chrome/browser/ash/policy/core/device_cloud_policy_store_ash.h" #include "chrome/browser/ash/policy/core/dm_token_storage.h" +#include "chrome/browser/ash/policy/dev_mode/dev_mode_policy_util.h" #include "chrome/browser/ash/policy/server_backed_state/server_backed_state_keys_broker.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/policy/enrollment_status.h" @@ -105,38 +106,6 @@ return em::DeviceRegisterRequest::FLAVOR_ENROLLMENT_MANUAL; } -// Returns whether block_devmode is set. -bool GetBlockdevmodeFromPolicy( - const enterprise_management::PolicyFetchResponse* policy) { - DCHECK(policy); - em::PolicyData policy_data; - if (!policy_data.ParseFromString(policy->policy_data())) { - LOG(ERROR) << "Failed to parse policy data"; - return false; - } - - em::ChromeDeviceSettingsProto payload; - if (!payload.ParseFromString(policy_data.policy_value())) { - LOG(ERROR) << "Failed to parse policy value"; - return false; - } - - bool block_devmode = false; - if (payload.has_system_settings()) { - const em::SystemSettingsProto& container = payload.system_settings(); - if (container.has_block_devmode()) { - block_devmode = container.block_devmode(); - } - } - - // TODO(crbug.com/1271134): Logging as "WARNING" to make sure it's preserved - // in the logs. - LOG(WARNING) << (block_devmode ? "Blocking" : "Allowing") - << " dev mode by device policy"; - - return block_devmode; -} - // A utility funciton of base::ReadFileToString which returns an optional // string. // TODO(mukai): move this to base/files. @@ -613,6 +582,14 @@ std::string username = validator->policy_data()->username(); device_id_ = validator->policy_data()->device_id(); policy_ = std::move(validator->policy()); + + if (GetDeviceBlockDevModePolicyValue(*policy_) && + !IsDeviceBlockDevModePolicyAllowed()) { + ReportResult( + EnrollmentStatus::ForStatus(EnrollmentStatus::MAY_NOT_BLOCK_DEV_MODE)); + return; + } + if (device_mode_ == DEVICE_MODE_ENTERPRISE_AD) { // Don't use robot account for the Active Directory managed devices. skip_robot_auth_ = true; @@ -671,8 +648,13 @@ return; } + const bool block_devmode = GetDeviceBlockDevModePolicyValue(*policy_); + // TODO(crbug.com/1271134): Logging as "WARNING" to make sure it's preserved + // in the logs. + LOG(WARNING) << (block_devmode ? "Blocking" : "Allowing") + << " dev mode by device policy"; install_attributes_->SetBlockDevmodeInTpm( - GetBlockdevmodeFromPolicy(policy_.get()), + block_devmode, base::BindOnce(&EnrollmentHandler::OnFirmwareManagementParametersDataSet, weak_ptr_factory_.GetWeakPtr())); }
diff --git a/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer.cc b/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer.cc index f7ed155e..44ee6c4c 100644 --- a/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer.cc +++ b/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer.cc
@@ -13,7 +13,6 @@ #include "base/metrics/field_trial_params.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" -#include "base/numerics/ranges.h" #include "chrome/browser/ash/power/auto_screen_brightness/utils.h" namespace ash {
diff --git a/chrome/browser/ash/tether/tether_service.cc b/chrome/browser/ash/tether/tether_service.cc index 1425fe0..6e6ed09 100644 --- a/chrome/browser/ash/tether/tether_service.cc +++ b/chrome/browser/ash/tether/tether_service.cc
@@ -51,7 +51,7 @@ // static void TetherService::RegisterProfilePrefs( user_prefs::PrefRegistrySyncable* registry) { - chromeos::tether::TetherComponentImpl::RegisterProfilePrefs(registry); + TetherComponentImpl::RegisterProfilePrefs(registry); } // static. @@ -111,12 +111,10 @@ profile_, chromeos::NetworkConnect::Get())), gms_core_notifications_state_tracker_( - std::make_unique< - chromeos::tether::GmsCoreNotificationsStateTrackerImpl>()), + std::make_unique<GmsCoreNotificationsStateTrackerImpl>()), tether_host_fetcher_( - chromeos::tether::TetherHostFetcherImpl::Factory::Create( - device_sync_client_, - multidevice_setup_client_)), + TetherHostFetcherImpl::Factory::Create(device_sync_client_, + multidevice_setup_client_)), timer_(std::make_unique<base::OneShotTimer>()) { tether_host_fetcher_->AddObserver(this); power_manager_client_->AddObserver(this); @@ -153,7 +151,7 @@ return; PA_LOG(VERBOSE) << "Starting up TetherComponent."; - tether_component_ = chromeos::tether::TetherComponentImpl::Factory::Create( + tether_component_ = TetherComponentImpl::Factory::Create( device_sync_client_, secure_channel_client_, tether_host_fetcher_.get(), notification_presenter_.get(), gms_core_notifications_state_tracker_.get(), profile_->GetPrefs(), @@ -164,62 +162,55 @@ session_manager_); } -chromeos::tether::GmsCoreNotificationsStateTracker* +GmsCoreNotificationsStateTracker* TetherService::GetGmsCoreNotificationsStateTracker() { return gms_core_notifications_state_tracker_.get(); } void TetherService::StopTetherIfNecessary() { if (!tether_component_ || - tether_component_->status() != - chromeos::tether::TetherComponent::Status::ACTIVE) { + tether_component_->status() != TetherComponent::Status::ACTIVE) { return; } PA_LOG(VERBOSE) << "Shutting down TetherComponent."; - chromeos::tether::TetherComponent::ShutdownReason shutdown_reason; + TetherComponent::ShutdownReason shutdown_reason; switch (GetTetherFeatureState()) { case SHUT_DOWN: - shutdown_reason = - chromeos::tether::TetherComponent::ShutdownReason::USER_LOGGED_OUT; + shutdown_reason = TetherComponent::ShutdownReason::USER_LOGGED_OUT; break; case SUSPENDED: - shutdown_reason = - chromeos::tether::TetherComponent::ShutdownReason::USER_CLOSED_LID; + shutdown_reason = TetherComponent::ShutdownReason::USER_CLOSED_LID; break; case CELLULAR_DISABLED: - shutdown_reason = - chromeos::tether::TetherComponent::ShutdownReason::CELLULAR_DISABLED; + shutdown_reason = TetherComponent::ShutdownReason::CELLULAR_DISABLED; break; case BLUETOOTH_DISABLED: - shutdown_reason = - chromeos::tether::TetherComponent::ShutdownReason::BLUETOOTH_DISABLED; + shutdown_reason = TetherComponent::ShutdownReason::BLUETOOTH_DISABLED; break; case USER_PREFERENCE_DISABLED: - shutdown_reason = - chromeos::tether::TetherComponent::ShutdownReason::PREF_DISABLED; + shutdown_reason = TetherComponent::ShutdownReason::PREF_DISABLED; break; case BLE_NOT_PRESENT: - shutdown_reason = chromeos::tether::TetherComponent::ShutdownReason:: - BLUETOOTH_CONTROLLER_DISAPPEARED; + shutdown_reason = + TetherComponent::ShutdownReason::BLUETOOTH_CONTROLLER_DISAPPEARED; break; case NO_AVAILABLE_HOSTS: // If |tether_component_| was previously active but now has been shut down // due to no longer having a host, this means that the host became // unverified. - shutdown_reason = chromeos::tether::TetherComponent::ShutdownReason:: - MULTIDEVICE_HOST_UNVERIFIED; + shutdown_reason = + TetherComponent::ShutdownReason::MULTIDEVICE_HOST_UNVERIFIED; break; case BETTER_TOGETHER_SUITE_DISABLED: - shutdown_reason = chromeos::tether::TetherComponent::ShutdownReason:: - BETTER_TOGETHER_SUITE_DISABLED; + shutdown_reason = + TetherComponent::ShutdownReason::BETTER_TOGETHER_SUITE_DISABLED; break; default: PA_LOG(ERROR) << "Unexpected shutdown reason. FeatureState is " << GetTetherFeatureState() << "."; - shutdown_reason = - chromeos::tether::TetherComponent::ShutdownReason::OTHER; + shutdown_reason = TetherComponent::ShutdownReason::OTHER; break; } @@ -327,8 +318,7 @@ } void TetherService::OnShutdownComplete() { - DCHECK(tether_component_->status() == - chromeos::tether::TetherComponent::Status::SHUT_DOWN); + DCHECK(tether_component_->status() == TetherComponent::Status::SHUT_DOWN); tether_component_->RemoveObserver(this); tether_component_.reset(); PA_LOG(VERBOSE) << "TetherComponent was shut down."; @@ -655,8 +645,7 @@ } void TetherService::SetTestDoubles( - std::unique_ptr<chromeos::tether::NotificationPresenter> - notification_presenter, + std::unique_ptr<NotificationPresenter> notification_presenter, std::unique_ptr<base::OneShotTimer> timer) { notification_presenter_ = std::move(notification_presenter); timer_ = std::move(timer);
diff --git a/chrome/browser/ash/tether/tether_service.h b/chrome/browser/ash/tether/tether_service.h index 8127831..de200bf 100644 --- a/chrome/browser/ash/tether/tether_service.h +++ b/chrome/browser/ash/tether/tether_service.h
@@ -27,11 +27,6 @@ namespace secure_channel { class SecureChannelClient; } // namespace secure_channel -namespace tether { -class GmsCoreNotificationsStateTracker; -class GmsCoreNotificationsStateTrackerImpl; -class NotificationPresenter; -} // namespace tether } // namespace chromeos namespace session_manager { @@ -45,6 +40,10 @@ namespace ash { namespace tether { +class GmsCoreNotificationsStateTracker; +class GmsCoreNotificationsStateTrackerImpl; +class NotificationPresenter; + // Service providing access to the Instant Tethering component. Provides an // interface to start up the component as well as to retrieve metadata about // ongoing Tether connections. @@ -54,10 +53,10 @@ class TetherService : public KeyedService, public chromeos::PowerManagerClient::Observer, - public chromeos::tether::TetherHostFetcher::Observer, + public TetherHostFetcher::Observer, public device::BluetoothAdapter::Observer, public chromeos::NetworkStateHandlerObserver, - public chromeos::tether::TetherComponent::Observer, + public TetherComponent::Observer, public chromeos::device_sync::DeviceSyncClient::Observer, public chromeos::multidevice_setup::MultiDeviceSetupClient::Observer { public: @@ -86,7 +85,7 @@ // Should only be called once a user is logged in. virtual void StartTetherIfPossible(); - virtual chromeos::tether::GmsCoreNotificationsStateTracker* + virtual GmsCoreNotificationsStateTracker* GetGmsCoreNotificationsStateTracker(); protected: @@ -97,7 +96,7 @@ void SuspendImminent(power_manager::SuspendImminent::Reason reason) override; void SuspendDone(base::TimeDelta sleep_duration) override; - // chromeos::tether::TetherHostFetcher::Observer + // TetherHostFetcher::Observer void OnTetherHostsUpdated() override; // device::BluetoothAdapter::Observer: @@ -111,7 +110,7 @@ // Helper method called from NetworkStateHandlerObserver methods. void UpdateEnabledState(); - // chromeos::tether::TetherComponent::Observer: + // TetherComponent::Observer: void OnShutdownComplete() override; // chromeos::device_sync::DeviceSyncClient::Observer: @@ -236,9 +235,9 @@ void LogUserPreferenceChanged(bool is_now_enabled); - void SetTestDoubles(std::unique_ptr<chromeos::tether::NotificationPresenter> - notification_presenter, - std::unique_ptr<base::OneShotTimer> timer); + void SetTestDoubles( + std::unique_ptr<NotificationPresenter> notification_presenter, + std::unique_ptr<base::OneShotTimer> timer); // Whether the service has been shut down. bool shut_down_ = false; @@ -275,12 +274,11 @@ multidevice_setup_client_; chromeos::NetworkStateHandler* network_state_handler_; session_manager::SessionManager* session_manager_; - std::unique_ptr<chromeos::tether::NotificationPresenter> - notification_presenter_; - std::unique_ptr<chromeos::tether::GmsCoreNotificationsStateTrackerImpl> + std::unique_ptr<NotificationPresenter> notification_presenter_; + std::unique_ptr<GmsCoreNotificationsStateTrackerImpl> gms_core_notifications_state_tracker_; - std::unique_ptr<chromeos::tether::TetherHostFetcher> tether_host_fetcher_; - std::unique_ptr<chromeos::tether::TetherComponent> tether_component_; + std::unique_ptr<TetherHostFetcher> tether_host_fetcher_; + std::unique_ptr<TetherComponent> tether_component_; scoped_refptr<device::BluetoothAdapter> adapter_; std::unique_ptr<base::OneShotTimer> timer_;
diff --git a/chrome/browser/ash/tether/tether_service_unittest.cc b/chrome/browser/ash/tether/tether_service_unittest.cc index 2a14904..d6f704a1 100644 --- a/chrome/browser/ash/tether/tether_service_unittest.cc +++ b/chrome/browser/ash/tether/tether_service_unittest.cc
@@ -121,8 +121,7 @@ int updated_technology_state_count_ = 0; }; -class FakeTetherComponentWithDestructorCallback - : public chromeos::tether::FakeTetherComponent { +class FakeTetherComponentWithDestructorCallback : public FakeTetherComponent { public: FakeTetherComponentWithDestructorCallback( base::OnceClosure destructor_callback) @@ -137,8 +136,7 @@ base::OnceClosure destructor_callback_; }; -class TestTetherComponentFactory final - : public chromeos::tether::TetherComponentImpl::Factory { +class TestTetherComponentFactory final : public TetherComponentImpl::Factory { public: TestTetherComponentFactory() {} @@ -148,13 +146,13 @@ return active_tether_component_; } - // chromeos::tether::TetherComponentImpl::Factory: - std::unique_ptr<chromeos::tether::TetherComponent> CreateInstance( + // TetherComponentImpl::Factory: + std::unique_ptr<TetherComponent> CreateInstance( chromeos::device_sync::DeviceSyncClient* device_sync_client, chromeos::secure_channel::SecureChannelClient* secure_channel_client, - chromeos::tether::TetherHostFetcher* tether_host_fetcher, - chromeos::tether::NotificationPresenter* notification_presenter, - chromeos::tether::GmsCoreNotificationsStateTrackerImpl* + TetherHostFetcher* tether_host_fetcher, + NotificationPresenter* notification_presenter, + GmsCoreNotificationsStateTrackerImpl* gms_core_notifications_state_tracker, PrefService* pref_service, chromeos::NetworkStateHandler* network_state_handler, @@ -174,8 +172,7 @@ bool was_tether_component_active() { return was_tether_component_active_; } - const chromeos::tether::TetherComponent::ShutdownReason& - last_shutdown_reason() { + const TetherComponent::ShutdownReason& last_shutdown_reason() { return last_shutdown_reason_; } @@ -187,7 +184,7 @@ FakeTetherComponentWithDestructorCallback* active_tether_component_ = nullptr; bool was_tether_component_active_ = false; - chromeos::tether::TetherComponent::ShutdownReason last_shutdown_reason_; + TetherComponent::ShutdownReason last_shutdown_reason_; }; class FakeRemoteDeviceProviderFactory @@ -206,33 +203,29 @@ } }; -class FakeTetherHostFetcherFactory - : public chromeos::tether::TetherHostFetcherImpl::Factory { +class FakeTetherHostFetcherFactory : public TetherHostFetcherImpl::Factory { public: FakeTetherHostFetcherFactory( const chromeos::multidevice::RemoteDeviceRefList& initial_devices) : initial_devices_(initial_devices) {} virtual ~FakeTetherHostFetcherFactory() = default; - chromeos::tether::FakeTetherHostFetcher* last_created() { - return last_created_; - } + FakeTetherHostFetcher* last_created() { return last_created_; } void SetNoInitialDevices() { initial_devices_.clear(); } - // chromeos::tether::TetherHostFetcherImpl::Factory : - std::unique_ptr<chromeos::tether::TetherHostFetcher> CreateInstance( + // TetherHostFetcherImpl::Factory : + std::unique_ptr<TetherHostFetcher> CreateInstance( chromeos::device_sync::DeviceSyncClient* device_sync_client, chromeos::multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client) override { - last_created_ = - new chromeos::tether::FakeTetherHostFetcher(initial_devices_); + last_created_ = new FakeTetherHostFetcher(initial_devices_); return base::WrapUnique(last_created_); } private: chromeos::multidevice::RemoteDeviceRefList initial_devices_; - chromeos::tether::FakeTetherHostFetcher* last_created_ = nullptr; + FakeTetherHostFetcher* last_created_ = nullptr; }; class FakeDeviceSyncClientImplFactory @@ -364,7 +357,7 @@ test_tether_component_factory_ = base::WrapUnique(new TestTetherComponentFactory()); - chromeos::tether::TetherComponentImpl::Factory::SetFactoryForTesting( + TetherComponentImpl::Factory::SetFactoryForTesting( test_tether_component_factory_.get()); shutdown_reason_verified_ = false; @@ -375,7 +368,7 @@ fake_tether_host_fetcher_factory_ = base::WrapUnique(new FakeTetherHostFetcherFactory(test_devices_)); - chromeos::tether::TetherHostFetcherImpl::Factory::SetFactoryForTesting( + TetherHostFetcherImpl::Factory::SetFactoryForTesting( fake_tether_host_fetcher_factory_.get()); TestingBrowserProcess::GetGlobal()->SetLocalState(&local_pref_service_); @@ -431,8 +424,7 @@ fake_multidevice_setup_client_.get(), network_state_handler(), nullptr /* session_manager */)); - fake_notification_presenter_ = - new chromeos::tether::FakeNotificationPresenter(); + fake_notification_presenter_ = new FakeNotificationPresenter(); mock_timer_ = new base::MockOneShotTimer(); tether_service_->SetTestDoubles( base::WrapUnique(fake_notification_presenter_), @@ -517,8 +509,7 @@ } void VerifyLastShutdownReason( - const chromeos::tether::TetherComponent::ShutdownReason& - expected_shutdown_reason) { + const TetherComponent::ShutdownReason& expected_shutdown_reason) { EXPECT_EQ(expected_shutdown_reason, test_tether_component_factory_->last_shutdown_reason()); shutdown_reason_verified_ = true; @@ -546,7 +537,7 @@ fake_remote_device_provider_factory_; std::unique_ptr<FakeTetherHostFetcherFactory> fake_tether_host_fetcher_factory_; - chromeos::tether::FakeNotificationPresenter* fake_notification_presenter_; + FakeNotificationPresenter* fake_notification_presenter_; base::MockOneShotTimer* mock_timer_; std::unique_ptr<chromeos::device_sync::FakeDeviceSyncClient> fake_device_sync_client_; @@ -591,8 +582,7 @@ network_state_handler()->GetTechnologyState( chromeos::NetworkTypePattern::Tether())); VerifyTetherActiveStatus(false /* expected_active */); - VerifyLastShutdownReason( - chromeos::tether::TetherComponent::ShutdownReason::USER_LOGGED_OUT); + VerifyLastShutdownReason(TetherComponent::ShutdownReason::USER_LOGGED_OUT); } // TODO(https://crbug.com/893878): Fix disabled test. @@ -616,7 +606,7 @@ // Tether should be active, but shutting down. VerifyTetherActiveStatus(true /* expected_active */); EXPECT_EQ( - chromeos::tether::TetherComponent::Status::SHUTTING_DOWN, + TetherComponent::Status::SHUTTING_DOWN, test_tether_component_factory_->active_tether_component()->status()); // Tether should be AVAILABLE. @@ -630,8 +620,7 @@ test_tether_component_factory_->active_tether_component() ->FinishAsynchronousShutdown(); VerifyTetherActiveStatus(false /* expected_active */); - VerifyLastShutdownReason( - chromeos::tether::TetherComponent::ShutdownReason::PREF_DISABLED); + VerifyLastShutdownReason(TetherComponent::ShutdownReason::PREF_DISABLED); } TEST_F(TetherServiceTest, TestSuspend) { @@ -659,8 +648,7 @@ VerifyTetherFeatureStateRecorded(TetherService::TetherFeatureState::SUSPENDED, 2 /* expected_count */); - VerifyLastShutdownReason( - chromeos::tether::TetherComponent::ShutdownReason::USER_CLOSED_LID); + VerifyLastShutdownReason(TetherComponent::ShutdownReason::USER_CLOSED_LID); } TEST_F(TetherServiceTest, TestDeviceSyncClientNotReady) { @@ -678,8 +666,7 @@ VerifyTetherActiveStatus(true /* expected_active */); ShutdownTetherService(); - VerifyLastShutdownReason( - chromeos::tether::TetherComponent::ShutdownReason::USER_LOGGED_OUT); + VerifyLastShutdownReason(TetherComponent::ShutdownReason::USER_LOGGED_OUT); } TEST_F(TetherServiceTest, @@ -708,8 +695,7 @@ VerifyTetherActiveStatus(true /* expected_active */); ShutdownTetherService(); - VerifyLastShutdownReason( - chromeos::tether::TetherComponent::ShutdownReason::USER_LOGGED_OUT); + VerifyLastShutdownReason(TetherComponent::ShutdownReason::USER_LOGGED_OUT); } TEST_F(TetherServiceTest, TestMultiDeviceSetupClientLosesVerifiedHost) { @@ -737,8 +723,8 @@ VerifyTetherFeatureStateRecorded( TetherService::TetherFeatureState::NO_AVAILABLE_HOSTS, 1 /* expected_count */); - VerifyLastShutdownReason(chromeos::tether::TetherComponent::ShutdownReason:: - MULTIDEVICE_HOST_UNVERIFIED); + VerifyLastShutdownReason( + TetherComponent::ShutdownReason::MULTIDEVICE_HOST_UNVERIFIED); } TEST_F(TetherServiceTest, TestBetterTogetherSuiteInitiallyDisabled) { @@ -763,8 +749,7 @@ VerifyTetherActiveStatus(true /* expected_active */); ShutdownTetherService(); - VerifyLastShutdownReason( - chromeos::tether::TetherComponent::ShutdownReason::USER_LOGGED_OUT); + VerifyLastShutdownReason(TetherComponent::ShutdownReason::USER_LOGGED_OUT); } TEST_F(TetherServiceTest, TestBetterTogetherSuiteBecomesDisabled) { @@ -790,8 +775,8 @@ VerifyTetherFeatureStateRecorded( TetherService::TetherFeatureState::BETTER_TOGETHER_SUITE_DISABLED, 1 /* expected_count */); - VerifyLastShutdownReason(chromeos::tether::TetherComponent::ShutdownReason:: - BETTER_TOGETHER_SUITE_DISABLED); + VerifyLastShutdownReason( + TetherComponent::ShutdownReason::BETTER_TOGETHER_SUITE_DISABLED); } TEST_F(TetherServiceTest, TestGet_NotPrimaryUser_FeatureFlagDisabled) { @@ -825,8 +810,7 @@ base::RunLoop().RunUntilIdle(); tether_service->Shutdown(); - VerifyLastShutdownReason( - chromeos::tether::TetherComponent::ShutdownReason::USER_LOGGED_OUT); + VerifyLastShutdownReason(TetherComponent::ShutdownReason::USER_LOGGED_OUT); } // TODO(https://crbug.com/893878): Fix disabled test. @@ -846,8 +830,7 @@ base::RunLoop().RunUntilIdle(); tether_service->Shutdown(); - VerifyLastShutdownReason( - chromeos::tether::TetherComponent::ShutdownReason::USER_LOGGED_OUT); + VerifyLastShutdownReason(TetherComponent::ShutdownReason::USER_LOGGED_OUT); } // TODO(https://crbug.com/893878): Fix disabled test. @@ -872,8 +855,7 @@ base::RunLoop().RunUntilIdle(); tether_service->Shutdown(); - VerifyLastShutdownReason( - chromeos::tether::TetherComponent::ShutdownReason::USER_LOGGED_OUT); + VerifyLastShutdownReason(TetherComponent::ShutdownReason::USER_LOGGED_OUT); } TEST_F(TetherServiceTest, TestNoTetherHosts) { @@ -968,8 +950,7 @@ ASSERT_FALSE(mock_timer_->IsRunning()); ShutdownTetherService(); - VerifyLastShutdownReason( - chromeos::tether::TetherComponent::ShutdownReason::USER_LOGGED_OUT); + VerifyLastShutdownReason(TetherComponent::ShutdownReason::USER_LOGGED_OUT); } TEST_F(TetherServiceTest, TestWifiNotPresent) { @@ -1016,8 +997,7 @@ VerifyTetherFeatureStateRecorded( TetherService::TetherFeatureState::BLUETOOTH_DISABLED, 2 /* expected_count */); - VerifyLastShutdownReason( - chromeos::tether::TetherComponent::ShutdownReason::BLUETOOTH_DISABLED); + VerifyLastShutdownReason(TetherComponent::ShutdownReason::BLUETOOTH_DISABLED); } // TODO(https://crbug.com/893878): Fix disabled test. @@ -1036,8 +1016,7 @@ network_state_handler()->GetTechnologyState( chromeos::NetworkTypePattern::Tether())); VerifyTetherActiveStatus(false /* expected_active */); - VerifyLastShutdownReason( - chromeos::tether::TetherComponent::ShutdownReason::PREF_DISABLED); + VerifyLastShutdownReason(TetherComponent::ShutdownReason::PREF_DISABLED); SetTetherTechnologyStateEnabled(true); EXPECT_EQ(chromeos::NetworkStateHandler::TechnologyState::TECHNOLOGY_ENABLED, @@ -1105,8 +1084,7 @@ VerifyTetherFeatureStateRecorded( TetherService::TetherFeatureState::CELLULAR_DISABLED, 2 /* expected_count */); - VerifyLastShutdownReason( - chromeos::tether::TetherComponent::ShutdownReason::CELLULAR_DISABLED); + VerifyLastShutdownReason(TetherComponent::ShutdownReason::CELLULAR_DISABLED); } // TODO(https://crbug.com/893878): Fix disabled test. @@ -1163,8 +1141,7 @@ VerifyTetherFeatureStateRecorded(TetherService::TetherFeatureState::ENABLED, 2 /* expected_count */); - VerifyLastShutdownReason( - chromeos::tether::TetherComponent::ShutdownReason::PREF_DISABLED); + VerifyLastShutdownReason(TetherComponent::ShutdownReason::PREF_DISABLED); } TEST_F(TetherServiceTest, TestUserPrefChangesViaFeatureStateChange) { @@ -1225,8 +1202,7 @@ "InstantTethering.UserPreference.OnToggle", true, 2u /* expected_count */); - VerifyLastShutdownReason( - chromeos::tether::TetherComponent::ShutdownReason::PREF_DISABLED); + VerifyLastShutdownReason(TetherComponent::ShutdownReason::PREF_DISABLED); } TEST_F(TetherServiceTest, TestUserPrefChangesViaTechnologyStateChange) { @@ -1276,8 +1252,7 @@ VerifyTetherFeatureStateRecorded(TetherService::TetherFeatureState::ENABLED, 2 /* expected_count */); - VerifyLastShutdownReason( - chromeos::tether::TetherComponent::ShutdownReason::PREF_DISABLED); + VerifyLastShutdownReason(TetherComponent::ShutdownReason::PREF_DISABLED); } // TODO(https://crbug.com/893878): Fix disabled test. @@ -1309,8 +1284,7 @@ EXPECT_EQ(updated_technology_state_count, tether_service_->updated_technology_state_count()); - VerifyLastShutdownReason( - chromeos::tether::TetherComponent::ShutdownReason::PREF_DISABLED); + VerifyLastShutdownReason(TetherComponent::ShutdownReason::PREF_DISABLED); } } // namespace tether
diff --git a/chrome/browser/ash/web_applications/camera_app/camera_system_web_app_info.cc b/chrome/browser/ash/web_applications/camera_app/camera_system_web_app_info.cc index efe58a1..6b9492d 100644 --- a/chrome/browser/ash/web_applications/camera_app/camera_system_web_app_info.cc +++ b/chrome/browser/ash/web_applications/camera_app/camera_system_web_app_info.cc
@@ -8,6 +8,7 @@ #include "ash/grit/ash_camera_app_resources.h" #include "ash/webui/camera_app_ui/resources/strings/grit/ash_camera_app_strings.h" #include "ash/webui/camera_app_ui/url_constants.h" +#include "chrome/browser/ash/file_manager/path_util.h" #include "chrome/browser/ash/web_applications/camera_app/chrome_camera_app_ui_constants.h" #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h" #include "chrome/browser/web_applications/web_app_constants.h" @@ -77,6 +78,11 @@ return true; } +base::FilePath CameraSystemAppDelegate::GetLaunchDirectory( + const apps::AppLaunchParams& params) const { + return file_manager::util::GetMyFilesFolderForProfile(profile()); +} + gfx::Size CameraSystemAppDelegate::GetMinimumWindowSize() const { return {kChromeCameraAppMinimumWidth, kChromeCameraAppMinimumHeight + 32}; }
diff --git a/chrome/browser/ash/web_applications/camera_app/camera_system_web_app_info.h b/chrome/browser/ash/web_applications/camera_app/camera_system_web_app_info.h index 249f178c..c46e00f 100644 --- a/chrome/browser/ash/web_applications/camera_app/camera_system_web_app_info.h +++ b/chrome/browser/ash/web_applications/camera_app/camera_system_web_app_info.h
@@ -6,9 +6,9 @@ #define CHROME_BROWSER_ASH_WEB_APPLICATIONS_CAMERA_APP_CAMERA_SYSTEM_WEB_APP_INFO_H_ #include <memory> + #include "chrome/browser/web_applications/system_web_apps/system_web_app_delegate.h" #include "chrome/browser/web_applications/system_web_apps/system_web_app_types.h" - #include "ui/gfx/geometry/rect.h" class Browser; @@ -22,6 +22,8 @@ std::unique_ptr<WebApplicationInfo> GetWebAppInfo() const override; bool ShouldCaptureNavigations() const override; gfx::Size GetMinimumWindowSize() const override; + base::FilePath GetLaunchDirectory( + const apps::AppLaunchParams& params) const override; gfx::Rect GetDefaultBounds(Browser* browser) const override; };
diff --git a/chrome/browser/ash/web_applications/camera_app/chrome_camera_app_ui_delegate.cc b/chrome/browser/ash/web_applications/camera_app/chrome_camera_app_ui_delegate.cc index 186542e3..52c176f 100644 --- a/chrome/browser/ash/web_applications/camera_app/chrome_camera_app_ui_delegate.cc +++ b/chrome/browser/ash/web_applications/camera_app/chrome_camera_app_ui_delegate.cc
@@ -33,7 +33,6 @@ #include "chrome/browser/ui/web_applications/system_web_app_ui_utils.h" #include "chrome/browser/web_applications/web_app_id_constants.h" #include "chrome/browser/web_applications/web_app_tab_helper.h" -#include "chrome/browser/web_launch/web_launch_files_helper.h" #include "components/services/app_service/public/mojom/types.mojom.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" @@ -168,22 +167,6 @@ file_task_runner_->DeleteSoon(FROM_HERE, std::move(file_monitor_)); } -void ChromeCameraAppUIDelegate::SetLaunchDirectory() { - Profile* profile = Profile::FromWebUI(web_ui_); - content::WebContents* web_contents = web_ui_->GetWebContents(); - - auto my_files_folder_path = - file_manager::util::GetMyFilesFolderForProfile(profile); - - web_launch::WebLaunchFilesHelper::EnqueueLaunchParams( - web_contents, - /*app_scope=*/GURL(ash::kChromeUICameraAppScopeURL), - /*await_navigation=*/true, - /*launch_url=*/GURL(ash::kChromeUICameraAppMainURL), my_files_folder_path, - /*launch_paths=*/{}); - web_app::WebAppTabHelper::CreateForWebContents(web_contents); -} - void ChromeCameraAppUIDelegate::PopulateLoadTimeData( content::WebUIDataSource* source) { // Add strings that can be pulled in.
diff --git a/chrome/browser/ash/web_applications/camera_app/chrome_camera_app_ui_delegate.h b/chrome/browser/ash/web_applications/camera_app/chrome_camera_app_ui_delegate.h index 267b5b70..f7c75ff 100644 --- a/chrome/browser/ash/web_applications/camera_app/chrome_camera_app_ui_delegate.h +++ b/chrome/browser/ash/web_applications/camera_app/chrome_camera_app_ui_delegate.h
@@ -93,7 +93,6 @@ ~ChromeCameraAppUIDelegate() override; // ash::CameraAppUIDelegate - void SetLaunchDirectory() override; void PopulateLoadTimeData(content::WebUIDataSource* source) override; bool IsMetricsAndCrashReportingEnabled() override; void OpenFileInGallery(const std::string& name) override;
diff --git a/chrome/browser/ash/web_applications/media_app/media_web_app_info.cc b/chrome/browser/ash/web_applications/media_app/media_web_app_info.cc index d3e07f4..88fa10f 100644 --- a/chrome/browser/ash/web_applications/media_app/media_web_app_info.cc +++ b/chrome/browser/ash/web_applications/media_app/media_web_app_info.cc
@@ -11,6 +11,7 @@ #include "ash/constants/ash_features.h" #include "ash/grit/ash_media_app_resources.h" #include "ash/webui/media_app_ui/url_constants.h" +#include "base/files/file_path.h" #include "base/strings/string_split.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h" @@ -161,8 +162,24 @@ return CreateWebAppInfoForMediaWebApp(); } -bool MediaSystemAppDelegate::ShouldIncludeLaunchDirectory() const { - return true; +base::FilePath MediaSystemAppDelegate::GetLaunchDirectory( + const apps::AppLaunchParams& params) const { + // |launch_dir| is the directory that contains all |launch_files|. If + // there are no launch files, launch_dir is empty. + base::FilePath launch_dir = params.launch_files.size() + ? params.launch_files[0].DirName() + : base::FilePath(); + +#if DCHECK_IS_ON() + // Check |launch_files| all come from the same directory. + if (!launch_dir.empty()) { + for (auto path : params.launch_files) { + DCHECK_EQ(launch_dir, path.DirName()); + } + } +#endif + + return launch_dir; } bool MediaSystemAppDelegate::ShouldShowInLauncher() const {
diff --git a/chrome/browser/ash/web_applications/media_app/media_web_app_info.h b/chrome/browser/ash/web_applications/media_app/media_web_app_info.h index 264e391..61574d37 100644 --- a/chrome/browser/ash/web_applications/media_app/media_web_app_info.h +++ b/chrome/browser/ash/web_applications/media_app/media_web_app_info.h
@@ -16,12 +16,13 @@ // web_app::SystemWebAppDelegate overrides: std::unique_ptr<WebApplicationInfo> GetWebAppInfo() const override; - bool ShouldIncludeLaunchDirectory() const override; bool ShouldShowInLauncher() const override; bool ShouldCaptureNavigations() const override; bool ShouldShowInSearch() const override; bool ShouldShowNewWindowMenuOption() const override; bool ShouldReuseExistingWindow() const override; + base::FilePath GetLaunchDirectory( + const apps::AppLaunchParams& params) const override; }; // Return a WebApplicationInfo used to install the app.
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index bdec672..8473814e 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -2447,6 +2447,8 @@ "../ash/policy/core/user_cloud_policy_token_forwarder_factory.h", "../ash/policy/core/user_policy_manager_builder_ash.cc", "../ash/policy/core/user_policy_manager_builder_ash.h", + "../ash/policy/dev_mode/dev_mode_policy_util.cc", + "../ash/policy/dev_mode/dev_mode_policy_util.h", "../ash/policy/display/display_resolution_handler.cc", "../ash/policy/display/display_resolution_handler.h", "../ash/policy/display/display_rotation_default_handler.cc",
diff --git a/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc b/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc index febee56c4..09be74d 100644 --- a/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc +++ b/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc
@@ -391,7 +391,11 @@ manager_->AddObserver(this); } - ~CupsPrintersManagerTest() override {} + ~CupsPrintersManagerTest() override { + // Fast forwarding so that delayed tasks like |SendScannerCountToUMA| will + // run and not leak memory in unused callbacks. + task_environment_.FastForwardUntilNoTasksRemain(); + } // CupsPrintersManager::Observer implementation void OnPrintersChanged(PrinterClass printer_class, @@ -431,7 +435,8 @@ // See // //docs/threading_and_tasks_testing.md#mainthreadtype-trait content::BrowserTaskEnvironment task_environment_{ - base::test::TaskEnvironment::MainThreadType::IO}; + base::test::TaskEnvironment::MainThreadType::IO, + base::test::TaskEnvironment::TimeSource::MOCK_TIME}; // Captured printer lists from observer callbacks. base::flat_map<PrinterClass, std::vector<Printer>> observed_printers_;
diff --git a/chrome/browser/component_updater/media_foundation_widevine_cdm_component_installer.cc b/chrome/browser/component_updater/media_foundation_widevine_cdm_component_installer.cc index c7644815..3e669e6a 100644 --- a/chrome/browser/component_updater/media_foundation_widevine_cdm_component_installer.cc +++ b/chrome/browser/component_updater/media_foundation_widevine_cdm_component_installer.cc
@@ -106,7 +106,7 @@ kWidevineKeySystem, content::CdmInfo::Robustness::kHardwareSecure, /*capability=*/absl::nullopt, /*supports_sub_key_systems=*/false, kMediaFoundationWidevineCdmDisplayName, kMediaFoundationWidevineCdmType, - version, GetCdmPath(install_dir), /*file_system_id=*/""); + version, GetCdmPath(install_dir)); content::CdmRegistry::GetInstance()->RegisterCdm(cdm_info); }
diff --git a/chrome/browser/component_updater/widevine_cdm_component_installer.cc b/chrome/browser/component_updater/widevine_cdm_component_installer.cc index 5d35673..6ced59e1 100644 --- a/chrome/browser/component_updater/widevine_cdm_component_installer.cc +++ b/chrome/browser/component_updater/widevine_cdm_component_installer.cc
@@ -123,8 +123,7 @@ content::CdmInfo cdm_info( kWidevineKeySystem, content::CdmInfo::Robustness::kSoftwareSecure, std::move(capability), /*supports_sub_key_systems=*/false, - kWidevineCdmDisplayName, kWidevineCdmType, cdm_version, cdm_path, - kWidevineCdmFileSystemId); + kWidevineCdmDisplayName, kWidevineCdmType, cdm_version, cdm_path); CdmRegistry::GetInstance()->RegisterCdm(cdm_info); } #endif // !defined(OS_LINUX) && !defined(OS_CHROMEOS)
diff --git a/chrome/browser/content_settings/sound_content_setting_observer.cc b/chrome/browser/content_settings/sound_content_setting_observer.cc index 2b7ae43..bc4fd51 100644 --- a/chrome/browser/content_settings/sound_content_setting_observer.cc +++ b/chrome/browser/content_settings/sound_content_setting_observer.cc
@@ -86,14 +86,9 @@ blink::mojom::kAutoplayFlagUserException); } -void SoundContentSettingObserver::DidFinishNavigation( - content::NavigationHandle* navigation_handle) { - if (navigation_handle->IsInPrimaryMainFrame() && - navigation_handle->HasCommitted() && - !navigation_handle->IsSameDocument()) { - MuteOrUnmuteIfNecessary(); - logged_site_muted_ukm_ = false; - } +void SoundContentSettingObserver::PrimaryPageChanged(content::Page& page) { + MuteOrUnmuteIfNecessary(); + logged_site_muted_ukm_ = false; } void SoundContentSettingObserver::OnAudioStateChanged(bool audible) {
diff --git a/chrome/browser/content_settings/sound_content_setting_observer.h b/chrome/browser/content_settings/sound_content_setting_observer.h index 6de46715..7d96899d 100644 --- a/chrome/browser/content_settings/sound_content_setting_observer.h +++ b/chrome/browser/content_settings/sound_content_setting_observer.h
@@ -15,6 +15,10 @@ #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" +namespace content { +class Page; +} + class SoundContentSettingObserver : public content::WebContentsObserver, public content::WebContentsUserData<SoundContentSettingObserver>, @@ -37,8 +41,7 @@ // content::WebContentsObserver implementation. void ReadyToCommitNavigation( content::NavigationHandle* navigation_handle) override; - void DidFinishNavigation( - content::NavigationHandle* navigation_handle) override; + void PrimaryPageChanged(content::Page& page) override; void OnAudioStateChanged(bool audible) override; // content_settings::Observer implementation.
diff --git a/chrome/browser/devtools/devtools_ui_bindings.cc b/chrome/browser/devtools/devtools_ui_bindings.cc index 47d8c96..8042c95 100644 --- a/chrome/browser/devtools/devtools_ui_bindings.cc +++ b/chrome/browser/devtools/devtools_ui_bindings.cc
@@ -372,11 +372,12 @@ std::string fragment; if (allow_query_and_fragment) { for (net::QueryIterator it(url); !it.IsAtEnd(); it.Advance()) { - std::string value = SanitizeFrontendQueryParam(it.GetKey(), - it.GetValue()); + const std::string key = std::string(it.GetKey()); + std::string value = + SanitizeFrontendQueryParam(key, std::string(it.GetValue())); if (!value.empty()) { query_parts.push_back( - base::StringPrintf("%s=%s", it.GetKey().c_str(), value.c_str())); + base::StringPrintf("%s=%s", key.c_str(), value.c_str())); } } if (url.has_ref() && url.ref_piece().find('\'') == base::StringPiece::npos)
diff --git a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc index fe926c1..c11ef1b 100644 --- a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc +++ b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
@@ -3655,8 +3655,16 @@ // Test that the action matched badge text for an extension is visible in an // incognito context if the extension is incognito enabled. +// Test is disabled on Mac. See https://crbug.com/1280116 +#if defined(OS_MAC) +#define MAYBE_ActionsMatchedCountAsBadgeTextIncognito \ + DISABLED_ActionsMatchedCountAsBadgeTextIncognito +#else +#define MAYBE_ActionsMatchedCountAsBadgeTextIncognito \ + ActionsMatchedCountAsBadgeTextIncognito +#endif IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, - ActionsMatchedCountAsBadgeTextIncognito) { + MAYBE_ActionsMatchedCountAsBadgeTextIncognito) { TestRule rule = CreateGenericRule(); rule.condition->url_filter = "abc.com"; rule.id = kMinValidID;
diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc index 8ffb21e..2388b896 100644 --- a/chrome/browser/extensions/api/settings_private/prefs_util.cc +++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -808,6 +808,9 @@ // Privacy settings. (*s_allowlist)[::ash::prefs::kSnoopingProtectionEnabled] = settings_api::PrefType::PREF_TYPE_BOOLEAN; + (*s_allowlist) + [::ash::prefs::kSnoopingProtectionNotificationSuppressionEnabled] = + settings_api::PrefType::PREF_TYPE_BOOLEAN; (*s_allowlist)[::ash::prefs::kPowerQuickDimEnabled] = settings_api::PrefType::PREF_TYPE_BOOLEAN;
diff --git a/chrome/browser/extensions/api/socket/tcp_socket_unittest.cc b/chrome/browser/extensions/api/socket/tcp_socket_unittest.cc index a3bcd891..64dbc1f2 100644 --- a/chrome/browser/extensions/api/socket/tcp_socket_unittest.cc +++ b/chrome/browser/extensions/api/socket/tcp_socket_unittest.cc
@@ -527,20 +527,6 @@ NOTIMPLEMENTED(); return nullptr; } - std::unique_ptr<net::ProxyClientSocket> CreateProxyClientSocket( - std::unique_ptr<net::StreamSocket> stream_socket, - const std::string& user_agent, - const net::HostPortPair& endpoint, - const net::ProxyServer& proxy_server, - net::HttpAuthController* http_auth_controller, - bool tunnel, - bool using_spdy, - net::NextProto negotiated_protocol, - net::ProxyDelegate* proxy_delegate, - const net::NetworkTrafficAnnotationTag& traffic_annotation) override { - NOTIMPLEMENTED(); - return nullptr; - } private: std::vector<std::unique_ptr<net::StaticSocketDataProvider>> providers_;
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 82af9b0d..0babcd6 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -4014,6 +4014,11 @@ "expiry_milestone": 100 }, { + "name": "ntp-realbox-match-omnibox-theme", + "owners": [ "mahmadi", "mfacey" ], + "expiry_milestone": 105 + }, + { "name": "ntp-realbox-pedals", "owners": [ "mahmadi", "mfacey" ], "expiry_milestone": 100 @@ -4029,6 +4034,11 @@ "expiry_milestone": 100 }, { + "name": "ntp-realbox-use-google-g-icon", + "owners": [ "mahmadi", "mfacey" ], + "expiry_milestone": 105 + }, + { "name": "ntp-recipe-tasks-module", "owners": [ "mahmadi", "tiborg" ], "expiry_milestone": 100 @@ -5305,11 +5315,6 @@ "expiry_milestone": 110 }, { - "name": "tabs-bulkactions-ios", - "owners": [ "mrefaat", "michaeldo", "bling-flags@google.com" ], - "expiry_milestone": 98 - }, - { "name": "tabs-search-ios", "owners": [ "mrefaat", "michaeldo", "bling-flags@google.com" ], "expiry_milestone":100
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 7575410..c9ef782 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -3711,6 +3711,11 @@ const char kNtpModulesRedesignedLayoutDescription[] = "Changes the layout of modules on New Tab Page"; +const char kNtpRealboxMatchOmniboxThemeName[] = + "NTP Realbox Matches Omnibox Theme"; +const char kNtpRealboxMatchOmniboxThemeDescription[] = + "NTP Realbox matches the Omnibox theme when enabled."; + const char kNtpRealboxPedalsName[] = "NTP Realbox Pedals"; const char kNtpRealboxPedalsDescription[] = "Shows pedals in the NTP Realbox when enabled."; @@ -3724,6 +3729,11 @@ const char kNtpRealboxTailSuggestDescription[] = "Properly formats the tail suggestions to match the Omnibox"; +const char kNtpRealboxUseGoogleGIconName[] = "NTP Realbox Google G Icon"; +const char kNtpRealboxUseGoogleGIconDescription[] = + "Shows Google G icon " + "instead of Search Loupe in realbox when enabled"; + const char kEnableReaderModeName[] = "Enable Reader Mode"; const char kEnableReaderModeDescription[] = "Allows viewing of simplified web pages by selecting 'Customize and "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 393c389..093ba12 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -2141,6 +2141,9 @@ extern const char kNtpModulesRedesignedLayoutName[]; extern const char kNtpModulesRedesignedLayoutDescription[]; +extern const char kNtpRealboxMatchOmniboxThemeName[]; +extern const char kNtpRealboxMatchOmniboxThemeDescription[]; + extern const char kNtpRealboxPedalsName[]; extern const char kNtpRealboxPedalsDescription[]; @@ -2150,6 +2153,9 @@ extern const char kNtpRealboxTailSuggestName[]; extern const char kNtpRealboxTailSuggestDescription[]; +extern const char kNtpRealboxUseGoogleGIconName[]; +extern const char kNtpRealboxUseGoogleGIconDescription[]; + extern const char kEnableReaderModeName[]; extern const char kEnableReaderModeDescription[];
diff --git a/chrome/browser/media/router/providers/dial/dial_activity_manager.cc b/chrome/browser/media/router/providers/dial/dial_activity_manager.cc index 146f482..0b5295e 100644 --- a/chrome/browser/media/router/providers/dial/dial_activity_manager.cc +++ b/chrome/browser/media/router/providers/dial/dial_activity_manager.cc
@@ -88,11 +88,11 @@ // temporary object. for (net::QueryIterator query_it(url); !query_it.IsAtEnd(); query_it.Advance()) { - std::string key = query_it.GetKey(); + const base::StringPiece key = query_it.GetKey(); if (key == "clientId") { - client_id = query_it.GetValue(); + client_id = std::string(query_it.GetValue()); } else if (key == "dialPostData") { - post_data = query_it.GetValue(); + post_data = std::string(query_it.GetValue()); } } if (client_id.empty())
diff --git a/chrome/browser/media/webrtc/same_origin_observer.cc b/chrome/browser/media/webrtc/same_origin_observer.cc index 74d66c5..bcd2583f 100644 --- a/chrome/browser/media/webrtc/same_origin_observer.cc +++ b/chrome/browser/media/webrtc/same_origin_observer.cc
@@ -4,38 +4,29 @@ #include "chrome/browser/media/webrtc/same_origin_observer.h" -#include "base/callback.h" -#include "base/check.h" -#include "content/public/browser/navigation_handle.h" #include "content/public/browser/web_contents.h" -#include "url/gurl.h" -#include "url/origin.h" SameOriginObserver::SameOriginObserver( content::WebContents* observed_contents, - const GURL& reference_origin, + const url::Origin& reference_origin, base::RepeatingCallback<void(content::WebContents*)> on_same_origin_state_changed) - : observed_contents_(observed_contents), + : content::WebContentsObserver(observed_contents), reference_origin_(reference_origin), on_same_origin_state_changed_(on_same_origin_state_changed) { DCHECK(observed_contents); - is_same_origin_ = url::IsSameOriginWith( - reference_origin_, - observed_contents_->GetLastCommittedURL().DeprecatedGetOriginAsURL()); - Observe(observed_contents); + is_same_origin_ = reference_origin_.IsSameOriginWith( + observed_contents->GetMainFrame()->GetLastCommittedOrigin()); } SameOriginObserver::~SameOriginObserver() = default; -void SameOriginObserver::DidFinishNavigation( - content::NavigationHandle* navigation_handle) { - const GURL& new_origin = - navigation_handle->GetURL().DeprecatedGetOriginAsURL(); - bool is_now_same_origin = - url::IsSameOriginWith(reference_origin_, new_origin); +void SameOriginObserver::PrimaryPageChanged(content::Page& page) { + bool is_now_same_origin = reference_origin_.IsSameOriginWith( + page.GetMainDocument().GetLastCommittedOrigin()); + if (is_same_origin_ != is_now_same_origin) { is_same_origin_ = is_now_same_origin; - on_same_origin_state_changed_.Run(observed_contents_.get()); + on_same_origin_state_changed_.Run(web_contents()); } }
diff --git a/chrome/browser/media/webrtc/same_origin_observer.h b/chrome/browser/media/webrtc/same_origin_observer.h index 7604280..18d8a08a 100644 --- a/chrome/browser/media/webrtc/same_origin_observer.h +++ b/chrome/browser/media/webrtc/same_origin_observer.h
@@ -6,9 +6,8 @@ #define CHROME_BROWSER_MEDIA_WEBRTC_SAME_ORIGIN_OBSERVER_H_ #include "base/callback.h" -#include "base/memory/raw_ptr.h" #include "content/public/browser/web_contents_observer.h" -#include "url/gurl.h" +#include "url/origin.h" namespace content { class WebContents; @@ -24,18 +23,16 @@ class SameOriginObserver : public content::WebContentsObserver { public: SameOriginObserver(content::WebContents* observed_contents, - const GURL& reference_origin, + const url::Origin& reference_origin, base::RepeatingCallback<void(content::WebContents*)> on_same_origin_state_changed); ~SameOriginObserver() override; // WebContentsObserver - void DidFinishNavigation( - content::NavigationHandle* navigation_handle) override; + void PrimaryPageChanged(content::Page& page) override; private: - const raw_ptr<content::WebContents> observed_contents_; - const GURL reference_origin_; + const url::Origin reference_origin_; base::RepeatingCallback<void(content::WebContents*)> on_same_origin_state_changed_; bool is_same_origin_ = false;
diff --git a/chrome/browser/media/webrtc/same_origin_observer_browsertest.cc b/chrome/browser/media/webrtc/same_origin_observer_browsertest.cc new file mode 100644 index 0000000..f32dafb7 --- /dev/null +++ b/chrome/browser/media/webrtc/same_origin_observer_browsertest.cc
@@ -0,0 +1,86 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/media/webrtc/same_origin_observer.h" + +#include "base/test/mock_callback.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/ui_test_utils.h" +#include "content/public/test/browser_test.h" +#include "content/public/test/fenced_frame_test_util.h" +#include "net/dns/mock_host_resolver.h" + +class SameOriginObserverTest : public InProcessBrowserTest { + public: + void SetUpOnMainThread() override { + host_resolver()->AddRule("*", "127.0.0.1"); + InProcessBrowserTest::SetUpOnMainThread(); + } + + void NavigateAndCreateObserver(const std::string& hostname, + const std::string& relative_url) { + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), embedded_test_server()->GetURL(hostname, relative_url))); + + same_origin_observer_ = std::make_unique<SameOriginObserver>( + web_contents(), embedded_test_server()->GetOrigin(hostname), + origin_state_callback_.Get()); + } + + content::WebContents* web_contents() { + return browser()->tab_strip_model()->GetActiveWebContents(); + } + + protected: + using OriginCallback = base::RepeatingCallback<void(content::WebContents*)>; + base::MockCallback<OriginCallback> origin_state_callback_; + std::unique_ptr<SameOriginObserver> same_origin_observer_; +}; + +IN_PROC_BROWSER_TEST_F(SameOriginObserverTest, CallCallbackWhenOriginChanged) { + ASSERT_TRUE(embedded_test_server()->Start()); + + // Navigate to the initial page. The observer refers to its origin. + NavigateAndCreateObserver("a.com", "/title1.html"); + + // Navigate to the second page with the same origin. The observer won't call + // the callback because the origin was not changed. + EXPECT_CALL(origin_state_callback_, Run).Times(0); + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), embedded_test_server()->GetURL("a.com", "/title2.html"))); + testing::Mock::VerifyAndClearExpectations(&origin_state_callback_); + + // Navigate to the third page with the different origin. The observer has to + // call the callback. + EXPECT_CALL(origin_state_callback_, Run); + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), embedded_test_server()->GetURL("b.com", "/title1.html"))); + testing::Mock::VerifyAndClearExpectations(&origin_state_callback_); +} + +class SameOriginObserverFencedFrameTest : public SameOriginObserverTest { + public: + content::test::FencedFrameTestHelper& fenced_frame_test_helper() { + return fenced_frame_helper_; + } + + private: + content::test::FencedFrameTestHelper fenced_frame_helper_; +}; + +IN_PROC_BROWSER_TEST_F(SameOriginObserverFencedFrameTest, + FFDoesNotAffectSameOriginState) { + ASSERT_TRUE(embedded_test_server()->Start()); + + // Navigate to the initial page. The observer refers to its origin. + NavigateAndCreateObserver("a.com", "/title1.html"); + + // The same-origin state callback is not called by fenced frames. + EXPECT_CALL(origin_state_callback_, Run).Times(0); + ASSERT_TRUE(fenced_frame_test_helper().CreateFencedFrame( + web_contents()->GetMainFrame(), + embedded_test_server()->GetURL("b.com", "/fenced_frames/title1.html"))); + testing::Mock::VerifyAndClearExpectations(&origin_state_callback_); +}
diff --git a/chrome/browser/media/webrtc/tab_capture_access_handler.cc b/chrome/browser/media/webrtc/tab_capture_access_handler.cc index 771c61255..57a2709 100644 --- a/chrome/browser/media/webrtc/tab_capture_access_handler.cc +++ b/chrome/browser/media/webrtc/tab_capture_access_handler.cc
@@ -34,7 +34,7 @@ public: // Since we own the observer, the base::Unretained for the callback is safe. SameOriginPolicyUI(content::WebContents* observed_contents, - const GURL& reference_origin) + const url::Origin& reference_origin) : observer_( observed_contents, reference_origin, @@ -163,8 +163,8 @@ if (!devices.empty()) { std::unique_ptr<MediaStreamUI> media_ui; if (capture_level == AllowedScreenCaptureLevel::kSameOrigin) { - media_ui = std::make_unique<SameOriginPolicyUI>(target_web_contents, - request.security_origin); + media_ui = std::make_unique<SameOriginPolicyUI>( + target_web_contents, url::Origin::Create(request.security_origin)); } ui = MediaCaptureDevicesDispatcher::GetInstance() ->GetMediaStreamCaptureIndicator()
diff --git a/chrome/browser/metrics/testing/metrics_reporting_pref_helper.cc b/chrome/browser/metrics/testing/metrics_reporting_pref_helper.cc index 23888fa..4b28b65f7 100644 --- a/chrome/browser/metrics/testing/metrics_reporting_pref_helper.cc +++ b/chrome/browser/metrics/testing/metrics_reporting_pref_helper.cc
@@ -22,9 +22,8 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) namespace { -void SetMetricsReportingEnabledChromeOS( - bool is_enabled, - base::DictionaryValue* local_state_dict) { +void SetMetricsReportingEnabledChromeOS(bool is_enabled, + base::Value& local_state_dict) { namespace em = enterprise_management; em::ChromeDeviceSettingsProto device_settings_proto; device_settings_proto.mutable_metrics_enabled()->set_metrics_enabled( @@ -32,7 +31,7 @@ em::PolicyData policy_data; policy_data.set_policy_type("google/chromeos/device"); policy_data.set_policy_value(device_settings_proto.SerializeAsString()); - local_state_dict->SetString( + local_state_dict.SetStringKey( prefs::kDeviceSettingsCache, ash::device_settings_cache::PolicyDataToString(policy_data)); } @@ -43,9 +42,9 @@ namespace metrics { base::FilePath SetUpUserDataDirectoryForTesting(bool is_enabled) { - base::DictionaryValue local_state_dict; - local_state_dict.SetBoolean(metrics::prefs::kMetricsReportingEnabled, - is_enabled); + base::Value local_state_dict(base::Value::Type::DICTIONARY); + local_state_dict.SetBoolPath(metrics::prefs::kMetricsReportingEnabled, + is_enabled); base::FilePath user_data_dir; if (!base::PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)) @@ -53,7 +52,7 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) // ChromeOS checks a separate place for reporting enabled. - SetMetricsReportingEnabledChromeOS(is_enabled, &local_state_dict); + SetMetricsReportingEnabledChromeOS(is_enabled, local_state_dict); #endif base::FilePath local_state_path =
diff --git a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc index ce5d95d..fbbea3ff 100644 --- a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc
@@ -1251,6 +1251,11 @@ RecordMemoriesMetrics(builder, page_end_reason); builder.Record(ukm::UkmRecorder::Get()); + + // Also log UserInitiated in UserPerceivedPageVisit. + ukm::builders::UserPerceivedPageVisit(GetDelegate().GetPageUkmSourceId()) + .SetUserInitiated(is_user_initiated_navigation) + .Record(ukm::UkmRecorder::Get()); } absl::optional<int64_t>
diff --git a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer_unittest.cc index 9b49a12..b1b569c 100644 --- a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer_unittest.cc
@@ -312,6 +312,15 @@ EXPECT_TRUE(tester()->test_ukm_recorder().EntryHasMetric( kv.second.get(), PageLoad::kPageTiming_ForegroundDurationName)); } + std::map<ukm::SourceId, ukm::mojom::UkmEntryPtr> pagevisit_entries = + tester()->test_ukm_recorder().GetMergedEntriesByName( + ukm::builders::UserPerceivedPageVisit::kEntryName); + EXPECT_EQ(1ul, pagevisit_entries.size()); + for (const auto& kv : pagevisit_entries) { + tester()->test_ukm_recorder().ExpectEntryMetric( + kv.second.get(), + ukm::builders::UserPerceivedPageVisit::kUserInitiatedName, true); + } } TEST_F(UkmPageLoadMetricsObserverTest, FailedProvisionalLoad) {
diff --git a/chrome/browser/permissions/permission_request_manager_browsertest.cc b/chrome/browser/permissions/permission_request_manager_browsertest.cc index 270ccb41..151c8d3 100644 --- a/chrome/browser/permissions/permission_request_manager_browsertest.cc +++ b/chrome/browser/permissions/permission_request_manager_browsertest.cc
@@ -10,6 +10,7 @@ #include "base/command_line.h" #include "base/metrics/field_trial.h" #include "base/run_loop.h" +#include "base/test/mock_callback.h" #include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" @@ -37,6 +38,8 @@ #include "components/permissions/test/mock_permission_prompt_factory.h" #include "components/permissions/test/mock_permission_request.h" #include "components/variations/variations_associated_data.h" +#include "content/public/browser/permission_controller_delegate.h" +#include "content/public/browser/permission_type.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_view_host.h" @@ -51,6 +54,7 @@ #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "services/device/public/cpp/test/scoped_geolocation_overrider.h" +#include "third_party/blink/public/mojom/permissions/permission_status.mojom-shared.h" #include "url/gurl.h" #include "url/origin.h" @@ -1197,4 +1201,40 @@ EXPECT_EQ(0, bubble_factory()->TotalRequestCount()); } +// Tests that the permission request for a fenced frame is blocked +// when the permission is requested thru PermissionControllerDelegate. +IN_PROC_BROWSER_TEST_F(PermissionRequestManagerWithFencedFrameTest, + RequestPermissionThruDelegate) { + net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); + https_server.AddDefaultHandlers(GetChromeTestDataDir()); + https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_OK); + ASSERT_TRUE(https_server.Start()); + auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); + + GURL initial_url = https_server.GetURL("/title1.html"); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), initial_url)); + + // Load a fenced frame. + GURL fenced_frame_url = https_server.GetURL("/fenced_frames/title1.html"); + content::RenderFrameHost* fenced_frame_host = + fenced_frame_test_helper().CreateFencedFrame(web_contents->GetMainFrame(), + fenced_frame_url); + ASSERT_TRUE(fenced_frame_host); + + // The permission request is denied because it's from the fenced frame. + const char kExpectedConsolePattern[] = + "*blocked because it was requested inside a fenced frame*"; + content::WebContentsConsoleObserver console_observer(web_contents); + console_observer.SetPattern(kExpectedConsolePattern); + + base::MockOnceCallback<void(blink::mojom::PermissionStatus)> callback; + EXPECT_CALL(callback, Run(blink::mojom::PermissionStatus::DENIED)); + auto* delegate = browser()->profile()->GetPermissionControllerDelegate(); + delegate->RequestPermission(content::PermissionType::SENSORS, + fenced_frame_host, fenced_frame_url, + /* user_gesture = */ true, callback.Get()); + console_observer.Wait(); + ASSERT_EQ(1u, console_observer.messages().size()); +} + } // anonymous namespace
diff --git a/chrome/browser/policy/enrollment_status.h b/chrome/browser/policy/enrollment_status.h index 98e3e1d..8da322b 100644 --- a/chrome/browser/policy/enrollment_status.h +++ b/chrome/browser/policy/enrollment_status.h
@@ -54,6 +54,9 @@ // offline demo mode. OFFLINE_POLICY_DECODING_FAILED = 21, // Failed when the policy data fails // to be decoded. + // Device policy would block dev mode but the + // kEnterpriseEnrollmentFailOnBlockDevMode flag was given. + MAY_NOT_BLOCK_DEV_MODE = 22, }; // Helpers for constructing errors for relevant cases.
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc index 01cc5f1..977e1f2 100644 --- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc +++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -76,6 +76,7 @@ #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h" #include "chrome/browser/profiles/renderer_updater_factory.h" #include "chrome/browser/safe_browsing/certificate_reporting_service_factory.h" +#include "chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.h" #include "chrome/browser/search_engines/template_url_fetcher_factory.h" #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/segmentation_platform/segmentation_platform_service_factory.h" @@ -506,6 +507,7 @@ SystemExtensionsProviderFactory::GetInstance(); #endif TabRestoreServiceFactory::GetInstance(); + safe_browsing::TailoredSecurityServiceFactory::GetInstance(); TemplateURLFetcherFactory::GetInstance(); TemplateURLServiceFactory::GetInstance(); #if !defined(OS_ANDROID)
diff --git a/chrome/browser/resources/access_code_cast/BUILD.gn b/chrome/browser/resources/access_code_cast/BUILD.gn index 08c53a4..f54e0a7 100644 --- a/chrome/browser/resources/access_code_cast/BUILD.gn +++ b/chrome/browser/resources/access_code_cast/BUILD.gn
@@ -15,6 +15,7 @@ js_files = [ "access_code_cast.ts", "code_input/code_input.ts", + "error_message/error_message.ts", ] } @@ -57,6 +58,7 @@ "access_code_cast.ts", "browser_proxy.ts", "code_input/code_input.ts", + "error_message/error_message.ts", "route_request_result_code.mojom-webui.js", ] }
diff --git a/chrome/browser/resources/access_code_cast/access_code_cast.html b/chrome/browser/resources/access_code_cast/access_code_cast.html index 73d967a4..3a1128b2 100644 --- a/chrome/browser/resources/access_code_cast/access_code_cast.html +++ b/chrome/browser/resources/access_code_cast/access_code_cast.html
@@ -3,6 +3,12 @@ margin-inline-end: 8px; } + .center { + left: 50%; + top: 50%; + transform: translateY(-50%) translateX(-50%); + } + .text-button:not(:focus) { border: none; box-shadow: none; @@ -21,7 +27,7 @@ <h1>$i18n{dialogTitle}</h1> <div id="codeInputView"> <c2c-code-input length="6" value="" id="codeInput"></c2c-code-input> - <cr-button on-click="switchToQrInput" class="text-button"> + <cr-button on-click="switchToQrInput" class="center text-button"> <iron-icon class="button-image" icon="cr:videocam"></iron-icon> $i18n{useCamera} </cr-button> @@ -29,6 +35,7 @@ <div id="qrInputView"> <p>Camera input view</p> </div> +<c2c-error-message id="errorMessage"></c2c-error-message> <div id="button-container"> <cr-button on-click="close">$i18n{close}</cr-button> <cr-button id="castButton" on-click="addSinkAndCast" class="action-button"
diff --git a/chrome/browser/resources/access_code_cast/access_code_cast.ts b/chrome/browser/resources/access_code_cast/access_code_cast.ts index 686fed3a..692517c9 100644 --- a/chrome/browser/resources/access_code_cast/access_code_cast.ts +++ b/chrome/browser/resources/access_code_cast/access_code_cast.ts
@@ -3,6 +3,7 @@ // found in the LICENSE file. import './code_input/code_input.js'; +import './error_message/error_message.js'; import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; import 'chrome://resources/cr_elements/icons.m.js'; @@ -16,6 +17,7 @@ import {AddSinkResultCode, CastDiscoveryMethod, PageCallbackRouter} from './access_code_cast.mojom-webui.js'; import {BrowserProxy} from './browser_proxy.js'; import {CodeInputElement} from './code_input/code_input.js'; +import {ErrorMessageElement} from './error_message/error_message.js'; import {RouteRequestResultCode} from './route_request_result_code.mojom-webui.js'; declare const chrome: any; @@ -31,6 +33,7 @@ castButton: CrButtonElement; codeInputView: HTMLDivElement; codeInput: CodeInputElement; + errorMessage: ErrorMessageElement; qrInputView: HTMLDivElement; } } @@ -62,6 +65,7 @@ ready() { super.ready(); this.setState(PageState.CODE_INPUT); + this.$.errorMessage.setNoError(); this.$.codeInput.addEventListener('access-code-input', (e: any) => { this.handleCodeInput(e); }); @@ -101,7 +105,7 @@ }); if (addResult !== AddSinkResultCode.OK) { - this.showAddSinkError(addResult); + this.$.errorMessage.setAddSinkError(addResult); return; } @@ -110,7 +114,7 @@ }); if (castResult !== RouteRequestResultCode.OK) { - this.showCastError(castResult); + this.$.errorMessage.setCastError(castResult); return; } @@ -129,6 +133,7 @@ private setState(state: PageState) { this.state = state; + this.$.errorMessage.setNoError(); this.$.codeInputView.hidden = state !== PageState.CODE_INPUT; this.$.castButton.hidden = state !== PageState.CODE_INPUT; @@ -156,25 +161,6 @@ const castResult = await BrowserProxy.getInstance().handler.castToSink(); return castResult.resultCode as RouteRequestResultCode; } - - // TODO:(b/209720173): Implement this functions to handle errors - private showAddSinkError(resultCode: AddSinkResultCode) { - if (resultCode === AddSinkResultCode.INVALID_ACCESS_CODE) { - console.log('Incorrect access code'); - } else { - console.log('Add sink error: ' + resultCode); - } - } - - // TODO:(b/209720173): Implement this functions to handle errors - private showCastError(resultCode: RouteRequestResultCode) { - if (resultCode === RouteRequestResultCode.ROUTE_NOT_FOUND) { - console.log('Route not found'); - } else { - console.log('Cast error: ' + resultCode); - } - } - } customElements.define(AccessCodeCastElement.is, AccessCodeCastElement);
diff --git a/chrome/browser/resources/access_code_cast/error_message/error_message.html b/chrome/browser/resources/access_code_cast/error_message/error_message.html new file mode 100644 index 0000000..3590072 --- /dev/null +++ b/chrome/browser/resources/access_code_cast/error_message/error_message.html
@@ -0,0 +1,40 @@ +<style include="cr-shared-style"> + .error { + color: var(--google-red-600); + padding-top: 16px; + } + + .error > iron-icon { + --iron-icon-height: 16px; + --iron-icon-width: 16px; + } +</style> +<div class="error"> + <template is="dom-if" + if="[[isNotEqual(messageCode, errorMessageEnum.NO_ERROR)]]" + > + <iron-icon class="button-image" icon="cr:error-outline" size="16"> + </iron-icon> + <template is="dom-if" if="[[isEqual(messageCode, errorMessageEnum.GENERIC)]]"> + $i18n{errorUnknown} + </template> + <template is="dom-if" + if="[[isEqual(messageCode, errorMessageEnum.ACCESS_CODE)]]" + > + $i18n{errorAccessCode} + </template> + <template is="dom-if" if="[[isEqual(messageCode, errorMessageEnum.NETWORK)]]"> + $i18n{errorNetwork} + </template> + <template is="dom-if" + if="[[isEqual(messageCode, errorMessageEnum.PERMISSION)]]" + > + $i18n{errorPermission} + </template> + <template is="dom-if" + if="[[isEqual(messageCode, errorMessageEnum.TOO_MANY_REQUESTS)]]" + > + $i18n{errorTooManyRequests} + </template> + </template> +</div> \ No newline at end of file
diff --git a/chrome/browser/resources/access_code_cast/error_message/error_message.ts b/chrome/browser/resources/access_code_cast/error_message/error_message.ts new file mode 100644 index 0000000..09457057d --- /dev/null +++ b/chrome/browser/resources/access_code_cast/error_message/error_message.ts
@@ -0,0 +1,124 @@ +// 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. + +import 'chrome://resources/cr_elements/icons.m.js'; +import 'chrome://resources/cr_elements/shared_vars_css.m.js'; +import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; + +import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {AddSinkResultCode} from '../access_code_cast.mojom-webui.js'; +import {RouteRequestResultCode} from '../route_request_result_code.mojom-webui.js'; + +enum ErrorMessage { + NO_ERROR, + GENERIC, + ACCESS_CODE, + NETWORK, + PERMISSION, + TOO_MANY_REQUESTS, +} + +export class ErrorMessageElement extends PolymerElement { + private static readonly ADD_RESULT_MESSAGE_CODES: + [ErrorMessage, AddSinkResultCode[]][] = [ + [ErrorMessage.NO_ERROR, [AddSinkResultCode.OK]], + [ErrorMessage.GENERIC, [ + AddSinkResultCode.UNKNOWN_ERROR, + AddSinkResultCode.SINK_CREATION_ERROR + ]], + [ErrorMessage.ACCESS_CODE, [ + AddSinkResultCode.INVALID_ACCESS_CODE, + AddSinkResultCode.ACCESS_CODE_NOT_FOUND + ]], + [ErrorMessage.NETWORK, [ + AddSinkResultCode.HTTP_RESPONSE_CODE_ERROR, + AddSinkResultCode.RESPONSE_MALFORMED, + AddSinkResultCode.EMPTY_RESPONSE, + AddSinkResultCode.SERVICE_NOT_PRESENT, + AddSinkResultCode.SERVER_ERROR + ]], + [ErrorMessage.PERMISSION, [AddSinkResultCode.AUTH_ERROR]], + [ErrorMessage.TOO_MANY_REQUESTS, [AddSinkResultCode.TOO_MANY_REQUESTS]], + ]; + + private static readonly CAST_RESULT_MESSAGE_CODES: + [ErrorMessage, RouteRequestResultCode[]][] = [ + [ErrorMessage.NO_ERROR, [RouteRequestResultCode.OK]], + [ErrorMessage.GENERIC, [ + RouteRequestResultCode.UNKNOWN_ERROR, + RouteRequestResultCode.INVALID_ORIGIN, + RouteRequestResultCode.OFF_THE_RECORD_MISMATCH, + RouteRequestResultCode.NO_SUPPORTED_PROVIDER, + RouteRequestResultCode.CANCELLED, + RouteRequestResultCode.ROUTE_ALREADY_EXISTS, + RouteRequestResultCode.DESKTOP_PICKER_FAILED, + RouteRequestResultCode.ROUTE_ALREADY_TERMINATED + ]], + [ErrorMessage.NETWORK, [ + RouteRequestResultCode.TIMED_OUT, + RouteRequestResultCode.ROUTE_NOT_FOUND, + RouteRequestResultCode.SINK_NOT_FOUND + ]], + ]; + + private static readonly ADD_RESULT_MESSAGE_MAP = + new Map(ErrorMessageElement.ADD_RESULT_MESSAGE_CODES); + + private static readonly CAST_RESULT_MESSAGE_MAP = + new Map(ErrorMessageElement.CAST_RESULT_MESSAGE_CODES); + + // Needed for Polymer data binding + private errorMessageEnum = ErrorMessage; + + static get is() { + return 'c2c-error-message'; + } + + static get template() { + return html`{__html_template__}`; + } + + private messageCode = ErrorMessage.NO_ERROR; + + setAddSinkError(resultCode: AddSinkResultCode) { + this.messageCode = this.findErrorMessage(resultCode, + ErrorMessageElement.ADD_RESULT_MESSAGE_MAP); + } + + setCastError(resultCode: RouteRequestResultCode) { + this.messageCode = this.findErrorMessage(resultCode, + ErrorMessageElement.CAST_RESULT_MESSAGE_MAP); + } + + setNoError() { + this.messageCode = ErrorMessage.NO_ERROR; + } + + getMessageCode() { + return this.messageCode; + } + + isEqual(a: ErrorMessage, b: ErrorMessage) { + return a === b; + } + + isNotEqual(a: ErrorMessage, b: ErrorMessage) { + return a !== b; + } + + private findErrorMessage( + resultCode: AddSinkResultCode|RouteRequestResultCode, + messageCodes: Map<ErrorMessage, any[]>) { + for (const key of messageCodes.keys()) { + if (messageCodes.get(key)!.includes(resultCode)) { + return key; + } + } + + return ErrorMessage.NO_ERROR; + } +} + +customElements.define(ErrorMessageElement.is, ErrorMessageElement); \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings.gni b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings.gni index 95f07ba..a8a4e3e 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings.gni +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings.gni
@@ -2,68 +2,29 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/locales.gni") import("//chrome/common/features.gni") import("//tools/grit/grit_rule.gni") +# Same as the locales list but in the format the extension system expects: +# it uses underscores instead of hyphens, and "en" instead of "en-US". +# Very similar to locales_as_mac_outputs, except pseudolocales are not included. +accessibility_locales = [] +foreach(locale, locales_without_pseudolocales) { + if (locale == "en-US") { + accessibility_locales += [ "en" ] + } else { + accessibility_locales += [ string_replace(locale, "-", "_") ] + } +} + template("accessibility_strings") { grit(target_name) { source = "//chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings.grd" defines = chrome_grit_defines - outputs = [ - "_locales/am/messages.json.gz", - "_locales/ar/messages.json.gz", - "_locales/bg/messages.json.gz", - "_locales/bn/messages.json.gz", - "_locales/ca/messages.json.gz", - "_locales/cs/messages.json.gz", - "_locales/da/messages.json.gz", - "_locales/de/messages.json.gz", - "_locales/el/messages.json.gz", - "_locales/en_GB/messages.json.gz", - "_locales/en/messages.json.gz", - "_locales/es/messages.json.gz", - "_locales/es_419/messages.json.gz", - "_locales/et/messages.json.gz", - "_locales/fa/messages.json.gz", - "_locales/fi/messages.json.gz", - "_locales/fil/messages.json.gz", - "_locales/fr/messages.json.gz", - "_locales/gu/messages.json.gz", - "_locales/he/messages.json.gz", - "_locales/hi/messages.json.gz", - "_locales/hr/messages.json.gz", - "_locales/hu/messages.json.gz", - "_locales/id/messages.json.gz", - "_locales/it/messages.json.gz", - "_locales/ja/messages.json.gz", - "_locales/kn/messages.json.gz", - "_locales/ko/messages.json.gz", - "_locales/lt/messages.json.gz", - "_locales/lv/messages.json.gz", - "_locales/ml/messages.json.gz", - "_locales/mr/messages.json.gz", - "_locales/ms/messages.json.gz", - "_locales/nl/messages.json.gz", - "_locales/nb/messages.json.gz", - "_locales/pl/messages.json.gz", - "_locales/pt_BR/messages.json.gz", - "_locales/pt_PT/messages.json.gz", - "_locales/ro/messages.json.gz", - "_locales/ru/messages.json.gz", - "_locales/sk/messages.json.gz", - "_locales/sl/messages.json.gz", - "_locales/sr/messages.json.gz", - "_locales/sv/messages.json.gz", - "_locales/sw/messages.json.gz", - "_locales/ta/messages.json.gz", - "_locales/te/messages.json.gz", - "_locales/th/messages.json.gz", - "_locales/tr/messages.json.gz", - "_locales/uk/messages.json.gz", - "_locales/vi/messages.json.gz", - "_locales/zh_CN/messages.json.gz", - "_locales/zh_TW/messages.json.gz", - ] + outputs = + process_file_template(accessibility_locales, + "_locales/{{source_name_part}}/messages.json.gz") output_dir = invoker.out_dir resource_ids = ""
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings.grd b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings.grd index b28f620..c500bf655 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings.grd +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings.grd
@@ -27,6 +27,7 @@ <output filename="_locales/hr/messages.json.gz" type="chrome_messages_json_gzip" lang="hr"/> <output filename="_locales/hu/messages.json.gz" type="chrome_messages_json_gzip" lang="hu"/> <output filename="_locales/id/messages.json.gz" type="chrome_messages_json_gzip" lang="id"/> + <output filename="_locales/is/messages.json.gz" type="chrome_messages_json_gzip" lang="is"/> <output filename="_locales/it/messages.json.gz" type="chrome_messages_json_gzip" lang="it"/> <output filename="_locales/ja/messages.json.gz" type="chrome_messages_json_gzip" lang="ja"/> <output filename="_locales/kn/messages.json.gz" type="chrome_messages_json_gzip" lang="kn"/>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_kk.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_kk.xtb index 9c825b4..dca022e5 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_kk.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_kk.xtb
@@ -392,6 +392,7 @@ <translation id="3497063866483065785">{COUNT,plural, =1{сұрақ белгісі}other{# сұрақ белгісі}}</translation> <translation id="3505359110822747654">ChromeVox мәзірлерін ашу</translation> <translation id="3514822174137761109">{COUNT,plural, =1{кірістіру белгісі}other{# кірістіру белгісі}}</translation> +<translation id="3518600448524470129">{COUNT,plural, =1{ақ таңбалауыш}other{# ақ таңбалауыш}}</translation> <translation id="352577523970648069">Өңделетін мәтін өрісі</translation> <translation id="3538907380453898475">сипаттама тізімі</translation> <translation id="3549141990712742152"><ph name="TEXT" /> бөлігін қиып алу.</translation> @@ -675,6 +676,7 @@ <translation id="5597170376237141345">Келесі құсбелгі ұяшығы</translation> <translation id="5598905979683743333"><ph name="NAME" />, радио түйме белгісі алып тасталды</translation> <translation id="5601172225407283979">Әдепкі әрекетті орындау</translation> +<translation id="5604302400025591178">{COUNT,plural, =1{шаршы таңбалауыш}other{# шаршы таңбалауыш}}</translation> <translation id="5608798115546226984">Автотолтыру жолы</translation> <translation id="5616029807486814372">Келесі сабақ</translation> <translation id="561939826962581046">time</translation> @@ -1097,6 +1099,7 @@ <translation id="8659501358298941449">Ашылмалы тізімдер</translation> <translation id="8666733765751421568"><ph name="TYPE" />, соңы</translation> <translation id="867187640362843212">5-тақырып</translation> +<translation id="8690400660839620419">{COUNT,plural, =1{}other{# орналастырылған деңгей}}</translation> <translation id="8693391540059827073">Сүйікті маусымым</translation> <translation id="8696284982970258155">Бал реңкті</translation> <translation id="8697111817566059991">{COUNT,plural, =1{құбыр}other{# тік құбыр}}</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_vi.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_vi.xtb index 555355d..05a53b1 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_vi.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_vi.xtb
@@ -392,6 +392,7 @@ <translation id="3497063866483065785">{COUNT,plural, =1{dấu hỏi}other{# dấu hỏi}}</translation> <translation id="3505359110822747654">Thu gọn Trình đơn ChromeVox</translation> <translation id="3514822174137761109">{COUNT,plural, =1{dấu mũ}other{# dấu mũ}}</translation> +<translation id="3518600448524470129">{COUNT,plural, =1{dấu chấm trắng đầu dòng}other{# dấu chấm trắng đầu dòng}}</translation> <translation id="352577523970648069">Trường văn bản có thể chỉnh sửa</translation> <translation id="3538907380453898475">dsmt</translation> <translation id="3549141990712742152">cắt <ph name="TEXT" />.</translation> @@ -675,6 +676,7 @@ <translation id="5597170376237141345">Hộp kiểm tiếp theo</translation> <translation id="5598905979683743333"><ph name="NAME" />, nút radio bị bỏ chọn</translation> <translation id="5601172225407283979">Thực hiện tác vụ mặc định</translation> +<translation id="5604302400025591178">{COUNT,plural, =1{dấu đầu dòng hình vuông}other{# dấu đầu dòng hình vuông}}</translation> <translation id="5608798115546226984">Tự động hoàn thành nội dòng</translation> <translation id="5616029807486814372">Bài học tiếp theo</translation> <translation id="561939826962581046">thời gian</translation> @@ -1098,6 +1100,7 @@ <translation id="8659501358298941449">Danh sách thả xuống</translation> <translation id="8666733765751421568"><ph name="TYPE" /> kết thúc</translation> <translation id="867187640362843212">Tiêu đề 5</translation> +<translation id="8690400660839620419">{COUNT,plural, =1{}other{nội dung con cấp #}}</translation> <translation id="8693391540059827073">Mùa tôi yêu thích</translation> <translation id="8696284982970258155">Màu dưa lưới</translation> <translation id="8697111817566059991">{COUNT,plural, =1{dấu sổ thẳng}other{# dấu sổ thẳng}}</translation>
diff --git a/chrome/browser/resources/pdf/controller.js b/chrome/browser/resources/pdf/controller.js index f28405d..ec1d504a 100644 --- a/chrome/browser/resources/pdf/controller.js +++ b/chrome/browser/resources/pdf/controller.js
@@ -582,7 +582,8 @@ /** @type {!Point} */ (messageData)); break; case 'ackScrollToRemote': - this.viewport_.ackScrollToRemote(); + this.viewport_.ackScrollToRemote( + /** @type {!Point} */ (messageData)); break; case 'saveData': this.saveData_(/** @type {!SaveDataMessageData} */ (messageData));
diff --git a/chrome/browser/resources/pdf/pdf_internal_plugin_wrapper.js b/chrome/browser/resources/pdf/pdf_internal_plugin_wrapper.js index 8552aee..c2686f1 100644 --- a/chrome/browser/resources/pdf/pdf_internal_plugin_wrapper.js +++ b/chrome/browser/resources/pdf/pdf_internal_plugin_wrapper.js
@@ -46,8 +46,12 @@ return; case 'syncScrollToRemote': - channel.port1.postMessage({type: 'ackScrollToRemote'}); window.scrollTo(e.data.x, e.data.y); + channel.port1.postMessage({ + type: 'ackScrollToRemote', + x: window.scrollX, + y: window.scrollY, + }); return; case 'updateSize':
diff --git a/chrome/browser/resources/pdf/viewport.js b/chrome/browser/resources/pdf/viewport.js index 1759738e..4d8b709 100644 --- a/chrome/browser/resources/pdf/viewport.js +++ b/chrome/browser/resources/pdf/viewport.js
@@ -82,12 +82,13 @@ /** @private {!HTMLElement} */ this.window_ = container; - /** @private {!ScrollContent} */ - this.scrollContent_ = new ScrollContent(this.window_, sizer, content); - /** @private {number} */ this.scrollbarWidth_ = scrollbarWidth; + /** @private {!ScrollContent} */ + this.scrollContent_ = + new ScrollContent(this.window_, sizer, content, this.scrollbarWidth_); + /** @private {number} */ this.defaultZoom_ = defaultZoom; @@ -228,9 +229,10 @@ /** * Receives acknowledgment of scroll position synchronized to remote content. + * @param {!Point} position */ - ackScrollToRemote() { - this.scrollContent_.ackScrollToRemote(); + ackScrollToRemote(position) { + this.scrollContent_.ackScrollToRemote(position); } /** @param {function():void} viewportChangedCallback */ @@ -1587,8 +1589,9 @@ * scrollable content. * @param {!Element} content The element which is the parent of the scrollable * content. + * @param {number} scrollbarWidth The width of any scrollbars. */ - constructor(container, sizer, content) { + constructor(container, sizer, content, scrollbarWidth) { /** @private @const {!Element} */ this.container_ = container; @@ -1601,6 +1604,9 @@ /** @private @const {!Element} */ this.content_ = content; + /** @private @const {number} */ + this.scrollbarWidth_ = scrollbarWidth; + /** @private {?UnseasonedPdfPluginElement} */ this.unseasonedPlugin_ = null; @@ -1718,10 +1724,17 @@ /** * Receives acknowledgment of scroll position synchronized to remote content. + * @param {!Point} position */ - ackScrollToRemote() { + ackScrollToRemote(position) { assert(this.unackedScrollsToRemote_ > 0); - --this.unackedScrollsToRemote_; + + if (--this.unackedScrollsToRemote_ === 0) { + // Accept remote adjustment when there are no pending scrolls-to-remote. + this.scrollLeft_ = position.x; + this.scrollTop_ = position.y; + } + this.dispatchScroll_(); } @@ -1785,12 +1798,33 @@ */ scrollTo(x, y) { if (this.unseasonedPlugin_) { + // TODO(crbug.com/1277228): Can get NaN if zoom calculations divide by 0. + x = Number.isNaN(x) ? 0 : x; + y = Number.isNaN(y) ? 0 : y; + + // Clamp coordinates to scroll limits. Note that the order of min() and + // max() operations is significant, as each "maximum" can be negative. + const maxX = this.maxScroll_( + this.width_, this.container_.clientWidth, + this.height_ > this.container_.clientHeight); + const maxY = this.maxScroll_( + this.height_, this.container_.clientHeight, + this.width_ > this.container_.clientWidth); + + if (this.container_.dir === 'rtl') { + // Right-to-left. + x = Math.min(Math.max(-maxX, x), 0); + } else { + // Left-to-right. + x = Math.max(0, Math.min(x, maxX)); + } + y = Math.max(0, Math.min(y, maxY)); + // To match the DOM's scrollTo() behavior, update the scroll position // immediately, but fire the scroll event later (when the remote side // triggers `ackScrollToRemote()`). - // TODO(crbug.com/1277228): Can get NaN if zoom calculations divide by 0. - this.scrollLeft_ = Number.isNaN(x) ? 0 : x; - this.scrollTop_ = Number.isNaN(y) ? 0 : y; + this.scrollLeft_ = x; + this.scrollTop_ = y; ++this.unackedScrollsToRemote_; this.unseasonedPlugin_.postMessage({ @@ -1802,4 +1836,22 @@ this.container_.scrollTo(x, y); } } + + /** + * Computes maximum scroll position. + * @param {number} maxContent The maximum content dimension. + * @param {number} maxContainer The maximum container dimension. + * @param {boolean} hasScrollbar Whether to compensate for a scrollbar. + * @return {number} + * @private + */ + maxScroll_(maxContent, maxContainer, hasScrollbar) { + if (hasScrollbar) { + maxContainer -= this.scrollbarWidth_; + } + + // This may return a negative value, which is fine because scroll positions + // are clamped to a minimum of 0. + return maxContent - maxContainer; + } }
diff --git a/chrome/browser/resources/settings/chromeos/os_privacy_page/smart_privacy_page.html b/chrome/browser/resources/settings/chromeos/os_privacy_page/smart_privacy_page.html index 2161115..ed98c3d 100644 --- a/chrome/browser/resources/settings/chromeos/os_privacy_page/smart_privacy_page.html +++ b/chrome/browser/resources/settings/chromeos/os_privacy_page/smart_privacy_page.html
@@ -4,6 +4,10 @@ flex-flow: column wrap; } + .indented { + margin-inline-start: var(--cr-section-padding); + } + .underbar { border-bottom: var(--cr-separator-line); } @@ -67,15 +71,9 @@ </settings-toggle-button> <iron-collapse id="snoopingProtectionOptions" opened="[[prefs.ash.privacy.snooping_protection_enabled.value]]"> - <div class="settings-box continuation embedded"> - <cr-radio-group> - <cr-radio-button name="dim" class="list-item" - label="$i18n{smartPrivacySnoopingDim}"> - </cr-radio-button> - <cr-radio-button name="icon" class="list-item" - label="$i18n{smartPrivacySnoopingIcon}"> - </cr-radio-button> - </cr-radio-group> - </div> + <settings-toggle-button class="settings-box continuation indented" + pref="{{prefs.ash.privacy.snooping_protection_notification_suppression_enabled}}" + label="$i18n{smartPrivacySnoopingNotifications}"> + </settings-toggle-button> </iron-collapse> </template>
diff --git a/chrome/browser/safe_browsing/BUILD.gn b/chrome/browser/safe_browsing/BUILD.gn index 85ae170..ad5bfe9 100644 --- a/chrome/browser/safe_browsing/BUILD.gn +++ b/chrome/browser/safe_browsing/BUILD.gn
@@ -55,6 +55,7 @@ "//components/sessions", "//components/signin/public/identity_manager", "//components/url_formatter", + "//components/vector_icons:vector_icons", "//mojo/public/cpp/platform", "//mojo/public/cpp/system", "//services/preferences/public/cpp", @@ -127,6 +128,8 @@ "safe_browsing_service.h", "services_delegate.cc", "services_delegate.h", + "tailored_security/chrome_tailored_security_service.cc", + "tailored_security/chrome_tailored_security_service.h", "tailored_security/tailored_security_outcome.h", "tailored_security/tailored_security_service_factory.cc", "tailored_security/tailored_security_service_factory.h",
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.h b/chrome/browser/safe_browsing/chrome_password_protection_service.h index 97cb161..391fd19 100644 --- a/chrome/browser/safe_browsing/chrome_password_protection_service.h +++ b/chrome/browser/safe_browsing/chrome_password_protection_service.h
@@ -397,8 +397,14 @@ // Unit tests FRIEND_TEST_ALL_PREFIXES(ChromePasswordProtectionServiceTest, VerifyUserPopulationForPasswordOnFocusPing); - FRIEND_TEST_ALL_PREFIXES(ChromePasswordProtectionServiceTest, - VerifyUserPopulationForSyncPasswordEntryPing); + FRIEND_TEST_ALL_PREFIXES( + ChromePasswordProtectionServiceWithProtectionForSignedInUsersEnabledTest, + VerifyUserPopulationForSyncPasswordEntryPing); +#if defined(OS_ANDROID) + FRIEND_TEST_ALL_PREFIXES( + ChromePasswordProtectionServiceWithProtectionForSignedInUsersDisabledTest, + VerifyUserPopulationForSyncPasswordEntryPing); +#endif FRIEND_TEST_ALL_PREFIXES(ChromePasswordProtectionServiceTest, VerifyUserPopulationForSavedPasswordEntryPing); FRIEND_TEST_ALL_PREFIXES( @@ -425,6 +431,9 @@ VerifyUnhandledSyncPasswordReuseUponClearHistoryDeletion); FRIEND_TEST_ALL_PREFIXES(ChromePasswordProtectionServiceTest, VerifyCanShowInterstitial); + FRIEND_TEST_ALL_PREFIXES( + ChromePasswordProtectionServiceWithProtectionForSignedInUsersEnabledTest, + VerifyCanShowInterstitial); FRIEND_TEST_ALL_PREFIXES(ChromePasswordProtectionServiceTest, VerifySendsPingForAboutBlank); FRIEND_TEST_ALL_PREFIXES(ChromePasswordProtectionServiceTest, @@ -441,8 +450,12 @@ VerifyPersistPhishedSavedPasswordCredential); FRIEND_TEST_ALL_PREFIXES(ChromePasswordProtectionServiceTest, VerifyGetPingNotSentReason); - FRIEND_TEST_ALL_PREFIXES(ChromePasswordProtectionServiceTest, - VerifyPageLoadToken); + FRIEND_TEST_ALL_PREFIXES( + ChromePasswordProtectionServiceWithSBPageLoadTokenEnabledTest, + VerifyPageLoadToken); + FRIEND_TEST_ALL_PREFIXES( + ChromePasswordProtectionServiceWithSBPageLoadTokenDisabledTest, + VerifyPageLoadToken); // Browser tests FRIEND_TEST_ALL_PREFIXES(ChromePasswordProtectionServiceBrowserTest, VerifyCheckGaiaPasswordChange);
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 9b767db..7af9a9a2 100644 --- a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc +++ b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
@@ -437,6 +437,25 @@ mock_remove_callback_; }; +class ChromePasswordProtectionServiceWithProtectionForSignedInUsersEnabledTest + : public ChromePasswordProtectionServiceTest { + private: + base::test::ScopedFeatureList feature_list_{ + safe_browsing::kPasswordProtectionForSignedInUsers}; +}; + +class ChromePasswordProtectionServiceWithProtectionForSignedInUsersDisabledTest + : public ChromePasswordProtectionServiceTest { + public: + ChromePasswordProtectionServiceWithProtectionForSignedInUsersDisabledTest() { + feature_list_.InitAndDisableFeature( + safe_browsing::kPasswordProtectionForSignedInUsers); + } + + private: + base::test::ScopedFeatureList feature_list_; +}; + TEST_F(ChromePasswordProtectionServiceTest, VerifyUserPopulationForPasswordOnFocusPing) { ReusedPasswordAccountType reused_password_type; @@ -467,8 +486,6 @@ TEST_F(ChromePasswordProtectionServiceTest, VerifyUserPopulationForSavedPasswordEntryPing) { - base::test::ScopedFeatureList feature_list; - ReusedPasswordAccountType reused_password_type; reused_password_type.set_account_type( ReusedPasswordAccountType::SAVED_PASSWORD); @@ -500,100 +517,90 @@ reused_password_type)); } -// TODO(crbug.com/1276906): Flaky on Linux TSan Tests. -#if defined(THREAD_SANITIZER) -#define MAYBE_VerifyUserPopulationForSyncPasswordEntryPing \ - DISABLED_VerifyUserPopulationForSyncPasswordEntryPing -#else -#define MAYBE_VerifyUserPopulationForSyncPasswordEntryPing \ - VerifyUserPopulationForSyncPasswordEntryPing -#endif -TEST_F(ChromePasswordProtectionServiceTest, - MAYBE_VerifyUserPopulationForSyncPasswordEntryPing) { +TEST_F(ChromePasswordProtectionServiceWithProtectionForSignedInUsersEnabledTest, + VerifyUserPopulationForSyncPasswordEntryPing) { // Sets up the account as a gmail account as there is no hosted domain. ReusedPasswordAccountType reused_password_type; reused_password_type.set_account_type(ReusedPasswordAccountType::GMAIL); reused_password_type.set_is_account_syncing(true); - { - // 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)); - // 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(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)); - 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)); - // 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_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)); - } + 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) - { - // Disable kPasswordProtectionForSignedInUsers. - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures( - {}, {safe_browsing::kPasswordProtectionForSignedInUsers}); +TEST_F( + ChromePasswordProtectionServiceWithProtectionForSignedInUsersDisabledTest, + VerifyUserPopulationForSyncPasswordEntryPing) { + // Sets up the account as a gmail account as there is no hosted domain. + ReusedPasswordAccountType reused_password_type; + reused_password_type.set_account_type(ReusedPasswordAccountType::GMAIL); + reused_password_type.set_is_account_syncing(true); - 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)); + profile()->GetPrefs()->SetInteger(prefs::kPasswordProtectionWarningTrigger, + PASSWORD_REUSE); - // 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 + service_->ConfigService(false /*incognito*/, false /*SBER*/); + // Sync password pings are now gated by Safe Browsing Enhanced Reporting, + // because kPasswordProtectionForSignedInUsers 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 kPasswordProtectionForSignedInUsers is disabled. + service_->ConfigService(false /*incognito*/, true /*SBER*/); + EXPECT_TRUE(service_->IsPingingEnabled( + LoginReputationClientRequest::PASSWORD_REUSE_EVENT, + reused_password_type)); } +#endif TEST_F(ChromePasswordProtectionServiceTest, VerifyPingingIsSkippedIfMatchEnterpriseAllowlist) { @@ -1308,7 +1315,7 @@ EXPECT_EQ(warning_text, service_->GetWarningDetailText(reused_password_type)); } -TEST_F(ChromePasswordProtectionServiceTest, +TEST_F(ChromePasswordProtectionServiceWithProtectionForSignedInUsersEnabledTest, VerifyGetWarningDetailTextEnterprise) { std::u16string warning_text_non_sync = l10n_util::GetStringUTF16( IDS_PAGE_INFO_CHANGE_PASSWORD_DETAILS_SIGNED_IN_NON_SYNC); @@ -1330,14 +1337,10 @@ reused_password_type.set_is_account_syncing(false); EXPECT_EQ(generic_enterprise_warning_text, service_->GetWarningDetailText(reused_password_type)); - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - safe_browsing::kPasswordProtectionForSignedInUsers); - reused_password_type.set_account_type(ReusedPasswordAccountType::GSUITE); - EXPECT_EQ(warning_text_non_sync, - service_->GetWarningDetailText(reused_password_type)); - } + + reused_password_type.set_account_type(ReusedPasswordAccountType::GSUITE); + EXPECT_EQ(warning_text_non_sync, + service_->GetWarningDetailText(reused_password_type)); reused_password_type.set_account_type(ReusedPasswordAccountType::GSUITE); reused_password_type.set_is_account_syncing(true); @@ -1351,15 +1354,12 @@ service_->GetWarningDetailText(reused_password_type)); } -TEST_F(ChromePasswordProtectionServiceTest, VerifyGetWarningDetailTextGmail) { +TEST_F(ChromePasswordProtectionServiceWithProtectionForSignedInUsersEnabledTest, + VerifyGetWarningDetailTextGmail) { std::u16string warning_text_non_sync = l10n_util::GetStringUTF16( IDS_PAGE_INFO_CHANGE_PASSWORD_DETAILS_SIGNED_IN_NON_SYNC); std::u16string warning_text_sync = l10n_util::GetStringUTF16(IDS_PAGE_INFO_CHANGE_PASSWORD_DETAILS_SYNC); - - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - safe_browsing::kPasswordProtectionForSignedInUsers); ReusedPasswordAccountType reused_password_type; reused_password_type.set_account_type(ReusedPasswordAccountType::GMAIL); EXPECT_EQ(warning_text_non_sync, @@ -1369,6 +1369,25 @@ service_->GetWarningDetailText(reused_password_type)); } +TEST_F(ChromePasswordProtectionServiceWithProtectionForSignedInUsersEnabledTest, + VerifyCanShowInterstitial) { + // Do not show interstitial if policy not set for password_alert. + ASSERT_FALSE( + profile()->GetPrefs()->HasPrefPath(prefs::kSafeBrowsingAllowlistDomains)); + GURL trigger_url = GURL(kPhishingURL); + ReusedPasswordAccountType reused_password_type; + reused_password_type.set_account_type(ReusedPasswordAccountType::GSUITE); + reused_password_type.set_is_account_syncing(false); + service_->SetAccountInfo(kUserName); + EXPECT_FALSE( + service_->CanShowInterstitial(reused_password_type, trigger_url)); + + // Show interstitial if the policy is set to password_alert. + profile()->GetPrefs()->SetInteger(prefs::kPasswordProtectionWarningTrigger, + PASSWORD_REUSE); + EXPECT_TRUE(service_->CanShowInterstitial(reused_password_type, trigger_url)); +} + TEST_F(ChromePasswordProtectionServiceTest, VerifyCanShowInterstitial) { // Do not show interstitial if policy not set for password_alert. ASSERT_FALSE( @@ -1383,16 +1402,6 @@ reused_password_type.set_is_account_syncing(true); EXPECT_FALSE( service_->CanShowInterstitial(reused_password_type, trigger_url)); - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - safe_browsing::kPasswordProtectionForSignedInUsers); - service_->SetAccountInfo(kUserName); - reused_password_type.set_is_account_syncing(false); - EXPECT_FALSE( - service_->CanShowInterstitial(reused_password_type, trigger_url)); - } - reused_password_type.set_account_type( ReusedPasswordAccountType::NON_GAIA_ENTERPRISE); reused_password_type.set_is_account_syncing(false); @@ -1409,18 +1418,6 @@ profile()->GetPrefs()->SetInteger(prefs::kPasswordProtectionWarningTrigger, PASSWORD_REUSE); EXPECT_TRUE(service_->CanShowInterstitial(reused_password_type, trigger_url)); - { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - safe_browsing::kPasswordProtectionForSignedInUsers); - service_->SetAccountInfo(kUserName); - reused_password_type.set_account_type(ReusedPasswordAccountType::GSUITE); - reused_password_type.set_is_account_syncing(false); - profile()->GetPrefs()->SetInteger(prefs::kPasswordProtectionWarningTrigger, - PASSWORD_REUSE); - EXPECT_TRUE( - service_->CanShowInterstitial(reused_password_type, trigger_url)); - } // Show interstitial if user is a Enterprise user and the policy is set to // password_alert. reused_password_type.set_account_type( @@ -1522,24 +1519,35 @@ } } -TEST_F(ChromePasswordProtectionServiceTest, VerifyPageLoadToken) { - // Feature disabled - { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndDisableFeature(kSafeBrowsingPageLoadToken); - auto request = std::make_unique<LoginReputationClientRequest>(); - service_->FillUserPopulation(GURL("https:www.example.com/"), request.get()); - ASSERT_EQ(0, request->population().page_load_tokens_size()); +class ChromePasswordProtectionServiceWithSBPageLoadTokenDisabledTest + : public ChromePasswordProtectionServiceTest { + public: + ChromePasswordProtectionServiceWithSBPageLoadTokenDisabledTest() { + feature_list_.InitAndDisableFeature(kSafeBrowsingPageLoadToken); } - // Feature enabled - { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature(kSafeBrowsingPageLoadToken); - auto request = std::make_unique<LoginReputationClientRequest>(); - service_->FillUserPopulation(GURL("https:www.example.com/"), request.get()); - ASSERT_EQ(1, request->population().page_load_tokens_size()); - } + private: + base::test::ScopedFeatureList feature_list_; +}; + +TEST_F(ChromePasswordProtectionServiceWithSBPageLoadTokenDisabledTest, + VerifyPageLoadToken) { + auto request = std::make_unique<LoginReputationClientRequest>(); + service_->FillUserPopulation(GURL("https:www.example.com/"), request.get()); + ASSERT_EQ(0, request->population().page_load_tokens_size()); +} + +class ChromePasswordProtectionServiceWithSBPageLoadTokenEnabledTest + : public ChromePasswordProtectionServiceTest { + private: + base::test::ScopedFeatureList feature_list_{kSafeBrowsingPageLoadToken}; +}; + +TEST_F(ChromePasswordProtectionServiceWithSBPageLoadTokenEnabledTest, + VerifyPageLoadToken) { + auto request = std::make_unique<LoginReputationClientRequest>(); + service_->FillUserPopulation(GURL("https:www.example.com/"), request.get()); + ASSERT_EQ(1, request->population().page_load_tokens_size()); } namespace {
diff --git a/chrome/browser/safe_browsing/local_two_phase_testserver.cc b/chrome/browser/safe_browsing/local_two_phase_testserver.cc index 1106327..3d563ca0 100644 --- a/chrome/browser/safe_browsing/local_two_phase_testserver.cc +++ b/chrome/browser/safe_browsing/local_two_phase_testserver.cc
@@ -75,7 +75,7 @@ if (it.GetKey() == "p2close") p2close = "1"; if (it.GetKey() == "p2code") - p2code = it.GetValue(); + p2code = std::string(it.GetValue()); } std::string put_url = base::StringPrintf(
diff --git a/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.cc b/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.cc new file mode 100644 index 0000000..8b3be0f8 --- /dev/null +++ b/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.cc
@@ -0,0 +1,101 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.h" + +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/signin/identity_manager_factory.h" +#include "chrome/browser/ui/browser_finder.h" +#include "components/prefs/pref_service.h" +#include "components/safe_browsing/core/common/features.h" +#include "components/safe_browsing/core/common/safe_browsing_prefs.h" +#include "components/signin/public/identity_manager/identity_manager.h" +#include "content/public/browser/storage_partition.h" + +#if defined(OS_ANDROID) +#include "chrome/browser/ui/android/tab_model/tab_model.h" +#include "chrome/browser/ui/android/tab_model/tab_model_list.h" +#else +#include "chrome/browser/safe_browsing/tailored_security/notification_handler_desktop.h" +#endif + +namespace safe_browsing { + +namespace { + +#if defined(OS_ANDROID) +content::WebContents* GetWebContentsForProfile(Profile* profile) { + for (const TabModel* tab_model : TabModelList::models()) { + if (tab_model->GetProfile() != profile) + continue; + + int tab_count = tab_model->GetTabCount(); + for (int i = 0; i < tab_count; i++) { + content::WebContents* web_contents = tab_model->GetWebContentsAt(i); + if (web_contents) + return web_contents; + } + } + return nullptr; +} +#endif + +} // namespace + +ChromeTailoredSecurityService::ChromeTailoredSecurityService(Profile* profile) + : TailoredSecurityService(IdentityManagerFactory::GetForProfile(profile), + profile->GetPrefs()), + profile_(profile) {} + +ChromeTailoredSecurityService::~ChromeTailoredSecurityService() = default; + +void ChromeTailoredSecurityService::MaybeNotifySyncUser( + bool is_enabled, + base::Time previous_update) { + if (!base::FeatureList::IsEnabled(kTailoredSecurityIntegration)) + return; + + if (!identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync)) + return; + + if (is_enabled && !IsEnhancedProtectionEnabled(*prefs())) { + ShowSyncNotification(true); + } + + if (!is_enabled && IsEnhancedProtectionEnabled(*prefs()) && + prefs()->GetBoolean( + prefs::kEnhancedProtectionEnabledViaTailoredSecurity)) { + ShowSyncNotification(false); + } +} + +void ChromeTailoredSecurityService::ShowSyncNotification(bool is_enabled) { +#if defined(OS_ANDROID) + content::WebContents* web_contents = GetWebContentsForProfile(profile_); + if (!web_contents) + return; + message_ = std::make_unique<TailoredSecurityConsentedModalAndroid>(); + message_->DisplayMessage( + web_contents, is_enabled, + base::BindOnce(&ChromeTailoredSecurityService::MessageDismissed, + // Unretained is safe because |this| owns |message_|. + base::Unretained(this))); +#else + DisplayTailoredSecurityConsentedModalDesktop(profile_, is_enabled); +#endif +} + +#if defined(OS_ANDROID) +void ChromeTailoredSecurityService::MessageDismissed() { + message_.reset(); +} +#endif + +scoped_refptr<network::SharedURLLoaderFactory> +ChromeTailoredSecurityService::GetURLLoaderFactory() { + return profile_->GetDefaultStoragePartition() + ->GetURLLoaderFactoryForBrowserProcess(); +} + +} // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.h b/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.h new file mode 100644 index 0000000..90971ece --- /dev/null +++ b/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.h
@@ -0,0 +1,44 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_SAFE_BROWSING_TAILORED_SECURITY_CHROME_TAILORED_SECURITY_SERVICE_H_ +#define CHROME_BROWSER_SAFE_BROWSING_TAILORED_SECURITY_CHROME_TAILORED_SECURITY_SERVICE_H_ + +#include "build/build_config.h" +#include "components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h" + +#if defined(OS_ANDROID) +#include "chrome/browser/safe_browsing/tailored_security/consented_message_android.h" +#endif + +class Profile; + +namespace safe_browsing { + +class ChromeTailoredSecurityService : public TailoredSecurityService { + public: + explicit ChromeTailoredSecurityService(Profile* profile); + ~ChromeTailoredSecurityService() override; + + protected: + void MaybeNotifySyncUser(bool is_enabled, + base::Time previous_update) override; + + scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() override; + + private: + void ShowSyncNotification(bool is_enabled); + +#if defined(OS_ANDROID) + void MessageDismissed(); + + std::unique_ptr<TailoredSecurityConsentedModalAndroid> message_; +#endif + + Profile* profile_; +}; + +} // namespace safe_browsing + +#endif // CHROME_BROWSER_SAFE_BROWSING_TAILORED_SECURITY_CHROME_TAILORED_SECURITY_SERVICE_H_
diff --git a/chrome/browser/safe_browsing/tailored_security/consented_message_android.cc b/chrome/browser/safe_browsing/tailored_security/consented_message_android.cc index 857b15f..7b9d3fb 100644 --- a/chrome/browser/safe_browsing/tailored_security/consented_message_android.cc +++ b/chrome/browser/safe_browsing/tailored_security/consented_message_android.cc
@@ -37,12 +37,14 @@ void TailoredSecurityConsentedModalAndroid::DisplayMessage( content::WebContents* web_contents, - bool enable) { + bool enable, + base::OnceClosure dismiss_callback) { if (message_) { return; } web_contents_ = web_contents; is_enable_message_ = enable; + dismiss_callback_ = std::move(dismiss_callback); message_ = std::make_unique<messages::MessageWrapper>( is_enable_message_ ? messages::MessageIdentifier::TAILORED_SECURITY_ENABLED @@ -94,6 +96,7 @@ return; messages::MessageDispatcherBridge::Get()->DismissMessage(message_.get(), dismiss_reason); + std::move(dismiss_callback_).Run(); } void TailoredSecurityConsentedModalAndroid::HandleSettingsClicked() { @@ -107,10 +110,12 @@ messages::DismissReason dismiss_reason) { LogOutcome(TailoredSecurityOutcome::kDismissed, is_enable_message_); message_.reset(); + std::move(dismiss_callback_).Run(); } void TailoredSecurityConsentedModalAndroid::HandleMessageAccepted() { LogOutcome(TailoredSecurityOutcome::kAccepted, is_enable_message_); + std::move(dismiss_callback_).Run(); } } // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/tailored_security/consented_message_android.h b/chrome/browser/safe_browsing/tailored_security/consented_message_android.h index b1c1e04..55f07e4f 100644 --- a/chrome/browser/safe_browsing/tailored_security/consented_message_android.h +++ b/chrome/browser/safe_browsing/tailored_security/consented_message_android.h
@@ -24,7 +24,9 @@ // Show the message for the given `web_contents`, when the Tailored security // setting has been `enabled`. - void DisplayMessage(content::WebContents* web_contents, bool enabled); + void DisplayMessage(content::WebContents* web_contents, + bool enabled, + base::OnceClosure dismiss_callback); private: void DismissMessageInternal(messages::DismissReason dismiss_reason); @@ -34,6 +36,7 @@ std::unique_ptr<messages::MessageWrapper> message_; raw_ptr<content::WebContents> web_contents_ = nullptr; + base::OnceClosure dismiss_callback_; // Whether the message is shown for Tailored Security being enabled or // disabled.
diff --git a/chrome/browser/safe_browsing/tailored_security/notification_handler_desktop.cc b/chrome/browser/safe_browsing/tailored_security/notification_handler_desktop.cc index 65ae2992..b2dc3746 100644 --- a/chrome/browser/safe_browsing/tailored_security/notification_handler_desktop.cc +++ b/chrome/browser/safe_browsing/tailored_security/notification_handler_desktop.cc
@@ -21,6 +21,7 @@ #include "components/prefs/pref_service.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "components/strings/grit/components_strings.h" +#include "components/vector_icons/vector_icons.h" #include "content/public/common/referrer.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/page_transition_types.h" @@ -172,11 +173,13 @@ description = l10n_util::GetStringUTF16( IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_DESCRIPTION); primary_button = l10n_util::GetStringUTF16( - IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_ON); + IDS_TAILORED_SECURITY_CONSENTED_DISABLE_NOTIFICATION_TURN_OFF); secondary_button = l10n_util::GetStringUTF16(IDS_OK); - SkColor icon_color = color_provider->GetColor(ui::kColorAlertHighSeverity); + SkColor icon_color = + color_provider->GetColor(ui::kColorSecondaryForeground); icon = gfx::Image(gfx::CreateVectorIcon( - kShieldBadIcon, message_center::kNotificationIconSize, icon_color)); + vector_icons::kGppMaybeIcon, message_center::kNotificationIconSize, + icon_color)); } LogConsentedOutcome(TailoredSecurityOutcome::kShown, enable); message_center::Notification notification(
diff --git a/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.cc b/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.cc index e3765a3..13900ad 100644 --- a/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.cc +++ b/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.cc
@@ -6,12 +6,11 @@ #include "chrome/browser/profiles/incognito_helpers.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/prefs/pref_service.h" -#include "components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h" #include "content/public/browser/browser_context.h" -#include "content/public/browser/storage_partition.h" namespace safe_browsing { @@ -37,10 +36,7 @@ KeyedService* TailoredSecurityServiceFactory::BuildServiceInstanceFor( content::BrowserContext* context) const { Profile* profile = static_cast<Profile*>(context); - return new TailoredSecurityService( - IdentityManagerFactory::GetForProfile(profile), - profile->GetDefaultStoragePartition() - ->GetURLLoaderFactoryForBrowserProcess()); + return new ChromeTailoredSecurityService(profile); } bool TailoredSecurityServiceFactory::ServiceIsCreatedWithBrowserContext()
diff --git a/chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer_unittest.cc b/chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer_unittest.cc index 0ce9249..f96ca6e4 100644 --- a/chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer_unittest.cc +++ b/chrome/browser/safe_browsing/tailored_security/tailored_security_url_observer_unittest.cc
@@ -19,6 +19,9 @@ MockTailoredSecurityService() : TailoredSecurityService(nullptr, nullptr) {} MOCK_METHOD0(AddQueryRequest, void()); MOCK_METHOD0(RemoveQueryRequest, void()); + MOCK_METHOD2(MaybeNotifySyncUser, void(bool, base::Time)); + MOCK_METHOD0(GetURLLoaderFactory, + scoped_refptr<network::SharedURLLoaderFactory>()); }; } // namespace
diff --git a/chrome/browser/translate/translate_manager_browsertest.cc b/chrome/browser/translate/translate_manager_browsertest.cc index f3e47c1b..b4ac8d2 100644 --- a/chrome/browser/translate/translate_manager_browsertest.cc +++ b/chrome/browser/translate/translate_manager_browsertest.cc
@@ -502,7 +502,9 @@ } // Test that hrefTranslate is propagating properly. -IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, HrefTranslateSuccess) { +// The test is flaky. See https://crbug.com/1280123 +IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, + DISABLE_HrefTranslateSuccess) { base::HistogramTester histograms; GetChromeTranslateClient() ->GetTranslateManager()
diff --git a/chrome/browser/ui/android/omnibox/BUILD.gn b/chrome/browser/ui/android/omnibox/BUILD.gn index 743edd5..092d928b 100644 --- a/chrome/browser/ui/android/omnibox/BUILD.gn +++ b/chrome/browser/ui/android/omnibox/BUILD.gn
@@ -54,7 +54,6 @@ "java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java", "java/src/org/chromium/chrome/browser/omnibox/status/StatusViewBinder.java", "java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxResourceProvider.java", - "java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxTheme.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteDelegate.java",
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java index 3c4f67f4b..609ecb5 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java
@@ -45,7 +45,6 @@ import org.chromium.chrome.browser.omnibox.geo.GeolocationHeader; import org.chromium.chrome.browser.omnibox.status.StatusCoordinator; import org.chromium.chrome.browser.omnibox.styles.OmniboxResourceProvider; -import org.chromium.chrome.browser.omnibox.styles.OmniboxTheme; import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator; import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService; import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; @@ -57,6 +56,7 @@ import org.chromium.chrome.browser.signin.services.IdentityServicesProvider; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.ui.native_page.NativePage; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; import org.chromium.chrome.browser.util.KeyNavigationUtil; import org.chromium.components.browser_ui.styles.ChromeColors; @@ -927,24 +927,25 @@ * Update visuals to use a correct color scheme depending on the primary color. */ @VisibleForTesting - /* package */ void updateOmniboxTheme() { + /* package */ void updateBrandedColorScheme() { // TODO(crbug.com/1114183): Unify light and dark color logic in chrome and make it clear // whether the foreground or background color is dark. final boolean useDarkForegroundColors = !ColorUtils.shouldUseLightForegroundOnBackground(getPrimaryBackgroundColor()); - final @OmniboxTheme int omniboxTheme = OmniboxResourceProvider.getOmniboxTheme( - mContext, mLocationBarDataProvider.isIncognito(), getPrimaryBackgroundColor()); + final @BrandedColorScheme int brandedColorScheme = + OmniboxResourceProvider.getBrandedColorScheme(mContext, + mLocationBarDataProvider.isIncognito(), getPrimaryBackgroundColor()); mLocationBarLayout.setDeleteButtonTint( ChromeColors.getPrimaryIconTint(mContext, !useDarkForegroundColors)); // If the URL changed colors and is not focused, update the URL to account for the new // color scheme. - if (mUrlCoordinator.setOmniboxTheme(omniboxTheme) && !isUrlBarFocused()) { + if (mUrlCoordinator.setBrandedColorScheme(brandedColorScheme) && !isUrlBarFocused()) { updateUrl(); } mStatusCoordinator.setUseDarkForegroundColors(useDarkForegroundColors); if (mAutocompleteCoordinator != null) { - mAutocompleteCoordinator.updateVisualsForState(omniboxTheme); + mAutocompleteCoordinator.updateVisualsForState(brandedColorScheme); } } @@ -1172,7 +1173,7 @@ public void onPrimaryColorChanged() { updateAssistantVoiceSearchDrawableAndColors(); updateLensButtonColors(); - updateOmniboxTheme(); + updateBrandedColorScheme(); } @Override
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java index af0ce86f..4635ff0 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java
@@ -69,7 +69,6 @@ import org.chromium.chrome.browser.omnibox.UrlBarCoordinator.SelectionState; import org.chromium.chrome.browser.omnibox.geo.GeolocationHeader; import org.chromium.chrome.browser.omnibox.status.StatusCoordinator; -import org.chromium.chrome.browser.omnibox.styles.OmniboxTheme; import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator; import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService; import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; @@ -81,6 +80,7 @@ import org.chromium.chrome.browser.profiles.ProfileJni; import org.chromium.chrome.browser.signin.services.IdentityServicesProvider; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.signin.AccountManagerTestRule; @@ -663,11 +663,12 @@ .getPrimaryColor(); doReturn(false).when(mLocationBarDataProvider).isIncognito(); - mMediator.updateOmniboxTheme(); + mMediator.updateBrandedColorScheme(); verify(mLocationBarLayout).setDeleteButtonTint(any(ColorStateList.class)); verify(mStatusCoordinator).setUseDarkForegroundColors(true); - verify(mAutocompleteCoordinator).updateVisualsForState(OmniboxTheme.LIGHT_THEME); + verify(mAutocompleteCoordinator) + .updateVisualsForState(BrandedColorScheme.LIGHT_BRANDED_THEME); } @Test @@ -675,11 +676,12 @@ doReturn(Color.BLACK).when(mLocationBarDataProvider).getPrimaryColor(); doReturn(false).when(mLocationBarDataProvider).isIncognito(); - mMediator.updateOmniboxTheme(); + mMediator.updateBrandedColorScheme(); verify(mLocationBarLayout).setDeleteButtonTint(any(ColorStateList.class)); verify(mStatusCoordinator).setUseDarkForegroundColors(false); - verify(mAutocompleteCoordinator).updateVisualsForState(OmniboxTheme.DARK_THEME); + verify(mAutocompleteCoordinator) + .updateVisualsForState(BrandedColorScheme.DARK_BRANDED_THEME); } @Test @@ -688,11 +690,11 @@ doReturn(primaryColor).when(mLocationBarDataProvider).getPrimaryColor(); doReturn(true).when(mLocationBarDataProvider).isIncognito(); - mMediator.updateOmniboxTheme(); + mMediator.updateBrandedColorScheme(); verify(mLocationBarLayout).setDeleteButtonTint(any(ColorStateList.class)); verify(mStatusCoordinator).setUseDarkForegroundColors(false); - verify(mAutocompleteCoordinator).updateVisualsForState(OmniboxTheme.INCOGNITO); + verify(mAutocompleteCoordinator).updateVisualsForState(BrandedColorScheme.INCOGNITO); } @Test @@ -701,28 +703,29 @@ doReturn(primaryColor).when(mLocationBarDataProvider).getPrimaryColor(); doReturn(false).when(mLocationBarDataProvider).isIncognito(); - mMediator.updateOmniboxTheme(); + mMediator.updateBrandedColorScheme(); verify(mLocationBarLayout).setDeleteButtonTint(any(ColorStateList.class)); verify(mStatusCoordinator).setUseDarkForegroundColors(true); - verify(mAutocompleteCoordinator).updateVisualsForState(OmniboxTheme.DEFAULT); + verify(mAutocompleteCoordinator).updateVisualsForState(BrandedColorScheme.APP_DEFAULT); } @Test - public void testUpdateColors_setOmniboxTheme() { + public void testUpdateColors_setColorScheme() { String url = "https://www.google.com"; UrlBarData urlBarData = UrlBarData.forUrl(url); doReturn(urlBarData).when(mLocationBarDataProvider).getUrlBarData(); doReturn(url).when(mLocationBarDataProvider).getCurrentUrl(); - doReturn(true).when(mUrlCoordinator).setOmniboxTheme(anyInt()); + doReturn(true).when(mUrlCoordinator).setBrandedColorScheme(anyInt()); - mMediator.updateOmniboxTheme(); + mMediator.updateBrandedColorScheme(); verify(mLocationBarLayout).setDeleteButtonTint(anyObject()); verify(mUrlCoordinator) .setUrlBarData( urlBarData, UrlBar.ScrollType.SCROLL_TO_TLD, SelectionState.SELECT_ALL); verify(mStatusCoordinator).setUseDarkForegroundColors(false); - verify(mAutocompleteCoordinator).updateVisualsForState(OmniboxTheme.DARK_THEME); + verify(mAutocompleteCoordinator) + .updateVisualsForState(BrandedColorScheme.DARK_BRANDED_THEME); } @Test
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarCoordinator.java index 5dc80036..7b8e242c 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarCoordinator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarCoordinator.java
@@ -18,7 +18,7 @@ import org.chromium.chrome.browser.omnibox.UrlBar.ScrollType; import org.chromium.chrome.browser.omnibox.UrlBar.UrlBarDelegate; import org.chromium.chrome.browser.omnibox.UrlBar.UrlTextChangeListener; -import org.chromium.chrome.browser.omnibox.styles.OmniboxTheme; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.ui.KeyboardVisibilityDelegate; import org.chromium.ui.base.WindowDelegate; import org.chromium.ui.modelutil.PropertyModel; @@ -122,9 +122,9 @@ mMediator.setAutocompleteText(userText, autocompleteText); } - /** @see UrlBarMediator#setOmniboxTheme(int) */ - public boolean setOmniboxTheme(@OmniboxTheme int omniboxTheme) { - return mMediator.setOmniboxTheme(omniboxTheme); + /** @see UrlBarMediator#setBrandedColorScheme(int) */ + public boolean setBrandedColorScheme(@BrandedColorScheme int brandedColorScheme) { + return mMediator.setBrandedColorScheme(brandedColorScheme); } /** @see UrlBarMediator#setIncognitoColorsEnabled(boolean) */
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarMediator.java index 7a322544..31bb1db 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarMediator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarMediator.java
@@ -24,7 +24,7 @@ import org.chromium.chrome.browser.omnibox.UrlBarCoordinator.SelectionState; import org.chromium.chrome.browser.omnibox.UrlBarProperties.AutocompleteText; import org.chromium.chrome.browser.omnibox.UrlBarProperties.UrlBarTextState; -import org.chromium.chrome.browser.omnibox.styles.OmniboxTheme; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.omnibox.OmniboxUrlEmphasizer.UrlEmphasisSpan; import org.chromium.ui.modelutil.PropertyModel; @@ -73,7 +73,7 @@ mModel.set(UrlBarProperties.TEXT_CONTEXT_MENU_DELEGATE, this); mModel.set(UrlBarProperties.URL_TEXT_CHANGE_LISTENER, this); mModel.set(UrlBarProperties.TEXT_CHANGED_LISTENER, this); - setOmniboxTheme(OmniboxTheme.DEFAULT); + setBrandedColorScheme(BrandedColorScheme.APP_DEFAULT); } public void destroy() { @@ -224,17 +224,17 @@ } /** - * Sets the omnibox theme. + * Sets the color scheme. * - * @param omniboxTheme The {@link @OmniboxTheme}. + * @param brandedColorScheme The {@link @BrandedColorScheme}. * @return Whether this resulted in a change from the previous value. */ - public boolean setOmniboxTheme(@OmniboxTheme int omniboxTheme) { + public boolean setBrandedColorScheme(@BrandedColorScheme int brandedColorScheme) { // TODO(bauerb): Make clients observe the property instead of checking the return value. - @OmniboxTheme - int previousValue = mModel.get(UrlBarProperties.OMNIBOX_THEME); - mModel.set(UrlBarProperties.OMNIBOX_THEME, omniboxTheme); - return previousValue != omniboxTheme; + @BrandedColorScheme + int previousValue = mModel.get(UrlBarProperties.BRANDED_COLOR_SCHEME); + mModel.set(UrlBarProperties.BRANDED_COLOR_SCHEME, brandedColorScheme); + return previousValue != brandedColorScheme; } /**
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarProperties.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarProperties.java index d057f39..297a714 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarProperties.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarProperties.java
@@ -125,10 +125,10 @@ new WritableObjectPropertyKey<>(); /** - * Specifies the omnibox theme. It can be light or dark because of a publisher defined color, + * Specifies the color scheme. It can be light or dark because of a publisher defined color, * incognito, or the default theme that follows dynamic colors. */ - public static final WritableIntPropertyKey OMNIBOX_THEME = new WritableIntPropertyKey(); + public static final WritableIntPropertyKey BRANDED_COLOR_SCHEME = new WritableIntPropertyKey(); /** * Specifies whether incognito colors should be used in the view, meaning baseline dark theme @@ -145,5 +145,5 @@ new PropertyKey[] {ACTION_MODE_CALLBACK, ALLOW_FOCUS, AUTOCOMPLETE_TEXT, DELEGATE, FOCUS_CHANGE_CALLBACK, SHOW_CURSOR, TEXT_CONTEXT_MENU_DELEGATE, TEXT_STATE, URL_DIRECTION_LISTENER, URL_TEXT_CHANGE_LISTENER, TEXT_CHANGED_LISTENER, - OMNIBOX_THEME, INCOGNITO_COLORS_ENABLED, WINDOW_DELEGATE}; + BRANDED_COLOR_SCHEME, INCOGNITO_COLORS_ENABLED, WINDOW_DELEGATE}; }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarViewBinder.java index 1c853bb..f481a0f 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarViewBinder.java
@@ -19,7 +19,7 @@ import org.chromium.chrome.browser.omnibox.UrlBarProperties.AutocompleteText; import org.chromium.chrome.browser.omnibox.UrlBarProperties.UrlBarTextState; import org.chromium.chrome.browser.omnibox.styles.OmniboxResourceProvider; -import org.chromium.chrome.browser.omnibox.styles.OmniboxTheme; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel; @@ -72,8 +72,8 @@ view.setSelection(view.getText().length()); } } - } else if (UrlBarProperties.OMNIBOX_THEME.equals(propertyKey)) { - updateTextColors(view, model.get(UrlBarProperties.OMNIBOX_THEME)); + } else if (UrlBarProperties.BRANDED_COLOR_SCHEME.equals(propertyKey)) { + updateTextColors(view, model.get(UrlBarProperties.BRANDED_COLOR_SCHEME)); } else if (UrlBarProperties.INCOGNITO_COLORS_ENABLED.equals(propertyKey)) { final boolean incognitoColorsEnabled = model.get(UrlBarProperties.INCOGNITO_COLORS_ENABLED); @@ -92,12 +92,12 @@ } } - private static void updateTextColors(UrlBar view, @OmniboxTheme int omniboxTheme) { - final @ColorInt int textColor = - OmniboxResourceProvider.getUrlBarPrimaryTextColor(view.getContext(), omniboxTheme); + private static void updateTextColors(UrlBar view, @BrandedColorScheme int brandedColorScheme) { + final @ColorInt int textColor = OmniboxResourceProvider.getUrlBarPrimaryTextColor( + view.getContext(), brandedColorScheme); - final @ColorInt int hintColor = - OmniboxResourceProvider.getUrlBarHintTextColor(view.getContext(), omniboxTheme); + final @ColorInt int hintColor = OmniboxResourceProvider.getUrlBarHintTextColor( + view.getContext(), brandedColorScheme); view.setTextColor(textColor); setHintTextColor(view, hintColor);
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxResourceProvider.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxResourceProvider.java index 2c25e66..5da39d5 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxResourceProvider.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxResourceProvider.java
@@ -20,6 +20,7 @@ import org.chromium.chrome.browser.night_mode.NightModeUtils; import org.chromium.chrome.browser.omnibox.R; import org.chromium.chrome.browser.theme.ThemeUtils; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.ui.util.ColorUtils; /** Provides resources specific to Omnibox. */ @@ -27,64 +28,65 @@ private static final String TAG = "OmniboxResourceProvider"; /** @return Whether the mode is dark (dark theme or incognito). */ - public static boolean isDarkMode(@OmniboxTheme int omniboxTheme) { - return omniboxTheme == OmniboxTheme.DARK_THEME || omniboxTheme == OmniboxTheme.INCOGNITO; + public static boolean isDarkMode(@BrandedColorScheme int brandedColorScheme) { + return brandedColorScheme == BrandedColorScheme.DARK_BRANDED_THEME + || brandedColorScheme == BrandedColorScheme.INCOGNITO; } /** - * Returns a drawable for a given attribute depending on a {@link OmniboxTheme} + * Returns a drawable for a given attribute depending on a {@link BrandedColorScheme} * * @param context The {@link Context} used to retrieve resources. - * @param omniboxTheme {@link OmniboxTheme} to use. + * @param brandedColorScheme {@link BrandedColorScheme} to use. * @param attributeResId A resource ID of an attribute to resolve. * @return A background drawable resource ID providing ripple effect. */ public static Drawable resolveAttributeToDrawable( - Context context, @OmniboxTheme int omniboxTheme, int attributeResId) { - Context wrappedContext = maybeWrapContext(context, omniboxTheme); + Context context, @BrandedColorScheme int brandedColorScheme, int attributeResId) { + Context wrappedContext = maybeWrapContext(context, brandedColorScheme); @DrawableRes int resourceId = resolveAttributeToDrawableRes(wrappedContext, attributeResId); return ContextCompat.getDrawable(wrappedContext, resourceId); } /** - * Returns the OmniboxTheme based on the incognito state and the background color. + * Returns the ColorScheme based on the incognito state and the background color. * * @param context The {@link Context}. * @param isIncognito Whether incognito mode is enabled. * @param primaryBackgroundColor The primary background color of the omnibox. - * @return The {@link OmniboxTheme}. + * @return The {@link BrandedColorScheme}. */ - public static @OmniboxTheme int getOmniboxTheme( + public static @BrandedColorScheme int getBrandedColorScheme( Context context, boolean isIncognito, @ColorInt int primaryBackgroundColor) { - if (isIncognito) return OmniboxTheme.INCOGNITO; + if (isIncognito) return BrandedColorScheme.INCOGNITO; if (ThemeUtils.isUsingDefaultToolbarColor(context, isIncognito, primaryBackgroundColor)) { - return OmniboxTheme.DEFAULT; + return BrandedColorScheme.APP_DEFAULT; } return ColorUtils.shouldUseLightForegroundOnBackground(primaryBackgroundColor) - ? OmniboxTheme.DARK_THEME - : OmniboxTheme.LIGHT_THEME; + ? BrandedColorScheme.DARK_BRANDED_THEME + : BrandedColorScheme.LIGHT_BRANDED_THEME; } /** * Returns the primary text color for the url bar. * * @param context The context to retrieve the resources from. - * @param omniboxTheme The {@link OmniboxTheme}. + * @param brandedColorScheme The {@link BrandedColorScheme}. * @return Primary url bar text color. */ public static @ColorInt int getUrlBarPrimaryTextColor( - Context context, @OmniboxTheme int omniboxTheme) { + Context context, @BrandedColorScheme int brandedColorScheme) { final Resources resources = context.getResources(); @ColorInt int color; - if (omniboxTheme == OmniboxTheme.LIGHT_THEME) { + if (brandedColorScheme == BrandedColorScheme.LIGHT_BRANDED_THEME) { color = resources.getColor(R.color.branded_url_text_on_light_bg); - } else if (omniboxTheme == OmniboxTheme.DARK_THEME) { + } else if (brandedColorScheme == BrandedColorScheme.DARK_BRANDED_THEME) { color = resources.getColor(R.color.branded_url_text_on_dark_bg); - } else if (omniboxTheme == OmniboxTheme.INCOGNITO) { + } else if (brandedColorScheme == BrandedColorScheme.INCOGNITO) { color = resources.getColor(R.color.url_bar_primary_text_incognito); } else { color = MaterialColors.getColor(context, R.attr.colorOnSurface, TAG); @@ -96,19 +98,19 @@ * Returns the secondary text color for the url bar. * * @param context The context to retrieve the resources from. - * @param omniboxTheme The {@link OmniboxTheme}. + * @param brandedColorScheme The {@link BrandedColorScheme}. * @return Secondary url bar text color. */ public static @ColorInt int getUrlBarSecondaryTextColor( - Context context, @OmniboxTheme int omniboxTheme) { + Context context, @BrandedColorScheme int brandedColorScheme) { final Resources resources = context.getResources(); @ColorInt int color; - if (omniboxTheme == OmniboxTheme.LIGHT_THEME) { + if (brandedColorScheme == BrandedColorScheme.LIGHT_BRANDED_THEME) { color = resources.getColor(R.color.branded_url_text_variant_on_light_bg); - } else if (omniboxTheme == OmniboxTheme.DARK_THEME) { + } else if (brandedColorScheme == BrandedColorScheme.DARK_BRANDED_THEME) { color = resources.getColor(R.color.branded_url_text_variant_on_dark_bg); - } else if (omniboxTheme == OmniboxTheme.INCOGNITO) { + } else if (brandedColorScheme == BrandedColorScheme.INCOGNITO) { color = resources.getColor(R.color.url_bar_secondary_text_incognito); } else { color = MaterialColors.getColor(context, R.attr.colorOnSurfaceVariant, TAG); @@ -120,29 +122,30 @@ * Returns the hint text color for the url bar. * * @param context The context to retrieve the resources from. - * @param omniboxTheme The {@link OmniboxTheme}. + * @param brandedColorScheme The {@link BrandedColorScheme}. * @return The url bar hint text color. */ public static @ColorInt int getUrlBarHintTextColor( - Context context, @OmniboxTheme int omniboxTheme) { - return getUrlBarSecondaryTextColor(context, omniboxTheme); + Context context, @BrandedColorScheme int brandedColorScheme) { + return getUrlBarSecondaryTextColor(context, brandedColorScheme); } /** * Returns the danger semantic color. * * @param context The context to retrieve the resources from. - * @param omniboxTheme The {@link OmniboxTheme}. + * @param brandedColorScheme The {@link BrandedColorScheme}. * @return The danger semantic color to be used on the url bar. */ public static @ColorInt int getUrlBarDangerColor( - Context context, @OmniboxTheme int omniboxTheme) { + Context context, @BrandedColorScheme int brandedColorScheme) { // Danger color has semantic meaning and it doesn't change with dynamic colors. @ColorRes int colorId = R.color.default_red; - if (omniboxTheme == OmniboxTheme.DARK_THEME || omniboxTheme == OmniboxTheme.INCOGNITO) { + if (brandedColorScheme == BrandedColorScheme.DARK_BRANDED_THEME + || brandedColorScheme == BrandedColorScheme.INCOGNITO) { colorId = R.color.default_red_light; - } else if (omniboxTheme == OmniboxTheme.LIGHT_THEME) { + } else if (brandedColorScheme == BrandedColorScheme.LIGHT_BRANDED_THEME) { colorId = R.color.default_red_dark; } return context.getResources().getColor(colorId); @@ -152,17 +155,18 @@ * Returns the secure semantic color. * * @param context The context to retrieve the resources from. - * @param omniboxTheme The {@link OmniboxTheme}. + * @param brandedColorScheme The {@link BrandedColorScheme}. * @return The secure semantic color to be used on the url bar. */ public static @ColorInt int getUrlBarSecureColor( - Context context, @OmniboxTheme int omniboxTheme) { + Context context, @BrandedColorScheme int brandedColorScheme) { // Secure color has semantic meaning and it doesn't change with dynamic colors. @ColorRes int colorId = R.color.default_green; - if (omniboxTheme == OmniboxTheme.DARK_THEME || omniboxTheme == OmniboxTheme.INCOGNITO) { + if (brandedColorScheme == BrandedColorScheme.DARK_BRANDED_THEME + || brandedColorScheme == BrandedColorScheme.INCOGNITO) { colorId = R.color.default_green_light; - } else if (omniboxTheme == OmniboxTheme.LIGHT_THEME) { + } else if (brandedColorScheme == BrandedColorScheme.LIGHT_BRANDED_THEME) { colorId = R.color.default_green_dark; } return context.getResources().getColor(colorId); @@ -172,14 +176,14 @@ * Returns the primary text color for the suggestions. * * @param context The context to retrieve the resources from. - * @param omniboxTheme The {@link OmniboxTheme}. + * @param brandedColorScheme The {@link BrandedColorScheme}. * @return Primary suggestion text color. */ public static @ColorInt int getSuggestionPrimaryTextColor( - Context context, @OmniboxTheme int omniboxTheme) { + Context context, @BrandedColorScheme int brandedColorScheme) { // Suggestions are only shown when the omnibox is focused, hence LIGHT_THEME and DARK_THEME // are ignored as they don't change the result. - return omniboxTheme == OmniboxTheme.INCOGNITO + return brandedColorScheme == BrandedColorScheme.INCOGNITO ? ApiCompatibilityUtils.getColor( context.getResources(), R.color.default_text_color_light) : MaterialColors.getColor(context, R.attr.colorOnSurface, TAG); @@ -189,14 +193,14 @@ * Returns the secondary text color for the suggestions. * * @param context The context to retrieve the resources from. - * @param omniboxTheme The {@link OmniboxTheme}. + * @param brandedColorScheme The {@link BrandedColorScheme}. * @return Secondary suggestion text color. */ public static @ColorInt int getSuggestionSecondaryTextColor( - Context context, @OmniboxTheme int omniboxTheme) { + Context context, @BrandedColorScheme int brandedColorScheme) { // Suggestions are only shown when the omnibox is focused, hence LIGHT_THEME and DARK_THEME // are ignored as they don't change the result. - return omniboxTheme == OmniboxTheme.INCOGNITO + return brandedColorScheme == BrandedColorScheme.INCOGNITO ? ApiCompatibilityUtils.getColor( context.getResources(), R.color.default_text_color_secondary_light) : MaterialColors.getColor(context, R.attr.colorOnSurfaceVariant, TAG); @@ -206,14 +210,14 @@ * Returns the URL text color for the suggestions. * * @param context The context to retrieve the resources from. - * @param omniboxTheme The {@link OmniboxTheme}. + * @param brandedColorScheme The {@link BrandedColorScheme}. * @return URL suggestion text color. */ public static @ColorInt int getSuggestionUrlTextColor( - Context context, @OmniboxTheme int omniboxTheme) { + Context context, @BrandedColorScheme int brandedColorScheme) { // Suggestions are only shown when the omnibox is focused, hence LIGHT_THEME and DARK_THEME // are ignored as they don't change the result. - final @ColorRes int colorId = omniboxTheme == OmniboxTheme.INCOGNITO + final @ColorRes int colorId = brandedColorScheme == BrandedColorScheme.INCOGNITO ? R.color.suggestion_url_color_incognito : R.color.suggestion_url_color; return ApiCompatibilityUtils.getColor(context.getResources(), colorId); @@ -223,12 +227,13 @@ * Wraps the context if necessary to force dark resources for incognito. * * @param context The {@link Context} to be wrapped. - * @param omniboxTheme Current omnibox theme. - * @return Context with resources appropriate to the {@link OmniboxTheme}. + * @param brandedColorScheme Current color scheme. + * @return Context with resources appropriate to the {@link BrandedColorScheme}. */ - private static Context maybeWrapContext(Context context, @OmniboxTheme int omniboxTheme) { + private static Context maybeWrapContext( + Context context, @BrandedColorScheme int brandedColorScheme) { // Only wraps the context in case of incognito. - if (omniboxTheme == OmniboxTheme.INCOGNITO) { + if (brandedColorScheme == BrandedColorScheme.INCOGNITO) { return NightModeUtils.wrapContextWithNightModeConfig( context, R.style.Theme_Chromium_TabbedMode, /*nightMode=*/true); }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxResourceProviderTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxResourceProviderTest.java index e2dcdfad..77eba05c 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxResourceProviderTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxResourceProviderTest.java
@@ -23,6 +23,7 @@ import org.robolectric.annotation.Config; import org.chromium.chrome.R; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.testing.local.LocalRobolectricTestRunner; @@ -48,38 +49,40 @@ @Test public void isDarkMode() { - Assert.assertTrue(OmniboxResourceProvider.isDarkMode(OmniboxTheme.DARK_THEME)); - Assert.assertTrue(OmniboxResourceProvider.isDarkMode(OmniboxTheme.INCOGNITO)); - Assert.assertFalse(OmniboxResourceProvider.isDarkMode(OmniboxTheme.LIGHT_THEME)); + Assert.assertTrue( + OmniboxResourceProvider.isDarkMode(BrandedColorScheme.DARK_BRANDED_THEME)); + Assert.assertTrue(OmniboxResourceProvider.isDarkMode(BrandedColorScheme.INCOGNITO)); + Assert.assertFalse( + OmniboxResourceProvider.isDarkMode(BrandedColorScheme.LIGHT_BRANDED_THEME)); } @Test public void resolveAttributeToDrawable() { Drawable drawableLight = OmniboxResourceProvider.resolveAttributeToDrawable( - mActivity, OmniboxTheme.LIGHT_THEME, R.attr.selectableItemBackground); + mActivity, BrandedColorScheme.LIGHT_BRANDED_THEME, R.attr.selectableItemBackground); Assert.assertNotNull(drawableLight); Drawable drawableDark = OmniboxResourceProvider.resolveAttributeToDrawable( - mActivity, OmniboxTheme.DARK_THEME, R.attr.selectableItemBackground); + mActivity, BrandedColorScheme.DARK_BRANDED_THEME, R.attr.selectableItemBackground); Assert.assertNotNull(drawableDark); } @Test - public void getOmniboxTheme_incognito() { - assertEquals("Omnibox theme should be INCOGNITO.", OmniboxTheme.INCOGNITO, - OmniboxResourceProvider.getOmniboxTheme(mActivity, true, mDefaultColor)); - assertEquals("Omnibox theme should be INCOGNITO.", OmniboxTheme.INCOGNITO, - OmniboxResourceProvider.getOmniboxTheme(mActivity, true, Color.RED)); + public void getColorScheme_incognito() { + assertEquals("Color scheme should be INCOGNITO.", BrandedColorScheme.INCOGNITO, + OmniboxResourceProvider.getBrandedColorScheme(mActivity, true, mDefaultColor)); + assertEquals("Color scheme should be INCOGNITO.", BrandedColorScheme.INCOGNITO, + OmniboxResourceProvider.getBrandedColorScheme(mActivity, true, Color.RED)); } @Test - public void getOmniboxTheme_nonIncognito() { - assertEquals("Omnibox theme should be DEFAULT.", OmniboxTheme.DEFAULT, - OmniboxResourceProvider.getOmniboxTheme(mActivity, false, mDefaultColor)); - assertEquals("Omnibox theme should be DARK_THEME.", OmniboxTheme.DARK_THEME, - OmniboxResourceProvider.getOmniboxTheme(mActivity, false, Color.BLACK)); - assertEquals("Omnibox theme should be LIGHT_THEME.", OmniboxTheme.LIGHT_THEME, - OmniboxResourceProvider.getOmniboxTheme( + public void getColorScheme_nonIncognito() { + assertEquals("Color scheme should be DEFAULT.", BrandedColorScheme.APP_DEFAULT, + OmniboxResourceProvider.getBrandedColorScheme(mActivity, false, mDefaultColor)); + assertEquals("Color scheme should be DARK_THEME.", BrandedColorScheme.DARK_BRANDED_THEME, + OmniboxResourceProvider.getBrandedColorScheme(mActivity, false, Color.BLACK)); + assertEquals("Color scheme should be LIGHT_THEME.", BrandedColorScheme.LIGHT_BRANDED_THEME, + OmniboxResourceProvider.getBrandedColorScheme( mActivity, false, Color.parseColor("#eaecf0" /*Light grey color*/))); } @@ -93,15 +96,16 @@ assertEquals("Wrong url bar primary text color for LIGHT_THEME.", darkTextColor, OmniboxResourceProvider.getUrlBarPrimaryTextColor( - mActivity, OmniboxTheme.LIGHT_THEME)); + mActivity, BrandedColorScheme.LIGHT_BRANDED_THEME)); assertEquals("Wrong url bar primary text color for DARK_THEME.", lightTextColor, OmniboxResourceProvider.getUrlBarPrimaryTextColor( - mActivity, OmniboxTheme.DARK_THEME)); + mActivity, BrandedColorScheme.DARK_BRANDED_THEME)); assertEquals("Wrong url bar primary text color for INCOGNITO.", incognitoColor, OmniboxResourceProvider.getUrlBarPrimaryTextColor( - mActivity, OmniboxTheme.INCOGNITO)); + mActivity, BrandedColorScheme.INCOGNITO)); assertEquals("Wrong url bar primary text color for DEFAULT.", defaultColor, - OmniboxResourceProvider.getUrlBarPrimaryTextColor(mActivity, OmniboxTheme.DEFAULT)); + OmniboxResourceProvider.getUrlBarPrimaryTextColor( + mActivity, BrandedColorScheme.APP_DEFAULT)); } @Test @@ -115,16 +119,16 @@ assertEquals("Wrong url bar secondary text color for LIGHT_THEME.", darkTextColor, OmniboxResourceProvider.getUrlBarSecondaryTextColor( - mActivity, OmniboxTheme.LIGHT_THEME)); + mActivity, BrandedColorScheme.LIGHT_BRANDED_THEME)); assertEquals("Wrong url bar secondary text color for DARK_THEME.", lightTextColor, OmniboxResourceProvider.getUrlBarSecondaryTextColor( - mActivity, OmniboxTheme.DARK_THEME)); + mActivity, BrandedColorScheme.DARK_BRANDED_THEME)); assertEquals("Wrong url bar secondary text color for INCOGNITO.", incognitoColor, OmniboxResourceProvider.getUrlBarSecondaryTextColor( - mActivity, OmniboxTheme.INCOGNITO)); + mActivity, BrandedColorScheme.INCOGNITO)); assertEquals("Wrong url bar secondary text color for DEFAULT.", defaultColor, OmniboxResourceProvider.getUrlBarSecondaryTextColor( - mActivity, OmniboxTheme.DEFAULT)); + mActivity, BrandedColorScheme.APP_DEFAULT)); } @Test @@ -134,14 +138,18 @@ final int redOnLight = resources.getColor(R.color.default_red_dark); assertEquals("Danger color for DARK_THEME should be the lighter red.", redOnDark, - OmniboxResourceProvider.getUrlBarDangerColor(mActivity, OmniboxTheme.DARK_THEME)); + OmniboxResourceProvider.getUrlBarDangerColor( + mActivity, BrandedColorScheme.DARK_BRANDED_THEME)); assertEquals("Danger color for LIGHT_THEME should be the darker red.", redOnLight, - OmniboxResourceProvider.getUrlBarDangerColor(mActivity, OmniboxTheme.LIGHT_THEME)); + OmniboxResourceProvider.getUrlBarDangerColor( + mActivity, BrandedColorScheme.LIGHT_BRANDED_THEME)); assertEquals("Danger color for DEFAULT should be the darker red when we're in light theme.", redOnLight, - OmniboxResourceProvider.getUrlBarDangerColor(mActivity, OmniboxTheme.DEFAULT)); + OmniboxResourceProvider.getUrlBarDangerColor( + mActivity, BrandedColorScheme.APP_DEFAULT)); assertEquals("Danger color for INCOGNITO should be the lighter red.", redOnDark, - OmniboxResourceProvider.getUrlBarDangerColor(mActivity, OmniboxTheme.INCOGNITO)); + OmniboxResourceProvider.getUrlBarDangerColor( + mActivity, BrandedColorScheme.INCOGNITO)); } @Test @@ -151,15 +159,19 @@ final int greenOnLight = resources.getColor(R.color.default_green_dark); assertEquals("Secure color for DARK_THEME should be the lighter green.", greenOnDark, - OmniboxResourceProvider.getUrlBarSecureColor(mActivity, OmniboxTheme.DARK_THEME)); + OmniboxResourceProvider.getUrlBarSecureColor( + mActivity, BrandedColorScheme.DARK_BRANDED_THEME)); assertEquals("Secure color for LIGHT_THEME should be the darker green.", greenOnLight, - OmniboxResourceProvider.getUrlBarSecureColor(mActivity, OmniboxTheme.LIGHT_THEME)); + OmniboxResourceProvider.getUrlBarSecureColor( + mActivity, BrandedColorScheme.LIGHT_BRANDED_THEME)); assertEquals( "Secure color for DEFAULT should be the darker green when we're in light theme.", greenOnLight, - OmniboxResourceProvider.getUrlBarSecureColor(mActivity, OmniboxTheme.DEFAULT)); + OmniboxResourceProvider.getUrlBarSecureColor( + mActivity, BrandedColorScheme.APP_DEFAULT)); assertEquals("Secure color for INCOGNITO should be the lighter green.", greenOnDark, - OmniboxResourceProvider.getUrlBarSecureColor(mActivity, OmniboxTheme.INCOGNITO)); + OmniboxResourceProvider.getUrlBarSecureColor( + mActivity, BrandedColorScheme.INCOGNITO)); } @Test @@ -170,16 +182,16 @@ assertEquals("Wrong suggestion primary text color for LIGHT_THEME.", defaultColor, OmniboxResourceProvider.getSuggestionPrimaryTextColor( - mActivity, OmniboxTheme.LIGHT_THEME)); + mActivity, BrandedColorScheme.LIGHT_BRANDED_THEME)); assertEquals("Wrong suggestion primary text color for DARK_THEME.", defaultColor, OmniboxResourceProvider.getSuggestionPrimaryTextColor( - mActivity, OmniboxTheme.DARK_THEME)); + mActivity, BrandedColorScheme.DARK_BRANDED_THEME)); assertEquals("Wrong suggestion primary text color for INCOGNITO.", incognitoColor, OmniboxResourceProvider.getSuggestionPrimaryTextColor( - mActivity, OmniboxTheme.INCOGNITO)); + mActivity, BrandedColorScheme.INCOGNITO)); assertEquals("Wrong suggestion primary text color for DEFAULT.", defaultColor, OmniboxResourceProvider.getSuggestionPrimaryTextColor( - mActivity, OmniboxTheme.DEFAULT)); + mActivity, BrandedColorScheme.APP_DEFAULT)); } @Test @@ -191,16 +203,16 @@ assertEquals("Wrong suggestion secondary text color for LIGHT_THEME.", defaultColor, OmniboxResourceProvider.getSuggestionSecondaryTextColor( - mActivity, OmniboxTheme.LIGHT_THEME)); + mActivity, BrandedColorScheme.LIGHT_BRANDED_THEME)); assertEquals("Wrong suggestion secondary text color for DARK_THEME.", defaultColor, OmniboxResourceProvider.getSuggestionSecondaryTextColor( - mActivity, OmniboxTheme.DARK_THEME)); + mActivity, BrandedColorScheme.DARK_BRANDED_THEME)); assertEquals("Wrong suggestion secondary text color for INCOGNITO.", incognitoColor, OmniboxResourceProvider.getSuggestionSecondaryTextColor( - mActivity, OmniboxTheme.INCOGNITO)); + mActivity, BrandedColorScheme.INCOGNITO)); assertEquals("Wrong suggestion secondary text color for DEFAULT.", defaultColor, OmniboxResourceProvider.getSuggestionSecondaryTextColor( - mActivity, OmniboxTheme.DEFAULT)); + mActivity, BrandedColorScheme.APP_DEFAULT)); } @Test @@ -211,14 +223,15 @@ assertEquals("Wrong suggestion url text color for LIGHT_THEME.", defaultColor, OmniboxResourceProvider.getSuggestionUrlTextColor( - mActivity, OmniboxTheme.LIGHT_THEME)); + mActivity, BrandedColorScheme.LIGHT_BRANDED_THEME)); assertEquals("Wrong suggestion url text color for DARK_THEME.", defaultColor, OmniboxResourceProvider.getSuggestionUrlTextColor( - mActivity, OmniboxTheme.DARK_THEME)); + mActivity, BrandedColorScheme.DARK_BRANDED_THEME)); assertEquals("Wrong suggestion url text color for INCOGNITO.", incognitoColor, OmniboxResourceProvider.getSuggestionUrlTextColor( - mActivity, OmniboxTheme.INCOGNITO)); + mActivity, BrandedColorScheme.INCOGNITO)); assertEquals("Wrong suggestion url text color for DEFAULT.", defaultColor, - OmniboxResourceProvider.getSuggestionUrlTextColor(mActivity, OmniboxTheme.DEFAULT)); + OmniboxResourceProvider.getSuggestionUrlTextColor( + mActivity, BrandedColorScheme.APP_DEFAULT)); } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxTheme.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxTheme.java deleted file mode 100644 index 78921e4..0000000 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxTheme.java +++ /dev/null
@@ -1,24 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.omnibox.styles; - -import androidx.annotation.IntDef; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@IntDef({OmniboxTheme.LIGHT_THEME, OmniboxTheme.DARK_THEME, OmniboxTheme.INCOGNITO, - OmniboxTheme.DEFAULT}) -@Retention(RetentionPolicy.SOURCE) -public @interface OmniboxTheme { - /* Light branded color as defined by the website, unrelated to the app/OS dark theme setting. */ - int LIGHT_THEME = 0; - /* Dark branded color as defined by the website, unrelated to the app/OS dark theme setting. */ - int DARK_THEME = 1; - /* Incognito theme. */ - int INCOGNITO = 2; - /* Default theme with potentially dynamic colors that can be light or dark. */ - int DEFAULT = 3; -}
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 3b5b2f8..d986081c7 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
@@ -26,7 +26,6 @@ import org.chromium.chrome.browser.omnibox.UrlBar.UrlTextChangeListener; import org.chromium.chrome.browser.omnibox.UrlBarEditingTextStateProvider; import org.chromium.chrome.browser.omnibox.UrlFocusChangeListener; -import org.chromium.chrome.browser.omnibox.styles.OmniboxTheme; import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteController.OnSuggestionsReceivedListener; import org.chromium.chrome.browser.omnibox.suggestions.SuggestionListViewBinder.SuggestionListViewHolder; import org.chromium.chrome.browser.omnibox.suggestions.answer.AnswerSuggestionViewBinder; @@ -49,6 +48,7 @@ import org.chromium.chrome.browser.share.ShareDelegate; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabWindowManager; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.browser.util.KeyNavigationUtil; import org.chromium.components.omnibox.AutocompleteMatch; import org.chromium.ui.ViewProvider; @@ -298,10 +298,10 @@ /** * Update the visuals of the autocomplete UI. - * @param omniboxTheme The {@link @OmniboxTheme}. + * @param brandedColorScheme The {@link @BrandedColorScheme}. */ - public void updateVisualsForState(@OmniboxTheme int omniboxTheme) { - mMediator.updateVisualsForState(omniboxTheme); + public void updateVisualsForState(@BrandedColorScheme int colorScheme) { + mMediator.updateVisualsForState(colorScheme); } /**
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java index 568a0f9..eed7e0d0 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
@@ -29,7 +29,6 @@ import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType; import org.chromium.chrome.browser.omnibox.R; import org.chromium.chrome.browser.omnibox.UrlBarEditingTextStateProvider; -import org.chromium.chrome.browser.omnibox.styles.OmniboxTheme; import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteController.OnSuggestionsReceivedListener; import org.chromium.chrome.browser.omnibox.suggestions.SuggestionsMetrics.RefineActionUsage; import org.chromium.chrome.browser.omnibox.suggestions.basic.BasicSuggestionProcessor.BookmarkState; @@ -42,6 +41,7 @@ import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelUtils; import org.chromium.chrome.browser.tabmodel.TabWindowManager; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.metrics.OmniboxEventProtos.OmniboxEventProto.PageClassification; import org.chromium.components.omnibox.AutocompleteMatch; import org.chromium.components.omnibox.AutocompleteResult; @@ -248,11 +248,11 @@ /** * Specifies the visual state to be used by the suggestions. - * @param omniboxTheme The {@link @OmniboxTheme}. + * @param brandedColorScheme The {@link @BrandedColorScheme}. */ - void updateVisualsForState(@OmniboxTheme int omniboxTheme) { - mDropdownViewInfoListManager.setOmniboxTheme(omniboxTheme); - mListPropertyModel.set(SuggestionListProperties.OMNIBOX_THEME, omniboxTheme); + void updateVisualsForState(@BrandedColorScheme int brandedColorScheme) { + mDropdownViewInfoListManager.setBrandedColorScheme(brandedColorScheme); + mListPropertyModel.set(SuggestionListProperties.COLOR_SCHEME, brandedColorScheme); } /**
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager.java index cb0e31c9..1e7bd8a 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager.java
@@ -10,7 +10,7 @@ import androidx.annotation.NonNull; -import org.chromium.chrome.browser.omnibox.styles.OmniboxTheme; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.omnibox.AutocompleteResult; import org.chromium.ui.modelutil.MVCListAdapter.ListItem; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; @@ -25,13 +25,13 @@ private final ModelList mManagedModel; private final SparseBooleanArray mGroupsCollapsedState; private int mLayoutDirection; - private @OmniboxTheme int mOmniboxTheme; + private @BrandedColorScheme int mBrandedColorScheme; private List<DropdownItemViewInfo> mSourceViewInfoList; DropdownItemViewInfoListManager(@NonNull ModelList managedModel) { assert managedModel != null : "Must specify a non-null model."; mLayoutDirection = View.LAYOUT_DIRECTION_INHERIT; - mOmniboxTheme = OmniboxTheme.LIGHT_THEME; + mBrandedColorScheme = BrandedColorScheme.LIGHT_BRANDED_THEME; mSourceViewInfoList = Collections.emptyList(); mGroupsCollapsedState = new SparseBooleanArray(); mManagedModel = managedModel; @@ -58,15 +58,15 @@ /** * Specifies the visual theme to be used by the suggestions. - * @param omniboxTheme Specifies which {@link OmniboxTheme} should be used. + * @param brandedColorScheme Specifies which {@link BrandedColorScheme} should be used. */ - void setOmniboxTheme(@OmniboxTheme int omniboxTheme) { - if (mOmniboxTheme == omniboxTheme) return; + void setBrandedColorScheme(@BrandedColorScheme int brandedColorScheme) { + if (mBrandedColorScheme == brandedColorScheme) return; - mOmniboxTheme = omniboxTheme; + mBrandedColorScheme = brandedColorScheme; for (int i = 0; i < mSourceViewInfoList.size(); i++) { PropertyModel model = mSourceViewInfoList.get(i).model; - model.set(SuggestionCommonProperties.OMNIBOX_THEME, omniboxTheme); + model.set(SuggestionCommonProperties.COLOR_SCHEME, brandedColorScheme); } } @@ -129,7 +129,7 @@ final DropdownItemViewInfo item = mSourceViewInfoList.get(i); final PropertyModel model = item.model; model.set(SuggestionCommonProperties.LAYOUT_DIRECTION, mLayoutDirection); - model.set(SuggestionCommonProperties.OMNIBOX_THEME, mOmniboxTheme); + model.set(SuggestionCommonProperties.COLOR_SCHEME, mBrandedColorScheme); final boolean groupIsDefaultCollapsed = getGroupCollapsedState(item.groupId); if (!groupIsDefaultCollapsed || isGroupHeaderWithId(item, item.groupId)) {
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 641a493..8c05fd5 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
@@ -14,7 +14,6 @@ import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; -import android.view.View.MeasureSpec; import android.view.ViewGroup; import android.view.ViewParent; import android.view.ViewTreeObserver.OnGlobalLayoutListener; @@ -32,7 +31,7 @@ import org.chromium.base.task.PostTask; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.omnibox.R; -import org.chromium.chrome.browser.omnibox.styles.OmniboxTheme; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.browser.util.KeyNavigationUtil; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.content_public.browser.UiThreadTaskTraits; @@ -247,10 +246,11 @@ /** * Update the suggestion popup background to reflect the current state. - * @param omniboxTheme The {@link @OmniboxTheme}. + * @param brandedColorScheme The {@link @BrandedColorScheme}. */ - public void refreshPopupBackground(@OmniboxTheme int omniboxTheme) { - int color = omniboxTheme == OmniboxTheme.INCOGNITO ? mIncognitoBgColor : mStandardBgColor; + public void refreshPopupBackground(@BrandedColorScheme int brandedColorScheme) { + int color = brandedColorScheme == BrandedColorScheme.INCOGNITO ? mIncognitoBgColor + : mStandardBgColor; if (!isHardwareAccelerated()) { // When HW acceleration is disabled, changing mSuggestionList' items somehow erases // mOmniboxResultsContainer' background from the area not covered by
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionCommonProperties.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionCommonProperties.java index dc7918dd..1cf01f1 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionCommonProperties.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionCommonProperties.java
@@ -12,10 +12,9 @@ */ public class SuggestionCommonProperties { /** Whether dark colors should be applied to text, icons. */ - public static final WritableIntPropertyKey OMNIBOX_THEME = new WritableIntPropertyKey(); + public static final WritableIntPropertyKey COLOR_SCHEME = new WritableIntPropertyKey(); /** The layout direction to be applied to the entire suggestion view. */ public static final WritableIntPropertyKey LAYOUT_DIRECTION = new WritableIntPropertyKey(); - public static final PropertyKey[] ALL_KEYS = - new PropertyKey[] {OMNIBOX_THEME, LAYOUT_DIRECTION}; + public static final PropertyKey[] ALL_KEYS = new PropertyKey[] {COLOR_SCHEME, LAYOUT_DIRECTION}; }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionListProperties.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionListProperties.java index cb75241f..1f26fa9 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionListProperties.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionListProperties.java
@@ -29,15 +29,15 @@ new WritableObjectPropertyKey<>(true); /** - * Specifies the omnibox theme. It can be light or dark because of a publisher defined color, + * Specifies the color scheme. It can be light or dark because of a publisher defined color, * incognito, or the default theme that follows dynamic colors. */ - public static final WritableIntPropertyKey OMNIBOX_THEME = new WritableIntPropertyKey(); + public static final WritableIntPropertyKey COLOR_SCHEME = new WritableIntPropertyKey(); /** Observer that will receive notifications and callbacks from Suggestion List. */ public static final WritableObjectPropertyKey<OmniboxSuggestionsDropdown.Observer> OBSERVER = new WritableObjectPropertyKey<>(); public static final PropertyKey[] ALL_KEYS = - new PropertyKey[] {VISIBLE, EMBEDDER, SUGGESTION_MODELS, OMNIBOX_THEME, OBSERVER}; + new PropertyKey[] {VISIBLE, EMBEDDER, SUGGESTION_MODELS, COLOR_SCHEME, OBSERVER}; }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionListViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionListViewBinder.java index fd50d86..963dd13d4 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionListViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionListViewBinder.java
@@ -63,8 +63,8 @@ view.dropdown.resetSelection(); } }); - } else if (SuggestionListProperties.OMNIBOX_THEME.equals(propertyKey)) { - view.dropdown.refreshPopupBackground(model.get(SuggestionListProperties.OMNIBOX_THEME)); + } else if (SuggestionListProperties.COLOR_SCHEME.equals(propertyKey)) { + view.dropdown.refreshPopupBackground(model.get(SuggestionListProperties.COLOR_SCHEME)); } } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinder.java index a81af96..becea4e 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinder.java
@@ -57,7 +57,7 @@ ViewCompat.setLayoutDirection( view, model.get(SuggestionCommonProperties.LAYOUT_DIRECTION)); updateContentViewPadding(model, view.getDecoratedSuggestionView()); - } else if (SuggestionCommonProperties.OMNIBOX_THEME == propertyKey) { + } else if (SuggestionCommonProperties.COLOR_SCHEME == propertyKey) { updateColorScheme(model, view); } else if (BaseSuggestionViewProperties.ACTIONS == propertyKey) { bindActionButtons(model, view, model.get(BaseSuggestionViewProperties.ACTIONS)); @@ -147,7 +147,7 @@ /** @return Whether currently used color scheme is considered to be dark. */ private static boolean useDarkColors(PropertyModel model) { return !OmniboxResourceProvider.isDarkMode( - model.get(SuggestionCommonProperties.OMNIBOX_THEME)); + model.get(SuggestionCommonProperties.COLOR_SCHEME)); } /** Update attributes of decorated suggestion icon. */ @@ -207,7 +207,7 @@ */ private static Drawable getSelectableBackgroundDrawable(View view, PropertyModel model) { return OmniboxResourceProvider.resolveAttributeToDrawable(view.getContext(), - model.get(SuggestionCommonProperties.OMNIBOX_THEME), + model.get(SuggestionCommonProperties.COLOR_SCHEME), R.attr.selectableItemBackground); }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinderUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinderUnitTest.java index 7ebe859..2f6dbc2 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinderUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinderUnitTest.java
@@ -29,9 +29,9 @@ import org.robolectric.annotation.Config; import org.chromium.chrome.R; -import org.chromium.chrome.browser.omnibox.styles.OmniboxTheme; import org.chromium.chrome.browser.omnibox.suggestions.SuggestionCommonProperties; import org.chromium.chrome.browser.omnibox.suggestions.base.BaseSuggestionViewProperties.Action; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.testing.local.LocalRobolectricTestRunner; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModelChangeProcessor; @@ -224,7 +224,7 @@ Assert.assertNull(mModel.get(BaseSuggestionViewProperties.ACTIONS)); mBaseView.setActionButtonsCount(1); // Change in color scheme happening ahead of setting action could cause a crash. - mModel.set(SuggestionCommonProperties.OMNIBOX_THEME, OmniboxTheme.LIGHT_THEME); + mModel.set(SuggestionCommonProperties.COLOR_SCHEME, BrandedColorScheme.LIGHT_BRANDED_THEME); } @Test
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/SuggestionViewViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/SuggestionViewViewBinder.java index fa9bc9a..e208434 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/SuggestionViewViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/SuggestionViewViewBinder.java
@@ -13,9 +13,9 @@ import org.chromium.chrome.browser.omnibox.R; import org.chromium.chrome.browser.omnibox.styles.OmniboxResourceProvider; -import org.chromium.chrome.browser.omnibox.styles.OmniboxTheme; import org.chromium.chrome.browser.omnibox.suggestions.SuggestionCommonProperties; import org.chromium.chrome.browser.omnibox.suggestions.base.SuggestionSpannable; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel; @@ -26,7 +26,7 @@ if (propertyKey == SuggestionViewProperties.TEXT_LINE_1_TEXT) { TextView tv = view.findViewById(R.id.line_1); tv.setText(model.get(SuggestionViewProperties.TEXT_LINE_1_TEXT)); - } else if (propertyKey == SuggestionCommonProperties.OMNIBOX_THEME) { + } else if (propertyKey == SuggestionCommonProperties.COLOR_SCHEME) { updateSuggestionTextColor(view, model); } else if (propertyKey == SuggestionViewProperties.IS_SEARCH_SUGGESTION) { updateSuggestionTextColor(view, model); @@ -54,18 +54,20 @@ private static void updateSuggestionTextColor(View view, PropertyModel model) { final boolean isSearch = model.get(SuggestionViewProperties.IS_SEARCH_SUGGESTION); - final @OmniboxTheme int omniboxTheme = model.get(SuggestionCommonProperties.OMNIBOX_THEME); + final @BrandedColorScheme int brandedColorScheme = + model.get(SuggestionCommonProperties.COLOR_SCHEME); final TextView line1 = view.findViewById(R.id.line_1); final TextView line2 = view.findViewById(R.id.line_2); final Context context = view.getContext(); final @ColorInt int color1 = - OmniboxResourceProvider.getSuggestionPrimaryTextColor(context, omniboxTheme); + OmniboxResourceProvider.getSuggestionPrimaryTextColor(context, brandedColorScheme); line1.setTextColor(color1); final @ColorInt int color2 = isSearch - ? OmniboxResourceProvider.getSuggestionSecondaryTextColor(context, omniboxTheme) - : OmniboxResourceProvider.getSuggestionUrlTextColor(context, omniboxTheme); + ? OmniboxResourceProvider.getSuggestionSecondaryTextColor( + context, brandedColorScheme) + : OmniboxResourceProvider.getSuggestionUrlTextColor(context, brandedColorScheme); line2.setTextColor(color2); } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionViewBinder.java index e8922bd2..887ce1e1 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionViewBinder.java
@@ -28,9 +28,9 @@ public void bind(PropertyModel model, EditUrlSuggestionView view, PropertyKey propertyKey) { mBinder.bind(model, view.getBaseSuggestionView(), propertyKey); - if (SuggestionCommonProperties.OMNIBOX_THEME == propertyKey) { + if (SuggestionCommonProperties.COLOR_SCHEME == propertyKey) { Drawable drawable = OmniboxResourceProvider.resolveAttributeToDrawable( - view.getContext(), model.get(SuggestionCommonProperties.OMNIBOX_THEME), + view.getContext(), model.get(SuggestionCommonProperties.COLOR_SCHEME), android.R.attr.listDivider); view.getDivider().setBackground(drawable); }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinder.java index 0f1bb606..6c21881 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinder.java
@@ -21,9 +21,9 @@ public static void bind(PropertyModel model, HeaderView view, PropertyKey propertyKey) { if (HeaderViewProperties.TITLE == propertyKey) { view.getTextView().setText(model.get(HeaderViewProperties.TITLE)); - } else if (propertyKey == SuggestionCommonProperties.OMNIBOX_THEME) { + } else if (propertyKey == SuggestionCommonProperties.COLOR_SCHEME) { final boolean useDarkColors = !OmniboxResourceProvider.isDarkMode( - model.get(SuggestionCommonProperties.OMNIBOX_THEME)); + model.get(SuggestionCommonProperties.COLOR_SCHEME)); TextViewCompat.setTextAppearance(view.getTextView(), ChromeColors.getTextMediumThickSecondaryStyle(!useDarkColors)); ApiCompatibilityUtils.setImageTintList(view.getIconView(),
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessor.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessor.java index 27a9dbc..22efd4f3 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessor.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessor.java
@@ -22,12 +22,12 @@ import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType; import org.chromium.chrome.browser.omnibox.R; import org.chromium.chrome.browser.omnibox.styles.OmniboxResourceProvider; -import org.chromium.chrome.browser.omnibox.styles.OmniboxTheme; import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionUiType; import org.chromium.chrome.browser.omnibox.suggestions.SuggestionHost; import org.chromium.chrome.browser.omnibox.suggestions.carousel.BaseCarouselSuggestionProcessor; import org.chromium.chrome.browser.omnibox.suggestions.carousel.BaseCarouselSuggestionView; import org.chromium.chrome.browser.omnibox.suggestions.carousel.BaseCarouselSuggestionViewProperties; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.browser_ui.widget.tile.TileView; import org.chromium.components.browser_ui.widget.tile.TileViewBinder; @@ -220,8 +220,9 @@ .inflate(R.layout.suggestions_tile_view, parent, false); tile.setClickable(true); - Drawable background = OmniboxResourceProvider.resolveAttributeToDrawable( - parent.getContext(), OmniboxTheme.LIGHT_THEME, R.attr.selectableItemBackground); + Drawable background = + OmniboxResourceProvider.resolveAttributeToDrawable(parent.getContext(), + BrandedColorScheme.LIGHT_BRANDED_THEME, R.attr.selectableItemBackground); tile.setBackgroundDrawable(background); return tile; }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/tail/TailSuggestionViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/tail/TailSuggestionViewBinder.java index d7aeb54..a0ad5d6 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/tail/TailSuggestionViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/tail/TailSuggestionViewBinder.java
@@ -21,9 +21,9 @@ view.setTailText(model.get(TailSuggestionViewProperties.TEXT)); } else if (propertyKey == TailSuggestionViewProperties.FILL_INTO_EDIT) { view.setFullText(model.get(TailSuggestionViewProperties.FILL_INTO_EDIT)); - } else if (propertyKey == SuggestionCommonProperties.OMNIBOX_THEME) { + } else if (propertyKey == SuggestionCommonProperties.COLOR_SCHEME) { final @ColorInt int color = OmniboxResourceProvider.getSuggestionPrimaryTextColor( - view.getContext(), model.get(SuggestionCommonProperties.OMNIBOX_THEME)); + view.getContext(), model.get(SuggestionCommonProperties.COLOR_SCHEME)); view.setTextColor(color); } }
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 b8c0febd..c982612 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">Kopieer gebruikernaam</translation> <translation id="1592864538817356322">Standaardbeskerming:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{Verwyder 1 gekose item}other{Verwyder # gekose items}}</translation> +<translation id="1633659023549081553">Ontdek nuwe inhoud op Chrome se tuisblad</translation> <translation id="1641113438599504367">Veiligblaai</translation> <translation id="164269334534774161">Jy bekyk tans 'n vanlyn kopie van hierdie program vanaf <ph name="CREATION_TIME" /></translation> <translation id="1644574205037202324">Geskiedenis</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">Trek die glyer totdat jy dit gemaklik kan lees. Teks behoort minstens só groot te lyk nadat jy op 'n paragraaf gedubbeltik het.</translation> <translation id="2323763861024343754">Werfberging</translation> <translation id="2328985652426384049">Kan nie aanmeld nie</translation> +<translation id="2342601525305963189">Chrome-wenke:</translation> <translation id="234265804618409743">Kan nie jou kamera oopmaak nie. Iets is fout.</translation> <translation id="2345671828921229300">Raak en hou 'n woord om te soek</translation> <translation id="2349710944427398404">Alle data deur Chrome gebruik, insluitend rekeninge, boekmerke en gestoorde instellings</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">URL'e wat jy besoek, word na Google toe gestuur</translation> <translation id="2536728043171574184">Bekyk tans 'n vanlyn kopie van hierdie bladsy</translation> <translation id="2546283357679194313">Webkoekies en werfdata</translation> +<translation id="2558692642259318568">Probeer Incognito om te blaai sonder om aktiwiteit op jou toestel te stoor</translation> <translation id="2561519700418191927">Videovoorskoue</translation> <translation id="2567385386134582609">PRENT</translation> <translation id="2567545343356994513">Vinniger, proaktiewe beskerming teen gevaarlike webwerwe, aflaaie en uitbreidings</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">Kaartnommer</translation> <translation id="2625189173221582860">Wagwoord is gekopieer</translation> <translation id="2631006050119455616">Bespaar</translation> +<translation id="2634905176438867146">Kom meer te wete oor hoe om Chrome as jou verstek te stel</translation> <translation id="2645657967708199252">Jou <ph name="CONNECTION_TYPE" />-verbinding kan jou aflaai stadiger maak</translation> <translation id="2647434099613338025">Voeg taal by</translation> <translation id="2649068648233607930">Jou blaaier word bestuur deur <ph name="DOMAIN" /></translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">Spoor tans prys na</translation> <translation id="3037517125981011456">Wys porboodskappe om by Chrome aan te meld.</translation> <translation id="3046945242843292318">Kom volgende keer vinniger by hierdie werf uit</translation> +<translation id="3055259925215945098">Boekmerk is geskuif</translation> <translation id="305593374596241526">Ligging is af; skakel dit in <ph name="BEGIN_LINK" />Android-instellings<ph name="END_LINK" /> aan.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> boekmerk}other{<ph name="BOOKMARKS_COUNT_MANY" /> boekmerke}}</translation> <translation id="3062802207422175757">Artikels oor jou belangstellings op Chrome</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">Stoor op toestel</translation> <translation id="3236059992281584593">1 minuut oor</translation> <translation id="3237087289225714896">Standaardvooraflaai:</translation> +<translation id="3237433641417325993">Rollees af om voorgestelde artikels te sien</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">As jy ook Chrome-gebruiksverslae deel, sluit daardie verslae die URL'e in wat jy besoek</translation> <translation id="3250563604907490871">Prentbeskrywings sal hervat wanneer jy aan wi-fi koppel</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Chrome het nie toegang tot die hulpbron wat versoek is nie.</translation> <translation id="4837753911714442426">Maak opsies oop om bladsy te druk</translation> <translation id="4842092870884894799">Wys tans opspringer vir wagwoordgenerering</translation> +<translation id="4842515939542199281">Tik op die mikrofoon om met jou stem te soek</translation> <translation id="4850886885716139402">Bekyk</translation> <translation id="4860895144060829044">Bel</translation> <translation id="4864369630010738180">Meld tans aan …</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">Uitgebreide datagebruik</translation> <translation id="509429900233858213">'n Fout het voorgekom.</translation> <translation id="510275257476243843">1 uur oor</translation> +<translation id="5115811374190515607">na <ph name="PRODUCT_NAME" /></translation> <translation id="5118713593561876160">Belangstellings</translation> <translation id="5123685120097942451">Incognito-oortjie</translation> <translation id="5126510351761255129">Verifieer jou kaart</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">Chrome het bergingtoegang nodig om lêers af te laai.</translation> <translation id="5749237766298580851">Af <ph name="SEPARATOR" /> Nie aanbeveel nie</translation> <translation id="5752232708629533680">Deel net GIF</translation> +<translation id="5753139477036638699">Jy kan jou stem gebruik om in Chrome te soek</translation> <translation id="5754350196967618083">Kan nie Ontdek herlaai nie</translation> <translation id="5763382633136178763">Incognito-oortjies</translation> <translation id="5763514718066511291">Tik om hierdie program se URL te kopieer</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">Meld by Chrome aan; oopgemaak.</translation> <translation id="6814033694018386318">Wat jy met Google deel</translation> <translation id="6817747507826986771">Deel hierdie bladsy vinnig. Raak en hou om hierdie kortpad te wysig.</translation> +<translation id="6819199143469632133">Meld aan om jou Google-goed op alle toestelle te kry</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, oortjie, gekies</translation> <translation id="6828070228333235514">Stop prysnasporing</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705">Teruggestel op <ph name="ITEM_TITLE" /></translation> <translation id="7029390216614421513">Plaas QR- of strepieskode in hierdie raam</translation> <translation id="7029809446516969842">Wagwoorde</translation> +<translation id="7037830628447527439">Meld by Chrome aan met jou Google-rekening</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Kry prentbeskrywings?</translation> <translation id="7055152154916055070">Herleiding is geblokkeer:</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> – hierdie taal kon nie afgelaai word nie. Probeer later weer.</translation> <translation id="8951232171465285730">Chrome het vir jou <ph name="MEGABYTES" /> MB bespaar</translation> <translation id="8955719471735800169">Terug na bo</translation> +<translation id="8964479563882643397">Maak die kieslys oop om 'n nuwe Incognito-oortjie oop te maak</translation> <translation id="8965591936373831584">hangende</translation> <translation id="8967427617812342790">Voeg by leeslys</translation> <translation id="8968085728801125376">{TAB_COUNT,plural, =1{<ph name="INCOGNITO_TAB_COUNT" /> Incognito- en nog <ph name="TAB_COUNT_ONE" /> oortjie sal toegemaak word}other{<ph name="INCOGNITO_TAB_COUNT" /> Incognito- en nog <ph name="TAB_COUNT_MANY" /> oortjies sal toegemaak word}}</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 92f51cd3..00f70fd 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">የተጠቃሚ ስምን ቅዳ</translation> <translation id="1592864538817356322">መደበኛ ጥበቃ፦</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{1 የተመረጠ ንጥልን አስወግድ}one{# የተመረጡ ንጥሎችን አስወግድ}other{# የተመረጡ ንጥሎችን አስወግድ}}</translation> +<translation id="1633659023549081553">በChrome መነሻ ገጽ ላይ ያለውን አዲስ ይዘት ያግኙ</translation> <translation id="1641113438599504367">የጥንቃቄ አሰሳ</translation> <translation id="164269334534774161"><ph name="CREATION_TIME" /> ላይ የነበረ የዚህን ገጽ የመስመር ውጪ ቅጂ በመመልከት ላይ ነዎት</translation> <translation id="1644574205037202324">ታሪክ</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">ይህን በሚመች ሁኔታ ማንበብ እስኪችሉ ድረስ ተንሸራታቹን ይጎትቱት። በአንድ አንቀጽ ላይ ሁለቴ መታ ካደረጉ በኋላ ጽሑፍ ቢያንስ የዚህ ያህል ትልቀት ሊኖረው ይገባል።</translation> <translation id="2323763861024343754">የጣቢያ ማከማቻ</translation> <translation id="2328985652426384049">መግባት አልተቻለም</translation> +<translation id="2342601525305963189">የChrome ጠቃሚ ምክሮች፡-</translation> <translation id="234265804618409743">የእርስዎን ካሜራ መክፈት አይቻልም። የሆነ ችግር ተፈጥሯል።</translation> <translation id="2345671828921229300">ለመፈለግ ፣ ቃል ይንኩ እና ይያዙ</translation> <translation id="2349710944427398404">መለያዎች፣ ዕልባቶች እና የተቀመጡ ቅንብሮችን ጨምሮ Chrome የተጠቀመው ጠቅላላ ውሂብ</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">እርስዎ የጎበኟቸው ዩአርኤሎች ወደ Google ይላካሉ</translation> <translation id="2536728043171574184">የዚህን ገጽ የመስመር ውጭ ቅጂ በመመልከት ላይ</translation> <translation id="2546283357679194313">ኩኪዎች እና የጣቢያ ውሂብ</translation> +<translation id="2558692642259318568">እንቅስቃሴን ወደ መሳሪያዎ ሳያስቀምጡ ለማሰስ ማንነትን የማያሳውቅ ይሞክሩ</translation> <translation id="2561519700418191927">የቪዲዮ ቅድመ-እይታዎች</translation> <translation id="2567385386134582609">ምስል</translation> <translation id="2567545343356994513">ይበልጥ ፈጣን፣ ከአደገኛ ድር ጣቢያዎች፣ ማውረዶች እና ቅጥያዎች አስቀድሞ የሚደረግ ጥበቃ</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">የካርድ ቁጥር</translation> <translation id="2625189173221582860">የይለፍ ቃል ተቀድቷል።</translation> <translation id="2631006050119455616">ተቀምጧል</translation> +<translation id="2634905176438867146">chromeን እንደ የእርስዎ ነባሪ እንዴት ማዋቀር እንደሚችሉ ይወቁ</translation> <translation id="2645657967708199252">የእርስዎ <ph name="CONNECTION_TYPE" /> ግንኙነት ማውረድዎን ሊያዘገይ ይችላል</translation> <translation id="2647434099613338025">ቋንቋ አክል</translation> <translation id="2649068648233607930">የእርስዎ አሳሽ በ<ph name="DOMAIN" /> የሚተዳደር ነው</translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">ዋጋዎችን በመከታተል ላይ</translation> <translation id="3037517125981011456">ወደ Chrome ለመግባት ጥያቄዎችን ያሳያል</translation> <translation id="3046945242843292318">በሚቀጥለው ጊዜ በፍጥነት ወደዚህ ጣቢያ ይሂዱ</translation> +<translation id="3055259925215945098">ዕልባት ተንቀሳቅሷል</translation> <translation id="305593374596241526">አካባቢ ጠፍቷል፤ በ<ph name="BEGIN_LINK" />Android ቅንብሮች<ph name="END_LINK" /> ውስጥ ያብሩት።</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> ዕልባት}one{<ph name="BOOKMARKS_COUNT_MANY" /> ዕልባቶች}other{<ph name="BOOKMARKS_COUNT_MANY" /> ዕልባቶች}}</translation> <translation id="3062802207422175757">Chrome ላይ በእርስዎ ፍላጎቶች ላይ ያሉ ጽሑፎች</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">ወደ መሣሪያ አስቀምጥ</translation> <translation id="3236059992281584593">1 ደቂቃ ይቀራል</translation> <translation id="3237087289225714896">መደበኛ ቅድሚያ መጫን፦</translation> +<translation id="3237433641417325993">የተጠቆሙ ጽሑፎችን ለማየት ወደ ታች ይሸብልሉ</translation> <translation id="3244271242291266297">ወወ</translation> <translation id="3245429137663807393">እንዲሁም የChrome አጠቃቀም ሪፖርቶችን ካጋሩ፣ እነዚያ ሪፖርቶች እርስዎ የሚጎበኟቸውን ዩአርኤሎች ያካትታሉ</translation> <translation id="3250563604907490871">ከWi-Fi ጋር ሲገናኙ የምስል መግለጫዎች ከቆሙበት ይቀጥላሉ</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Chrome የተጠየቀው ግብዓት መዳረሻ የለውም።</translation> <translation id="4837753911714442426">ገጽን ለማተም አማራጮችን ክፈት</translation> <translation id="4842092870884894799">የይለፍ ቃል ማመንጨት ብቅ ይን በማሳየት ላይ</translation> +<translation id="4842515939542199281">በድምጽዎ ለመፈለግ ማይክሮፎኑን መታ ያድርጉ</translation> <translation id="4850886885716139402">አሳይ</translation> <translation id="4860895144060829044">ደውል</translation> <translation id="4864369630010738180">በመግባት ላይ...</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">የተራዘመ የአጠቃቀም ውሂብ</translation> <translation id="509429900233858213">ስህተት አጋጥሟል።</translation> <translation id="510275257476243843">1 ሰዓት ይቀራል</translation> +<translation id="5115811374190515607">ወደ <ph name="PRODUCT_NAME" /></translation> <translation id="5118713593561876160">ዝንባሌዎች</translation> <translation id="5123685120097942451">ማንነት የማያሳውቅ ትር</translation> <translation id="5126510351761255129">የእርስዎን ኮርድ ያረጋግጡ</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">Chrome ፋይሎችን ለማውረድ የማከማቻ መዳረሻ ያስፈልገዋል።</translation> <translation id="5749237766298580851">አጥፋ <ph name="SEPARATOR" /> አይመከርም</translation> <translation id="5752232708629533680">GIFን ብቻ ያጋሩ</translation> +<translation id="5753139477036638699">በChrome ውስጥ ለመፈለግ ድምጽዎን መጠቀም ይችላሉ</translation> <translation id="5754350196967618083">Discoverን ዳግም ማደስ አይቻልም</translation> <translation id="5763382633136178763">ማንነት የማያሳውቁ ትሮች</translation> <translation id="5763514718066511291">የዚህ መተግበሪያ ዩአርኤል ለመቅዳት መታ ያድርጉ</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">ወደ Chrome መግባት፣ ተከፍቷል።</translation> <translation id="6814033694018386318">ለGoogle የሚያጋሩት ነገር</translation> <translation id="6817747507826986771">ይህንን ገጽ በፍጥነት ያጋሩ ይህን አቋራጭ ለማርትዕ ነክተው ይያዙ።</translation> +<translation id="6819199143469632133">የእርስዎን የGoogle ነገሮች በመሳሪያዎች ላይ ለማግኘት፣ በመለያ ይግቡ</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />፣ ትር ተመርጧል</translation> <translation id="6828070228333235514">ዋጋ ተከታተልን ያቁሙ</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705">ወደነበረበት የተመለሰው በ<ph name="ITEM_TITLE" /></translation> <translation id="7029390216614421513">የQR ኮድ ወይም የአሞሌ ኮድ በዚህ ክፈፍ ውስጥ ያምጡት</translation> <translation id="7029809446516969842">የይለፍ ቃላት</translation> +<translation id="7037830628447527439">በእርስዎ Google መለያ ወደ Chrome ይግቡ</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">የምስል መግለጫዎችን ያግኙ?</translation> <translation id="7055152154916055070">አቅጣጫ ማዞር ታግዷል፦</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> - ይህ ቋንቋ ሊወርድ አልቻለም ቆይተው እንደገና ይሞክሩ።</translation> <translation id="8951232171465285730">Chrome <ph name="MEGABYTES" /> ሜባ ቆጥቦልዎታል</translation> <translation id="8955719471735800169">ወደ ላይ ተመለስ</translation> +<translation id="8964479563882643397">አዲስ ማንነት የማያሳውቅ ትር ለመክፈት ምናሌውን ይክፈቱ</translation> <translation id="8965591936373831584">በመጠበቅ ላይ</translation> <translation id="8967427617812342790">ወደ የንባብ ዝርዝር አክል</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>
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 a1be896..e0c5c72 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
@@ -423,7 +423,7 @@ <translation id="3414952576877147120">الحجم:</translation> <translation id="3421726884497337397">اختيار الحالات التي يتم فيها حظر ملفات ملف تعريف الارتباط التابعة لجهات خارجية</translation> <translation id="3429160811076349561">تم إيقاف ميزات الإصدار التجريبي.</translation> -<translation id="3435465986463792564">في حال ظهور العديد من النوافذ، يمكنك إدارتها من هنا.</translation> +<translation id="3435465986463792564">هل لديك العديد من النوافذ؟ يمكنك إدارتها من هنا.</translation> <translation id="3440975416244667276">انقر مع الاستمرار لعرض معلومات أكثر صلة</translation> <translation id="3443221991560634068">إعادة تحميل الصفحة الحالية</translation> <translation id="3444179773590444986">هل تريد مشاركة ملاحظاتك وآرائك حول وضع "المظهر الداكن" للمواقع الإلكترونية؟</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 3cd2c00..840f481 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">ব্যৱহাৰকাৰীৰ নামটোৰ প্ৰতিলিপি কৰক</translation> <translation id="1592864538817356322">মান্য সুৰক্ষা:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{বাছনি কৰা ১টা বস্তু আঁতৰাওক}one{বাছনি কৰা #টা বস্তু আঁতৰাওক}other{বাছনি কৰা #টা বস্তু আঁতৰাওক}}</translation> +<translation id="1633659023549081553">Chromeৰ গৃহপৃষ্ঠাত নতুন সমলৰ সন্ধান কৰক</translation> <translation id="1641113438599504367">সুৰক্ষিত ব্ৰাউজিং</translation> <translation id="164269334534774161">আপুনি <ph name="CREATION_TIME" />ৰ পৰা এই পৃষ্ঠাটোৰ এটা অফলাইন প্ৰতিলিপি চাই আছে</translation> <translation id="1644574205037202324">ইতিহাস</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">আপুনি এইখিনি অনায়সে পঢ়িব নোৱাৰালৈকে স্লাইডাৰটো টানক। কোনো পেৰেগ্ৰাফত দুবাৰ টিপিলে পাঠখিনি অতি কমেও ইমানখিনি ডাঙৰ দেখা হ'ব লাগে।</translation> <translation id="2323763861024343754">ছাইট ষ্ট’ৰেজ</translation> <translation id="2328985652426384049">ছাইন ইন কৰিব নোৱাৰি</translation> +<translation id="2342601525305963189">Chromeৰ কিটিপ:</translation> <translation id="234265804618409743">আপোনাৰ কেমেৰাটো খুলিব নোৱাৰি। কিবা ভুল হ’ল।</translation> <translation id="2345671828921229300">সন্ধান কৰিবলৈ শব্দ এটাত স্পৰ্শ কৰি ধৰি ৰাখক</translation> <translation id="2349710944427398404">একাউণ্ট, বুকমার্ক আৰু ছেভ কৰি ৰখা ছেটিংসমূহকে লৈ Chromeএ ব্যৱহাৰ কৰা মুঠ ডেটা</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">আপুনি চোৱা URLসমূহ Googleলৈ পঠিওৱা হয়</translation> <translation id="2536728043171574184">এই পৃষ্ঠাটোৰ এটা অফলাইন প্ৰতিলিপি চাই আছে</translation> <translation id="2546283357679194313">কুকি আৰু ছাইট ডেটা</translation> +<translation id="2558692642259318568">আপোনাৰ ডিভাইচত কাৰ্যকলাপ ছেভ নকৰাকৈ ব্ৰাউজ কৰিবলৈ ইনক’গনিট’ ব্যৱহাৰ কৰি চাওক</translation> <translation id="2561519700418191927">ভিডিঅ'ৰ পূৰ্বদৰ্শন</translation> <translation id="2567385386134582609">প্ৰতিচ্ছবি</translation> <translation id="2567545343356994513">বিপজ্জনক ৱেবছাইট, ডাউনল’ড আৰু এক্সটেনশ্বনসমূহৰ পৰা ক্ষিপ্ৰ, আগতীয়া সুৰক্ষা</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">কার্ড নম্বৰ</translation> <translation id="2625189173221582860">পাছৱর্ডৰ প্ৰতিলিপি কৰা হ’ল</translation> <translation id="2631006050119455616">ছেভ হৈ থকা</translation> +<translation id="2634905176438867146">chromeক আপোনাৰ ডিফ’ল্ট হিচাপে কেনেকৈ ছেট কৰিব লাগে জানক</translation> <translation id="2645657967708199252">আপোনাৰ <ph name="CONNECTION_TYPE" /> সংযোগে আপোনাৰ ডাউনল'ডটো লেহেমীয়া কৰিব পাৰে</translation> <translation id="2647434099613338025">ভাষা যোগ কৰক</translation> <translation id="2649068648233607930"><ph name="DOMAIN" />এ আপোনাৰ ব্ৰাউজাৰটো পৰিচালনা কৰে</translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">মূল্য ট্ৰেক কৰি থকা হৈছে</translation> <translation id="3037517125981011456">Chromeত ছাইন ইন কৰিবলৈ প্ৰম্প্ট প্ৰদৰ্শন কৰে</translation> <translation id="3046945242843292318">পৰৱৰ্তী সময়ত এই ছাইটটোলৈ ক্ষিপ্ৰতাৰে আহক</translation> +<translation id="3055259925215945098">বুকমাৰ্ক স্থানান্তৰ কৰা হৈছে</translation> <translation id="305593374596241526">অৱস্থান অফ আছে <ph name="BEGIN_LINK" />Android ছেটিংসমূহত<ph name="END_LINK" /> অন কৰক।</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" />টা বুকমাৰ্ক}one{<ph name="BOOKMARKS_COUNT_MANY" />টা বুকমাৰ্ক}other{<ph name="BOOKMARKS_COUNT_MANY" />টা বুকমাৰ্ক}}</translation> <translation id="3062802207422175757">Chromeত আপোনাৰ আগ্ৰহৰ বিষয়বস্তু সম্পৰ্কীয় প্ৰবন্ধসমূহ</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">ডিভাইচত ছেভ কৰক</translation> <translation id="3236059992281584593">১ মিনিট বাকী আছে</translation> <translation id="3237087289225714896">মান্য আগতীয়া ল’ডিং:</translation> +<translation id="3237433641417325993">পৰামৰ্শিত প্ৰবন্ধসমূহ চাবলৈ তললৈ স্ক্ৰ’ল কৰক</translation> <translation id="3244271242291266297">মাহ</translation> <translation id="3245429137663807393">যদি আপুনি Chrome ব্যৱহাৰ কৰাৰ ৰিপ’ৰ্টও শ্বেয়াৰ কৰে, সেই ৰিপ’ৰ্টত আপুনি চোৱা URLসমূহ অন্তৰ্ভুক্ত হয়</translation> <translation id="3250563604907490871">আপুনি ৱাই-ফাইৰ সৈতে সংযুক্ত হ’লে প্ৰতিচ্ছবিৰ বিৱৰণ পুনৰ আৰম্ভ হ’ব</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">অনুৰোধ জনোৱা সমললৈ Chromeৰ এক্সেছ নাই।</translation> <translation id="4837753911714442426">পৃষ্ঠা প্ৰিণ্ট কৰিবলৈ বিকল্প খোলক</translation> <translation id="4842092870884894799">পাছৱর্ড সৃষ্টি কৰা পপআপ দেখুৱাই থকা হৈছে</translation> +<translation id="4842515939542199281">আপোনাৰ কণ্ঠধ্বনিৰে সন্ধান কৰিবলৈ মাইক্ৰ’ফ’নটোত টিপক</translation> <translation id="4850886885716139402">চাওক</translation> <translation id="4860895144060829044">কল কৰক</translation> <translation id="4864369630010738180">ছাইন ইন কৰি থকা হৈছে…</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">বিস্তাৰিত ব্যৱহাৰৰ ডেটা</translation> <translation id="509429900233858213">কোনো আসোঁৱাহ হৈছে।</translation> <translation id="510275257476243843">১ঘণ্টা বাকী আছে</translation> +<translation id="5115811374190515607"><ph name="PRODUCT_NAME" />লৈ</translation> <translation id="5118713593561876160">আগ্ৰহ</translation> <translation id="5123685120097942451">ইনক’গনিট’ টেব</translation> <translation id="5126510351761255129">আপোনাৰ কাৰ্ডখন সত্যাপন কৰক</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">ফাইল ডাউনল’ড কৰিবলৈ Chromeক ষ্ট’ৰেজত এক্সেছৰ আৱশ্যক।</translation> <translation id="5749237766298580851">অফ আছে <ph name="SEPARATOR" /> চুপাৰিছ কৰা নহয়</translation> <translation id="5752232708629533680">কেৱল GIF শ্বেয়াৰ কৰক</translation> +<translation id="5753139477036638699">Chromeত সন্ধান কৰিবলৈ আপুনি নিজৰ কণ্ঠধ্বনি ব্যৱহাৰ কৰিব পাৰে</translation> <translation id="5754350196967618083">Discover ৰিফ্ৰেশ্ব কৰিব নোৱাৰি</translation> <translation id="5763382633136178763">ইনক'গনিট' টেব</translation> <translation id="5763514718066511291">এই এপৰ URLটো প্ৰতিলিপি কৰিবলৈ টিপক</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">Chromeত ছাইন ইন কৰা হ’ল, খোলা আছে।</translation> <translation id="6814033694018386318">আপুনি Googleৰ সৈতে কি শ্বেয়াৰ কৰে</translation> <translation id="6817747507826986771">এই পৃষ্ঠাখন ক্ষিপ্ৰভাৱে শ্বেয়াৰ কৰক। এই শ্বৰ্টকাটটো সম্পাদনা কৰিবলৈ, স্পৰ্শ কৰি ধৰি ৰাখক।</translation> +<translation id="6819199143469632133">সমগ্ৰ ডিভাইচত আপোনাৰ Googleৰ বস্তুবোৰ পাবলৈ ছাইন ইন কৰক</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" /> টেবটো বাছনি কৰা হৈছে</translation> <translation id="6828070228333235514">মূল্য ট্ৰেক কৰাটো বন্ধ কৰক</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> পুনঃস্থাপন কৰা হৈছে</translation> <translation id="7029390216614421513">কিউআৰ ক’ড/বাৰক’ডটো এই ফ্ৰেমটোলৈ আনক।</translation> <translation id="7029809446516969842">পাছৱৰ্ডসমূহ</translation> +<translation id="7037830628447527439">আপোনাৰ Google একাউণ্টৰ জৰিয়তে Chromeত ছাইন ইন কৰক</translation> <translation id="7038956721828960940">chrome_প্ৰতিচ্ছবি_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">প্ৰতিচ্ছবিৰ বিৱৰণ লাভ কৰিবনে?</translation> <translation id="7055152154916055070">পুনৰ নির্দেশ কৰাটো অৱৰোধ কৰা হৈছে</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> - এই ভাষাটো ডাউনল'ড কৰিব পৰা নগ'ল। পাছত পুনৰ চেষ্টা কৰক।</translation> <translation id="8951232171465285730">Chromeএ আপোনাৰ <ph name="MEGABYTES" /> এমবি ডেটা ৰাহি কৰিছে</translation> <translation id="8955719471735800169">ওপৰলৈ যাওক</translation> +<translation id="8964479563882643397">নতুন ইনক’গনিট’ টেব খুলিবলৈ মেনুখন খোলক</translation> <translation id="8965591936373831584">বিবেচনাধীন হৈ আছে</translation> <translation id="8967427617812342790">পঢ়াৰ সূচীত যোগ দিয়ক</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>
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 d801164c..5b9fcda 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">ইউজারনেম কপি করুন</translation> <translation id="1592864538817356322">স্ট্যান্ডার্ড সুরক্ষা:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{১ টি নির্বাচিত আইটেম সরান}one{#টি নির্বাচিত আইটেম সরান}other{#টি নির্বাচিত আইটেম সরান}}</translation> +<translation id="1633659023549081553">Chrome-এর হোমপেজে নতুন কন্টেন্ট খুঁজুন</translation> <translation id="1641113438599504367">নিরাপদ ব্রাউজিং</translation> <translation id="164269334534774161">আপনি <ph name="CREATION_TIME" /> তারিখের এই পৃষ্ঠার একটি অফলাইন কপি দেখছেন</translation> <translation id="1644574205037202324">ইতিহাস</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">আপনি এটি স্বচ্ছন্দে পড়তে না পারা পর্যন্ত স্লাইডারটি টেনে আনুন৷ কোনো অনুচ্ছেদে দুবার-আলতো চাপার পরে পাঠ্যটিকে দেখতে অন্ততপক্ষে এইরকম বড় লাগা উচিত৷</translation> <translation id="2323763861024343754">সাইটের স্টোরেজ</translation> <translation id="2328985652426384049">সাইন ইন করতে পারছেন না</translation> +<translation id="2342601525305963189">Chrome সংক্রান্ত পরামর্শ:</translation> <translation id="234265804618409743">ক্যামেরা চালু করা যাচ্ছে না। কোনও সমস্যা হয়েছে।</translation> <translation id="2345671828921229300">কোনও শব্দ সার্চ করতে সেটি টাচ করে ধরে থাকুন</translation> <translation id="2349710944427398404">অ্যাকাউন্ট, বুকমার্ক এবং স্টোর করা সেটিংসসহ Chrome-এর ব্যবহার করা মোট ডেটা</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">আপনি যেসব URL দেখেন তা Google-এ পাঠানো হয়</translation> <translation id="2536728043171574184">এই পৃষ্ঠার একটি অফলাইন কপি দেখছেন</translation> <translation id="2546283357679194313">কুকিজ ও সাইট ডেটা</translation> +<translation id="2558692642259318568">আপনার ডিভাইসে অ্যাক্টিভিটি সেভ না করেই ব্রাউজ করার জন্য, ছদ্মবেশী মোড ব্যবহার করুন</translation> <translation id="2561519700418191927">ভিডিওর প্রিভিউ</translation> <translation id="2567385386134582609">ছবি</translation> <translation id="2567545343356994513">ঝুঁকিপূর্ণ ওয়েবসাইট, ডাউনলোড এবং এক্সটেনশনের জন্য আরও দ্রুত, সক্রিয় সুরক্ষা ব্যবস্থা</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">কার্ড নম্বর</translation> <translation id="2625189173221582860">পাসওয়ার্ড কপি করা হয়েছে</translation> <translation id="2631006050119455616">সংরক্ষিত হয়েছে</translation> +<translation id="2634905176438867146">ডিফল্ট হিসেবে Chrome কীভাবে সেট করবেন তা জানুন</translation> <translation id="2645657967708199252">আপনার <ph name="CONNECTION_TYPE" /> কানেকশনের ফলে ডাউনলোডের স্পিড কম হতে পারে</translation> <translation id="2647434099613338025">ভাষা যুক্ত করুন</translation> <translation id="2649068648233607930"><ph name="DOMAIN" /> আপনার ব্রাউজার ম্যানেজ করে</translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">দাম ট্র্যাক করা হচ্ছে</translation> <translation id="3037517125981011456">Chrome-এ সাইন-ইন করার প্রম্পট দেখাবে</translation> <translation id="3046945242843292318">পরবর্তী সময়ে এই সাইটে আরও তাড়াতাড়ি যান</translation> +<translation id="3055259925215945098">বুকমার্ক সরিয়ে দেওয়া হয়েছে</translation> <translation id="305593374596241526">লোকেশনটি বন্ধ, <ph name="BEGIN_LINK" />Android সেটিংস<ph name="END_LINK" /> থেকে এটি চালু করুন।</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" />টি বুকমার্ক}one{<ph name="BOOKMARKS_COUNT_MANY" />টি বুকমার্ক}other{<ph name="BOOKMARKS_COUNT_MANY" />টি বুকমার্ক}}</translation> <translation id="3062802207422175757">Chrome-এ আপনি যেসব নিবন্ধগুলি পড়তে পছন্দ করেন</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">ডিভাইসে সেভ করুন</translation> <translation id="3236059992281584593">১ মিনিট বাকি আছে</translation> <translation id="3237087289225714896">স্ট্যান্ডার্ড প্রিলোডিং:</translation> +<translation id="3237433641417325993">সাজেস্ট করা নিবন্ধ দেখার জন্য নিচের দিকে স্ক্রল করুন</translation> <translation id="3244271242291266297">মিমি</translation> <translation id="3245429137663807393">আপনি Chrome ব্যবহারের রিপোর্ট শেয়ার করলেও, আপনার দেখা URL তার মধ্যে অন্তর্ভুক্ত থাকে</translation> <translation id="3250563604907490871">আপনি ওয়াই-ফাইতে কানেক্ট করলে, ছবির বিবরণ আবার দেখা যাবে</translation> @@ -653,6 +659,7 @@ <translation id="4835385943915508971">অনুরোধকৃত সম্পদে Chrome এর অ্যাক্সেস নেই।</translation> <translation id="4837753911714442426">‘পৃষ্ঠা প্রিন্ট করুন’-এর বিকল্পগুলি খুলুন</translation> <translation id="4842092870884894799">পাসওয়ার্ড প্রজন্মের পপআপ দেখানো হচ্ছে</translation> +<translation id="4842515939542199281">আপনার ভয়েস ব্যবহার করে সার্চ করার জন্য, মাইক্রোফোনে ট্যাপ করুন</translation> <translation id="4850886885716139402">দেখুন</translation> <translation id="4860895144060829044">কল করুন</translation> <translation id="4864369630010738180">প্রবেশ করা হচ্ছে...</translation> @@ -699,6 +706,7 @@ <translation id="5091249083535528968">বেশি ব্যবহারের ডেটা</translation> <translation id="509429900233858213">একটি ত্রুটি ঘটেছে৷</translation> <translation id="510275257476243843">১ ঘণ্টা বাকি আছে</translation> +<translation id="5115811374190515607"><ph name="PRODUCT_NAME" />-এ</translation> <translation id="5118713593561876160">আগ্রহগুলি</translation> <translation id="5123685120097942451">ছদ্মবেশী ট্যাব</translation> <translation id="5126510351761255129">আপনার কার্ডটি যাচাই করুন</translation> @@ -803,6 +811,7 @@ <translation id="5749068826913805084">ফাইল ডাউনলোড করতে Chrome-এর জন্য স্টোরেজ অ্যাক্সেস প্রয়োজন।</translation> <translation id="5749237766298580851"><ph name="SEPARATOR" /> বন্ধ করার বিষয়টি সাজেস্ট করা হয়নি</translation> <translation id="5752232708629533680">শুধুমাত্র GIF শেয়ার করুন</translation> +<translation id="5753139477036638699">আপনি Chrome-এ সার্চ করতে আপনার ভয়েস ব্যবহার করতে পারবেন</translation> <translation id="5754350196967618083">Discover রিফ্রেশ করা যাচ্ছে না</translation> <translation id="5763382633136178763">ছদ্মবেশী ট্যাব</translation> <translation id="5763514718066511291">এই অ্যাপের ইউআরএল কপি করতে ট্যাপ করুন</translation> @@ -1014,6 +1023,7 @@ <translation id="6813446258015311409">Chrome-এ সাইন-ইন করার পৃষ্ঠা খোলা আছে।</translation> <translation id="6814033694018386318">আপনি Google-এ কী শেয়ার করেন</translation> <translation id="6817747507826986771">এই পৃষ্ঠা দ্রুত শেয়ার করুন। এই শর্টকার্ট এডিট করতে, টাচ করে ধরে থাকুন।</translation> +<translation id="6819199143469632133">ডিভাইস জুড়ে আপনার Google পরিষেবা পাওয়ার জন্য, সাইন-ইন করুন</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, ট্যাব বেছে নেওয়া হয়েছে</translation> <translation id="6828070228333235514">দাম ট্র্যাক করা বন্ধ করুন</translation> @@ -1052,6 +1062,7 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> ফিরিয়ে আনা হয়েছে</translation> <translation id="7029390216614421513">এই ফ্রেমের মধ্যে QR কোড/বারকোড রাখুন।</translation> <translation id="7029809446516969842">পাসওয়ার্ড</translation> +<translation id="7037830628447527439">আপনার Google অ্যাকাউন্ট ব্যবহার করে Chrome-এ সাইন-ইন করুন</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">ছবির বিবরণ পেতে চান?</translation> <translation id="7055152154916055070">রিডাইরেক্ট ব্লক করা হয়েছে:</translation> @@ -1406,6 +1417,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> - এই ভাষাটি ডাউনলোড করা যায়নি। পরে আবার চেষ্টা করুন।</translation> <translation id="8951232171465285730">Chrome আপনার জন্য <ph name="MEGABYTES" /> এমবি বাঁচিয়ে দিয়েছে</translation> <translation id="8955719471735800169">শীর্ষে ফিরে যান</translation> +<translation id="8964479563882643397">নতুন ছদ্মবেশী ট্যাব খোলার জন্য, মেনু খুলুন</translation> <translation id="8965591936373831584">বাকি আছে</translation> <translation id="8967427617812342790">পড়ার তালিকায় যোগ করুন</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>
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 1e7581c..764ebdd 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">Kopiranje korisničkog imena</translation> <translation id="1592864538817356322">Standardna zaštita:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{Ukloni 1 odabranu stavku}one{Ukloni # odabranu stavku}few{Ukloni # odabrane stavke}other{Ukloni # odabranih stavki}}</translation> +<translation id="1633659023549081553">Otkrijte novi sadržaj na početnoj stranici Chromea</translation> <translation id="1641113438599504367">Sigurno pregledanje</translation> <translation id="164269334534774161">Prikazana vam je kopija ove stranice bez mreže od <ph name="CREATION_TIME" /></translation> <translation id="1644574205037202324">Historija</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">Povlačite klizač dok vam tekst ne bude ugodan za čitanje. Nakon dvostrukog dodira na pasus, tekst bi trebao izgledati najmanje ove veličine.</translation> <translation id="2323763861024343754">Pohrana web lokacije</translation> <translation id="2328985652426384049">Nije se moguće prijaviti</translation> +<translation id="2342601525305963189">Savjeti za Crhome:</translation> <translation id="234265804618409743">Nije moguće otvoriti kameru. Nešto nije uredu.</translation> <translation id="2345671828921229300">Da pretražite, dodirnite i zadržite riječ</translation> <translation id="2349710944427398404">Ukupna količina podataka koju je Chrome iskoristio, uključujući račune, oznake i sačuvane postavke</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">URL-ovi koje posjetite šalju se Googleu</translation> <translation id="2536728043171574184">Gledate kopiju ove stranice van mreže</translation> <translation id="2546283357679194313">Kolačići i podaci web lokacije</translation> +<translation id="2558692642259318568">Da pregledate bez pohranjivanja aktivnosti na uređaj, isprobajte anonimni način rada</translation> <translation id="2561519700418191927">Pregledi videozapisa</translation> <translation id="2567385386134582609">SLIKA</translation> <translation id="2567545343356994513">Brža, proaktivna zaštita od opasnih web lokacija, preuzimanja i ekstenzija</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">Broj kartice</translation> <translation id="2625189173221582860">Zaporka je kopirana</translation> <translation id="2631006050119455616">Sačuvano</translation> +<translation id="2634905176438867146">Saznajte kako postaviti Chrome kao zadani preglednik</translation> <translation id="2645657967708199252">Vaša veza <ph name="CONNECTION_TYPE" /> može usporiti preuzimanje</translation> <translation id="2647434099613338025">Dodavanje jezika</translation> <translation id="2649068648233607930">Vašim preglednikom upravlja <ph name="DOMAIN" /></translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">Praćenje cijene</translation> <translation id="3037517125981011456">Prikazuje upite za prijavu na Chrome</translation> <translation id="3046945242843292318">Sljedeći put brže pristupite ovoj web lokaciji</translation> +<translation id="3055259925215945098">Oznaka je premještena</translation> <translation id="305593374596241526">Lokacija je isključena; uključite je u <ph name="BEGIN_LINK" />Postavkama Androida<ph name="END_LINK" />.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> oznaka}one{<ph name="BOOKMARKS_COUNT_MANY" /> oznaka}few{<ph name="BOOKMARKS_COUNT_MANY" /> oznake}other{<ph name="BOOKMARKS_COUNT_MANY" /> oznaka}}</translation> <translation id="3062802207422175757">Članci o vašim interesovanjima na Chromeu</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">Sačuvaj na uređaj</translation> <translation id="3236059992281584593">Još 1 min</translation> <translation id="3237087289225714896">Standardno predučitavanje:</translation> +<translation id="3237433641417325993">Kliznite nadolje da vidite predložene članke</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">Ako dijelite i izvještaje o korištenju Chromea, ti izvještaji uključuju URL-ove koje posjećujete</translation> <translation id="3250563604907490871">Opisi slika će se nastaviti kada se povežete s WiFi mrežom</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Chrome nema pristup traženom resursu.</translation> <translation id="4837753911714442426">Otvorite opcije za štampanje stranice</translation> <translation id="4842092870884894799">Prikazivanje skočnog prozora za izradu lozinke</translation> +<translation id="4842515939542199281">Da pretražujete glasom, dodirnite mikrofon</translation> <translation id="4850886885716139402">Prikaz</translation> <translation id="4860895144060829044">Pozovi</translation> <translation id="4864369630010738180">Prijavljivanje…</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">Prošireni podaci o korištenju</translation> <translation id="509429900233858213">Došlo je do greške.</translation> <translation id="510275257476243843">Još 1 sat</translation> +<translation id="5115811374190515607">u: <ph name="PRODUCT_NAME" /></translation> <translation id="5118713593561876160">Interesi</translation> <translation id="5123685120097942451">Anonimna kartica</translation> <translation id="5126510351761255129">Potvrdite karticu</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">Chromeu treba pristup pohrani za preuzimanje fajlova.</translation> <translation id="5749237766298580851">Isključeno <ph name="SEPARATOR" /> Ne preporučuje se</translation> <translation id="5752232708629533680">Dijeli samo GIF</translation> +<translation id="5753139477036638699">Pretraživanje u Chromeu možete obavljati glasom</translation> <translation id="5754350196967618083">Nije moguće osvježiti Discover</translation> <translation id="5763382633136178763">Anonimne kartice</translation> <translation id="5763514718066511291">Dodirnite da kopirate URL za ovu aplikaciju</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">Prijava na Chrome je otvorena.</translation> <translation id="6814033694018386318">Šta dijelite s Googleom</translation> <translation id="6817747507826986771">Brzo dijelite ovu stranicu. Dodirnite i zadržite da uredite ovu prečicu.</translation> +<translation id="6819199143469632133">Da imate sve Googleove proizvode koje koristite na svim uređajima, prijavite se</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, kartica, odabrana</translation> <translation id="6828070228333235514">Zaustavi praćenje cijene</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705">Vraćeno: <ph name="ITEM_TITLE" /></translation> <translation id="7029390216614421513">Postavite QR kôd/bar kôd u ovaj okvir.</translation> <translation id="7029809446516969842">Lozinke</translation> +<translation id="7037830628447527439">Prijavite se na Chrome pomoću svog Google računa</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Preuzeti opise slika?</translation> <translation id="7055152154916055070">Preusmjeravanje je blokirano:</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> – Preuzimanje ovog jezika nije uspjelo. Pokušajte ponovo kasnije.</translation> <translation id="8951232171465285730">Chrome vam je uštedio <ph name="MEGABYTES" /> MB</translation> <translation id="8955719471735800169">Nazad na vrh</translation> +<translation id="8964479563882643397">Da otvorite novu anonimnu karticu, otvorite meni</translation> <translation id="8965591936373831584">na čekanju</translation> <translation id="8967427617812342790">Dodaj na popis za čitanje</translation> <translation id="8968085728801125376">{TAB_COUNT,plural, =1{<ph name="INCOGNITO_TAB_COUNT" /> anonimna kartica i još <ph name="TAB_COUNT_ONE" /> kartica će se zatvoriti}one{<ph name="INCOGNITO_TAB_COUNT" /> anonimna kartica i još <ph name="TAB_COUNT_MANY" /> kartica će se zatvoriti}few{<ph name="INCOGNITO_TAB_COUNT" /> anonimne kartice i još <ph name="TAB_COUNT_MANY" /> kartice će se zatvoriti}other{<ph name="INCOGNITO_TAB_COUNT" /> anonimnih kartica i još <ph name="TAB_COUNT_MANY" /> kartica će se zatvoriti}}</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 c1fdc09..5122840 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">Nutzernamen kopieren</translation> <translation id="1592864538817356322">Standardschutz</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{1 ausgewähltes Element entfernen}other{# ausgewählte Elemente entfernen}}</translation> +<translation id="1633659023549081553">Entdecken Sie neue Inhalte auf der Startseite von Chrome</translation> <translation id="1641113438599504367">Safe Browsing</translation> <translation id="164269334534774161">Sie sehen sich momentan eine Offlinekopie dieser Seite vom <ph name="CREATION_TIME" /> an</translation> <translation id="1644574205037202324">Verlauf</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">Ziehen Sie den Schieberegler, bis Sie diesen Text problemlos lesen können. Nach dem Doppeltippen auf einen Abschnitt sollte der Text mindestens so groß sein.</translation> <translation id="2323763861024343754">Websitespeicher</translation> <translation id="2328985652426384049">Anmeldung nicht möglich</translation> +<translation id="2342601525305963189">Chrome-Tipps:</translation> <translation id="234265804618409743">Die Kamera kann nicht geöffnet werden. Ein Fehler ist aufgetreten.</translation> <translation id="2345671828921229300">Wenn Sie ein Wort suchen, berühren und halten sie es</translation> <translation id="2349710944427398404">Gesamtdaten, die von Chrome verwendet werden, wie Konten, Lesezeichen und gespeicherte Einstellungen</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">URLs von Websites, die Sie besuchen, werden an Google gesendet</translation> <translation id="2536728043171574184">Eine Offline-Kopie dieser Seite wird angezeigt.</translation> <translation id="2546283357679194313">Cookies und Websitedaten</translation> +<translation id="2558692642259318568">Mit dem Inkognitomodus können Sie surfen, ohne dass Ihre Aktivitäten auf Ihrem Gerät gespeichert werden</translation> <translation id="2561519700418191927">Videovorschauen</translation> <translation id="2567385386134582609">BILD</translation> <translation id="2567545343356994513">Schnellerer und dynamischerer Schutz gegen schädliche Websites, Downloads und Erweiterungen</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">Kartennummer</translation> <translation id="2625189173221582860">Passwort kopiert</translation> <translation id="2631006050119455616">Eingespart</translation> +<translation id="2634905176438867146">Hier erfahren Sie, wie Sie Chrome als Standardbrowser festlegen können</translation> <translation id="2645657967708199252">Ihr Download kann wegen Ihrer <ph name="CONNECTION_TYPE" />-Verbindung sehr lange dauern</translation> <translation id="2647434099613338025">Sprache hinzufügen</translation> <translation id="2649068648233607930">Ihr Browser wird von <ph name="DOMAIN" /> verwaltet</translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">Preis wird beobachtet</translation> <translation id="3037517125981011456">Aufforderungen für die Anmeldung in Chrome werden angezeigt</translation> <translation id="3046945242843292318">Diese Seite beim nächsten Mal schneller aufrufen</translation> +<translation id="3055259925215945098">Lesezeichen verschoben</translation> <translation id="305593374596241526">Die Standortermittlung ist deaktiviert. Sie können sie in den <ph name="BEGIN_LINK" />Android-Einstellungen<ph name="END_LINK" /> aktivieren.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> Lesezeichen}other{<ph name="BOOKMARKS_COUNT_MANY" /> Lesezeichen}}</translation> <translation id="3062802207422175757">Artikel zu Ihren Interessen in Chrome</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">Auf Gerät speichern</translation> <translation id="3236059992281584593">1 Minute übrig</translation> <translation id="3237087289225714896">Standard-Vorabladen:</translation> +<translation id="3237433641417325993">Scrollen Sie nach unten, um empfohlene Artikel zu sehen</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">Wenn Sie Chrome-Nutzungsberichte teilen, enthalten diese Berichte die von Ihnen aufgerufenen URLs</translation> <translation id="3250563604907490871">Bildbeschreibungen werden fortgesetzt, wenn Sie mit WLAN verbunden sind</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Chrome hat keinen Zugriff auf die angeforderte Ressource.</translation> <translation id="4837753911714442426">Optionen zum Drucken einer Seite öffnen</translation> <translation id="4842092870884894799">Pop-up-Fenster zur Passwortgenerierung wird angezeigt.</translation> +<translation id="4842515939542199281">Tippen Sie auf das Mikrofon, um die Sprachsuche zu verwenden</translation> <translation id="4850886885716139402">Anzeigen</translation> <translation id="4860895144060829044">Anrufen</translation> <translation id="4864369630010738180">Anmeldung erfolgt...</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">Erweiterte Nutzungsdaten</translation> <translation id="509429900233858213">Ein Fehler ist aufgetreten.</translation> <translation id="510275257476243843">1 Stunde übrig</translation> +<translation id="5115811374190515607">zu <ph name="PRODUCT_NAME" /></translation> <translation id="5118713593561876160">Interessen</translation> <translation id="5123685120097942451">Inkognitotab</translation> <translation id="5126510351761255129">Karte bestätigen</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">Chrome benötigt Speicherzugriff, um Dateien herunterladen zu können.</translation> <translation id="5749237766298580851">Aus <ph name="SEPARATOR" /> Nicht empfohlen</translation> <translation id="5752232708629533680">Nur GIF teilen</translation> +<translation id="5753139477036638699">Sie können in Chrome per Sprachbefehl suchen</translation> <translation id="5754350196967618083">Discover kann nicht aktualisiert werden</translation> <translation id="5763382633136178763">Inkognito-Tabs</translation> <translation id="5763514718066511291">Tippen, um die URL für diese App zu kopieren</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">In Chrome anmelden, geöffnet.</translation> <translation id="6814033694018386318">Folgendes wird mit Google geteilt</translation> <translation id="6817747507826986771">Diese Seite schnell teilen. Zum Ändern Schaltfläche gedrückt halten.</translation> +<translation id="6819199143469632133">Melden Sie sich an, um auf Ihre Inhalte bei Google zuzugreifen</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612">Tab „<ph name="TAB_TITLE" />“ ausgewählt</translation> <translation id="6828070228333235514">Preis nicht mehr beobachten</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705">Wiederhergestellt: <ph name="ITEM_TITLE" /></translation> <translation id="7029390216614421513">Positionieren Sie den QR- oder Barcode in diesem Bereich.</translation> <translation id="7029809446516969842">Passwörter</translation> +<translation id="7037830628447527439">Melden Sie sich mit Ihrem Google-Konto in Chrome an</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Bildbeschreibungen abrufen?</translation> <translation id="7055152154916055070">Weiterleitung blockiert:</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> – Diese Sprache konnte nicht heruntergeladen werden. Versuchen Sie es später noch einmal.</translation> <translation id="8951232171465285730">Dank Chrome haben Sie <ph name="MEGABYTES" /> MB eingespart</translation> <translation id="8955719471735800169">Zurück nach oben</translation> +<translation id="8964479563882643397">Öffnen Sie das Menü, um einen neuen Inkognitotab zu öffnen</translation> <translation id="8965591936373831584">ausstehend</translation> <translation id="8967427617812342790">Zur Leseliste hinzufügen</translation> <translation id="8968085728801125376">{TAB_COUNT,plural, =1{<ph name="INCOGNITO_TAB_COUNT" /> Inkognito- und <ph name="TAB_COUNT_ONE" /> weiterer Tab werden geschlossen}other{<ph name="INCOGNITO_TAB_COUNT" /> Inkognito- und <ph name="TAB_COUNT_MANY" /> weitere Tabs werden geschlossen}}</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 381c1b1..d076ce7 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">کپی کردن نام کاربری</translation> <translation id="1592864538817356322">محافظت استاندارد:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{حذف ۱ مورد انتخابشده}one{حذف # مورد انتخابشده}other{حذف # مورد انتخابشده}}</translation> +<translation id="1633659023549081553">محتوای جدید را در صفحه اصلی Chrome کاوش کنید</translation> <translation id="1641113438599504367">مرور ایمن</translation> <translation id="164269334534774161">شما در حال تماشای کپی آفلاین این صفحه از <ph name="CREATION_TIME" /> هستید</translation> <translation id="1644574205037202324">سابقه</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">لغزنده را بکشید تا زمانی که بتوانید این متن را به راحتی بخوانید. بعد از دو ضربه متوالی روی یک پاراگراف، اندازه نوشتار حداقل باید به این بزرگی باشد.</translation> <translation id="2323763861024343754">فضای ذخیرهسازی سایت</translation> <translation id="2328985652426384049">ورود به سیستم امکانپذیر نیست</translation> +<translation id="2342601525305963189">نکتههای Chrome:</translation> <translation id="234265804618409743">نمیتوان دوربین را باز کرد. مشکلی پیش آمد.</translation> <translation id="2345671828921229300">برای جستجو کردن، واژه را لمس کنید و نگه دارید</translation> <translation id="2349710944427398404">کل دادههای استفادهشده توسط Chrome، شامل حسابها، نشانکها و تنظیمات ذخیرهشده</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">نشانیهای وبی که بازدید میکنید به Google ارسال میشوند</translation> <translation id="2536728043171574184">مشاهده یک کپی آفلاین از این صفحه</translation> <translation id="2546283357679194313">کوکیها و دادههای سایت</translation> +<translation id="2558692642259318568">برای مرور بدون ذخیره فعالیت در دستگاه، «ناشناس» را امتحان کنید</translation> <translation id="2561519700418191927">پیشنمایش ویدیو</translation> <translation id="2567385386134582609">تصویر</translation> <translation id="2567545343356994513">محافظت سریعتر و پیشگیرانه دربرابر وبسایتها، بارگیریها، و افزونههای خطرناک</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">شماره کارت</translation> <translation id="2625189173221582860">گذرواژه کپی شد</translation> <translation id="2631006050119455616">ذخیره شده</translation> +<translation id="2634905176438867146">با نحوه تنظیم Chrome بهعنوان مرورگر پیشفرض آشنا شوید</translation> <translation id="2645657967708199252">اتصال <ph name="CONNECTION_TYPE" /> ممکن است سرعت بارگیری شما را کاهش دهد</translation> <translation id="2647434099613338025">افزودن زبان</translation> <translation id="2649068648233607930">مرورگرتان توسط <ph name="DOMAIN" /> مدیریت میشود</translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">درحال پیگیری قیمت</translation> <translation id="3037517125981011456">درخواستهایی برای ورود به سیستم Chrome نشان میدهد</translation> <translation id="3046945242843292318">دفعه بعدی سریعتر به این سایت دسترسی پیدا کنید</translation> +<translation id="3055259925215945098">نشانک منتقل شد</translation> <translation id="305593374596241526">مکان خاموش است، آن را در <ph name="BEGIN_LINK" />تنظیمات Android<ph name="END_LINK" /> روشن کنید.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> نشانک}one{<ph name="BOOKMARKS_COUNT_MANY" /> نشانک}other{<ph name="BOOKMARKS_COUNT_MANY" /> نشانک}}</translation> <translation id="3062802207422175757">مقالههای مربوط با علایقتان در Chrome</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">ذخیره کردن در دستگاه</translation> <translation id="3236059992281584593">۱ دقیقه باقیمانده است</translation> <translation id="3237087289225714896">پیشبارگیری استاندارد:</translation> +<translation id="3237433641417325993">برای دیدن مقالههای پیشنهادی، به پایین پیمایش کنید</translation> <translation id="3244271242291266297">ماه</translation> <translation id="3245429137663807393">اگر گزارشهای استفاده از Chrome را نیز همرسانی کنید، این گزارشها نشانیهای وبی را که بازدید میکنید دربرمیگیرند.</translation> <translation id="3250563604907490871">وقتی به Wi-Fi وصل شوید ویژگی توضیحات تصویر فعال خواهد شد</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Chrome به منبع درخواستی دسترسی ندارد.</translation> <translation id="4837753911714442426">باز کردن گزینههای چاپ صفحه</translation> <translation id="4842092870884894799">نمایش پنجره تولید گذرواژه</translation> +<translation id="4842515939542199281">برای جستجو با صدایتان، روی میکروفون ضربه بزنید</translation> <translation id="4850886885716139402">نما</translation> <translation id="4860895144060829044">تماس</translation> <translation id="4864369630010738180">در حال ورود به سیستم...</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">دادههای استفاده گسترده</translation> <translation id="509429900233858213">خطایی روی داد.</translation> <translation id="510275257476243843">۱ ساعت باقیمانده است</translation> +<translation id="5115811374190515607">به <ph name="PRODUCT_NAME" /></translation> <translation id="5118713593561876160">علایق</translation> <translation id="5123685120097942451">برگه ناشناس</translation> <translation id="5126510351761255129">کارتتان را تأیید کنید</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">Chrome برای بارگیری فایلها باید به حافظه دسترسی داشته باشد.</translation> <translation id="5749237766298580851">خاموش <ph name="SEPARATOR" /> توصیه نمیشود</translation> <translation id="5752232708629533680">فقط همرسانی GIF</translation> +<translation id="5753139477036638699">میتوانید از صدایتان برای جستجو در Chrome استفاده کنید</translation> <translation id="5754350196967618083">«یافتهها» بازخوانی نمیشود</translation> <translation id="5763382633136178763">برگههای ناشناس</translation> <translation id="5763514718066511291">برای کپی کردن نشانی وب این برنامه ضربه بزنید</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">ورود به سیستم Chrome، باز شد.</translation> <translation id="6814033694018386318">آنچه با Google همرسانی میکنید</translation> <translation id="6817747507826986771">بهسرعت این صفحه را همرسانی کنید. برای ویرایش این میانبر، لمس کنید و نگه دارید.</translation> +<translation id="6819199143469632133">برای دریافت موارد مربوط به Google در دستگاهها، به سیستم وارد شوید</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />، برگه، انتخابشده</translation> <translation id="6828070228333235514">توقف پیگیری قیمت</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705">تاریخ بازیابی <ph name="ITEM_TITLE" /></translation> <translation id="7029390216614421513">رمزینه پاسخسریع یا بارکد را در این قاب قرار دهید.</translation> <translation id="7029809446516969842">گذرواژهها</translation> +<translation id="7037830628447527439">با «حساب Google» به سیستم Chrome وارد شوید.</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">توضیحات تصویر دریافت شود؟</translation> <translation id="7055152154916055070">هدایت کردن مسدود شده است:</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> - این زبان بارگیری نشد. بعداً دوباره امتحان کنید.</translation> <translation id="8951232171465285730">Chrome <ph name="MEGABYTES" /> مگابایت از دادههای شما را ذخیره کرده است</translation> <translation id="8955719471735800169">برگشت به بالا</translation> +<translation id="8964479563882643397">برای باز کردن «برگه ناشناس»، روی منو ضربه بزنید</translation> <translation id="8965591936373831584">در انتظار</translation> <translation id="8967427617812342790">افزودن به فهرست خواندن</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>
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 5c275c7..752754e 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">उपयोगकर्ता नाम की कॉपी करें</translation> <translation id="1592864538817356322">सामान्य सुरक्षा मोड:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{1 चयनित आइटम निकालें}one{# चयनित आइटम निकालें}other{# चयनित आइटम निकालें}}</translation> +<translation id="1633659023549081553">Chrome के होम पेज पर जाकर, नया कॉन्टेंट खोजें</translation> <translation id="1641113438599504367">सुरक्षित ब्राउज़िंग</translation> <translation id="164269334534774161">आप <ph name="CREATION_TIME" /> से इस पेज की ऑफ़लाइन कॉपी देख रहे हैं</translation> <translation id="1644574205037202324">इतिहास</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">इस टेक्स्ट को आसानी से पढ़ने लायक बनाने के लिए, स्लाइडर को आगे की ओर खींचें. पैराग्राफ़ पर डबल-टैप करने के बाद, टेक्स्ट को इतना बड़ा दिखाई देना चाहिए.</translation> <translation id="2323763861024343754">साइट मेमोरी</translation> <translation id="2328985652426384049">साइन इन नहीं कर सकते</translation> +<translation id="2342601525305963189">Chrome से जुड़ी सलाह:</translation> <translation id="234265804618409743">कैमरा खाेला नहीं जा सकता. कोई गड़बड़ी हुई.</translation> <translation id="2345671828921229300">किसी शब्द को खोजने के लिए, उसे दबाकर रखें</translation> <translation id="2349710944427398404">Chrome द्वारा उपयोग किया गया कुल डेटा, जिसमें खाते, बुकमार्क और सहेजी गईं सेटिंग शामिल हैं</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">आपके देखे गए पेजों के यूआरएल, Google को भेजे जाते हैं</translation> <translation id="2536728043171574184">इस पृष्ठ की ऑफ़लाइन कॉपी देख रहे हैं</translation> <translation id="2546283357679194313">कुकी और साइट डेटा</translation> +<translation id="2558692642259318568">अपनी गतिविधि को डिवाइस में सेव किए बिना ब्राउज़ करने के लिए, गुप्त मोड आज़माएं</translation> <translation id="2561519700418191927">वीडियो की झलक की सेटिंग</translation> <translation id="2567385386134582609">इमेज</translation> <translation id="2567545343356994513">नुकसान पहुंचाने वाली वेबसाइटों, डाउनलोड, और एक्सटेंशन से तेज़ और प्रोऐक्टिव (बिना मांगे मिलने वाली) सुरक्षा</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">कार्ड संख्या</translation> <translation id="2625189173221582860">पासवर्ड कॉपी किया गया</translation> <translation id="2631006050119455616">बचाया गया</translation> +<translation id="2634905176438867146">Chrome को अपने डिफ़ॉल्ट ब्राउज़र के तौर पर सेट करने का तरीका जानें</translation> <translation id="2645657967708199252">हो सकता है कि आपका <ph name="CONNECTION_TYPE" /> कनेक्शन आपके डाउनलोड की स्पीड कम कर दे</translation> <translation id="2647434099613338025">भाषा जोड़ें</translation> <translation id="2649068648233607930"><ph name="DOMAIN" />, आपके ब्राउज़र को मैनेज करता है</translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">कीमत ट्रैक की जा रही है</translation> <translation id="3037517125981011456">Chrome में साइन इन करने के निर्देश दिखाता है</translation> <translation id="3046945242843292318">अगली बार यह साइट तेज़ी से ऐक्सेस हो</translation> +<translation id="3055259925215945098">बुकमार्क को एक से दूसरी जगह ले जाया गया</translation> <translation id="305593374596241526">स्थान सेवा बंद है, उसे <ph name="BEGIN_LINK" />Android सेटिंग<ph name="END_LINK" /> में चालू करें.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> बुकमार्क}one{<ph name="BOOKMARKS_COUNT_MANY" /> बुकमार्क}other{<ph name="BOOKMARKS_COUNT_MANY" /> बुकमार्क}}</translation> <translation id="3062802207422175757">Chrome पर आपकी पसंद के लेख</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">डिवाइस में सेव करें</translation> <translation id="3236059992281584593">1 मिनट शेष</translation> <translation id="3237087289225714896">पहले से लोड करने की स्टैंडर्ड सुविधा:</translation> +<translation id="3237433641417325993">सुझाए गए लेख देखने के लिए, नीचे की ओर स्क्रोल करें</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">अगर Chrome के इस्तेमाल से जुड़ी जानकारी देने वाली रिपोर्ट भी शेयर की जाती हैं, तो याद रखें कि आपके देखे गए पेजों के यूआरएल उनमें शामिल होते हैं</translation> <translation id="3250563604907490871">वाई-फ़ाई से कनेक्ट करने पर, इमेज की जानकारी जोड़ने की सुविधा फिर से शुरू हो जाएगी</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Chrome के पास अनुरोध किए गए संसाधन का एक्सेस नहीं है.</translation> <translation id="4837753911714442426">पेज प्रिंट करने के विकल्प खोलें</translation> <translation id="4842092870884894799">पासवर्ड जेनरेशन पॉपअप दिखाया जा रहा है</translation> +<translation id="4842515939542199281">बोलकर खोजने के लिए, माइक्रोफ़ोन पर टैप करें</translation> <translation id="4850886885716139402">देखें</translation> <translation id="4860895144060829044">कॉल करें</translation> <translation id="4864369630010738180">प्रवेश कर रहा है...</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">इस्तेमाल के बारे में ज़्यादा डेटा</translation> <translation id="509429900233858213">कोई गड़बड़ी हुई.</translation> <translation id="510275257476243843">1 घंटा शेष</translation> +<translation id="5115811374190515607"><ph name="PRODUCT_NAME" /> में ले जाया गया</translation> <translation id="5118713593561876160">रुचि</translation> <translation id="5123685120097942451">गुप्त टैब</translation> <translation id="5126510351761255129">कार्ड की पुष्टि करें</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">फ़ाइलें डाउनलोड करने के लिए Chrome को मेमोरी के ऐक्सेस की ज़रूरत होगी.</translation> <translation id="5749237766298580851"><ph name="SEPARATOR" /> को बंद करने का सुझाव नहीं दिया गया</translation> <translation id="5752232708629533680">सिर्फ़ GIF शेयर करें</translation> +<translation id="5753139477036638699">Chrome पर जानकारी खोजने के लिए, आवाज़ का इस्तेमाल किया जा सकता है</translation> <translation id="5754350196967618083">'डिस्कवर' को रीफ़्रेश नहीं किया जा सकता</translation> <translation id="5763382633136178763">गुप्त टैब</translation> <translation id="5763514718066511291">इस ऐप्लिकेशन का यूआरएल कॉपी करने के लिए टैप करें</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">'Chrome में साइन इन करें' पेज खोला गया.</translation> <translation id="6814033694018386318">आप Google के साथ क्या शेयर करते हैं</translation> <translation id="6817747507826986771">इस पेज को तेज़ी से शेयर करें. इस शॉर्टकट में बदलाव करने के लिए, दबाकर रखें.</translation> +<translation id="6819199143469632133">Google की सेवाएं अपने सभी डिवाइसों पर ऐक्सेस करने के लिए, Chrome में साइन इन करें</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, टैब, चुना गया</translation> <translation id="6828070228333235514">कीमत को ट्रैक करना रोकें</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> को पहले जैसा किया गया</translation> <translation id="7029390216614421513">इस फ़्रेम में क्यूआर/बार कोड रखें.</translation> <translation id="7029809446516969842">पासवर्ड</translation> +<translation id="7037830628447527439">अपने Google खाते से Chrome में साइन इन करें</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">क्या आप इमेज की जानकारी पाना चाहते हैं?</translation> <translation id="7055152154916055070">रीडायरेक्ट ब्लॉक किया गया:</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> - यह भाषा डाउनलोड नहीं की जा सकी. कुछ देर बाद कोशिश करें.</translation> <translation id="8951232171465285730">Chrome ने आपके <ph name="MEGABYTES" /> एमबी की बचत की</translation> <translation id="8955719471735800169">शीर्ष पर वापस जाएं</translation> +<translation id="8964479563882643397">नया गुप्त टैब खोलने के लिए, मेन्यू खोलें</translation> <translation id="8965591936373831584">डाउनलोड बाकी है</translation> <translation id="8967427617812342790">रीडिंग लिस्ट में जोड़ें</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>
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 b1c1921..edde01cd 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">Kopiraj korisničko ime</translation> <translation id="1592864538817356322">Standardna zaštita:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{Uklanjanje 1 odabrane stavke}one{Uklanjanje # odabrane stavke}few{Uklanjanje # odabranih stavki}other{Uklanjanje # odabranih stavki}}</translation> +<translation id="1633659023549081553">Otkrijte novi sadržaj na početnoj stranici Chromea</translation> <translation id="1641113438599504367">Sigurno pregledavanje</translation> <translation id="164269334534774161">Prikazuje se offline kopija stranice od <ph name="CREATION_TIME" /></translation> <translation id="1644574205037202324">Povijest</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">Pomičite klizač dok ne budete mogli čitati ovaj tekst bez poteškoća. Tekst bi trebao biti barem ovoliko velik nakon što dvaput dodirnete odlomak.</translation> <translation id="2323763861024343754">Pohrana web-lokacije</translation> <translation id="2328985652426384049">Prijava nije moguća</translation> +<translation id="2342601525305963189">Savjeti za Chrome:</translation> <translation id="234265804618409743">Kamera se ne može otvoriti. Nešto nije u redu.</translation> <translation id="2345671828921229300">Za pretraživanje dodirnite i držite riječ</translation> <translation id="2349710944427398404">Ukupna količina podataka koju Chrome upotrebljava, uključujući račune, oznake i spremljene postavke.</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">URL-ovi koje posjećujete šalju se Googleu</translation> <translation id="2536728043171574184">Prikaz izvanmrežne kopije stranice</translation> <translation id="2546283357679194313">Kolačići i podaci o web-lokacijama</translation> +<translation id="2558692642259318568">Isprobajte anonimni način da biste pregledavali bez spremanja aktivnosti na uređaj</translation> <translation id="2561519700418191927">Pregledi videozapisa</translation> <translation id="2567385386134582609">SLIKA</translation> <translation id="2567545343356994513">Brža, proaktivna zaštita od opasnih web-lokacija, preuzimanja i proširenja</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">Broj kartice</translation> <translation id="2625189173221582860">Zaporka je kopirana</translation> <translation id="2631006050119455616">Spremljeno</translation> +<translation id="2634905176438867146">Saznajte kako postaviti Chrome kao zadani preglednik</translation> <translation id="2645657967708199252">Vaša <ph name="CONNECTION_TYPE" /> veza mogla bi usporiti preuzimanje</translation> <translation id="2647434099613338025">Dodavanje jezika</translation> <translation id="2649068648233607930">Vašim preglednikom upravlja <ph name="DOMAIN" /></translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">Praćenje cijene</translation> <translation id="3037517125981011456">Prikazuje obavijesti za prijavu u Chrome</translation> <translation id="3046945242843292318">Sljedeći put brže otvorite ovu web-lokaciju</translation> +<translation id="3055259925215945098">Oznaka je premještena</translation> <translation id="305593374596241526">Lokacija je isključena. Uključite je u <ph name="BEGIN_LINK" />postavkama Androida<ph name="END_LINK" />.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> oznaka}one{<ph name="BOOKMARKS_COUNT_MANY" /> oznaka}few{<ph name="BOOKMARKS_COUNT_MANY" /> oznake}other{<ph name="BOOKMARKS_COUNT_MANY" /> oznaka}}</translation> <translation id="3062802207422175757">Članci o vašim interesima na Chromeu</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">Spremi na uređaj</translation> <translation id="3236059992281584593">Još 1 min</translation> <translation id="3237087289225714896">Standardno predučitavanje:</translation> +<translation id="3237433641417325993">Pomaknite se prema dolje da biste vidjeli predložene članke</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">Ako dijelite i izvješća o upotrebi Chromea, ta izvješća uključuju URL-ove koje posjećujete</translation> <translation id="3250563604907490871">Opisi slika nastavit će se kada se povežete s Wi-Fijem</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Chrome nema pristup zatraženom resursu.</translation> <translation id="4837753911714442426">Otvaranje opcija za ispis stranice</translation> <translation id="4842092870884894799">Prikazuje se skočni prozor generiranja zaporke</translation> +<translation id="4842515939542199281">Da biste pretraživali glasovno, dodirnite mikrofon</translation> <translation id="4850886885716139402">Prikaz</translation> <translation id="4860895144060829044">Poziv</translation> <translation id="4864369630010738180">Prijavljivanje...</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">Prošireni podaci o upotrebi</translation> <translation id="509429900233858213">Došlo je do pogreške.</translation> <translation id="510275257476243843">Još 1 sat</translation> +<translation id="5115811374190515607">u <ph name="PRODUCT_NAME" /></translation> <translation id="5118713593561876160">Interesi</translation> <translation id="5123685120097942451">Anonimna kartica</translation> <translation id="5126510351761255129">Potvrdite svoju karticu</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">Chrome treba pristup pohrani radi preuzimanja datoteka.</translation> <translation id="5749237766298580851">Isključeno <ph name="SEPARATOR" /> Ne preporučuje se</translation> <translation id="5752232708629533680">Podijeli samo GIF</translation> +<translation id="5753139477036638699">Chrome možete pretraživati upotrebom glasa</translation> <translation id="5754350196967618083">Nije moguće osvježiti Discover</translation> <translation id="5763382633136178763">Anonimne kartice</translation> <translation id="5763514718066511291">Dodirnite da biste kopirali URL za tu aplikaciju</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">Prijava u Chrome; otvoreno.</translation> <translation id="6814033694018386318">Što dijelite s Googleom</translation> <translation id="6817747507826986771">Brzo podijelite ovu stranicu. Da biste uredili taj prečac, dodirnite ga i zadržite pritisak.</translation> +<translation id="6819199143469632133">Prijavite se da biste imali pristup Googleovim stvarima na svim uređajima</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, kartica, odabrana</translation> <translation id="6828070228333235514">Zaustavi praćenje cijene</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705">Vraćeno: <ph name="ITEM_TITLE" /></translation> <translation id="7029390216614421513">Postavite QR ili crtični kôd u ovaj okvir.</translation> <translation id="7029809446516969842">Zaporke</translation> +<translation id="7037830628447527439">Prijavite se na Chrome svojim Google računom</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Primati opise slike?</translation> <translation id="7055152154916055070">Preusmjeravanje je blokirano:</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> – preuzimanje tog jezika nije uspjelo. Pokušajte ponovo kasnije.</translation> <translation id="8951232171465285730">Chrome vam je uštedio <ph name="MEGABYTES" /> MB</translation> <translation id="8955719471735800169">Natrag na vrh</translation> +<translation id="8964479563882643397">Da biste otvorili novu anonimnu karticu, otvorite izbornik</translation> <translation id="8965591936373831584">na čekanju</translation> <translation id="8967427617812342790">Dodaj na popis za čitanje</translation> <translation id="8968085728801125376">{TAB_COUNT,plural, =1{Bit će zatvorena <ph name="INCOGNITO_TAB_COUNT" /> anonimna i još <ph name="TAB_COUNT_ONE" /> kartica}one{Bit će zatvorena <ph name="INCOGNITO_TAB_COUNT" /> anonimna i još <ph name="TAB_COUNT_MANY" /> kartica}few{Bit će zatvorena <ph name="INCOGNITO_TAB_COUNT" /> anonimna i još <ph name="TAB_COUNT_MANY" /> kartice}other{Bit će zatvorena <ph name="INCOGNITO_TAB_COUNT" /> anonimna i još <ph name="TAB_COUNT_MANY" /> kartica}}</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 d7d740b..cde7b0e2e 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">Պատճենել օգտանունը</translation> <translation id="1592864538817356322">Սովորական պաշտպանություն՝</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{Հեռացնել ընտրված 1 տարրը}one{Հեռացնել ընտրված # տարրը}other{Հեռացնել ընտրված # տարրերը}}</translation> +<translation id="1633659023549081553">Դիտեք բովանդակության առաջարկներ Chrome-ի գլխավոր էջում</translation> <translation id="1641113438599504367">Անվտանգ դիտարկում</translation> <translation id="164269334534774161">Դուք դիտում եք տվյալ էջի <ph name="CREATION_TIME" />-ի անցանց պատճենը</translation> <translation id="1644574205037202324">Պատմություն</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">Քաշեք սահիչն այնպես, որ հարմարավետ լինի կարդալը: Պարբերության վրա երկու անգամ սեղմելուց հետո տեքստը պետք է այսպիսի չափ ունենա:</translation> <translation id="2323763861024343754">Կայքի օգտագործած տարածքը</translation> <translation id="2328985652426384049">Չհաջողվեց մուտք գործել</translation> +<translation id="2342601525305963189">Chrome-ին վերաբերող խորհուրդներ</translation> <translation id="234265804618409743">Չհաջողվեց բացել տեսախցիկը։ Սխալ առաջացավ։</translation> <translation id="2345671828921229300">Որոնելու համար հպեք բառին և պահեք</translation> <translation id="2349710944427398404">Chrome-ի օգտագործած ընդհանուր տարածքը, ներառյալ` հաշիվները, էջանիշները և պահված կարգավորումները</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">Ձեր այցելած էջերի URL-ներն ուղարկվում են Google-ին</translation> <translation id="2536728043171574184">Դուք դիտում եք տվյալ էջի անցանց պատճենը</translation> <translation id="2546283357679194313">Cookie ֆայլեր և կայքի տվյալներ</translation> +<translation id="2558692642259318568">Որպեսզի դիտարկիչի պատմությունը չպահվի սարքում, միացրեք ինկոգնիտո ռեժիմը</translation> <translation id="2561519700418191927">Տեսանյութերի նախադիտում</translation> <translation id="2567385386134582609">ՊԱՏԿԵՐ</translation> <translation id="2567545343356994513">Ավելի արագ և արդյունավետ պաշտպանություն վտանգավոր կայքերից, ընդլայնումներից և ներբեռնումներից</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">Քարտի համարը</translation> <translation id="2625189173221582860">Գաղտնաբառը պատճենվեց</translation> <translation id="2631006050119455616">Խնայվեց</translation> +<translation id="2634905176438867146">Իմացեք՝ ինչպես Chrome-ը դարձնել կանխադրված դիտարկիչ</translation> <translation id="2645657967708199252">Ներբեռնումը <ph name="CONNECTION_TYPE" /> ցանցի միջոցով կարող է դանդաղ կատարվել</translation> <translation id="2647434099613338025">Ավելացնել լեզու</translation> <translation id="2649068648233607930">Ձեր դիտարկիչը կառավարվում է <ph name="DOMAIN" /> կայքի կողմից</translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">Դուք հետևում եք այս ապրանքի գնին</translation> <translation id="3037517125981011456">Ցույց է տալիս հաղորդագրություն Chrome-ում մուտք գործելու համար</translation> <translation id="3046945242843292318">Հաջորդ անգամ ավելի արագ անցեք այս կայք</translation> +<translation id="3055259925215945098">Էջանիշը տեղափոխվեց</translation> <translation id="305593374596241526">Տեղորոշումն անջատված է: Միացրեք այն <ph name="BEGIN_LINK" />Android-ի կարգավորումներում<ph name="END_LINK" />:</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> էջանիշ}one{<ph name="BOOKMARKS_COUNT_MANY" /> էջանիշ}other{<ph name="BOOKMARKS_COUNT_MANY" /> էջանիշ}}</translation> <translation id="3062802207422175757">Ձեր հետաքրքրությունների հիման վրա ընտրված հոդվածներ՝ Chrome-ում</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">Պահել սարքում</translation> <translation id="3236059992281584593">Մնացել է 1 րոպե</translation> <translation id="3237087289225714896">Սովորական նախաբեռնում՝</translation> +<translation id="3237433641417325993">Ոլորեք ներքև՝ առաջարկվող հոդվածները տեսնելու համար</translation> <translation id="3244271242291266297">ամիս</translation> <translation id="3245429137663807393">Եթե դուք նաև ուղարկում եք Chrome-ի օգտագործման զեկույցներ, դրանցում կներառվեն ձեր այցելած URL-ները</translation> <translation id="3250563604907490871">Պատկերի նկարագրությունները կցուցադրվեն, երբ միանաք Wi-Fi-ին</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Հարցված ռեսուրսը հասանելի չէ Chrome-ին:</translation> <translation id="4837753911714442426">Բացել էջը տպելու տարբերակները</translation> <translation id="4842092870884894799">Ցուցադրվում է գաղտնաբառի ստեղծման ելնող պատուհանը</translation> +<translation id="4842515939542199281">Ձայնի միջոցով որոնելու համար հպեք խոսափողին</translation> <translation id="4850886885716139402">Տեսք</translation> <translation id="4860895144060829044">Զանգեք</translation> <translation id="4864369630010738180">Մուտք...</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">Օգտագործման լրացուցիչ տվյալներ</translation> <translation id="509429900233858213">Սխալ առաջացավ:</translation> <translation id="510275257476243843">Մնացել է 1 ժամ</translation> +<translation id="5115811374190515607"><ph name="PRODUCT_NAME" /></translation> <translation id="5118713593561876160">Հետաքրքրություններ</translation> <translation id="5123685120097942451">Ինկոգնիտո ներդիր</translation> <translation id="5126510351761255129">Հաստատեք ձեր քարտը</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">Ֆայլեր ներբեռնելու համար Chrome-ին անհրաժեշտ է պահեստի մուտք:</translation> <translation id="5749237766298580851">Անջատված է <ph name="SEPARATOR" /> Խորհուրդ չի տրվում</translation> <translation id="5752232708629533680">Կիսվել միայն GIF ֆայլով</translation> +<translation id="5753139477036638699">Դուք կարող եք որոնել Chrome-ում ձեր ձայնով</translation> <translation id="5754350196967618083">Չհաջողվեց թարմացնել Discover-ը</translation> <translation id="5763382633136178763">Ինկոգնիտո ներդիրներ</translation> <translation id="5763514718066511291">Հպեք՝ այս հավելվածի URL-ը պատճենելու համար</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">Մուտք գործել Chrome, բացված է։</translation> <translation id="6814033694018386318">Ինչ տեղեկություններ են փոխանցվում Google-ին</translation> <translation id="6817747507826986771">Արագ կիսվեք այս էջով։ Այս դյուրանցումը փոփոխելու համար հպեք դրան և պահեք։</translation> +<translation id="6819199143469632133">Google-ի ծառայություններից մի քանի սարքերում օգտվելու համար մուտք գործեք հաշիվ</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612">«<ph name="TAB_TITLE" />» ներդիրն ընտրված է</translation> <translation id="6828070228333235514">Դադարեցնել գների հետագծումը</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705">Վերականգնման ամսաթիվը՝ <ph name="ITEM_TITLE" /></translation> <translation id="7029390216614421513">Դիրքավորեք QR-կոդը կամ գծակոդը այս շրջանակի մեջ</translation> <translation id="7029809446516969842">Գաղտնաբառեր</translation> +<translation id="7037830628447527439">Մուտք գործեք Chrome ձեր Google հաշվով</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Ուզո՞ւմ եք ստանալ պատկերների նկարագրություններ</translation> <translation id="7055152154916055070">Վերահասցեավորումն արգելափակված է՝</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> լեզուն հնարավոր չէ ներբեռնել։ Փորձեք ավելի ուշ։</translation> <translation id="8951232171465285730">Chrome-ը խնայել է <ph name="MEGABYTES" /> ՄԲ տարածք</translation> <translation id="8955719471735800169">Հետ դեպի վերև</translation> +<translation id="8964479563882643397">Նոր ինկոգնիտո ներդիր բացելու համար բացեք ընտրացանկը</translation> <translation id="8965591936373831584">սպասում է</translation> <translation id="8967427617812342790">Ավելացնել ընթերցանության ցանկում</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>
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 dc36a819..24c7fd9 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
@@ -826,6 +826,7 @@ <translation id="5854512288214985237">Google-ға статистика немесе жаңылыс туралы есеп жіберілмеді.</translation> <translation id="5855546874025048181">Нақтылау: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">Бірдеңе дұрыс болмады. Бақыланатын баға жаңартылмады.</translation> +<translation id="5859968346865909126">Мұны "Параметрлер" бөлімінен қосуға не өшіруге болады.</translation> <translation id="5860033963881614850">Өшірулі</translation> <translation id="5860491529813859533">Қосу</translation> <translation id="5862731021271217234">Барлық құрылғылардан қойындыларды пайдалану үшін синхрондау функциясын қосыңыз</translation> @@ -1100,6 +1101,7 @@ <translation id="7359002509206457351">Төлеу әдістерін көру</translation> <translation id="7375125077091615385">Түрі:</translation> <translation id="7376560087009844242">Түртіп іздеу функциясын пайдалану кезінде беттегі мәтінді көбірек қамту арқылы дәлірек нәтижелер көресіз. Мұны кез келген уақытта <ph name="BEGIN_LINK" />параметрлерден<ph name="END_LINK" /> өзгертуге болады.</translation> +<translation id="7379900596734708416">Сайттар үшін қараңғы тақырып қолжетімді</translation> <translation id="7386842512861524348">Сайт байланысы қауіпсіз болмаса, Chrome сізге бұл туралы хабарлайды.</translation> <translation id="7396940094317457632"><ph name="FILE_NAME" />.</translation> <translation id="7400418766976504921">URL</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 b5022b19..d9e3a284 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">ಬಳಕೆದಾರರಹೆಸರು ನಕಲಿಸಿ</translation> <translation id="1592864538817356322">ಪ್ರಮಾಣಿತ ಸುರಕ್ಷತೆ:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{ಆಯ್ಕೆಮಾಡಲಾದ 1 ಐಟಂ ತೆಗೆದುಹಾಕಿ}one{ಆಯ್ಕೆಮಾಡಲಾದ # ಐಟಂಗಳನ್ನು ತೆಗೆದುಹಾಕಿ}other{ಆಯ್ಕೆಮಾಡಲಾದ # ಐಟಂಗಳನ್ನು ತೆಗೆದುಹಾಕಿ}}</translation> +<translation id="1633659023549081553">Chrome ನ ಮುಖಪುಟದಲ್ಲಿ ಹೊಸ ವಿಷಯವನ್ನು ಅನ್ವೇಷಿಸಿ</translation> <translation id="1641113438599504367">ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್</translation> <translation id="164269334534774161">ನೀವು <ph name="CREATION_TIME" /> ದಿನಾಂಕದಿಂದ ಈ ಪುಟದ ಆಫ್ಲೈನ್ ನಕಲನ್ನು ವೀಕ್ಷಿಸುತ್ತಿರುವಿರಿ</translation> <translation id="1644574205037202324">ಇತಿಹಾಸ</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">ನೀವು ಇದನ್ನು ಆರಾಮವಾಗಿ ಓದಲು ಸಾಧ್ಯವಾಗುವವರೆಗೆ ಸ್ಲೈಡರ್ ಎಳೆಯಿರಿ. ಪ್ಯಾರಾಗ್ರಾಫ್ನಲ್ಲಿ ಡಬಲ್ ಟ್ಯಾಪಿಂಗ್ ಮಾಡಿದ ನಂತರ ಪಠ್ಯವು ಕನಿಷ್ಠ ಇಷ್ಟು ದೊಡ್ಡದಾಗಿ ಕಾಣಿಸಬೇಕು.</translation> <translation id="2323763861024343754">ಸೈಟ್ ಸಂಗ್ರಹಣೆ</translation> <translation id="2328985652426384049">ಸೈನ್ ಇನ್ ಆಗಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> +<translation id="2342601525305963189">Chrome ಸಲಹೆಗಳು:</translation> <translation id="234265804618409743">ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ತೆರೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ. ಏನೋ ತಪ್ಪಾಗಿದೆ.</translation> <translation id="2345671828921229300">ಹುಡುಕಲು, ಪದವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ</translation> <translation id="2349710944427398404">ಖಾತೆಗಳು, ಬುಕ್ಮಾರ್ಕ್ಗಳು ಮತ್ತು ಉಳಿಸಿದ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ Chrome ಬಳಸಿದ ಒಟ್ಟು ಡೇಟಾ</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">ನೀವು ಭೇಟಿ ನೀಡುವ URL ಗಳನ್ನು Google ಗೆ ಕಳುಹಿಸಲಾಗುತ್ತದೆ</translation> <translation id="2536728043171574184">ಈ ಪುಟದ ಆಫ್ಲೈನ್ ನಕಲನ್ನು ವೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="2546283357679194313">ಕುಕೀಗಳು ಮತ್ತು ಸೈಟ್ ಡೇಟಾ</translation> +<translation id="2558692642259318568">ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಚಟುವಟಿಕೆಯನ್ನು ಉಳಿಸದೆಯೇ ಬ್ರೌಸ್ ಮಾಡಲು, ಅಜ್ಞಾತ ಮೋಡ್ ಅನ್ನು ಬಳಸಿ ನೋಡಿ</translation> <translation id="2561519700418191927">ವೀಡಿಯೊ ಪೂರ್ವವೀಕ್ಷಣೆಗಳು</translation> <translation id="2567385386134582609">ಚಿತ್ರ</translation> <translation id="2567545343356994513">ಅಪಾಯಕಾರಿ ವೆಬ್ಸೈಟ್ಗಳು, ಡೌನ್ಲೋಡ್ಗಳು ಮತ್ತು ವಿಸ್ತರಣೆಗಳ ವಿರುದ್ಧ ವೇಗವಾದ, ಪೂರ್ವಭಾವಿ ಸುರಕ್ಷತೆ</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">ಕಾರ್ಡ್ ಸಂಖ್ಯೆ</translation> <translation id="2625189173221582860">ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಕಲಿಸಲಾಗಿದೆ</translation> <translation id="2631006050119455616">ಉಳಿಸಲಾಗಿದೆ</translation> +<translation id="2634905176438867146">Chrome ಅನ್ನು ನಿಮ್ಮ ಡೀಫಾಲ್ಟ್ ಆಗಿ ಸೆಟ್ ಮಾಡುವುದು ಹೇಗೆ ಎಂದು ತಿಳಿಯಿರಿ</translation> <translation id="2645657967708199252">ನಿಮ್ಮ ಡೌನ್ಲೋಡ್ ಅನ್ನು ನಿಮ್ಮ <ph name="CONNECTION_TYPE" /> ಕನೆಕ್ಷನ್ ನಿಧಾನಗೊಳಿಸಬಹುದು</translation> <translation id="2647434099613338025">ಭಾಷೆಯನ್ನು ಸೇರಿಸಿ</translation> <translation id="2649068648233607930">ನಿಮ್ಮ ಬ್ರೌಸರ್ ಅನ್ನು <ph name="DOMAIN" /> ನಿರ್ವಹಿಸುತ್ತಿದೆ</translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">ದರವನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation> <translation id="3037517125981011456">Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಪ್ರಾಂಪ್ಟ್ಗಳನ್ನು ತೋರಿಸುತ್ತದೆ</translation> <translation id="3046945242843292318">ಮುಂದಿನ ಬಾರಿ ಈ ಸೈಟ್ ಅನ್ನು ತ್ವರಿತವಾಗಿ ಪ್ರವೇಶಿಸಿ</translation> +<translation id="3055259925215945098">ಬುಕ್ಮಾರ್ಕ್ ಸರಿಸಲಾಗಿದೆ</translation> <translation id="305593374596241526">ಸ್ಥಳ ಆಫ್ ಆಗಿದೆ; <ph name="BEGIN_LINK" />Android ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ<ph name="END_LINK" /> ಇದನ್ನು ಆನ್ ಮಾಡಿ.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> ಬುಕ್ಮಾರ್ಕ್}one{<ph name="BOOKMARKS_COUNT_MANY" /> ಬುಕ್ಮಾರ್ಕ್ಗಳು}other{<ph name="BOOKMARKS_COUNT_MANY" /> ಬುಕ್ಮಾರ್ಕ್ಗಳು}}</translation> <translation id="3062802207422175757">Chrome ನಲ್ಲಿ ನಿಮ್ಮ ಆಸಕ್ತಿಗಳಿಗೆ ಅನುಗುಣವಾಗಿರುವ ಲೇಖನಗಳು</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">ಸಾಧನದಲ್ಲಿ ಉಳಿಸಿ</translation> <translation id="3236059992281584593">1 ನಿಮಿಷ ಉಳಿದಿದೆ</translation> <translation id="3237087289225714896">ಪ್ರಮಾಣಿತ ಮುಂಚಿತ ಲೋಡ್ ಮಾಡುವಿಕೆ:</translation> +<translation id="3237433641417325993">ಸೂಚಿಸಿದ ಲೇಖನಗಳನ್ನು ನೋಡಲು ಕೆಳಗೆ ಸ್ಕ್ರಾಲ್ ಮಾಡಿ</translation> <translation id="3244271242291266297">ಮಿಮೀ</translation> <translation id="3245429137663807393">ನೀವು Chrome ಬಳಕೆಯ ವರದಿಗಳನ್ನು ಸಹ ಹಂಚಿಕೊಂಡರೆ, ಆ ವರದಿಗಳು ನೀವು ಭೇಟಿ ನೀಡುವ URL ಗಳನ್ನು ಒಳಗೊಂಡಿರುತ್ತವೆ</translation> <translation id="3250563604907490871">ನೀವು ವೈಫೈಗೆ ಕನೆಕ್ಟ್ ಮಾಡಿದಾಗ ಚಿತ್ರ ವಿವರಣೆಗಳು ಪುನರಾರಂಭಗೊಳ್ಳುತ್ತವೆ</translation> @@ -650,6 +656,7 @@ <translation id="4835385943915508971">ವಿನಂತಿಸಿದ ಸಂಪನ್ಮೂಲದಲ್ಲಿ Chrome ಪ್ರವೇಶವನ್ನು ಹೊಂದಿಲ್ಲ.</translation> <translation id="4837753911714442426">ಪುಟವನ್ನು ಮುದ್ರಿಸಲು ಆಯ್ಕೆಗಳನ್ನು ತೆರೆಯಿರಿ</translation> <translation id="4842092870884894799">ಪಾಸ್ವರ್ಡ್ ರಚನೆ ಪಾಪ್ಅಪ್ ತೋರಿಸಲಾಗುತ್ತಿದೆ</translation> +<translation id="4842515939542199281">ನಿಮ್ಮ ಧ್ವನಿಯ ಮೂಲಕ ಹುಡುಕಲು, ಮೈಕ್ರೊಫೋನ್ ಟ್ಯಾಪ್ ಮಾಡಿ</translation> <translation id="4850886885716139402">ವೀಕ್ಷಣೆ</translation> <translation id="4860895144060829044">ಕರೆ</translation> <translation id="4864369630010738180">ಸೈನ್ ಇನ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation> @@ -696,6 +703,7 @@ <translation id="5091249083535528968">ಬಳಕೆಯ ಡೇಟಾವನ್ನು ವಿಸ್ತರಿಸಲಾಗಿದೆ</translation> <translation id="509429900233858213">ದೋಷವೊಂದು ಕಾಣಿಸಿಕೊಂಡಿದೆ.</translation> <translation id="510275257476243843">1 ಗಂಟೆ ಉಳಿದಿದೆ</translation> +<translation id="5115811374190515607"><ph name="PRODUCT_NAME" /> ಗೆ</translation> <translation id="5118713593561876160">ಆಸಕ್ತಿಗಳು</translation> <translation id="5123685120097942451">ಅದೃಶ್ಯ ಟ್ಯಾಬ್</translation> <translation id="5126510351761255129">ನಿಮ್ಮ ಕಾರ್ಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ</translation> @@ -800,6 +808,7 @@ <translation id="5749068826913805084">ಫೈಲ್ಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲು Chrome ಗೆ ಸಂಗ್ರಹಣೆ ಪ್ರವೇಶ ಅಗತ್ಯವಿದೆ.</translation> <translation id="5749237766298580851">ಆಫ್ <ph name="SEPARATOR" /> ಶಿಫಾರಸು ಮಾಡಲಾಗಿಲ್ಲ</translation> <translation id="5752232708629533680">GIF ಮಾತ್ರ ಹಂಚಿಕೊಳ್ಳಿ</translation> +<translation id="5753139477036638699">Chrome ನಲ್ಲಿ ಹುಡುಕಲು ನೀವು ನಿಮ್ಮ ಧ್ವನಿಯನ್ನು ಬಳಸಬಹುದು</translation> <translation id="5754350196967618083">Discover ಅನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="5763382633136178763">ಅದೃಶ್ಯ ಟ್ಯಾಬ್ಗಳು</translation> <translation id="5763514718066511291">ಈ ಅಪ್ಲಿಕೇಶನ್ಗಾಗಿ URL ನಕಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ</translation> @@ -1011,6 +1020,7 @@ <translation id="6813446258015311409">Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ, ತೆರೆಯಲಾಗಿದೆ.</translation> <translation id="6814033694018386318">ನೀವು Google ಜೊತೆಗೆ ಏನನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತೀರಿ</translation> <translation id="6817747507826986771">ಈ ಪುಟವನ್ನು ತ್ವರಿತವಾಗಿ ಹಂಚಿಕೊಳ್ಳಿ. ಈ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಎಡಿಟ್ ಮಾಡಲು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿಯಿರಿ.</translation> +<translation id="6819199143469632133">ಸಾಧನಗಳಾದ್ಯಂತ ನಿಮ್ಮ Google ವಿಷಯವನ್ನು ಪಡೆಯಲು, ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" /> ಟ್ಯಾಬ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ</translation> <translation id="6828070228333235514">ಬೆಲೆ ಟ್ರ್ಯಾಕಿಂಗ್ ಅನ್ನು ನಿಲ್ಲಿಸಿ</translation> @@ -1049,6 +1059,7 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> ಅನ್ನು ಮರುಸ್ಥಾಪಿಸಲಾಗಿದೆ</translation> <translation id="7029390216614421513">ಈ ಫ್ರೇಮ್ನಲ್ಲಿ QR ಕೋಡ್/ಬಾರ್ಕೋಡ್ ಅನ್ನು ಇರಿಸಿ.</translation> <translation id="7029809446516969842">ಪಾಸ್ವರ್ಡ್ಗಳು</translation> +<translation id="7037830628447527439">ನಿಮ್ಮ Google ಖಾತೆಯ ಮೂಲಕ Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">ಚಿತ್ರದ ವಿವರಣೆ ಪಡೆಯಬೇಕೇ?</translation> <translation id="7055152154916055070">ಮರುನಿರ್ದೇಶಿಸುವಿಕೆಯನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ:</translation> @@ -1403,6 +1414,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> - ಈ ಭಾಷೆಯನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="8951232171465285730">ನಿಮ್ಮ <ph name="MEGABYTES" /> MB ಅನ್ನು Chrome ಉಳಿಸಿದೆ</translation> <translation id="8955719471735800169">ಮೇಲಕ್ಕೆ ಹಿಂತಿರುಗಿ</translation> +<translation id="8964479563882643397">ಹೊಸ ಅಜ್ಞಾತ ಮೋಡ್ ಟ್ಯಾಬ್ ಅನ್ನು ತೆರೆಯಲು, ಮೆನು ತೆರೆಯಿರಿ</translation> <translation id="8965591936373831584">ಬಾಕಿ ಉಳಿದಿರುವುದು</translation> <translation id="8967427617812342790">ಓದುವ ಪಟ್ಟಿಗೆ ಸೇರಿಸಿ</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>
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 a8c47665..f5bb0bec 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">Kopijuoti naudotojo vardą</translation> <translation id="1592864538817356322">Įprasta apsauga:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{Pašalinti 1 pasirinktą elementą}one{Pašalinti # pasirinktą elementą}few{Pašalinti # pasirinktus elementus}many{Pašalinti # pasirinkto elemento}other{Pašalinti # pasirinktų elementų}}</translation> +<translation id="1633659023549081553">Atraskite naujo turinio pagrindiniame „Chrome“ puslapyje</translation> <translation id="1641113438599504367">Saugus naršymas</translation> <translation id="164269334534774161">Peržiūrite neprisijungus pasiekiamą šio puslapio kopiją (<ph name="CREATION_TIME" />)</translation> <translation id="1644574205037202324">Istorija</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">Vilkite šliaužiklį, kol bus patogu skaityti šį tekstą. Du kartus palietus pastraipą, tekstas turėtų būti mažiausiai tokio dydžio.</translation> <translation id="2323763861024343754">Svetainės saugykla</translation> <translation id="2328985652426384049">Nepavyksta prisijungti</translation> +<translation id="2342601525305963189">„Chrome“ patarimai</translation> <translation id="234265804618409743">Kameros atidaryti nepavyko. Įvyko klaida.</translation> <translation id="2345671828921229300">Jei norite ieškoti, palieskite ir palaikykite žodį</translation> <translation id="2349710944427398404">Bendras „Chrome“ naudojamų duomenų kiekis, įskaitant paskyras, žymes ir išsaugotus nustatymus</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">URL, kuriais lankotės, siunčiami „Google“</translation> <translation id="2536728043171574184">Žiūrima neprisijungus naudojama šio puslapio kopija</translation> <translation id="2546283357679194313">Slapukai ir svetainės duomenys</translation> +<translation id="2558692642259318568">Jei norite naršyti neišsaugodami veiklos įrenginyje, išbandykite inkognito režimą</translation> <translation id="2561519700418191927">Vaizdo įrašų peržiūros</translation> <translation id="2567385386134582609">VAIZDAS</translation> <translation id="2567545343356994513">Spartesnė, veiksni apsauga nuo pavojingų svetainių, atsisiuntimų ir plėtinių</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">Kortelės numeris</translation> <translation id="2625189173221582860">Slaptažodis nukopijuotas</translation> <translation id="2631006050119455616">Išsaugota</translation> +<translation id="2634905176438867146">Sužinokite, kaip nustatyti „Chrome“ kaip numatytąją naršyklę</translation> <translation id="2645657967708199252">Dėl <ph name="CONNECTION_TYPE" /> ryšio atsisiuntimas gali sulėtėti</translation> <translation id="2647434099613338025">Pridėti kalbą</translation> <translation id="2649068648233607930">Jūsų naršyklę tvarko <ph name="DOMAIN" /></translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">Kaina stebima</translation> <translation id="3037517125981011456">Rodomi raginimai prisijungti prie „Chrome“.</translation> <translation id="3046945242843292318">Kitą kartą sparčiau pasiekite šią svetainę</translation> +<translation id="3055259925215945098">Žymė perkelta</translation> <translation id="305593374596241526">Vieta išjungta; įjunkite <ph name="BEGIN_LINK" />„Android“ nustatymuose<ph name="END_LINK" />.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> žymė}one{<ph name="BOOKMARKS_COUNT_MANY" /> žymė}few{<ph name="BOOKMARKS_COUNT_MANY" /> žymės}many{<ph name="BOOKMARKS_COUNT_MANY" /> žymės}other{<ph name="BOOKMARKS_COUNT_MANY" /> žymių}}</translation> <translation id="3062802207422175757">Su jūsų pomėgiais susiję straipsniai naršyklėje „Chrome“</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">Išsaugoti įrenginyje</translation> <translation id="3236059992281584593">Liko 1 min.</translation> <translation id="3237087289225714896">Įprastas išankstinis įkėlimas:</translation> +<translation id="3237433641417325993">Slinkite žemyn ir peržiūrėkite siūlomus straipsnius</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">Jei taip pat bendrinate „Chrome“ naudojimo ataskaitas, į tas ataskaitas įtraukiami URL, kuriais lankėtės</translation> <translation id="3250563604907490871">Vaizdų aprašai bus atnaujinti, kai prisijungsite prie „Wi-Fi“</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">„Chrome“ negali pasiekti pageidaujamo ištekliaus.</translation> <translation id="4837753911714442426">Atidaryti puslapio spausdinimo parinktis</translation> <translation id="4842092870884894799">Rodomas slaptažodžio generavimo iššokantysis langas</translation> +<translation id="4842515939542199281">Jei norite ieškoti balsu, palieskite mikrofoną</translation> <translation id="4850886885716139402">Žiūrėti</translation> <translation id="4860895144060829044">Skambinti</translation> <translation id="4864369630010738180">Prisijungiama...</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">Išplėstiniai naudojimo duomenys</translation> <translation id="509429900233858213">Įvyko klaida.</translation> <translation id="510275257476243843">Liko 1 val.</translation> +<translation id="5115811374190515607">į <ph name="PRODUCT_NAME" /></translation> <translation id="5118713593561876160">Pomėgiai</translation> <translation id="5123685120097942451">Inkognito skirtukas</translation> <translation id="5126510351761255129">Kortelės patvirtinimas</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">„Chrome“ reikia prieigos prie saugyklos failams atsisiųsti.</translation> <translation id="5749237766298580851">Išjungta <ph name="SEPARATOR" /> Nerekomenduojama</translation> <translation id="5752232708629533680">Bendrinti tik GIF</translation> +<translation id="5753139477036638699">Galite balsu ieškoti naršyklėje „Chrome“</translation> <translation id="5754350196967618083">Nepavyko atnaujinti „Discover“</translation> <translation id="5763382633136178763">Inkognito skirtukai</translation> <translation id="5763514718066511291">Palieskite, jei norite nukopijuoti šios programos URL</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">Prisijungimo prie „Chrome“ puslapis atidarytas.</translation> <translation id="6814033694018386318">Ką bendrinate su „Google“</translation> <translation id="6817747507826986771">Sparčiai bendrinkite šį puslapį. Jei norite redaguoti šį spartųjį klavišą, palieskite ir palaikykite.</translation> +<translation id="6819199143469632133">Jei norite pasiekti savo „Google“ duomenis skirtinguose įrenginiuose, prisijunkite</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612">„<ph name="TAB_TITLE" />“, skirtukas, pasirinktas</translation> <translation id="6828070228333235514">Stabdyti kainos stebėjimą</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705">Atkurta „<ph name="ITEM_TITLE" />“</translation> <translation id="7029390216614421513">QR arba brūkšninis kodas turėtų būti rodomas šiame rėmelyje.</translation> <translation id="7029809446516969842">Slaptažodžiai</translation> +<translation id="7037830628447527439">Prisijunkite prie „Chrome“ naudodami „Google“ paskyrą</translation> <translation id="7038956721828960940">chrome_vaizdas_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Gauti vaizdų aprašus?</translation> <translation id="7055152154916055070">Peradresavimas užblokuotas:</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> – nepavyko atsisiųsti šios kalbos. Vėliau bandykite dar kartą.</translation> <translation id="8951232171465285730">„Chrome“ sutaupė jums <ph name="MEGABYTES" /> MB</translation> <translation id="8955719471735800169">Į pradžią</translation> +<translation id="8964479563882643397">Jei norite atidaryti naują inkognito skirtuką, atidarykite meniu</translation> <translation id="8965591936373831584">laukiama</translation> <translation id="8967427617812342790">Prid. prie skait. sąrašo</translation> <translation id="8968085728801125376">{TAB_COUNT,plural, =1{<ph name="INCOGNITO_TAB_COUNT" /> inkognito ir dar <ph name="TAB_COUNT_ONE" /> skirtukas bus uždaryti}one{<ph name="INCOGNITO_TAB_COUNT" /> inkognito ir dar <ph name="TAB_COUNT_MANY" /> skirtukas bus uždaryti}few{<ph name="INCOGNITO_TAB_COUNT" /> inkognito ir dar <ph name="TAB_COUNT_MANY" /> skirtukai bus uždaryti}many{<ph name="INCOGNITO_TAB_COUNT" /> inkognito ir dar <ph name="TAB_COUNT_MANY" /> skirtuko bus uždaryti}other{<ph name="INCOGNITO_TAB_COUNT" /> inkognito ir dar <ph name="TAB_COUNT_MANY" /> skirtukų bus uždaryti}}</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 e1c7b7b..eabdc71 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
@@ -549,7 +549,7 @@ <translation id="4250229828105606438">Слика од екран</translation> <translation id="4256782883801055595">Лиценци за отворен код</translation> <translation id="4263656433980196874">Корисничкиот интерфејс за согласност за гласовно пребарување со „Помошникот“ е отворен на цел екран</translation> -<translation id="4269820728363426813">Копирај адреса на врска</translation> +<translation id="4269820728363426813">Копирај ја адресата на линкот</translation> <translation id="4290281343757112331">Да се преземе подоцна?</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Вклучете го заклучувањето на екранот во поставките за Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Нова картичка „Инкогнито“</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 6c07127d..13136d1 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">ഉപയോക്തൃനാമം പകർത്തുക</translation> <translation id="1592864538817356322">സ്റ്റാൻഡേർഡ് പരിരക്ഷ:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{തിരഞ്ഞെടുത്ത ഒരു ഇനം നീക്കംചെയ്യുക}other{തിരഞ്ഞെടുത്ത # ഇനങ്ങൾ നീക്കംചെയ്യുക}}</translation> +<translation id="1633659023549081553">Chrome-ന്റെ ഹോം പേജിൽ പുതിയ ഉള്ളടക്കം കണ്ടെത്തുക</translation> <translation id="1641113438599504367">സുരക്ഷിത ബ്രൗസിംഗ്</translation> <translation id="164269334534774161">നിങ്ങൾ ഈ പേജിന്റെ <ph name="CREATION_TIME" /> മുതലുള്ള ഓഫ്ലൈൻ പകർപ്പാണ് കാണുന്നത്</translation> <translation id="1644574205037202324">ചരിത്രം</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">നിങ്ങൾക്ക് ഇത് സൗകര്യപ്രദമായി വായിക്കാൻ കഴിയുന്നതുവരെ സ്ലൈഡർ വലിക്കുക. ഒരു ഖണ്ഡികയിൽ ഇരട്ട-ടാപ്പ് ചെയ്തതിനുശേഷം ടെക്സ്റ്റിന് ഈ വലുപ്പമെങ്കിലും ഉണ്ടായിരിക്കണം.</translation> <translation id="2323763861024343754">സൈറ്റ് സ്റ്റോറേജ്</translation> <translation id="2328985652426384049">സൈൻ ഇൻ ചെയ്യാനാകില്ല</translation> +<translation id="2342601525305963189">Chrome നുറുങ്ങുകൾ:</translation> <translation id="234265804618409743">നിങ്ങളുടെ ക്യാമറ തുറക്കാനാവുന്നില്ല. എന്തോ കുഴപ്പമുണ്ടായി.</translation> <translation id="2345671828921229300">തിരയുന്നതിന്, ഒരു പദം സ്പർശിച്ച് പിടിക്കുക</translation> <translation id="2349710944427398404">അക്കൗണ്ടുകളും ബുക്ക്മാർക്കുകളും സംരക്ഷിച്ച ക്രമീകരണവും ഉൾപ്പെടെ Chrome ഉപയോഗിക്കുന്ന മൊത്തം വിവരങ്ങൾ</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">നിങ്ങൾ സന്ദർശിക്കുന്ന URL-കൾ Google-ന് അയയ്ക്കുന്നു</translation> <translation id="2536728043171574184">ഈ പേജിന്റെ ഒരു ഓഫ്ലൈൻ പതിപ്പ് കാണുന്നു</translation> <translation id="2546283357679194313">കുക്കികളും സൈറ്റ് ഡാറ്റയും</translation> +<translation id="2558692642259318568">നിങ്ങളുടെ ഉപകരണത്തിൽ ആക്റ്റിവിറ്റി സംരക്ഷിക്കാതെ ബ്രൗസ് ചെയ്യാൻ അദൃശ്യ മോഡ് പരീക്ഷിക്കൂ</translation> <translation id="2561519700418191927">വീഡിയോ പ്രിവ്യൂകൾ</translation> <translation id="2567385386134582609">ചിത്രം</translation> <translation id="2567545343356994513">അപകടകരമായ വെബ്സൈറ്റുകൾ, ഡൗൺലോഡുകൾ, വിപുലീകരണങ്ങൾ എന്നിവയിൽ നിന്ന് വേഗത്തിലും സമയോചിതവുമായ പരിരക്ഷ</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">കാർഡ് നമ്പർ</translation> <translation id="2625189173221582860">പാസ്വേഡ് പകർത്തി</translation> <translation id="2631006050119455616">ലാഭിച്ചത്</translation> +<translation id="2634905176438867146">Chrome നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസറായി സജ്ജീകരിക്കുന്നത് എങ്ങനെയെന്ന് അറിയുക</translation> <translation id="2645657967708199252"><ph name="CONNECTION_TYPE" /> കണക്ഷൻ നിങ്ങളുടെ ഡൗൺലോഡിന്റെ വേഗത കുറച്ചേക്കാം</translation> <translation id="2647434099613338025">ഭാഷ ചേര്ക്കുക</translation> <translation id="2649068648233607930">നിങ്ങളുടെ ബ്രൗസർ മാനേജ് ചെയ്യുന്നത് <ph name="DOMAIN" /> ആണ്</translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">നിരക്ക് ട്രാക്ക് ചെയ്യുന്നു</translation> <translation id="3037517125981011456">Chrome-ൽ സൈൻ ഇൻ ചെയ്യാനുള്ള നിർദ്ദേശങ്ങൾ കാണിക്കുന്നു</translation> <translation id="3046945242843292318">അടുത്ത തവണ കൂടുതൽ വേഗത്തിൽ ഈ സൈറ്റിലേക്ക് എത്തുക</translation> +<translation id="3055259925215945098">ബുക്ക്മാർക്ക് നീക്കി</translation> <translation id="305593374596241526">ലൊക്കേഷൻ ഓഫാണ്; <ph name="BEGIN_LINK" />Android ക്രമീകരണത്തിൽ<ph name="END_LINK" /> അത് ഓണാക്കുക.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> ബുക്ക്മാർക്ക്}other{<ph name="BOOKMARKS_COUNT_MANY" /> ബുക്ക്മാർക്കുകൾ}}</translation> <translation id="3062802207422175757">Chrome-ൽ നിങ്ങൾക്ക് താൽപ്പര്യമുള്ള വിഷയങ്ങളിലെ ലേഖനങ്ങൾ കാണൂ</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">ഉപകരണത്തിൽ സംരക്ഷിക്കുക</translation> <translation id="3236059992281584593">ഒരു മിനിറ്റ് ശേഷിക്കുന്നു</translation> <translation id="3237087289225714896">സാധാരണ മുൻകൂട്ടി ലോഡ് ചെയ്യൽ:</translation> +<translation id="3237433641417325993">നിർദ്ദേശിക്കുന്ന ലേഖനങ്ങൾ കാണാൻ താഴേക്ക് സ്ക്രോൾ ചെയ്യുക</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">നിങ്ങൾ Chrome ഉപയോഗ റിപ്പോർട്ടുകളും പങ്കിടുന്നുവെങ്കിൽ ആ റിപ്പോർട്ടുകളിൽ നിങ്ങൾ സന്ദർശിക്കുന്ന URL-കളും ഉൾപ്പെടും</translation> <translation id="3250563604907490871">നിങ്ങൾ വൈഫൈയിലേക്ക് കണക്റ്റ് ചെയ്യുമ്പോൾ ചിത്രത്തിന്റെ വിവരണങ്ങൾ പുനരാരംഭിക്കും</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">അഭ്യർത്ഥിച്ച ഉറവിടത്തിലേക്ക് Chrome-ന് ആക്സസ് ഇല്ല.</translation> <translation id="4837753911714442426">പേജ് പ്രിന്റ് ചെയ്യുന്നതിനുള്ള ഓപ്ഷനുകൾ തുറക്കുക</translation> <translation id="4842092870884894799">പാസ്വേഡ് സൃഷ്ടിക്കൽ പോപ്പ് അപ്പ് കാണിക്കുന്നു</translation> +<translation id="4842515939542199281">നിങ്ങളുടെ ശബ്ദം ഉപയോഗിച്ച് തിരയാൻ മൈക്രോഫോൺ ടാപ്പ് ചെയ്യുക</translation> <translation id="4850886885716139402">കാണുക</translation> <translation id="4860895144060829044">വിളിക്കുക</translation> <translation id="4864369630010738180">സൈൻ ഇൻ ചെയ്യുന്നു...</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">വിപുലീകൃത ഉപയോഗ ഡാറ്റ</translation> <translation id="509429900233858213">ഒരു പിശക് സംഭവിച്ചു.</translation> <translation id="510275257476243843">ഒരു മണിക്കൂർ ശേഷിക്കുന്നു</translation> +<translation id="5115811374190515607"><ph name="PRODUCT_NAME" /> എന്നതിലേക്ക്</translation> <translation id="5118713593561876160">താൽപ്പര്യങ്ങൾ</translation> <translation id="5123685120097942451">അദൃശ്യ ടാബ്</translation> <translation id="5126510351761255129">നിങ്ങളുടെ കാർഡ് പരിശോധിച്ചുറപ്പിക്കുക</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">ഫയലുകൾ ഡൗൺലോഡ് ചെയ്യാൻ Chrome-ന് സ്റ്റോറേജ് ആക്സസ് ആവശ്യമുണ്ട്.</translation> <translation id="5749237766298580851">ഓഫാണ് <ph name="SEPARATOR" /> ശുപാർശ ചെയ്യുന്നില്ല</translation> <translation id="5752232708629533680">GIF മാത്രം പങ്കിടുക</translation> +<translation id="5753139477036638699">നിങ്ങളുടെ ശബ്ദം ഉപയോഗിച്ച് Chrome-ൽ തിരയാം</translation> <translation id="5754350196967618083">Discover റീഫ്രഷ് ചെയ്യാനാകുന്നില്ല</translation> <translation id="5763382633136178763">ആൾമാറാട്ട ടാബുകൾ</translation> <translation id="5763514718066511291">ഈ ആപ്പിനായുള്ള URL പകർത്താൻ ടാപ്പ് ചെയ്യുക</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">Chrome-ലേക്ക് സെെൻ ഇൻ ചെയ്യുക, തുറന്നു.</translation> <translation id="6814033694018386318">Google-മായി നിങ്ങൾ പങ്കിടുന്നത്</translation> <translation id="6817747507826986771">ഈ പേജ് വേഗത്തിൽ പങ്കിടുക. ഈ കുറുക്കുവഴി എഡിറ്റ് ചെയ്യാൻ, സ്പർശിച്ചുപിടിക്കുക.</translation> +<translation id="6819199143469632133">Google-ലുള്ള നിങ്ങളുടെ കാര്യങ്ങളെല്ലാം ഉപകരണങ്ങളിൽ ഉടനീളം ലഭ്യമാകാൻ സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, ടാബ്, തിരഞ്ഞെടുത്തു</translation> <translation id="6828070228333235514">നിരക്ക് ട്രാക്ക് ചെയ്യൽ നിർത്തുക</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> പുനഃസ്ഥാപിച്ചു</translation> <translation id="7029390216614421513">ഈ ഫ്രെയിമിൽ QR കോഡ്/ബാർകോഡ് സ്ഥാപിക്കുക.</translation> <translation id="7029809446516969842">പാസ്വേഡുകള്</translation> +<translation id="7037830628447527439">നിങ്ങളുടെ Google അക്കൗണ്ട് ഉപയോഗിച്ച് Chrome-ൽ സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">ചിത്ര വിവരണങ്ങൾ നേടണോ?</translation> <translation id="7055152154916055070">റീഡയറക്റ്റ് ചെയ്യുന്നത് ബ്ലോക്ക് ചെയ്തു</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> - ഈ ഭാഷ ഡൗൺലോഡ് ചെയ്യാനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="8951232171465285730">Chrome നിങ്ങളുടെ <ph name="MEGABYTES" /> MB ലാഭിച്ചു</translation> <translation id="8955719471735800169">മുകളിലേക്ക് മടങ്ങുക</translation> +<translation id="8964479563882643397">പുതിയ അദൃശ്യ ടാബ് തുറക്കാൻ മെനു തുറക്കുക</translation> <translation id="8965591936373831584">തീർച്ചപ്പെടുത്താത്തവ</translation> <translation id="8967427617812342790">വായന ലിസ്റ്റിൽ ചേർക്കുക</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>
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 6d7d9afb..cfd5ee1 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">Хэрэглэгчийн нэрийг хуулах</translation> <translation id="1592864538817356322">Стандарт хамгаалалт:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{Сонгосон 1 зүйлийг устгах}other{Сонгосон # зүйлийг устгах}}</translation> +<translation id="1633659023549081553">Chrome-н нүүр хуудаснаас шинэ контенттой танилцаарай</translation> <translation id="1641113438599504367">Аюулгүй хайлт</translation> <translation id="164269334534774161">Та энэ хуудасны офлайн хуулбарыг <ph name="CREATION_TIME" />-с харж байна</translation> <translation id="1644574205037202324">Түүх</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">Уншихад тохиромжтой болох хүртэл хүрээг томруулж татна уу. Бичвэр дээр хоёр удаа товшсоны дараагаар текстийн хэмжээ томорч харагдана.</translation> <translation id="2323763861024343754">Сайтын сан</translation> <translation id="2328985652426384049">Нэвтрэх боломжгүй</translation> +<translation id="2342601525305963189">Chrome-н зөвлөгөө:</translation> <translation id="234265804618409743">Таны камерыг нээх боломжгүй байна. Алдаа гарлаа.</translation> <translation id="2345671828921229300">Хайхын тулд үгийг удаан дарна уу</translation> <translation id="2349710944427398404">Бүртгэл, хавчуурга, хадгалсан тохиргоо зэрэг Chrome-н ашигласан нийт өгөгдөл</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">Таны зочилсон URL-г Google-д илгээдэг</translation> <translation id="2536728043171574184">Энэ хуудсын офлайн хуулбарыг харж байна</translation> <translation id="2546283357679194313">Cookies болон сайтын дата</translation> +<translation id="2558692642259318568">Үйл ажиллагааг төхөөрөмждөө хадгалахгүйгээр үзэхийн тулд Нууцлалтай горимыг туршиж үзээрэй</translation> <translation id="2561519700418191927">Видеоны урьдчилан үзэлтүүд</translation> <translation id="2567385386134582609">ЗУРАГ</translation> <translation id="2567545343356994513">Аюултай вебсайтууд, татаж авсан файл болон өргөтгөлийн эсрэг илүү хурдан, идэвхтэй хамгаалалт</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">Картын дугаар</translation> <translation id="2625189173221582860">Нууц үгийг хуулсан</translation> <translation id="2631006050119455616">Хадгалсан</translation> +<translation id="2634905176438867146">Chrome-г хэрхэн өгөгдмөл хөтөч болгон тохируулах талаар мэдэж аваарай</translation> <translation id="2645657967708199252">Таны <ph name="CONNECTION_TYPE" />-н холболт таны татан авалтыг удаашруулж болзошгүй</translation> <translation id="2647434099613338025">Хэл нэмэх</translation> <translation id="2649068648233607930">Таны хөтчийг <ph name="DOMAIN" /> удирддаг</translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">Үнийг хянаж байна</translation> <translation id="3037517125981011456">Chrome-д нэвтрэх сануулгыг харуулна</translation> <translation id="3046945242843292318">Дараагийн удаа энэ сайт руу илүү шуурхай очоорой</translation> +<translation id="3055259925215945098">Хавчуургыг зөөсөн байна</translation> <translation id="305593374596241526">Байршил идэвхгүй, үүнийг <ph name="BEGIN_LINK" />Андройд Тохиргоо<ph name="END_LINK" /> дотроос асаана уу.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> хавчуурга}other{<ph name="BOOKMARKS_COUNT_MANY" /> хавчуурга}}</translation> <translation id="3062802207422175757">Таны сонирхолтой холбоотой Chrome дээрх нийтлэлүүд</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">Төхөөрөмжид хадгалах</translation> <translation id="3236059992281584593">1 минут үлдсэн</translation> <translation id="3237087289225714896">Стандарт урьдчилан ачаалал:</translation> +<translation id="3237433641417325993">Санал болгож буй нийтлэлүүдийг харахын тулд доош гүйлгэнэ үү</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">Хэрэв та мөн Chrome-н ашиглалтын тайланг хуваалцвал тэдгээр тайланд таны зочилсон URL багтана</translation> <translation id="3250563604907490871">Таныг Wi-Fi-д холбогдох үед зургийн тайлбарыг үргэлжлүүлнэ</translation> @@ -650,6 +656,7 @@ <translation id="4835385943915508971">Chrome хүсэлт тавьсан нөөцөд хандах эрхгүй.</translation> <translation id="4837753911714442426">Хуудас хэвлэхийн тулд сонголтыг нээнэ үү</translation> <translation id="4842092870884894799">Нууц үг үүсгэх цонхыг харуулж байна</translation> +<translation id="4842515939542199281">Дуу хоолойгоо ашиглан хайлт хийхийн тулд микрофон дээр товшино уу</translation> <translation id="4850886885716139402">Харах</translation> <translation id="4860895144060829044">Дуудлага</translation> <translation id="4864369630010738180">Нэвтэрч байна…</translation> @@ -696,6 +703,7 @@ <translation id="5091249083535528968">Өргөтгөсөн ашиглалтын өгөгдөл</translation> <translation id="509429900233858213">Алдаа гарлаа.</translation> <translation id="510275257476243843">1 цаг үлдсэн</translation> +<translation id="5115811374190515607"><ph name="PRODUCT_NAME" /> хаягт</translation> <translation id="5118713593561876160">Сонирхол</translation> <translation id="5123685120097942451">Нууцлалтай таб</translation> <translation id="5126510351761255129">Картаа баталгаажуулах</translation> @@ -800,6 +808,7 @@ <translation id="5749068826913805084">Файл татахын тулд Chrome-д санах ойд хандах зөвшөөрөл шаардлагатай.</translation> <translation id="5749237766298580851">Унтраалттай <ph name="SEPARATOR" /> Зөвлөдөггүй</translation> <translation id="5752232708629533680">Зөвхөн GIF хуваалцана уу</translation> +<translation id="5753139477036638699">Та Chrome-д хайлт хийхдээ дуу хоолойгоо ашиглах боломжтой</translation> <translation id="5754350196967618083">Discover-г сэргээх боломжгүй байна</translation> <translation id="5763382633136178763">Мэдээний нууцлалтай цонхууд</translation> <translation id="5763514718066511291">URL-г энэ аппад хуулах бол товшино уу</translation> @@ -1011,6 +1020,7 @@ <translation id="6813446258015311409">Chrome-д нэвтэрнэ үү, нээсэн.</translation> <translation id="6814033694018386318">Таны Google-тэй хуваалцдаг зүйл</translation> <translation id="6817747507826986771">Энэ хуудсыг шуурхай хуваалцаарай. Энэ товчлолыг засахын тулд хүрээд удаан дарна уу.</translation> +<translation id="6819199143469632133">Google-н зүйлээ төхөөрөмжөөр авахын тулд нэвтэрнэ үү</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, таб, сонгосон</translation> <translation id="6828070228333235514">Үнэ хянахыг зогсоох</translation> @@ -1049,6 +1059,7 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" />-г сэргээсэн</translation> <translation id="7029390216614421513">Энэ хүрээнд QR код/ шугаман код байрлуулна уу.</translation> <translation id="7029809446516969842">Нууц үг</translation> +<translation id="7037830628447527439">Chrome-д Google Бүртгэлээрээ нэвтэрнэ үү</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Зургийн тайлбар авах уу?</translation> <translation id="7055152154916055070">Дахин чиглүүлэлтийг блоклосон:</translation> @@ -1403,6 +1414,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> - Энэ хэлийг татаж чадсангүй. Дараа дахин оролдоно уу.</translation> <translation id="8951232171465285730">Chrome <ph name="MEGABYTES" /> МБ-ыг хэмнэсэн</translation> <translation id="8955719471735800169">Дээшээ очих</translation> +<translation id="8964479563882643397">Шинэ Нууцлалтай таб нээхийн тулд цэсийг нээнэ үү</translation> <translation id="8965591936373831584">хүлээгдэж байна</translation> <translation id="8967427617812342790">Унших жагсаалтад нэмэх</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>
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 020c3471..bd0e0dd 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">वापरकर्ता नाव कॉपी करा</translation> <translation id="1592864538817356322">साधारण संरक्षण:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{1 निवडलेला आयटम काढून टाका}other{# निवडलेले आयटम काढून टाका}}</translation> +<translation id="1633659023549081553">Chrome च्या होम पेजवर नवीन आशय पहा</translation> <translation id="1641113438599504367">सुरक्षित ब्राउझिंग</translation> <translation id="164269334534774161">तुम्ही <ph name="CREATION_TIME" /> पासून या पेजची ऑफलाइन प्रत पाहत आहात</translation> <translation id="1644574205037202324">इतिहास</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">तुम्ही हे व्यवस्थित वाचू शकण्यापार्यंत स्लायडर ड्रॅग करा. परिच्छेदावर डबल-टॅपिंग केल्यानंतर मजकूर कमीत कमी यापेक्षा मोठा दिसावा.</translation> <translation id="2323763861024343754">साइट स्टोरेज</translation> <translation id="2328985652426384049">साइन इन करू शकत नाही</translation> +<translation id="2342601525305963189">Chrome संबंधित टिपा:</translation> <translation id="234265804618409743">तुमचा कॅमेरा उघडू शकत नाही. काहीतरी चूक झाली.</translation> <translation id="2345671828921229300">शोधण्यासाठी, शब्दाला स्पर्श करा आणि धरून ठेवा</translation> <translation id="2349710944427398404">खाती, बुकमार्क आणि सेव्ह केलेल्या सेटिंग्जसह, Chrome ने वापरलेला एकूण डेटा</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">Google ला तुम्ही भेट दिलेल्या URLs पाठवल्या जातात</translation> <translation id="2536728043171574184">या पेजची ऑफलाइन प्रत पाहत आहे</translation> <translation id="2546283357679194313">कुकीज आणि साइट डेटा</translation> +<translation id="2558692642259318568">तुमच्या डिव्हाइसवर अॅक्टिव्हिटी सेव्ह न करता ब्राउझ करण्यासाठी, गुप्त मोड वापरून पहा</translation> <translation id="2561519700418191927">व्हिडिओची पूर्वावलोकने</translation> <translation id="2567385386134582609">इमेज</translation> <translation id="2567545343356994513">धोकादायक वेबसाइट, डाउनलोड आणि एक्स्टेंशनपासून अधिक जलद, प्रोअॅक्टिव्ह संरक्षण</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">कार्ड नंबर</translation> <translation id="2625189173221582860">पासवर्ड कॉपी केला</translation> <translation id="2631006050119455616">वाचवला</translation> +<translation id="2634905176438867146">Chrome ला तुमचे डीफॉल्ट ब्राउझर म्हणून कसे सेट करावे हे जाणून घ्या</translation> <translation id="2645657967708199252">तुमच्या <ph name="CONNECTION_TYPE" /> कनेक्शनमुळे तुमच्या डाउनलोडचा वेग कमी होऊ शकतो</translation> <translation id="2647434099613338025">भाषा जोडा</translation> <translation id="2649068648233607930">तुमचा ब्राउझर <ph name="DOMAIN" /> द्वारे व्यवस्थापित केला जातो</translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">किमतीचा माग ठेवत आहे</translation> <translation id="3037517125981011456">Chrome मध्ये साइन इन करण्यासाठी सूचना दाखवते</translation> <translation id="3046945242843292318">पुढील वेळी या साइटवर आणखी जलद जा</translation> +<translation id="3055259925215945098">बुकमार्क हलवले आहेत</translation> <translation id="305593374596241526">स्थान बंद आहे; <ph name="BEGIN_LINK" />Android सेटिंग्ज<ph name="END_LINK" /> मध्ये हे सुरू करा.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> बुकमार्क}other{<ph name="BOOKMARKS_COUNT_MANY" /> बुकमार्क}}</translation> <translation id="3062802207422175757">Chrome वरील तुमच्या स्वारस्यांविषयी लेख</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">डिव्हाइसमध्ये सेव्ह करा</translation> <translation id="3236059992281584593">1 मिनिट शिल्लक</translation> <translation id="3237087289225714896">साधारण प्रीलोडिंग:</translation> +<translation id="3237433641417325993">सुचवलेले लेख पाहण्यासाठी खाली स्क्रोल करा</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">तुम्ही Chrome वापर अहवालदेखील शेअर केल्यास, त्या अहवालांमध्ये तुम्ही भेट दिलेल्या URLs चा समावेश होतो</translation> <translation id="3250563604907490871">तुम्ही वाय-फायशी कनेक्ट करता तेव्हा इमेजची वर्णने पुन्हा सुरू होतील</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Chrome ला विनंती केलेल्या संसाधनांचा ॲक्सेस नाही.</translation> <translation id="4837753911714442426">पेज प्रिंट करण्यासाठी पर्याय उघडा</translation> <translation id="4842092870884894799">पासवर्ड निर्मिती पॉपअप दाखवत आहे</translation> +<translation id="4842515939542199281">तुमचा आवाज वापरून शोधण्यासाठी, मायक्रोफोनवर टॅप करा</translation> <translation id="4850886885716139402">पहा</translation> <translation id="4860895144060829044">कॉल करा</translation> <translation id="4864369630010738180">साइन इन करत आहे...</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">वाढलेला वापर डेटा</translation> <translation id="509429900233858213">एक एरर आली आहे.</translation> <translation id="510275257476243843">1 तास शिल्लक</translation> +<translation id="5115811374190515607"><ph name="PRODUCT_NAME" /> वर</translation> <translation id="5118713593561876160">स्वारस्ये</translation> <translation id="5123685120097942451">गुप्त टॅब</translation> <translation id="5126510351761255129">तुमच्या कार्डाची पडताळणी करा</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">Chrome ला फाइल डाउनलोड करण्यासाठी स्टोरेज ॲक्सेस आवश्यक आहे.</translation> <translation id="5749237766298580851">बंद <ph name="SEPARATOR" /> शिफारस केली जात नाही</translation> <translation id="5752232708629533680">फक्त GIF शेअर करा</translation> +<translation id="5753139477036638699">तुम्ही Chrome मध्ये शोधण्यासाठी तुमचा आवाज वापरू शकता</translation> <translation id="5754350196967618083">Discover रिफ्रेश करू शकत नाही</translation> <translation id="5763382633136178763">गुप्त टॅब</translation> <translation id="5763514718066511291">या ॲपची URL कॉपी करण्यासाठी टॅप करा</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">Chrome मध्ये साइन इन करा, उघडले.</translation> <translation id="6814033694018386318">तुम्ही Google सोबत काय शेअर करता</translation> <translation id="6817747507826986771">हे पेज झटपट शेअर करा. हा शॉर्टकट संपादित करण्यासाठी, स्पर्श करा आणि धरून ठेवा.</translation> +<translation id="6819199143469632133">सर्व डिव्हाइसवर तुमच्या Google संबंधित गोष्टी मिळवण्यासाठी, साइन इन करा</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" /> हा टॅब निवडला</translation> <translation id="6828070228333235514">किमतीचा माग ठेवणे बंद करा</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> रिस्टोअर केले</translation> <translation id="7029390216614421513">QR कोड/बारकोड या फ्रेममध्ये बसवा.</translation> <translation id="7029809446516969842">पासवर्ड</translation> +<translation id="7037830628447527439">तुमचे Google खाते वापरून Chrome मध्ये साइन इन करा</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">इमेजची वर्णने मिळवायची का?</translation> <translation id="7055152154916055070">रीडिरेक्ट ब्लॉक केले:</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> - ही भाषा डाउनलोड करता आली नाही. नंतर पुन्हा प्रयत्न करा.</translation> <translation id="8951232171465285730">Chrome ने तुमच्यासाठी <ph name="MEGABYTES" /> MB सेव्ह केले</translation> <translation id="8955719471735800169">शीर्षस्थानाकडे परत जा</translation> +<translation id="8964479563882643397">नवीन गुप्त टॅब उघडण्यासाठी, मेनू उघडा</translation> <translation id="8965591936373831584">प्रलंबित</translation> <translation id="8967427617812342790">वाचन सूचीमध्ये जोडा</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>
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 446e0fbb..a4519bd 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">Kopiér brukernavnet</translation> <translation id="1592864538817356322">Standardbeskyttelse:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{Fjern 1 valgt element}other{Fjern # valgte elementer}}</translation> +<translation id="1633659023549081553">Oppdag nytt innhold på startsiden for Chrome</translation> <translation id="1641113438599504367">Safe Browsing</translation> <translation id="164269334534774161">Du ser en lokal kopi av denne siden fra <ph name="CREATION_TIME" /></translation> <translation id="1644574205037202324">Logg</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">Dra glidebryteren til du kan lese dette uten problemer. Når du har dobbelttrykket på et avsnitt, bør teksten være minst like stor som dette.</translation> <translation id="2323763861024343754">Nettstedslagring</translation> <translation id="2328985652426384049">Kan ikke logge på</translation> +<translation id="2342601525305963189">Chrome-tips:</translation> <translation id="234265804618409743">Kan ikke åpne kameraet. Noe gikk galt.</translation> <translation id="2345671828921229300">For å søke, trykk og hold inne på et ord</translation> <translation id="2349710944427398404">Total datamengde som brukes av Chrome, deriblant kontoer, bokmerker og lagrede innstillinger</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">Nettadresser du besøker, sendes til Google</translation> <translation id="2536728043171574184">Ser på en lokalt lagret versjon av denne siden</translation> <translation id="2546283357679194313">Informasjonskapsler og data fra nettsteder</translation> +<translation id="2558692642259318568">For å surfe uten å lagre aktivitet på enheten, prøv Inkognito</translation> <translation id="2561519700418191927">Videoforhåndsvisninger</translation> <translation id="2567385386134582609">BILDE</translation> <translation id="2567545343356994513">Raskere, proaktiv beskyttelse mot farlige nettsteder, nedlastinger og utvidelser</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">Kortnummer</translation> <translation id="2625189173221582860">Passordet er kopiert</translation> <translation id="2631006050119455616">Spart</translation> +<translation id="2634905176438867146">Finn ut hvordan du angir Chrome som standard</translation> <translation id="2645657967708199252"><ph name="CONNECTION_TYPE" />-tilkoblingen din kan gjøre at nedlastingen går tregt</translation> <translation id="2647434099613338025">Legg til språk</translation> <translation id="2649068648233607930">Nettleseren administreres av <ph name="DOMAIN" /></translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">Sporer prisen</translation> <translation id="3037517125981011456">Viser beskjeder om å logge på Chrome</translation> <translation id="3046945242843292318">Åpne dette nettstedet raskere neste gang</translation> +<translation id="3055259925215945098">Bokmerket er flyttet</translation> <translation id="305593374596241526">Posisjon er slått av. Slå den på i <ph name="BEGIN_LINK" />Android-innstillingene<ph name="END_LINK" />.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> bokmerke}other{<ph name="BOOKMARKS_COUNT_MANY" /> bokmerker}}</translation> <translation id="3062802207422175757">Artikler om interessene dine i Chrome</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">Lagre på enheten</translation> <translation id="3236059992281584593">1 minutt igjen</translation> <translation id="3237087289225714896">Standard forhåndslasting:</translation> +<translation id="3237433641417325993">Rull ned for å se foreslåtte artikler</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">Hvis du også deler Chrome-bruksrapporter, inneholder disse rapportene nettadressene du besøker</translation> <translation id="3250563604907490871">Bildebeskrivelser gjenopptas når du kobler til Wi-Fi</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Chrome har ikke tilgang til den forespurte ressursen.</translation> <translation id="4837753911714442426">Åpne alternativene for å skrive ut siden</translation> <translation id="4842092870884894799">Viser forgrunnsvinduet for passordgenerering</translation> +<translation id="4842515939542199281">For å søke med stemmen, trykk på mikrofonen</translation> <translation id="4850886885716139402">Visning</translation> <translation id="4860895144060829044">Ring</translation> <translation id="4864369630010738180">Logger på ...</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">Utvidede bruksdata</translation> <translation id="509429900233858213">Det oppsto en feil.</translation> <translation id="510275257476243843">1 time igjen</translation> +<translation id="5115811374190515607">til <ph name="PRODUCT_NAME" /></translation> <translation id="5118713593561876160">Interesser</translation> <translation id="5123685120097942451">Inkognitofane</translation> <translation id="5126510351761255129">Bekreft kortet ditt</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">Chrome må ha lagringstilgang for å laste ned filer.</translation> <translation id="5749237766298580851">Av <ph name="SEPARATOR" /> Anbefales ikke</translation> <translation id="5752232708629533680">Del kun GIF</translation> +<translation id="5753139477036638699">Du kan bruke stemmen til å søke i Chrome</translation> <translation id="5754350196967618083">Kan ikke oppdatere Discover</translation> <translation id="5763382633136178763">Inkognitofaner</translation> <translation id="5763514718066511291">Trykk for å kopiere nettadressen for denne appen</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">Logg på Chrome, åpnet.</translation> <translation id="6814033694018386318">Dette deler du med Google</translation> <translation id="6817747507826986771">Del denne siden raskt. Trykk og hold for å redigere denne snarveien.</translation> +<translation id="6819199143469632133">For å få Google-tingene dine på flere enheter, logg på</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, fane, valgt</translation> <translation id="6828070228333235514">Slutt å spore prisen</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705">Gjenopprettet <ph name="ITEM_TITLE" /></translation> <translation id="7029390216614421513">Plassér QR-/strekkoden i denne rammen.</translation> <translation id="7029809446516969842">Passord</translation> +<translation id="7037830628447527439">Logg på Chrome med Google-kontoen din</translation> <translation id="7038956721828960940">chrome_bilde_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Vil du ha bildebeskrivelser?</translation> <translation id="7055152154916055070">Viderekoblingen er blokkert:</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> – Kunne ikke laste ned dette språket. Prøv igjen senere.</translation> <translation id="8951232171465285730">Chrome har spart deg for <ph name="MEGABYTES" /> MB</translation> <translation id="8955719471735800169">Tilbake til toppen</translation> +<translation id="8964479563882643397">For å åpne en ny inkognitofane, åpne menyen</translation> <translation id="8965591936373831584">venter</translation> <translation id="8967427617812342790">Legg til på leselisten</translation> <translation id="8968085728801125376">{TAB_COUNT,plural, =1{<ph name="INCOGNITO_TAB_COUNT" /> inkognitofaner og <ph name="TAB_COUNT_ONE" /> annen fane blir lukket}other{<ph name="INCOGNITO_TAB_COUNT" /> inkognitofaner og <ph name="TAB_COUNT_MANY" /> andre faner blir lukket}}</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 ed4cb7b..9996af57 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">Kopiuj nazwę użytkownika</translation> <translation id="1592864538817356322">Standardowa ochrona:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{Usuń 1 wybrany element}few{Usuń # wybrane elementy}many{Usuń # wybranych elementów}other{Usuń # wybranego elementu}}</translation> +<translation id="1633659023549081553">Odkrywaj nowe treści na stronie głównej Chrome</translation> <translation id="1641113438599504367">Bezpieczne przeglądanie</translation> <translation id="164269334534774161">Oglądasz kopię offline tej strony z <ph name="CREATION_TIME" /></translation> <translation id="1644574205037202324">Historia</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">Przeciągaj suwak, by umożliwić wygodne czytanie. Gdy dwukrotnie klikniesz akapit, tekst powiększy się co najmniej do tej wielkości.</translation> <translation id="2323763861024343754">Dane witryn:</translation> <translation id="2328985652426384049">Nie można się zalogować</translation> +<translation id="2342601525305963189">Wskazówki dotyczące Chrome:</translation> <translation id="234265804618409743">Nie udało się otworzyć aparatu. Coś poszło nie tak.</translation> <translation id="2345671828921229300">Aby wyszukać, naciśnij i przytrzymaj słowo</translation> <translation id="2349710944427398404">Łączna ilość danych używanych przez Chrome, w tym konta, zakładki i zapisane ustawienia</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">Odwiedzane adresy URL są wysyłane do Google.</translation> <translation id="2536728043171574184">Oglądasz kopię offline tej strony</translation> <translation id="2546283357679194313">Pliki cookie i dane stron</translation> +<translation id="2558692642259318568">Aby przeglądać bez zapisywania swojej aktywności na urządzeniu, używaj karty incognito</translation> <translation id="2561519700418191927">Podglądy filmów</translation> <translation id="2567385386134582609">OBRAZ</translation> <translation id="2567545343356994513">Szybsza proaktywna ochrona przed niebezpiecznymi stronami, pobieranymi plikami i rozszerzeniami</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">Numer karty</translation> <translation id="2625189173221582860">Hasło zostało skopiowane</translation> <translation id="2631006050119455616">Zaoszczędzono</translation> +<translation id="2634905176438867146">Jak ustawić Chrome jako przeglądarkę domyślną</translation> <translation id="2645657967708199252">Połączenie <ph name="CONNECTION_TYPE" /> może spowalniać pobieranie</translation> <translation id="2647434099613338025">Dodaj język</translation> <translation id="2649068648233607930">Twoją przeglądarką zarządza <ph name="DOMAIN" /></translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">Monitoruję cenę</translation> <translation id="3037517125981011456">Pokazuje prośby o zalogowanie się w Chrome</translation> <translation id="3046945242843292318">Następnym razem otwórz tę stronę szybciej</translation> +<translation id="3055259925215945098">Zakładka została przeniesiona</translation> <translation id="305593374596241526">Lokalizacja jest wyłączona. Włącz ją w <ph name="BEGIN_LINK" />Ustawieniach Androida<ph name="END_LINK" />.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> zakładka}few{<ph name="BOOKMARKS_COUNT_MANY" /> zakładki}many{<ph name="BOOKMARKS_COUNT_MANY" /> zakładek}other{<ph name="BOOKMARKS_COUNT_MANY" /> zakładki}}</translation> <translation id="3062802207422175757">Artykuły dopasowane do Twoich zainteresowań w Chrome</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">Zapisz na urządzeniu</translation> <translation id="3236059992281584593">Pozostała minuta</translation> <translation id="3237087289225714896">Wczytywanie standardowe:</translation> +<translation id="3237433641417325993">Przewiń w dół, aby zobaczyć sugerowane artykuły</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">Jeśli udostępnisz także raporty o użytkowaniu Chrome, będą one zawierały odwiedzane przez Ciebie adresy URL.</translation> <translation id="3250563604907490871">Opisy do obrazów zostaną wznowione, gdy połączysz się z Wi-Fi</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Chrome nie ma dostępu do żądanego zasobu.</translation> <translation id="4837753911714442426">Otwórz opcje drukowania strony</translation> <translation id="4842092870884894799">Pokazuję wyskakujące okienko generowania hasła</translation> +<translation id="4842515939542199281">Aby wyszukać głosowo, kliknij mikrofon</translation> <translation id="4850886885716139402">Widok</translation> <translation id="4860895144060829044">Zadzwoń</translation> <translation id="4864369630010738180">Loguję...</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">Rozszerzone dane o korzystaniu</translation> <translation id="509429900233858213">Wystąpił błąd.</translation> <translation id="510275257476243843">Pozostała godzina</translation> +<translation id="5115811374190515607">do: <ph name="PRODUCT_NAME" /></translation> <translation id="5118713593561876160">Zainteresowania</translation> <translation id="5123685120097942451">Karta incognito</translation> <translation id="5126510351761255129">Zweryfikuj kartę</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">Chrome musi mieć dostęp do pamięci, by pobierać pliki.</translation> <translation id="5749237766298580851">Wyłączono <ph name="SEPARATOR" /> Niezalecane</translation> <translation id="5752232708629533680">Udostępnij tylko GIF-a</translation> +<translation id="5753139477036638699">W Chrome możesz wyszukiwać głosowo</translation> <translation id="5754350196967618083">Nie można odświeżyć karty Discover</translation> <translation id="5763382633136178763">Karty incognito</translation> <translation id="5763514718066511291">Kliknij, by skopiować URL tej aplikacji</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">Logowanie się w Chrome, otwarte.</translation> <translation id="6814033694018386318">Co udostępniasz Google</translation> <translation id="6817747507826986771">Szybko udostępnij tę stronę. Aby edytować ten skrót, naciśnij i przytrzymaj.</translation> +<translation id="6819199143469632133">Aby mieć dostęp do swoich treści w Google na różnych urządzeniach, zaloguj się</translation> <translation id="6820686453637990663">Kod CVC</translation> <translation id="6824899148643461612">Wybrano kartę <ph name="TAB_TITLE" /></translation> <translation id="6828070228333235514">Przestań monitorować cenę</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705">Przywrócono: <ph name="ITEM_TITLE" /></translation> <translation id="7029390216614421513">Umieść kod QR lub kod kreskowy w tej ramce.</translation> <translation id="7029809446516969842">Hasła</translation> +<translation id="7037830628447527439">Zaloguj się w Chrome, korzystając ze swojego konta Google</translation> <translation id="7038956721828960940">chrome_obraz_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Czy chcesz pobierać opisy obrazów?</translation> <translation id="7055152154916055070">Zablokowano przekierowanie:</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> – nie udało się pobrać tego języka. Spróbuj później.</translation> <translation id="8951232171465285730">Chrome pozwolił Ci zaoszczędzić <ph name="MEGABYTES" /> MB</translation> <translation id="8955719471735800169">Powrót do góry</translation> +<translation id="8964479563882643397">Aby otworzyć nową kartę incognito, otwórz menu</translation> <translation id="8965591936373831584">Oczekiwanie</translation> <translation id="8967427617812342790">Dodaj do listy Do przeczytania</translation> <translation id="8968085728801125376">{TAB_COUNT,plural, =1{Zostaną zamknięte karty incognito (<ph name="INCOGNITO_TAB_COUNT" />) i <ph name="TAB_COUNT_ONE" /> inna}few{Zostaną zamknięte karty incognito (<ph name="INCOGNITO_TAB_COUNT" />) i <ph name="TAB_COUNT_MANY" /> inne}many{Zostaną zamknięte karty incognito (<ph name="INCOGNITO_TAB_COUNT" />) i <ph name="TAB_COUNT_MANY" /> innych}other{Zostaną zamknięte karty incognito (<ph name="INCOGNITO_TAB_COUNT" />) i <ph name="TAB_COUNT_MANY" /> innej}}</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 b9aa6a6..1f1520f 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">Copiază numele de utilizator</translation> <translation id="1592864538817356322">Protecție standard:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{Elimină un element selectat}few{Elimină # elemente selectate}other{Elimină # de elemente selectate}}</translation> +<translation id="1633659023549081553">Descoperă conținut nou în pagina de pornire Chrome</translation> <translation id="1641113438599504367">Navigare sigură</translation> <translation id="164269334534774161">Se afișează o versiune offline a acestei pagini de pe <ph name="CREATION_TIME" /></translation> <translation id="1644574205037202324">Istoric</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">Trage cursorul până poți citi textul cu ușurință. Textul trebuie să fie cel puțin la fel de mare ca acesta după o atingere dublă pe un paragraf.</translation> <translation id="2323763861024343754">Stocarea site-urilor</translation> <translation id="2328985652426384049">Nu se poate conecta</translation> +<translation id="2342601525305963189">Sfaturi Chrome:</translation> <translation id="234265804618409743">Nu se poate deschide camera. A apărut o eroare.</translation> <translation id="2345671828921229300">Pentru a căuta, atinge lung un cuvânt</translation> <translation id="2349710944427398404">Totalul datelor folosite de Chrome, inclusiv conturile, marcajele și setările salvate</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">Adresele URL pe care le accesezi sunt trimise la Google</translation> <translation id="2536728043171574184">Se afișează o versiune offline a acestei pagini</translation> <translation id="2546283357679194313">Cookie-uri și date privind site-ul</translation> +<translation id="2558692642259318568">Încearcă modul incognito pentru a naviga fără să salvezi activitatea pe dispozitiv</translation> <translation id="2561519700418191927">Previzualizările videoclipului</translation> <translation id="2567385386134582609">IMAGINE</translation> <translation id="2567545343356994513">Protecție proactivă mai rapidă împotriva site-urilor, descărcărilor și extensiilor periculoase</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">Număr card</translation> <translation id="2625189173221582860">Parola a fost copiată</translation> <translation id="2631006050119455616">Economisite</translation> +<translation id="2634905176438867146">Află cum să setezi Chrome ca browser prestabilit</translation> <translation id="2645657967708199252">Conexiunea <ph name="CONNECTION_TYPE" /> poate încetini descărcarea</translation> <translation id="2647434099613338025">Adaugă o limbă</translation> <translation id="2649068648233607930">Browserul este gestionat de <ph name="DOMAIN" /></translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">Se urmărește prețul</translation> <translation id="3037517125981011456">Afișează solicitări pentru conectarea la Chrome</translation> <translation id="3046945242843292318">Accesează mai rapid site-ul data viitoare</translation> +<translation id="3055259925215945098">Marcajul a fost mutat</translation> <translation id="305593374596241526">Locația este dezactivată; activeaz-o în <ph name="BEGIN_LINK" />Setări Android<ph name="END_LINK" />.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> marcaj}few{<ph name="BOOKMARKS_COUNT_MANY" /> marcaje}other{<ph name="BOOKMARKS_COUNT_MANY" /> de marcaje}}</translation> <translation id="3062802207422175757">Articole despre ceea ce te interesează în Chrome</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">Salvează pe dispozitiv</translation> <translation id="3236059992281584593">1 min. rămas</translation> <translation id="3237087289225714896">Preîncărcare standard:</translation> +<translation id="3237433641417325993">Derulează în jos pentru a vedea articolele sugerate</translation> <translation id="3244271242291266297">LL</translation> <translation id="3245429137663807393">Dacă trimiți rapoarte privind folosirea Chrome, acestea includ adresele URL pe care le accesezi</translation> <translation id="3250563604907490871">Descrierile imaginilor vor fi reluate când te conectezi la Wi-Fi</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Chrome nu are acces la resursa solicitată.</translation> <translation id="4837753911714442426">Deschide opțiunile pentru a printa pagina</translation> <translation id="4842092870884894799">Fereastra pop-up pentru generarea parolelor este afișată</translation> +<translation id="4842515939542199281">Atinge microfonul pentru a căuta cu ajutorul vocii</translation> <translation id="4850886885716139402">Afișează</translation> <translation id="4860895144060829044">Apelează</translation> <translation id="4864369630010738180">Se conectează...</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">Date de utilizare detaliate</translation> <translation id="509429900233858213">A apărut o eroare.</translation> <translation id="510275257476243843">1 oră rămasă</translation> +<translation id="5115811374190515607">în <ph name="PRODUCT_NAME" /></translation> <translation id="5118713593561876160">Interese</translation> <translation id="5123685120097942451">Filă incognito</translation> <translation id="5126510351761255129">Confirmă cardul</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">Pentru a descărca fișiere, Chrome necesită acces la stocare.</translation> <translation id="5749237766298580851">Dezactivată <ph name="SEPARATOR" /> Nu este recomandată</translation> <translation id="5752232708629533680">Trimite numai GIF-ul</translation> +<translation id="5753139477036638699">Folosește-ți vocea pentru a căuta în Chrome</translation> <translation id="5754350196967618083">Nu se poate actualiza Discover</translation> <translation id="5763382633136178763">File incognito</translation> <translation id="5763514718066511291">Atinge pentru a copia adresa URL pentru această aplicație</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">Conectează-te la Chrome, deschis.</translation> <translation id="6814033694018386318">Ce trimiți la Google</translation> <translation id="6817747507826986771">Distribuie rapid pagina. Pentru a edita comanda rapidă, atinge-o lung.</translation> +<translation id="6819199143469632133">Conectează-te pentru a folosi serviciile tale Google pe mai multe dispozitive</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, filă, selectată</translation> <translation id="6828070228333235514">Nu mai urmări prețul</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705">S-a restabilit <ph name="ITEM_TITLE" /></translation> <translation id="7029390216614421513">Poziționează codul QR / codul de bare în acest cadru.</translation> <translation id="7029809446516969842">Parole</translation> +<translation id="7037830628447527439">Conectează-te la Chrome cu Contul Google</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Vrei să generezi descrieri ale imaginilor?</translation> <translation id="7055152154916055070">Redirecționarea a fost blocată:</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> – Limba nu a putut fi descărcată. Încearcă din nou mai târziu.</translation> <translation id="8951232171465285730">Chrome a economisit <ph name="MEGABYTES" /> MB</translation> <translation id="8955719471735800169">Înapoi sus</translation> +<translation id="8964479563882643397">Deschide meniul pentru a deschide o nouă filă incognito</translation> <translation id="8965591936373831584">în așteptare</translation> <translation id="8967427617812342790">Adaugă în lista de lectură</translation> <translation id="8968085728801125376">{TAB_COUNT,plural, =1{<ph name="INCOGNITO_TAB_COUNT" /> filă incognito și încă <ph name="TAB_COUNT_ONE" /> filă vor fi închise}few{<ph name="INCOGNITO_TAB_COUNT" /> filă incognito și încă <ph name="TAB_COUNT_MANY" /> file vor fi închise}other{<ph name="INCOGNITO_TAB_COUNT" /> filă incognito și încă <ph name="TAB_COUNT_MANY" /> de file vor fi închise}}</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 1c3d4f5c..6abd6d5 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">Копировать имя пользователя</translation> <translation id="1592864538817356322">Стандартная защита:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{Удалить 1 выбранный объект}one{Удалить # выбранный объект}few{Удалить # выбранных объекта}many{Удалить # выбранных объектов}other{Удалить # выбранного объекта}}</translation> +<translation id="1633659023549081553">Просматривайте рекомендации контента на главной странице Chrome.</translation> <translation id="1641113438599504367">Безопасный просмотр</translation> <translation id="164269334534774161">Эта офлайн-копия страницы была создана <ph name="CREATION_TIME" /></translation> <translation id="1644574205037202324">История</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">Перемещайте ползунок, пока текст не станет удобным для чтения. После двойного нажатия на абзац текст должен быть такого размера.</translation> <translation id="2323763861024343754">Данные сайтов</translation> <translation id="2328985652426384049">Не удается войти</translation> +<translation id="2342601525305963189">Советы по работе с Chrome</translation> <translation id="234265804618409743">Произошла ошибка. Не удается открыть камеру.</translation> <translation id="2345671828921229300">Для поиска нажмите на слово и удерживайте</translation> <translation id="2349710944427398404">Общее количество данных Chrome, включая аккаунты, закладки и сохраненные настройки</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">URL посещенных вами страниц отправляются в Google.</translation> <translation id="2536728043171574184">Офлайн-копия страницы</translation> <translation id="2546283357679194313">Файлы сookie и данные сайтов</translation> +<translation id="2558692642259318568">Чтобы история браузера не сохранялась на устройстве, включите режим инкогнито.</translation> <translation id="2561519700418191927">Предварительный просмотр видео</translation> <translation id="2567385386134582609">ИЗОБРАЖЕНИЕ</translation> <translation id="2567545343356994513">Более быстрая и эффективная защита от опасных сайтов, расширений и скачанных файлов.</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">Номер карты</translation> <translation id="2625189173221582860">Пароль скопирован</translation> <translation id="2631006050119455616">Сэкономлено</translation> +<translation id="2634905176438867146">Узнайте, как сделать Chrome браузером по умолчанию.</translation> <translation id="2645657967708199252">По сети <ph name="CONNECTION_TYPE" /> данные могут скачиваться медленно.</translation> <translation id="2647434099613338025">Добавить язык</translation> <translation id="2649068648233607930">Вашим браузером управляет <ph name="DOMAIN" /></translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">Вы отслеживаете цену на этот товар</translation> <translation id="3037517125981011456">Показывать подсказки для входа в Chrome</translation> <translation id="3046945242843292318">В следующий раз вы сможете открыть этот сайт быстрее.</translation> +<translation id="3055259925215945098">Закладка перемещена</translation> <translation id="305593374596241526">Определение местоположения отключено. Включите его в <ph name="BEGIN_LINK" />настройках Android<ph name="END_LINK" />.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> закладка}one{<ph name="BOOKMARKS_COUNT_MANY" /> закладка}few{<ph name="BOOKMARKS_COUNT_MANY" /> закладки}many{<ph name="BOOKMARKS_COUNT_MANY" /> закладок}other{<ph name="BOOKMARKS_COUNT_MANY" /> закладки}}</translation> <translation id="3062802207422175757">Прочитайте в Chrome статьи, подобранные с учетом ваших интересов.</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">Сохранить на устройстве</translation> <translation id="3236059992281584593">Осталась 1 мин.</translation> <translation id="3237087289225714896">Стандартная предзагрузка:</translation> +<translation id="3237433641417325993">Чтобы посмотреть рекомендуемые статьи, прокрутите экран вниз</translation> <translation id="3244271242291266297">ММ</translation> <translation id="3245429137663807393">Если вы также отправляете отчеты об использовании Chrome, в них включаются URL посещенных вами страниц.</translation> <translation id="3250563604907490871">Описания изображений станут доступны при подключении к сети Wi-Fi.</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Запрошенный ресурс недоступен в Chrome</translation> <translation id="4837753911714442426">Открыть параметры печати страницы</translation> <translation id="4842092870884894799">Открыто всплывающее окно создания пароля</translation> +<translation id="4842515939542199281">Чтобы использовать голосовой ввод при поиске, нажмите на микрофон</translation> <translation id="4850886885716139402">Посмотреть</translation> <translation id="4860895144060829044">Позвонить</translation> <translation id="4864369630010738180">Вход в систему...</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">Расширенные данные</translation> <translation id="509429900233858213">Произошла ошибка.</translation> <translation id="510275257476243843">Остался 1 час</translation> +<translation id="5115811374190515607">в <ph name="PRODUCT_NAME" /></translation> <translation id="5118713593561876160">Интересы</translation> <translation id="5123685120097942451">Вкладка инкогнито</translation> <translation id="5126510351761255129">Подтвердите данные карты</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">Для скачивания файлов браузеру Chrome требуется доступ к хранилищу.</translation> <translation id="5749237766298580851">Отключено <ph name="SEPARATOR" /> Не рекомендуется</translation> <translation id="5752232708629533680">Поделиться только GIF</translation> +<translation id="5753139477036638699">Вы можете использовать голосовой ввод при поиске в Chrome.</translation> <translation id="5754350196967618083">Не удается обновить рекомендации</translation> <translation id="5763382633136178763">Вкладки в режиме инкогнито</translation> <translation id="5763514718066511291">Нажмите, чтобы скопировать URL этого приложения.</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">Окно "Войти в Chrome" открыто.</translation> <translation id="6814033694018386318">Что отправляется в Google</translation> <translation id="6817747507826986771">Поделиться этой страницей. Чтобы изменить функцию кнопки, нажмите и удерживайте ее.</translation> +<translation id="6819199143469632133">Чтобы использовать сервисы Google на нескольких устройствах, войдите в аккаунт.</translation> <translation id="6820686453637990663">Код CVC</translation> <translation id="6824899148643461612">Выбрана вкладка "<ph name="TAB_TITLE" />"</translation> <translation id="6828070228333235514">Прекратить отслеживание цен</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705">Восстановлен объект "<ph name="ITEM_TITLE" />"</translation> <translation id="7029390216614421513">Поместите QR-код или штрихкод в эту рамку.</translation> <translation id="7029809446516969842">Пароли</translation> +<translation id="7037830628447527439">Войдите в Chrome, используя аккаунт Google</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Генерировать описания изображений?</translation> <translation id="7055152154916055070">Заблокирована попытка переадресации:</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> – не удалось скачать этот языковой пакет. Повторите попытку позже.</translation> <translation id="8951232171465285730">Благодаря Chrome вы сэкономили <ph name="MEGABYTES" /> МБ свободного места</translation> <translation id="8955719471735800169">В начало</translation> +<translation id="8964479563882643397">Чтобы открыть новую вкладку инкогнито, перейдите в меню</translation> <translation id="8965591936373831584">ожидание</translation> <translation id="8967427617812342790">Добавить в список для чтения</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" /> вкладка будут закрыты.}few{<ph name="INCOGNITO_TAB_COUNT" /> вкладка инкогнито и ещё <ph name="TAB_COUNT_MANY" /> вкладки будут закрыты.}many{<ph name="INCOGNITO_TAB_COUNT" /> вкладка инкогнито и ещё <ph name="TAB_COUNT_MANY" /> вкладок будут закрыты.}other{<ph name="INCOGNITO_TAB_COUNT" /> вкладка инкогнито и ещё <ph name="TAB_COUNT_MANY" /> вкладки будут закрыты.}}</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 18dbbd6..31bb7e2 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">Kopírovať používateľské meno</translation> <translation id="1592864538817356322">Štandardná ochrana:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{Odstrániť 1 vybranú položku}few{Odstrániť # vybrané položky}many{Odstrániť # vybranej položky}other{Odstrániť # vybraných položiek}}</translation> +<translation id="1633659023549081553">Objavte nový obsah na domovskej stránke Chromu</translation> <translation id="1641113438599504367">Bezpečné prehliadanie</translation> <translation id="164269334534774161">Zobrazuje sa offline kópia tejto stránky z <ph name="CREATION_TIME" /></translation> <translation id="1644574205037202324">História</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">Presúvajte posúvač, dokým nebude čítanie tohto textu pohodlné. Po dvojitom klepnutí na odsek by mal byť text aspoň takto veľký.</translation> <translation id="2323763861024343754">Úložisko webu</translation> <translation id="2328985652426384049">Nedá sa prihlásiť</translation> +<translation id="2342601525305963189">Tipy na používanie Chromu:</translation> <translation id="234265804618409743">Vaša kamera sa nedá otvoriť. Vyskytol sa problém.</translation> <translation id="2345671828921229300">Ak chcete nejaké slovo vyhľadať, pridržte ho</translation> <translation id="2349710944427398404">Celkové dáta využívané Chromom vrátane účtov, záložiek a uložených nastavení</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">Webové adresy, ktoré navštívite, sú odosielané Googlu</translation> <translation id="2536728043171574184">Zobrazuje sa offline kópia tejto stránky</translation> <translation id="2546283357679194313">Súbory cookie a dáta webov</translation> +<translation id="2558692642259318568">Ak chcete prehliadať bez ukladania aktivity v zariadení, vyskúšajte režim inkognito.</translation> <translation id="2561519700418191927">Ukážky videí</translation> <translation id="2567385386134582609">OBRÁZOK</translation> <translation id="2567545343356994513">Rýchlejšia a proaktívna ochrana pred nebezpečnými webmi, stiahnutými súbormi a rozšíreniami</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">Číslo karty</translation> <translation id="2625189173221582860">Heslo bolo skopírované.</translation> <translation id="2631006050119455616">Uložené</translation> +<translation id="2634905176438867146">Ako nastaviť Chrome ako predvolený prehliadač</translation> <translation id="2645657967708199252">Vaše pripojenie <ph name="CONNECTION_TYPE" /> môže spomaliť sťahovanie</translation> <translation id="2647434099613338025">Pridať jazyk</translation> <translation id="2649068648233607930">Váš prehliadač spravuje <ph name="DOMAIN" /></translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">Cenu sledujete</translation> <translation id="3037517125981011456">Zobrazí výzvy na prihlásenie do Chromu</translation> <translation id="3046945242843292318">Nabudúce prejdite na tento web rýchlejšie</translation> +<translation id="3055259925215945098">Záložka bola premiestnená</translation> <translation id="305593374596241526">Poloha je vypnutá. Zapnite ju v <ph name="BEGIN_LINK" />Nastaveniach Androidu<ph name="END_LINK" />.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> záložka}few{<ph name="BOOKMARKS_COUNT_MANY" /> záložky}many{<ph name="BOOKMARKS_COUNT_MANY" /> bookmarks}other{<ph name="BOOKMARKS_COUNT_MANY" /> záložiek}}</translation> <translation id="3062802207422175757">Články o vašich záujmoch v Chrome</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">Uložiť do zariadenia</translation> <translation id="3236059992281584593">Zostáva: 1 min</translation> <translation id="3237087289225714896">Štandardné prednačítavanie:</translation> +<translation id="3237433641417325993">Navrhované články zobrazíte posunutím zobrazenia nadol</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">Ak zdieľate aj prehľady používania Chromu, tieto prehľady zahŕňajú webové adresy, ktoré navštívite</translation> <translation id="3250563604907490871">Popisy obrázkov sa obnovia, keď sa pripojíte k sieti Wi‑Fi</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Chrome nemá prístup k požadovanému zdroju.</translation> <translation id="4837753911714442426">Otvorenie možností tlače stránky</translation> <translation id="4842092870884894799">Zobrazuje sa okno generovania hesiel</translation> +<translation id="4842515939542199281">Ak chcete vyhľadávať hlasom, klepnite na mikrofón</translation> <translation id="4850886885716139402">Zobraziť</translation> <translation id="4860895144060829044">Volajte</translation> <translation id="4864369630010738180">Prebieha prihlasovanie...</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">Rozšírené údaje o používaní</translation> <translation id="509429900233858213">Vyskytla sa chyba.</translation> <translation id="510275257476243843">Zostáva: 1 h</translation> +<translation id="5115811374190515607">do služby <ph name="PRODUCT_NAME" /></translation> <translation id="5118713593561876160">Záujmy</translation> <translation id="5123685120097942451">Karta inkognito</translation> <translation id="5126510351761255129">Overenie karty</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">Chrome potrebuje na sťahovanie súborov prístup k úložisku.</translation> <translation id="5749237766298580851">Vypnuté <ph name="SEPARATOR" /> Neodporúča sa</translation> <translation id="5752232708629533680">Zdieľať iba gify</translation> +<translation id="5753139477036638699">V Chrome môžete vyhľadávať hlasom</translation> <translation id="5754350196967618083">Kanál Objaviť sa nedá obnoviť</translation> <translation id="5763382633136178763">Karty inkognito</translation> <translation id="5763514718066511291">Klepnutím skopírujete webovú adresu tejto aplikácie</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">Prihlásenie sa do Chromu, otvorené.</translation> <translation id="6814033694018386318">Čo zdieľate s Googlom</translation> <translation id="6817747507826986771">Skratka na rýchle zdieľanie tejto stránky. Ak ju chcete upraviť, pridržte ju.</translation> +<translation id="6819199143469632133">Ak chcete využívať služby Googlu vo viacerých zariadeniach, prihláste sa</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, karta, vybrané</translation> <translation id="6828070228333235514">Prestať sledovať cenu</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705">Obnovili ste položku <ph name="ITEM_TITLE" /></translation> <translation id="7029390216614421513">QR kód alebo čiarový kód sa musí nachádzať v tomto rámčeku.</translation> <translation id="7029809446516969842">Heslá</translation> +<translation id="7037830628447527439">Prihláste sa do Chromu svojím účtom Google</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Chcete získať popisy obrázkov?</translation> <translation id="7055152154916055070">Presmerovanie bolo zablokované:</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> – tento jazyk sa nedá stiahnuť. Skúste to neskôr.</translation> <translation id="8951232171465285730">Chrome ušetril <ph name="MEGABYTES" /> MB</translation> <translation id="8955719471735800169">Späť na začiatok</translation> +<translation id="8964479563882643397">Ak chcete otvoriť novú kartu inkognito, otvorte ponuku</translation> <translation id="8965591936373831584">nespracované</translation> <translation id="8967427617812342790">Pridať do čitateľského zoznamu</translation> <translation id="8968085728801125376">{TAB_COUNT,plural, =1{<ph name="INCOGNITO_TAB_COUNT" /> inkognito a <ph name="TAB_COUNT_ONE" /> ďalšia karta budú zavreté}few{<ph name="INCOGNITO_TAB_COUNT" /> inkognito a <ph name="TAB_COUNT_MANY" /> ďalšie karty budú zavreté}many{<ph name="INCOGNITO_TAB_COUNT" /> incognito and <ph name="TAB_COUNT_MANY" /> more tabs will be closed}other{<ph name="INCOGNITO_TAB_COUNT" /> inkognito a <ph name="TAB_COUNT_MANY" /> ďalších kariet budú zavreté}}</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 fee661c3..db0669c9 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">Kopiraj korisničko ime</translation> <translation id="1592864538817356322">Standardna zaštita:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{Ukloni 1 izabranu stavku}one{Ukloni # izabranu stavku}few{Ukloni # izabrane stavke}other{Ukloni # izabranih stavki}}</translation> +<translation id="1633659023549081553">Otkrijte nov sadržaj na početnoj stranici Chrome-a</translation> <translation id="1641113438599504367">Bezbedno pregledanje</translation> <translation id="164269334534774161">Prikazuje se oflajn kopija ove stranice od <ph name="CREATION_TIME" /></translation> <translation id="1644574205037202324">Istorija</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">Prevlačite klizač dok ovo ne budete mogli lako da pročitate. Kada dvaput dodirnete pasus, tekst treba da bude bar ovoliki.</translation> <translation id="2323763861024343754">Memorijski prostor za sajt</translation> <translation id="2328985652426384049">Ne mogu da se prijavim</translation> +<translation id="2342601525305963189">Saveti za Chrome:</translation> <translation id="234265804618409743">Ne možemo da otvorimo kameru. Nešto nije u redu.</translation> <translation id="2345671828921229300">Da biste pretraživali, dodirnite i zadržite reč</translation> <translation id="2349710944427398404">Svi podaci koje koristi Chrome, uključujući naloge, obeleživače i sačuvana podešavanja</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">URL-ovi koje posećujete se šalju Google-u</translation> <translation id="2536728043171574184">Pregledate oflajn kopiju ove stranice</translation> <translation id="2546283357679194313">Kolačići i podaci o sajtovima</translation> +<translation id="2558692642259318568">Isprobajte režim Bez arhiviranja da biste pregledali bez čuvanja aktivnosti na uređaju</translation> <translation id="2561519700418191927">Pregledi video snimaka</translation> <translation id="2567385386134582609">SLIKA</translation> <translation id="2567545343356994513">Brža proaktivna zaštita od opasnih veb-sajtova, preuzimanja i dodataka</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">Broj kartice</translation> <translation id="2625189173221582860">Lozinka je kopirana</translation> <translation id="2631006050119455616">Sačuvano</translation> +<translation id="2634905176438867146">Saznajte kako da podesite Chrome kao podrazumevani pregledač</translation> <translation id="2645657967708199252"><ph name="CONNECTION_TYPE" /> veza može da uspori preuzimanje</translation> <translation id="2647434099613338025">Dodaj jezik</translation> <translation id="2649068648233607930">Pregledačem upravlja <ph name="DOMAIN" /></translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">Prati se cena</translation> <translation id="3037517125981011456">Prikazuje upite za prijavljivanje u Chrome</translation> <translation id="3046945242843292318">Sledeći put brže pristupite ovom sajtu</translation> +<translation id="3055259925215945098">Obeleživač je premešten</translation> <translation id="305593374596241526">Lokacija je isključena; uključite je u <ph name="BEGIN_LINK" />Android podešavanjima<ph name="END_LINK" />.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> obeleživač}one{<ph name="BOOKMARKS_COUNT_MANY" /> obeleživač}few{<ph name="BOOKMARKS_COUNT_MANY" /> obeleživača}other{<ph name="BOOKMARKS_COUNT_MANY" /> obeleživača}}</translation> <translation id="3062802207422175757">Članci o vašim interesovanjima u Chrome-u</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">Sačuvaj na uređaju</translation> <translation id="3236059992281584593">Još 1 min</translation> <translation id="3237087289225714896">Standardno predučitavanje:</translation> +<translation id="3237433641417325993">Skrolujte nadole da biste videli podržane članke</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">Ako delite i Chrome izveštaje o korišćenju, ti izveštaji obuhvataju URL-ove koje posećujete</translation> <translation id="3250563604907490871">Opisi slika će se nastaviti kada se povežete na WiFi</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Chrome nema pristup zahtevanom resursu.</translation> <translation id="4837753911714442426">Otvaranje opcija za štampanje stranice</translation> <translation id="4842092870884894799">Prikazivanje iskačućeg prozora za generisanje lozinke</translation> +<translation id="4842515939542199281">Dodirnite mikrofon da biste pretraživali glasom</translation> <translation id="4850886885716139402">Prikaz</translation> <translation id="4860895144060829044">Pozovite</translation> <translation id="4864369630010738180">Prijavljivanje...</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">Detaljni podaci o korišćenju</translation> <translation id="509429900233858213">Došlo je do greške.</translation> <translation id="510275257476243843">Još 1 sat</translation> +<translation id="5115811374190515607">u <ph name="PRODUCT_NAME" /></translation> <translation id="5118713593561876160">Interesovanja</translation> <translation id="5123685120097942451">Kartica bez arhiviranja</translation> <translation id="5126510351761255129">Verifikujte karticu</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">Chrome-u je potreban pristup memorijskom prostoru da bi preuzimao datoteke.</translation> <translation id="5749237766298580851">Isključeno <ph name="SEPARATOR" /> Ne preporučuje se</translation> <translation id="5752232708629533680">Delite samo GIF</translation> +<translation id="5753139477036638699">Možete da koristite glas da biste pretraživali pomoću glasa u Chrome-u</translation> <translation id="5754350196967618083">Osvežavanje Discover-a nije uspelo</translation> <translation id="5763382633136178763">Kartice bez arhiviranja</translation> <translation id="5763514718066511291">Dodirnite da biste kopirali URL za ovu aplikaciju</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">Prijavljivanje u Chrome, otvoreno.</translation> <translation id="6814033694018386318">Šta delite sa Google-om</translation> <translation id="6817747507826986771">Brzo delite ovu stranicu. Da biste izmenili ovu prečicu, dodirnite i zadržite.</translation> +<translation id="6819199143469632133">Prijavite se da biste sinhronizovali Google sadržaj na svim uređajima</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, kartica, izabrana</translation> <translation id="6828070228333235514">Zaustavi praćenje cena</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705">Vraćena je stavka <ph name="ITEM_TITLE" /></translation> <translation id="7029390216614421513">Postavite QR ili bar-kod u ovaj okvir.</translation> <translation id="7029809446516969842">Lozinke</translation> +<translation id="7037830628447527439">Prijavite se u Chrome pomoću Google naloga</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Želite da dobijate opise slika?</translation> <translation id="7055152154916055070">Blokirano je preusmeravanje:</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> – Preuzimanje ovog jezika nije uspelo. Probajte ponovo kasnije.</translation> <translation id="8951232171465285730">Chrome vam je uštedeo <ph name="MEGABYTES" /> MB</translation> <translation id="8955719471735800169">Nazad na vrh</translation> +<translation id="8964479563882643397">Otvorite meni da biste otvorili novu karticu bez arhiviranja</translation> <translation id="8965591936373831584">na čekanju</translation> <translation id="8967427617812342790">Dodaj na listu za čitanje</translation> <translation id="8968085728801125376">{TAB_COUNT,plural, =1{Kartice bez arhiviranja (<ph name="INCOGNITO_TAB_COUNT" />) i još <ph name="TAB_COUNT_ONE" /> kartica će biti zatvorene}one{Kartice bez arhiviranja (<ph name="INCOGNITO_TAB_COUNT" />) i još <ph name="TAB_COUNT_MANY" /> kartica će biti zatvorene}few{Kartice bez arhiviranja (<ph name="INCOGNITO_TAB_COUNT" />) i još <ph name="TAB_COUNT_MANY" /> kartice će biti zatvorene}other{Kartice bez arhiviranja (<ph name="INCOGNITO_TAB_COUNT" />) i još <ph name="TAB_COUNT_MANY" /> kartica će biti zatvorene}}</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 29bfc4c6..72e45ae 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">Копирај корисничко име</translation> <translation id="1592864538817356322">Стандардна заштита:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{Уклони 1 изабрану ставку}one{Уклони # изабрану ставку}few{Уклони # изабране ставке}other{Уклони # изабраних ставки}}</translation> +<translation id="1633659023549081553">Откријте нов садржај на почетној страници Chrome-а</translation> <translation id="1641113438599504367">Безбедно прегледање</translation> <translation id="164269334534774161">Приказује се офлајн копија ове странице од <ph name="CREATION_TIME" /></translation> <translation id="1644574205037202324">Историја</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">Превлачите клизач док ово не будете могли лако да прочитате. Када двапут додирнете пасус, текст треба да буде бар оволики.</translation> <translation id="2323763861024343754">Меморијски простор за сајт</translation> <translation id="2328985652426384049">Не могу да се пријавим</translation> +<translation id="2342601525305963189">Савети за Chrome:</translation> <translation id="234265804618409743">Не можемо да отворимо камеру. Нешто није у реду.</translation> <translation id="2345671828921229300">Да бисте претраживали, додирните и задржите реч</translation> <translation id="2349710944427398404">Сви подаци које користи Chrome, укључујући налоге, обележиваче и сачувана подешавања</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">URL-ови које посећујете се шаљу Google-у</translation> <translation id="2536728043171574184">Прегледате офлајн копију ове странице</translation> <translation id="2546283357679194313">Колачићи и подаци о сајтовима</translation> +<translation id="2558692642259318568">Испробајте режим Без архивирања да бисте прегледали без чувања активности на уређају</translation> <translation id="2561519700418191927">Прегледи видео снимака</translation> <translation id="2567385386134582609">СЛИКА</translation> <translation id="2567545343356994513">Бржа проактивна заштита од опасних веб-сајтова, преузимања и додатака</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">Број картице</translation> <translation id="2625189173221582860">Лозинка је копирана</translation> <translation id="2631006050119455616">Сачувано</translation> +<translation id="2634905176438867146">Сазнајте како да подесите Chrome као подразумевани прегледач</translation> <translation id="2645657967708199252"><ph name="CONNECTION_TYPE" /> веза може да успори преузимање</translation> <translation id="2647434099613338025">Додај језик</translation> <translation id="2649068648233607930">Прегледачем управља <ph name="DOMAIN" /></translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">Прати се цена</translation> <translation id="3037517125981011456">Приказује упите за пријављивање у Chrome</translation> <translation id="3046945242843292318">Следећи пут брже приступите овом сајту</translation> +<translation id="3055259925215945098">Обележивач је премештен</translation> <translation id="305593374596241526">Локација је искључена; укључите је у <ph name="BEGIN_LINK" />Android подешавањима<ph name="END_LINK" />.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> обележивач}one{<ph name="BOOKMARKS_COUNT_MANY" /> обележивач}few{<ph name="BOOKMARKS_COUNT_MANY" /> обележивача}other{<ph name="BOOKMARKS_COUNT_MANY" /> обележивача}}</translation> <translation id="3062802207422175757">Чланци о вашим интересовањима у Chrome-у</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">Сачувај на уређају</translation> <translation id="3236059992281584593">Још 1 мин</translation> <translation id="3237087289225714896">Стандардно предучитавање:</translation> +<translation id="3237433641417325993">Скролујте надоле да бисте видели подржане чланке</translation> <translation id="3244271242291266297">ММ</translation> <translation id="3245429137663807393">Ако делите и Chrome извештаје о коришћењу, ти извештаји обухватају URL-ове које посећујете</translation> <translation id="3250563604907490871">Описи слика ће се наставити када се повежете на WiFi</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Chrome нема приступ захтеваном ресурсу.</translation> <translation id="4837753911714442426">Отварање опција за штампање странице</translation> <translation id="4842092870884894799">Приказивање искачућег прозора за генерисање лозинке</translation> +<translation id="4842515939542199281">Додирните микрофон да бисте претраживали гласом</translation> <translation id="4850886885716139402">Приказ</translation> <translation id="4860895144060829044">Позовите</translation> <translation id="4864369630010738180">Пријављивање...</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">Детаљни подаци о коришћењу</translation> <translation id="509429900233858213">Дошло је до грешке.</translation> <translation id="510275257476243843">Још 1 сат</translation> +<translation id="5115811374190515607">у <ph name="PRODUCT_NAME" /></translation> <translation id="5118713593561876160">Интересовања</translation> <translation id="5123685120097942451">Картица без архивирања</translation> <translation id="5126510351761255129">Верификујте картицу</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">Chrome-у је потребан приступ меморијском простору да би преузимао датотеке.</translation> <translation id="5749237766298580851">Искључено <ph name="SEPARATOR" /> Не препоручује се</translation> <translation id="5752232708629533680">Делите само GIF</translation> +<translation id="5753139477036638699">Можете да користите глас да бисте претраживали помоћу гласа у Chrome-у</translation> <translation id="5754350196967618083">Освежавање Discover-а није успело</translation> <translation id="5763382633136178763">Картице без архивирања</translation> <translation id="5763514718066511291">Додирните да бисте копирали URL за ову апликацију</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">Пријављивање у Chrome, отворено.</translation> <translation id="6814033694018386318">Шта делите са Google-ом</translation> <translation id="6817747507826986771">Брзо делите ову страницу. Да бисте изменили ову пречицу, додирните и задржите.</translation> +<translation id="6819199143469632133">Пријавите се да бисте синхронизовали Google садржај на свим уређајима</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, картица, изабрана</translation> <translation id="6828070228333235514">Заустави праћење цена</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705">Враћена је ставка <ph name="ITEM_TITLE" /></translation> <translation id="7029390216614421513">Поставите QR или бар-код у овај оквир.</translation> <translation id="7029809446516969842">Лозинке</translation> +<translation id="7037830628447527439">Пријавите се у Chrome помоћу Google налога</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Желите да добијате описе слика?</translation> <translation id="7055152154916055070">Блокирано је преусмеравање:</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> – Преузимање овог језика није успело. Пробајте поново касније.</translation> <translation id="8951232171465285730">Chrome вам је уштедео <ph name="MEGABYTES" /> MB</translation> <translation id="8955719471735800169">Назад на врх</translation> +<translation id="8964479563882643397">Отворите мени да бисте отворили нову картицу без архивирања</translation> <translation id="8965591936373831584">на чекању</translation> <translation id="8967427617812342790">Додај на листу за читање</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" /> картица ће бити затворене}few{Картице без архивирања (<ph name="INCOGNITO_TAB_COUNT" />) и још <ph name="TAB_COUNT_MANY" /> картице ће бити затворене}other{Картице без архивирања (<ph name="INCOGNITO_TAB_COUNT" />) и још <ph name="TAB_COUNT_MANY" /> картица ће бити затворене}}</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 66ae752..78d4202 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">వినియోగదారు పేరును కాపీ చేస్తుంది</translation> <translation id="1592864538817356322">ప్రామాణిక రక్షణ:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{ఎంచుకోబడిన 1 అంశాన్ని తీసివేస్తుంది}other{ఎంచుకోబడిన # అంశాలను తీసివేస్తుంది}}</translation> +<translation id="1633659023549081553">Chrome హోమ్ పేజీలో కొత్త కంటెంట్ను కనుగొనండి</translation> <translation id="1641113438599504367">సురక్షిత బ్రౌజింగ్</translation> <translation id="164269334534774161">మీరు <ph name="CREATION_TIME" /> నుండి ఈ పేజీ యొక్క ఆఫ్లైన్ కాపీని వీక్షిస్తున్నారు</translation> <translation id="1644574205037202324">హిస్టరీ</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">మీరు దీనిని సౌకర్యవంతంగా చదవగలిగే వరకు స్లైడర్ను లాగండి. పేరాపై రెండుసార్లు నొక్కిన తర్వాత వచనం కనీసం ఇంత పెద్దదిగా కనిపించాలి.</translation> <translation id="2323763861024343754">సైట్ నిల్వ</translation> <translation id="2328985652426384049">సైన్ ఇన్ చేయడం సాధ్యపడదు</translation> +<translation id="2342601525305963189">Chrome చిట్కాలు:</translation> <translation id="234265804618409743">మీ కెమెరాను తెరవడం సాధ్యపడలేదు. ఏదో పొరపాటు జరిగింది.</translation> <translation id="2345671828921229300">వెతకడానికి, ఒక పదాన్ని తాకి & అలాగే నొక్కి ఉంచండి</translation> <translation id="2349710944427398404">ఖాతాలు, బుక్మార్క్లు, సేవ్ చేసిన సెట్టింగ్లతో సహా Chrome ఉపయోగించిన మొత్తం డేటా</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">మీరు సందర్శించే URLలు Googleకు పంపబడతాయి</translation> <translation id="2536728043171574184">ఈ పేజీ ఆఫ్లైన్ కాపీని వీక్షిస్తున్నారు</translation> <translation id="2546283357679194313">కుక్కీలు మరియు సైట్ డేటా</translation> +<translation id="2558692642259318568">మీ పరికరంలో యాక్టివిటీని సేవ్ చేయకుండా బ్రౌజ్ చేయాలంటే, అజ్ఞాత మోడ్ను ట్రై చేసి చూడండి</translation> <translation id="2561519700418191927">వీడియో ప్రివ్యూలు</translation> <translation id="2567385386134582609">చిత్రం</translation> <translation id="2567545343356994513">ప్రమాదకరమైన వెబ్సైట్లు, డౌన్లోడ్లు, ఎక్స్టెన్షన్ల నుండి మరింత వేగవంతమైన, క్రియాశీలమైన రక్షణ</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">కార్డ్ సంఖ్య</translation> <translation id="2625189173221582860">పాస్వర్డ్ కాపీ చేయబడింది</translation> <translation id="2631006050119455616">ఆదా చేయబడింది</translation> +<translation id="2634905176438867146">Chromeను మీ ఆటోమేటిక్ బ్రౌజర్గా సెట్ చేయడం ఎలాగో తెలుసుకోండి</translation> <translation id="2645657967708199252">మీ <ph name="CONNECTION_TYPE" /> కనెక్షన్ మీ డౌన్లోడ్ను నెమ్మదించవచ్చు</translation> <translation id="2647434099613338025">భాషను జోడించు</translation> <translation id="2649068648233607930">మీ బ్రౌజర్ <ph name="DOMAIN" /> ద్వారా మేనేజ్ చేయబడుతుంది</translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">ధరను ట్రాక్ చేయడం</translation> <translation id="3037517125981011456">Chromeకు సైన్ ఇన్ చేయడానికి ప్రాంప్ట్లను చూపిస్తుంది</translation> <translation id="3046945242843292318">తర్వాతిసారి ఈ సైట్కు త్వరగా చేరండి</translation> +<translation id="3055259925215945098">బుక్మార్క్ తరలించబడింది</translation> <translation id="305593374596241526">స్థానం ఆఫ్ చేయబడింది; దీనిని <ph name="BEGIN_LINK" />Android సెట్టింగ్లు<ph name="END_LINK" />లో ఆన్ చేయండి.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> బుక్మార్క్}other{<ph name="BOOKMARKS_COUNT_MANY" /> బుక్మార్క్లు}}</translation> <translation id="3062802207422175757">Chromeలోని మీ అభిరుచులకు అనుగుణమైన కథనాలు</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">పరికరానికి సేవ్ చేయండి</translation> <translation id="3236059992281584593">1 నిమిషం మిగిలి ఉంది</translation> <translation id="3237087289225714896">స్టాండర్డ్ ప్రీ - లోడింగ్:</translation> +<translation id="3237433641417325993">సూచించిన కథనాలను చూడటానికి కిందికి స్క్రోల్ చేయండి</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">మీరు Chrome వినియోగ రిపోర్ట్లను కూడా షేర్ చేస్తున్నట్లయితే, ఆ రిపోర్ట్లలో మీరు సందర్శించే URLలు ఉంటాయి</translation> <translation id="3250563604907490871">మీరు Wi-Fiకి కనెక్ట్ అయిన తర్వాత ఇమేజ్ వివరణలు కొనసాగించబడతాయి</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Chrome అభ్యర్థించిన వనరుకు యాక్సెస్ కలిగి లేదు.</translation> <translation id="4837753911714442426">పేజీని ముద్రించడానికి ఎంపికలను తెరవండి</translation> <translation id="4842092870884894799">పాస్వర్డ్ ఉత్పత్తి పాప్ అప్ చూపబడుతోంది</translation> +<translation id="4842515939542199281">మీ వాయిస్తో సెర్చ్ చేయడానికి, మైక్రోఫోన్ను ట్యాప్ చేయండి</translation> <translation id="4850886885716139402">వీక్షణ</translation> <translation id="4860895144060829044">కాల్ చేయండి</translation> <translation id="4864369630010738180">సైన్ ఇన్ అవుతోంది...</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">పొడిగించిన డేటా వినియోగం</translation> <translation id="509429900233858213">ఒక ఎర్రర్ ఏర్పడింది.</translation> <translation id="510275257476243843">1 గంట మిగిలి ఉంది</translation> +<translation id="5115811374190515607"><ph name="PRODUCT_NAME" />కు</translation> <translation id="5118713593561876160">ఆసక్తులు</translation> <translation id="5123685120097942451">అజ్ఞాత ట్యాబ్</translation> <translation id="5126510351761255129">మీ కార్డ్ను ధృవీకరించండి</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">ఫైళ్లను డౌన్లోడ్ చేయడానికి Chromeకు నిల్వ యాక్సెస్ అవసరం.</translation> <translation id="5749237766298580851">ఆఫ్ <ph name="SEPARATOR" /> సిఫార్సు చేయబడదు</translation> <translation id="5752232708629533680">GIFను మాత్రమే షేర్ చేయండి</translation> +<translation id="5753139477036638699">Chromeలో సెర్చ్ చేయడానికి మీరు మీ వాయిస్ను ఉపయోగించవచ్చు</translation> <translation id="5754350196967618083">Discoverను రిఫ్రెష్ చేయడం సాధ్యం కాదు</translation> <translation id="5763382633136178763">అజ్ఞాత ట్యాబ్లు</translation> <translation id="5763514718066511291">ఈ యాప్ URLను కాపీ చేయడానికి నొక్కండి</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">Chromeకు సైన్ ఇన్ చేయండి, తెరవబడింది.</translation> <translation id="6814033694018386318">మీరు Google తో ఏమి షేర్ చేస్తారు</translation> <translation id="6817747507826986771">త్వరగా ఈ పేజీని షేర్ చేయండి. ఈ షార్ట్కట్ను ఎడిట్ చేయడానికి, నొక్కి, పట్టుకోండి.</translation> +<translation id="6819199143469632133">మీ పరికరాలన్నింటిలో Google ప్రయోజనాలను పొందడానికి, సైన్ ఇన్ చేయండి</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, ట్యాబ్ను ఎంచుకున్నారు</translation> <translation id="6828070228333235514">ధరను ట్రాక్ చేయడాన్ని ఆపివేయండి</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> రీస్టోర్ చేయబడింది</translation> <translation id="7029390216614421513">QR కోడ్/బార్కోడ్ను ఈ ఫ్రేమ్లో ఉంచండి.</translation> <translation id="7029809446516969842">పాస్వర్డ్లు</translation> +<translation id="7037830628447527439">మీ Google ఖాతాతో Chromeకు సైన్ ఇన్ చేయండి</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">ఇమేజ్ వివరణలను పొందాలనుకుంటున్నారా?</translation> <translation id="7055152154916055070">మళ్లింపు బ్లాక్ చేయబడింది:</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> - ఈ భాషను డౌన్లోడ్ చేయడం సాధ్యపడదు. తర్వాత మళ్లీ ట్రై చేయండి.</translation> <translation id="8951232171465285730">Chrome మీకు <ph name="MEGABYTES" /> MB ఆదా చేసింది</translation> <translation id="8955719471735800169">ఎగువకు తిరిగి వెళ్ళు</translation> +<translation id="8964479563882643397">కొత్త అజ్ఞాత ట్యాబ్ను తెరవడానికి, మెనూను తెరవండి</translation> <translation id="8965591936373831584">పెండింగ్లో ఉంది</translation> <translation id="8967427617812342790">పఠనా లిస్ట్కు జోడించు</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>
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 8b312c4..c0c08156 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
@@ -104,6 +104,7 @@ <translation id="1571304935088121812">Копіювати ім’я користувача</translation> <translation id="1592864538817356322">Стандартний захист:</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{Вилучити 1 вибраний елемент}one{Вилучити # вибраний елемент}few{Вилучити # вибрані елементи}many{Вилучити # вибраних елементів}other{Вилучити # вибраного елемента}}</translation> +<translation id="1633659023549081553">Переглядайте новий контент на головній сторінці Chrome</translation> <translation id="1641113438599504367">Безпечний перегляд</translation> <translation id="164269334534774161">Ви переглядаєте офлайн-копію цієї сторінки, створену <ph name="CREATION_TIME" /></translation> <translation id="1644574205037202324">Історія</translation> @@ -220,6 +221,7 @@ <translation id="2321958826496381788">Перетягуйте повзунок, доки розмір тексту не стане зручним для читання. Якщо двічі торкнутись абзацу, розмір тексту має стати принаймні таким, як цей.</translation> <translation id="2323763861024343754">Дані сайтів</translation> <translation id="2328985652426384049">Не вдається ввійти</translation> +<translation id="2342601525305963189">Поради щодо Chrome</translation> <translation id="234265804618409743">Не вдається відкрити камеру. Помилка.</translation> <translation id="2345671828921229300">Щоб почати пошук, натисніть і утримуйте слово</translation> <translation id="2349710944427398404">Усі дані, які використовує Chrome, зокрема облікові записи, закладки та збережені налаштування</translation> @@ -263,6 +265,7 @@ <translation id="2534582914273493287">URL-адреси сторінок, які ви відвідуєте, надсилаються в Google</translation> <translation id="2536728043171574184">Перегляд копії сторінки в режимі офлайн</translation> <translation id="2546283357679194313">Файли cookie та дані із сайтів</translation> +<translation id="2558692642259318568">Увімкніть анонімний режим, якщо не хочете зберігати історію активності на пристрої</translation> <translation id="2561519700418191927">Анімовані значки відео</translation> <translation id="2567385386134582609">ЗОБРАЖЕННЯ</translation> <translation id="2567545343356994513">Швидший активний захист від небезпечних веб-сайтів, завантажень і розширень</translation> @@ -274,6 +277,7 @@ <translation id="2612676031748830579">Номер картки</translation> <translation id="2625189173221582860">Пароль скопійовано</translation> <translation id="2631006050119455616">Збережено</translation> +<translation id="2634905176438867146">Дізнайтеся, як зробити Chrome веб-переглядачем за умовчанням</translation> <translation id="2645657967708199252">Завантаження через підключення <ph name="CONNECTION_TYPE" /> може бути повільнішим</translation> <translation id="2647434099613338025">Додати мову</translation> <translation id="2649068648233607930">Вашим веб-переглядачем керує <ph name="DOMAIN" /></translation> @@ -358,6 +362,7 @@ <translation id="3037177537145227281">Ціна відстежується</translation> <translation id="3037517125981011456">Показувати сповіщення для входу в Chrome</translation> <translation id="3046945242843292318">Переходьте на цей сайт швидше</translation> +<translation id="3055259925215945098">Закладку переміщено</translation> <translation id="305593374596241526">Геодані вимкнено. Увімкніть їх у <ph name="BEGIN_LINK" />налаштуваннях Android<ph name="END_LINK" />.</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> закладка}one{<ph name="BOOKMARKS_COUNT_MANY" /> закладка}few{<ph name="BOOKMARKS_COUNT_MANY" /> закладки}many{<ph name="BOOKMARKS_COUNT_MANY" /> закладок}other{<ph name="BOOKMARKS_COUNT_MANY" /> закладки}}</translation> <translation id="3062802207422175757">Статті на цікаві вам теми в Chrome</translation> @@ -386,6 +391,7 @@ <translation id="3234978181857588512">Зберегти на пристрій</translation> <translation id="3236059992281584593">Залишилась 1 хв</translation> <translation id="3237087289225714896">Стандартне попереднє завантаження:</translation> +<translation id="3237433641417325993">Прокрутіть униз, що переглянути рекомендовані статті</translation> <translation id="3244271242291266297">ММ</translation> <translation id="3245429137663807393">Якщо ви також будете надсилати звіти про використання Chrome, у них буде включено дані про відвідані URL-адреси</translation> <translation id="3250563604907490871">Описи зображень з'являться знову, коли пристрій підключиться до мережі Wi-Fi</translation> @@ -651,6 +657,7 @@ <translation id="4835385943915508971">Chrome не має доступу до потрібного ресурсу.</translation> <translation id="4837753911714442426">Відкрити налаштування друку сторінки</translation> <translation id="4842092870884894799">Показ спливаючих вікон для створення пароля</translation> +<translation id="4842515939542199281">Щоб шукати за допомогою голосу, натисніть значок мікрофона</translation> <translation id="4850886885716139402">Перегляд</translation> <translation id="4860895144060829044">Зателефонувати</translation> <translation id="4864369630010738180">Вхід…</translation> @@ -697,6 +704,7 @@ <translation id="5091249083535528968">Розширені дані про використання</translation> <translation id="509429900233858213">Сталася помилка.</translation> <translation id="510275257476243843">Залишилась 1 година</translation> +<translation id="5115811374190515607">в <ph name="PRODUCT_NAME" /></translation> <translation id="5118713593561876160">Інтереси</translation> <translation id="5123685120097942451">Анонімна вкладка</translation> <translation id="5126510351761255129">Підтвердьте дані картки</translation> @@ -801,6 +809,7 @@ <translation id="5749068826913805084">Щоб завантажувати файли, Chrome потребує доступу до пам’яті.</translation> <translation id="5749237766298580851">Вимкнено <ph name="SEPARATOR" /> Не рекомендовано</translation> <translation id="5752232708629533680">Поділитися лише файлом у форматі GIF</translation> +<translation id="5753139477036638699">У Chrome можна шукати голосом</translation> <translation id="5754350196967618083">Не вдається оновити рекомендації</translation> <translation id="5763382633136178763">Анонімні вкладки</translation> <translation id="5763514718066511291">Торкніться, щоб скопіювати URL-адресу цього додатка</translation> @@ -1012,6 +1021,7 @@ <translation id="6813446258015311409">Вікно "Увійти в Chrome" відкрите.</translation> <translation id="6814033694018386318">До якої інформації отримає доступ компанія Google</translation> <translation id="6817747507826986771">Швидко діліться цією сторінкою. Щоб змінити функцію цієї кнопки, натисніть і втримуйте її.</translation> +<translation id="6819199143469632133">Увійдіть в обліковий запис, щоб користуватися сервісами Google на кількох пристроях</translation> <translation id="6820686453637990663">CVC</translation> <translation id="6824899148643461612">Вибрано вкладку "<ph name="TAB_TITLE" />"</translation> <translation id="6828070228333235514">Зупинити відстеження ціни</translation> @@ -1050,6 +1060,7 @@ <translation id="7027549951530753705">Відновлено об'єкт "<ph name="ITEM_TITLE" />"</translation> <translation id="7029390216614421513">Розмістіть QR-код або штрих-код у цій рамці</translation> <translation id="7029809446516969842">Паролі</translation> +<translation id="7037830628447527439">Увійдіть у Chrome через обліковий запис Google</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Отримувати описи зображень?</translation> <translation id="7055152154916055070">Переадресацію заблоковано:</translation> @@ -1404,6 +1415,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> – Не вдалося завантажити цю мову. Повторіть спробу пізніше.</translation> <translation id="8951232171465285730">Chrome заощадив <ph name="MEGABYTES" /> МБ</translation> <translation id="8955719471735800169">На початок</translation> +<translation id="8964479563882643397">Щоб відкрити нову анонімну вкладку, натисніть значок меню</translation> <translation id="8965591936373831584">очікується</translation> <translation id="8967427617812342790">Додати в список читання</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" /> вкладку буде закрито}few{Анонімні (<ph name="INCOGNITO_TAB_COUNT" />) і ще <ph name="TAB_COUNT_MANY" /> вкладки буде закрито}many{Анонімні (<ph name="INCOGNITO_TAB_COUNT" />) і ще <ph name="TAB_COUNT_MANY" /> вкладок буде закрито}other{Анонімні (<ph name="INCOGNITO_TAB_COUNT" />) і ще <ph name="TAB_COUNT_MANY" /> вкладки буде закрито}}</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 26fe730..ce8cc05 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
@@ -826,6 +826,7 @@ <translation id="5854512288214985237">Không có số liệu thống kê hoặc báo cáo sự cố nào được gửi cho Google</translation> <translation id="5855546874025048181">Tinh chỉnh: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">Đã xảy ra lỗi. Không thể cập nhật tính năng Theo dõi giá.</translation> +<translation id="5859968346865909126">Bạn có thể bật hoặc tắt chế độ này trong phần cài đặt.</translation> <translation id="5860033963881614850">Tắt</translation> <translation id="5860491529813859533">Bật</translation> <translation id="5862731021271217234">Để sử dụng các thẻ từ những thiết bị khác, hãy bật tính năng đồng bộ hóa</translation> @@ -1100,6 +1101,7 @@ <translation id="7359002509206457351">Truy cập vào phương thức thanh toán</translation> <translation id="7375125077091615385">Loại:</translation> <translation id="7376560087009844242">Bạn có thể thấy kết quả phù hợp hơn khi dùng tính năng Chạm để tìm kiếm bằng cách bao gồm thêm nhiều văn bản của trang. Bạn có thể truy cập phần <ph name="BEGIN_LINK" />cài đặt<ph name="END_LINK" /> để thay đổi lựa chọn này bất cứ lúc nào.</translation> +<translation id="7379900596734708416">Đã có giao diện tối cho các trang web</translation> <translation id="7386842512861524348">Trang web có kết nối an toàn, trừ phi Chrome thông báo cho bạn thông tin khác.</translation> <translation id="7396940094317457632"><ph name="FILE_NAME" />.</translation> <translation id="7400418766976504921">URL</translation>
diff --git a/chrome/browser/ui/android/theme/BUILD.gn b/chrome/browser/ui/android/theme/BUILD.gn index 4fac4fb4..36e61e78 100644 --- a/chrome/browser/ui/android/theme/BUILD.gn +++ b/chrome/browser/ui/android/theme/BUILD.gn
@@ -9,6 +9,7 @@ "java/src/org/chromium/chrome/browser/theme/ThemeColorProvider.java", "java/src/org/chromium/chrome/browser/theme/ThemeUtils.java", "java/src/org/chromium/chrome/browser/theme/TopUiThemeColorProvider.java", + "java/src/org/chromium/chrome/browser/ui/theme/BrandedColorScheme.java", ] deps = [ ":java_resources",
diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/ui/theme/BrandedColorScheme.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/ui/theme/BrandedColorScheme.java new file mode 100644 index 0000000..eaada423 --- /dev/null +++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/ui/theme/BrandedColorScheme.java
@@ -0,0 +1,31 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.ui.theme; + +import androidx.annotation.IntDef; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@IntDef({BrandedColorScheme.LIGHT_BRANDED_THEME, BrandedColorScheme.DARK_BRANDED_THEME, + BrandedColorScheme.INCOGNITO, BrandedColorScheme.APP_DEFAULT}) +@Retention(RetentionPolicy.SOURCE) +public @interface BrandedColorScheme { + /** + * Light branded color as defined by the website, unrelated to the app/OS dark theme setting. + */ + int LIGHT_BRANDED_THEME = 0; + /** + * Dark branded color as defined by the website, unrelated to the app/OS dark theme setting. + */ + int DARK_BRANDED_THEME = 1; + /** Incognito theme. */ + int INCOGNITO = 2; + /** + * Default theme with potentially dynamic colors that can be light or dark depending on user + * or system settings. + */ + int APP_DEFAULT = 3; +}
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java index cd596de6..d0632e7 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
@@ -28,7 +28,6 @@ import org.chromium.chrome.browser.omnibox.SearchEngineLogoUtils; import org.chromium.chrome.browser.omnibox.UrlBarData; import org.chromium.chrome.browser.omnibox.styles.OmniboxResourceProvider; -import org.chromium.chrome.browser.omnibox.styles.OmniboxTheme; import org.chromium.chrome.browser.paint_preview.TabbedPaintPreview; import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.profiles.Profile; @@ -36,6 +35,7 @@ import org.chromium.chrome.browser.tab.TrustedCdn; import org.chromium.chrome.browser.theme.ThemeUtils; import org.chromium.chrome.browser.ui.native_page.NativePage; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.features.start_surface.StartSurfaceConfiguration; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils; @@ -306,16 +306,18 @@ ChromeAutocompleteSchemeClassifier chromeAutocompleteSchemeClassifier = new ChromeAutocompleteSchemeClassifier(getProfile()); - final @OmniboxTheme int omniboxTheme = OmniboxResourceProvider.getOmniboxTheme( - mContext, isIncognito(), getPrimaryColor()); + final @BrandedColorScheme int brandedColorScheme = + OmniboxResourceProvider.getBrandedColorScheme( + mContext, isIncognito(), getPrimaryColor()); final @ColorInt int nonEmphasizedColor = - OmniboxResourceProvider.getUrlBarSecondaryTextColor(mContext, omniboxTheme); + OmniboxResourceProvider.getUrlBarSecondaryTextColor( + mContext, brandedColorScheme); final @ColorInt int emphasizedColor = - OmniboxResourceProvider.getUrlBarPrimaryTextColor(mContext, omniboxTheme); + OmniboxResourceProvider.getUrlBarPrimaryTextColor(mContext, brandedColorScheme); final @ColorInt int dangerColor = - OmniboxResourceProvider.getUrlBarDangerColor(mContext, omniboxTheme); + OmniboxResourceProvider.getUrlBarDangerColor(mContext, brandedColorScheme); final @ColorInt int secureColor = - OmniboxResourceProvider.getUrlBarSecureColor(mContext, omniboxTheme); + OmniboxResourceProvider.getUrlBarSecureColor(mContext, brandedColorScheme); OmniboxUrlEmphasizer.emphasizeUrl(spannableDisplayText, chromeAutocompleteSchemeClassifier, getSecurityLevel(), isInternalPage, shouldEmphasizeHttpsScheme(), nonEmphasizedColor, emphasizedColor, dangerColor,
diff --git a/chrome/browser/ui/ash/ime_controller_client_impl_unittest.cc b/chrome/browser/ui/ash/ime_controller_client_impl_unittest.cc index bc96941..a64c5f1 100644 --- a/chrome/browser/ui/ash/ime_controller_client_impl_unittest.cc +++ b/chrome/browser/ui/ash/ime_controller_client_impl_unittest.cc
@@ -244,7 +244,6 @@ } TEST_F(ImeControllerClientImplTest, InputMethodChanged) { - ui::IMEBridge::Initialize(); auto mock_candidate_window = std::make_unique<ash::MockIMECandidateWindowHandler>(); ui::IMEBridge::Get()->SetCandidateWindowHandler(mock_candidate_window.get());
diff --git a/chrome/browser/ui/ash/microphone_mute_notification_delegate_impl.cc b/chrome/browser/ui/ash/microphone_mute_notification_delegate_impl.cc index ef75e0c8..fb17b4df 100644 --- a/chrome/browser/ui/ash/microphone_mute_notification_delegate_impl.cc +++ b/chrome/browser/ui/ash/microphone_mute_notification_delegate_impl.cc
@@ -91,10 +91,13 @@ absl::optional<std::u16string> MicrophoneMuteNotificationDelegateImpl::GetAppAccessingMicrophone() { apps::AppRegistryCache* reg_cache = GetActiveUserAppRegistryCache(); - DCHECK(reg_cache); apps::AppCapabilityAccessCache* cap_cache = GetActiveUserAppCapabilityAccessCache(); - DCHECK(cap_cache); + // A reg_cache and/or cap_cache of value nullptr is possible if we have + // no active user, e.g. the login screen, so we test and return nullopt + // in that case instead of using DCHECK(). + if (!reg_cache || !cap_cache) + return absl::nullopt; return GetAppAccessingMicrophone(cap_cache, reg_cache); }
diff --git a/chrome/browser/ui/views/global_media_controls/media_item_ui_device_selector_view.cc b/chrome/browser/ui/views/global_media_controls/media_item_ui_device_selector_view.cc index 875a4f7..689e3722 100644 --- a/chrome/browser/ui/views/global_media_controls/media_item_ui_device_selector_view.cc +++ b/chrome/browser/ui/views/global_media_controls/media_item_ui_device_selector_view.cc
@@ -52,7 +52,7 @@ // Constant for DropdownButton const int kDropdownButtonIconSize = 15; -const int kDropdownButtonBackgroundRadius = 10; +const int kDropdownButtonBackgroundRadius = 15; constexpr gfx::Insets kDropdownButtonBorderInsets{4}; // The maximum number of audio devices to count when recording the @@ -507,6 +507,12 @@ return is_expanded_; } +bool MediaItemUIDeviceSelectorView::OnMousePressed( + const ui::MouseEvent& event) { + // Stop the mouse click event from bubbling to parent views. + return true; +} + void MediaItemUIDeviceSelectorView::AddObserver( MediaItemUIDeviceSelectorObserver* observer) { observers_.AddObserver(observer);
diff --git a/chrome/browser/ui/views/global_media_controls/media_item_ui_device_selector_view.h b/chrome/browser/ui/views/global_media_controls/media_item_ui_device_selector_view.h index 384ed0e4..b6b609ab 100644 --- a/chrome/browser/ui/views/global_media_controls/media_item_ui_device_selector_view.h +++ b/chrome/browser/ui/views/global_media_controls/media_item_ui_device_selector_view.h
@@ -87,6 +87,9 @@ void OnDropdownButtonClicked() override; bool IsDeviceSelectorExpanded() override; + // views::View + bool OnMousePressed(const ui::MouseEvent& event) override; + void AddObserver(MediaItemUIDeviceSelectorObserver* observer); views::Label* GetExpandDeviceSelectorLabelForTesting();
diff --git a/chrome/browser/ui/views/lens/lens_side_panel_controller_unittest.cc b/chrome/browser/ui/views/lens/lens_side_panel_controller_unittest.cc index 1a82b6b..d46e5f8 100644 --- a/chrome/browser/ui/views/lens/lens_side_panel_controller_unittest.cc +++ b/chrome/browser/ui/views/lens/lens_side_panel_controller_unittest.cc
@@ -29,9 +29,11 @@ public: void SetUp() override { base::test::ScopedFeatureList features; - features.InitWithFeatures( - {features::kLensRegionSearch, ::features::kSidePanel, - reading_list::switches::kReadLater}, + features.InitWithFeaturesAndParameters( + {{features::kLensRegionSearch, + {{"region-search-enable-side-panel", "true"}}}, + {::features::kSidePanel, {}}, + {reading_list::switches::kReadLater, {}}}, {}); TestWithBrowserView::SetUp(); // Create the lens side panel controller in BrowserView.
diff --git a/chrome/browser/ui/views/sync/inline_login_ui_browsertest.cc b/chrome/browser/ui/views/sync/inline_login_ui_browsertest.cc index 4baa415d..74f0bc77 100644 --- a/chrome/browser/ui/views/sync/inline_login_ui_browsertest.cc +++ b/chrome/browser/ui/views/sync/inline_login_ui_browsertest.cc
@@ -844,7 +844,7 @@ net::QueryIterator it(request_url); for (; !it.IsAtEnd(); it.Advance()) { query_params.push_back( - std::make_pair(it.GetKey(), it.GetUnescapedValue())); + std::make_pair(std::string(it.GetKey()), it.GetUnescapedValue())); } requested_urls_[GURL(request.GetURL().GetWithEmptyPath().Resolve( request.GetURL().path()))]
diff --git a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc index f67d98f..a1f68f33 100644 --- a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc +++ b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc
@@ -157,22 +157,12 @@ content::RenderFrameHost::FromID(rfh_id)); } -GURL GetOriginFromId(GlobalRenderFrameHostId rfh_id) { - WebContents* capturer = WebContentsFromId(rfh_id); - if (!capturer) +url::Origin GetOriginFromId(GlobalRenderFrameHostId rfh_id) { + auto* rfh = content::RenderFrameHost::FromID(rfh_id); + if (!rfh) return {}; - return capturer->GetLastCommittedURL().DeprecatedGetOriginAsURL(); -} - -bool CanFocusCapturer(GlobalRenderFrameHostId capturer_id) { - WebContents* const capturer = WebContentsFromId(capturer_id); - if (!capturer) { - return false; - } - - return !capturer->GetLastCommittedURL().SchemeIs( - extensions::kExtensionScheme); + return rfh->GetLastCommittedOrigin(); } bool CapturerRestrictedToSameOrigin(GlobalRenderFrameHostId capturer_id) { @@ -180,8 +170,8 @@ if (!capturer) return false; return capture_policy::GetAllowedCaptureLevel( - capturer->GetLastCommittedURL().DeprecatedGetOriginAsURL(), - capturer) == AllowedScreenCaptureLevel::kSameOrigin; + GetOriginFromId(capturer_id).GetURL(), capturer) == + AllowedScreenCaptureLevel::kSameOrigin; } } // namespace @@ -206,7 +196,8 @@ bool favicons_used_for_switch_to_tab_button) : capturer_(capturer), capturer_origin_(GetOriginFromId(capturer)), - can_focus_capturer_(CanFocusCapturer(capturer)), + can_focus_capturer_(GetOriginFromId(capturer).scheme() != + extensions::kExtensionScheme), capturer_restricted_to_same_origin_( CapturerRestrictedToSameOrigin(capturer)), shared_tab_media_id_(media_id), @@ -433,9 +424,8 @@ // Determine if we are currently allowed to share this tab by policy. const bool is_sharing_allowed_by_policy = !capturer_restricted_to_same_origin_ || - url::IsSameOriginWith( - capturer_origin_, - contents->GetLastCommittedURL().DeprecatedGetOriginAsURL()); + capturer_origin_.IsSameOriginWith( + contents->GetMainFrame()->GetLastCommittedOrigin()); // Never show the [share this tab instead] if sharing is not possible or is // blocked by policy.
diff --git a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.h b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.h index 5aae76b0..c609e32 100644 --- a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.h +++ b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.h
@@ -127,7 +127,7 @@ std::map<content::WebContents*, std::unique_ptr<SameOriginObserver>> same_origin_observers_; const content::GlobalRenderFrameHostId capturer_; - const GURL capturer_origin_; + const url::Origin capturer_origin_; const bool can_focus_capturer_; const bool capturer_restricted_to_same_origin_ = false; content::DesktopMediaID shared_tab_media_id_;
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc index 0b66105..99d8e02 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc
@@ -1575,9 +1575,10 @@ helper_.CheckWindowCreated(); } +// Test is flaky. See https://crbug.com/1280125 IN_PROC_BROWSER_TEST_F( WebAppIntegrationBrowserTest, - WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_InstPlcyTabShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated) { + DISABLED_WebAppIntegration_InstOmniboxSiteA_WindowCreated_InListWinSiteA_InstPlcyTabShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated) { // Test contents are generated by script. Please do not modify! // See `chrome/test/webapps/README.md` for more info. // Sheriffs: Disabling this test is supported. @@ -1634,9 +1635,10 @@ helper_.CheckWindowCreated(); } +// Test is flaky. See https://crbug.com/1280125 IN_PROC_BROWSER_TEST_F( WebAppIntegrationBrowserTest, - WebAppIntegration_InstMenuOptionSiteA_WindowCreated_InListWinSiteA_InstPlcyTabShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated) { + DISABLED_WebAppIntegration_InstMenuOptionSiteA_WindowCreated_InListWinSiteA_InstPlcyTabShctSiteA_InListWinSiteA_LaunchFromIconSiteA_WindowCreated) { // Test contents are generated by script. Please do not modify! // See `chrome/test/webapps/README.md` for more info. // Sheriffs: Disabling this test is supported.
diff --git a/chrome/browser/ui/web_applications/system_web_app_delegate_ui_impl.cc b/chrome/browser/ui/web_applications/system_web_app_delegate_ui_impl.cc index 83a50ac..e278eef 100644 --- a/chrome/browser/ui/web_applications/system_web_app_delegate_ui_impl.cc +++ b/chrome/browser/ui/web_applications/system_web_app_delegate_ui_impl.cc
@@ -20,33 +20,6 @@ namespace web_app { -namespace { - -base::FilePath GetLaunchDirectory( - bool should_include_launch_directory, - const std::vector<base::FilePath>& launch_files) { - if (!should_include_launch_directory) - return base::FilePath(); - - // |launch_dir| is the directory that contains all |launch_files|. If - // there are no launch files, launch_dir is empty. - base::FilePath launch_dir = - launch_files.size() ? launch_files[0].DirName() : base::FilePath(); - -#if DCHECK_IS_ON() - // Check |launch_files| all come from the same directory. - if (!launch_dir.empty()) { - for (auto path : launch_files) { - DCHECK_EQ(launch_dir, path.DirName()); - } - } -#endif - - return launch_dir; -} - -} // namespace - Browser* SystemWebAppDelegate::LaunchAndNavigateSystemWebApp( Profile* profile, WebAppProvider* provider, @@ -105,8 +78,7 @@ if (provider->os_integration_manager().IsFileHandlingAPIAvailable( params.app_id)) { GURL app_scope = provider->registrar().GetAppScope(params.app_id); - base::FilePath launch_dir = - GetLaunchDirectory(ShouldIncludeLaunchDirectory(), params.launch_files); + base::FilePath launch_dir = GetLaunchDirectory(params); if (!launch_dir.empty() || !params.launch_files.empty()) { web_launch::WebLaunchFilesHelper::EnqueueLaunchParams(
diff --git a/chrome/browser/ui/webui/access_code_cast/access_code_cast_ui.cc b/chrome/browser/ui/webui/access_code_cast/access_code_cast_ui.cc index 89677d0..0a9d9dd 100644 --- a/chrome/browser/ui/webui/access_code_cast/access_code_cast_ui.cc +++ b/chrome/browser/ui/webui/access_code_cast/access_code_cast_ui.cc
@@ -118,6 +118,11 @@ {"cast", IDS_ACCESS_CODE_CAST_CAST}, {"close", IDS_CLOSE}, {"dialogTitle", IDS_ACCESS_CODE_CAST_DIALOG_TITLE}, + {"errorAccessCode", IDS_ACCESS_CODE_CAST_ERROR_ACCESS_CODE}, + {"errorNetwork", IDS_ACCESS_CODE_CAST_ERROR_NETWORK}, + {"errorPermission", IDS_ACCESS_CODE_CAST_ERROR_PERMISSION}, + {"errorTooManyRequests", IDS_ACCESS_CODE_CAST_ERROR_TOO_MANY_REQUESTS}, + {"errorUnknown", IDS_ACCESS_CODE_CAST_ERROR_UNKNOWN}, {"useCamera", IDS_ACCESS_CODE_CAST_USE_CAMERA}, };
diff --git a/chrome/browser/ui/webui/chromeos/bluetooth_shared_load_time_data_provider.cc b/chrome/browser/ui/webui/chromeos/bluetooth_shared_load_time_data_provider.cc index b7739d7..8b77a804 100644 --- a/chrome/browser/ui/webui/chromeos/bluetooth_shared_load_time_data_provider.cc +++ b/chrome/browser/ui/webui/chromeos/bluetooth_shared_load_time_data_provider.cc
@@ -26,6 +26,7 @@ IDS_BLUETOOTH_PAIRING_PAIRING_AVAILABLE_DEVICES}, {"bluetoothNoAvailableDevices", IDS_BLUETOOTH_PAIRING_PAIRING_NO_AVAILABLE_DEVICES}, + {"bluetoothDisabled", IDS_BLUETOOTH_PAIRING_PAIRING_BLUETOOTH_DISABLED}, {"bluetoothAccept", IDS_BLUETOOTH_PAIRING_ACCEPT_PASSKEY}, {"bluetoothEnterKey", IDS_BLUETOOTH_PAIRING_ENTER_KEY}, {"bluetoothPair", IDS_BLUETOOTH_PAIRING_PAIR}, @@ -45,28 +46,6 @@ {"bluetoothConfirmCodeMessage", IDS_BLUETOOTH_PAIRING_CONFIRM_CODE_MESSAGE}, {"bluetoothPairingEnterKeys", IDS_BLUETOOTH_PAIRING_ENTER_KEYS}, - {"bluetoothPairingDeviceItemA11YLabelUnknown", - IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_UNKNOWN}, - {"bluetoothPairingDeviceItemA11YLabelComputer", - IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_COMPUTER}, - {"bluetoothPairingDeviceItemA11YLabelPhone", - IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_PHONE}, - {"bluetoothPairingDeviceItemA11YLabelHeadset", - IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_HEADSET}, - {"bluetoothPairingDeviceItemA11YLabelVideoCamera", - IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_VIDEO_CAMERA}, - {"bluetoothPairingDeviceItemA11YLabelGameContoller", - IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_GAME_CONTROLLER}, - {"bluetoothPairingDeviceItemA11YLabelKeyboard", - IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_KEYBOARD}, - {"bluetoothPairingDeviceItemA11YLabelMouse", - IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_MOUSE}, - {"bluetoothPairingDeviceItemA11YLabelTablet", - IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_A11Y_LABEL_TABLET}, - {"bluetoothPairingDeviceItemSecondaryErrorA11YLabel", - IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_SECONDARY_ERROR_A11Y_LABEL}, - {"bluetoothPairingDeviceItemSecondaryPairingA11YLabel", - IDS_BLUETOOTH_PAIRINGS_DEVICE_ITEM_SECONDARY_PAIRING_A11Y_LABEL}, // Device connecting and pairing. // These ids are generated in JS using 'bluetooth_' + a value from // bluetoothPrivate.PairingEventType (see bluetooth_private.idl).
diff --git a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc index fa8fdbe7..c6a1bc3 100644 --- a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
@@ -620,6 +620,9 @@ // only within MODE_OFFLINE_DEMO flow, which shouldn't happen here. NOTREACHED(); return; + case policy::EnrollmentStatus::MAY_NOT_BLOCK_DEV_MODE: + ShowError(IDS_ENTERPRISE_ENROLLMENT_ERROR_MAY_NOT_BLOCK_DEV_MODE, false); + return; } NOTREACHED(); }
diff --git a/chrome/browser/ui/webui/fileicon_source.cc b/chrome/browser/ui/webui/fileicon_source.cc index 628d7f7..c489d37 100644 --- a/chrome/browser/ui/webui/fileicon_source.cc +++ b/chrome/browser/ui/webui/fileicon_source.cc
@@ -37,7 +37,8 @@ // URL parameter specifying scale factor. const char kScaleFactorParameter[] = "scale"; -IconLoader::IconSize SizeStringToIconSize(const std::string& size_string) { +IconLoader::IconSize SizeStringToIconSize( + const base::StringPiece& size_string) { if (size_string == "small") return IconLoader::SMALL; if (size_string == "large") return IconLoader::LARGE; // We default to NORMAL if we don't recognize the size_string. Including @@ -51,7 +52,7 @@ IconLoader::IconSize* icon_size) { GURL request = GURL(chrome::kChromeUIFileiconURL).Resolve(path); for (net::QueryIterator it(request); !it.IsAtEnd(); it.Advance()) { - std::string key = it.GetKey(); + const base::StringPiece key = it.GetKey(); if (key == kPathParameter) { *file_path = base::FilePath::FromUTF8Unsafe(it.GetUnescapedValue()) .NormalizePathSeparators();
diff --git a/chrome/browser/ui/webui/settings/chromeos/internet_handler.h b/chrome/browser/ui/webui/settings/chromeos/internet_handler.h index 80862b2..52c567b1 100644 --- a/chrome/browser/ui/webui/settings/chromeos/internet_handler.h +++ b/chrome/browser/ui/webui/settings/chromeos/internet_handler.h
@@ -15,10 +15,6 @@ namespace chromeos { -namespace tether { -class GmsCoreNotificationsStateTracker; -} // namespace tether - namespace settings { // Chrome OS Internet settings page UI handler.
diff --git a/chrome/browser/ui/webui/settings/chromeos/privacy_section.cc b/chrome/browser/ui/webui/settings/chromeos/privacy_section.cc index f2373e8..1e437fd 100644 --- a/chrome/browser/ui/webui/settings/chromeos/privacy_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/privacy_section.cc
@@ -319,8 +319,8 @@ IDS_OS_SETTINGS_SMART_PRIVACY_SNOOPING_TITLE}, {"smartPrivacySnoopingSubtext", IDS_OS_SETTINGS_SMART_PRIVACY_SNOOPING_SUBTEXT}, - {"smartPrivacySnoopingIcon", IDS_OS_SETTINGS_SMART_PRIVACY_SNOOPING_ICON}, - {"smartPrivacySnoopingDim", IDS_OS_SETTINGS_SMART_PRIVACY_SNOOPING_DIM}, + {"smartPrivacySnoopingNotifications", + IDS_OS_SETTINGS_SMART_PRIVACY_SNOOPING_NOTIFICATIONS}, }; html_source->AddLocalizedStrings(kLocalizedStrings);
diff --git a/chrome/browser/ui/window_sizer/window_sizer.cc b/chrome/browser/ui/window_sizer/window_sizer.cc index 875aa4c..97895b3 100644 --- a/chrome/browser/ui/window_sizer/window_sizer.cc +++ b/chrome/browser/ui/window_sizer/window_sizer.cc
@@ -4,11 +4,11 @@ #include "chrome/browser/ui/window_sizer/window_sizer.h" +#include <algorithm> #include <utility> #include "base/command_line.h" #include "base/memory/raw_ptr.h" -#include "base/numerics/ranges.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/browser_process.h" @@ -147,6 +147,13 @@ raw_ptr<const Browser> browser_; }; +// This function, unlike base::clamp(), does not check if `min` is greater than +// `max`, and returns a bogus answer if it is. TODO(crbug.com/1235666) migrate +// all code that calls this function to use base::clamp() instead. +constexpr int BrokenClampThatShouldNotBeUsed(int value, int min, int max) { + return std::min(std::max(value, min), max); +} + } // namespace WindowSizer::WindowSizer(std::unique_ptr<StateProvider> state_provider, @@ -324,9 +331,9 @@ bounds->set_height(std::min(bounds->height(), work_area.height())); // TODO(crbug.com/1235666): Make sure these use correct ranges (lo <= hi) // and migrate to base::clamp(). - bounds->set_x(base::BrokenClampThatShouldNotBeUsed( + bounds->set_x(BrokenClampThatShouldNotBeUsed( bounds->x(), work_area.x(), work_area.right() - bounds->width())); - bounds->set_y(base::BrokenClampThatShouldNotBeUsed( + bounds->set_y(BrokenClampThatShouldNotBeUsed( bounds->y(), work_area.y(), work_area.bottom() - bounds->height())); } @@ -357,10 +364,8 @@ const int max_x = work_area.right() - kMinVisibleWidth; // TODO(crbug.com/1235666): Make sure these use correct ranges (lo <= hi) // and migrate to base::clamp(). - bounds->set_y( - base::BrokenClampThatShouldNotBeUsed(bounds->y(), min_y, max_y)); - bounds->set_x( - base::BrokenClampThatShouldNotBeUsed(bounds->x(), min_x, max_x)); + bounds->set_y(BrokenClampThatShouldNotBeUsed(bounds->y(), min_y, max_y)); + bounds->set_x(BrokenClampThatShouldNotBeUsed(bounds->x(), min_x, max_x)); #endif // defined(OS_MAC) }
diff --git a/chrome/browser/web_applications/app_registrar_observer.h b/chrome/browser/web_applications/app_registrar_observer.h index 9f3fa241..fdf1a296 100644 --- a/chrome/browser/web_applications/app_registrar_observer.h +++ b/chrome/browser/web_applications/app_registrar_observer.h
@@ -55,6 +55,10 @@ // a given protocol. virtual void OnWebAppProtocolSettingsChanged() {} + // Called after the app's access to the File Handling API has changed, e.g. by + // a user selecting "always allow" in the prompt or after a policy update. + virtual void OnWebAppFileHandlerApprovalStateChanged(const AppId& app_id) {} + virtual void OnWebAppLocallyInstalledStateChanged(const AppId& app_id, bool is_locally_installed) { }
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc index 195a5be..6e5f3e9c 100644 --- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc +++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
@@ -613,9 +613,9 @@ } void WebAppPublisherHelper::LoadIcon(const std::string& app_id, - const apps::IconKey& icon_key, apps::IconType icon_type, int32_t size_hint_in_dip, + apps::IconEffects icon_effects, LoadIconCallback callback) { DCHECK(provider_); if (IsShuttingDown()) { @@ -623,8 +623,7 @@ } LoadIconFromWebApp(profile_, icon_type, size_hint_in_dip, app_id, - static_cast<IconEffects>(icon_key.icon_effects), - std::move(callback)); + icon_effects, std::move(callback)); } content::WebContents* WebAppPublisherHelper::Launch(
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.h b/chrome/browser/web_applications/app_service/web_app_publisher_helper.h index 168b93d..0a4ffd8d 100644 --- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.h +++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.h
@@ -162,9 +162,9 @@ bool IsPaused(const std::string& app_id); void LoadIcon(const std::string& app_id, - const apps::IconKey& icon_key, apps::IconType icon_type, int32_t size_hint_in_dip, + apps::IconEffects icon_effects, LoadIconCallback callback); content::WebContents* Launch(const std::string& app_id,
diff --git a/chrome/browser/web_applications/app_service/web_apps.cc b/chrome/browser/web_applications/app_service/web_apps.cc index e536077..1f150a1 100644 --- a/chrome/browser/web_applications/app_service/web_apps.cc +++ b/chrome/browser/web_applications/app_service/web_apps.cc
@@ -142,7 +142,8 @@ int32_t size_hint_in_dip, bool allow_placeholder_icon, apps::LoadIconCallback callback) { - publisher_helper().LoadIcon(app_id, icon_key, icon_type, size_hint_in_dip, + publisher_helper().LoadIcon(app_id, icon_type, size_hint_in_dip, + static_cast<IconEffects>(icon_key.icon_effects), std::move(callback)); } @@ -175,11 +176,9 @@ return; } - std::unique_ptr<apps::IconKey> key = - apps::ConvertMojomIconKeyToIconKey(icon_key); publisher_helper().LoadIcon( - app_id, *key, apps::ConvertMojomIconTypeToIconType(icon_type), - size_hint_in_dip, + app_id, apps::ConvertMojomIconTypeToIconType(icon_type), size_hint_in_dip, + static_cast<IconEffects>(icon_key->icon_effects), apps::IconValueToMojomIconValueCallback(std::move(callback))); }
diff --git a/chrome/browser/web_applications/app_service/web_apps_publisher_host.cc b/chrome/browser/web_applications/app_service/web_apps_publisher_host.cc index cf07fa21..5458ed1 100644 --- a/chrome/browser/web_applications/app_service/web_apps_publisher_host.cc +++ b/chrome/browser/web_applications/app_service/web_apps_publisher_host.cc
@@ -174,7 +174,8 @@ std::unique_ptr<apps::IconKey> key = apps::ConvertMojomIconKeyToIconKey(icon_key); - publisher_helper().LoadIcon(app_id, *key, icon_type, size_hint_in_dip, + publisher_helper().LoadIcon(app_id, icon_type, size_hint_in_dip, + static_cast<IconEffects>(icon_key->icon_effects), std::move(callback)); }
diff --git a/chrome/browser/web_applications/system_web_apps/system_web_app_delegate.cc b/chrome/browser/web_applications/system_web_apps/system_web_app_delegate.cc index 0bee035..6735e16 100644 --- a/chrome/browser/web_applications/system_web_apps/system_web_app_delegate.cc +++ b/chrome/browser/web_applications/system_web_apps/system_web_app_delegate.cc
@@ -54,8 +54,9 @@ return false; } -bool SystemWebAppDelegate::ShouldIncludeLaunchDirectory() const { - return false; +base::FilePath SystemWebAppDelegate::GetLaunchDirectory( + const apps::AppLaunchParams& params) const { + return base::FilePath(); } std::vector<int> SystemWebAppDelegate::GetAdditionalSearchTerms() const {
diff --git a/chrome/browser/web_applications/system_web_apps/system_web_app_delegate.h b/chrome/browser/web_applications/system_web_apps/system_web_app_delegate.h index ff061c8..6360114 100644 --- a/chrome/browser/web_applications/system_web_apps/system_web_app_delegate.h +++ b/chrome/browser/web_applications/system_web_apps/system_web_app_delegate.h
@@ -86,9 +86,11 @@ // ShouldReuseExistingWindow() should return false at the same time. virtual bool ShouldShowNewWindowMenuOption() const; - // If true, when the app is launched through the File Handling Web API, we - // will include the file's directory in window.launchQueue as the first value. - virtual bool ShouldIncludeLaunchDirectory() const; + // Called when the app is launched with `params`. If the returned value is + // non-empty, it will be passed to the page as a FileSystemDirectoryHandle + // pre-pended to the `launchParams` list. + virtual base::FilePath GetLaunchDirectory( + const apps::AppLaunchParams& params) const; // Map from origin to enabled origin trial names for this app. For example, // "chrome://sample-web-app/" to ["Frobulate"]. If set, we will enable the @@ -176,10 +178,14 @@ virtual bool IsUrlInSystemAppScope(const GURL& url) const; protected: + Profile* profile() const { return profile_; } + + // These should all be private. See + // https://google.github.io/styleguide/cppguide.html#Access_Control SystemAppType type_; std::string internal_name_; GURL install_url_; - raw_ptr<const Profile> profile_; + raw_ptr<Profile> profile_; OriginTrialsMap origin_trials_map_; };
diff --git a/chrome/browser/web_applications/system_web_apps/test/test_system_web_app_installation.cc b/chrome/browser/web_applications/system_web_apps/test/test_system_web_app_installation.cc index 7cc452e..7f8a20c 100644 --- a/chrome/browser/web_applications/system_web_apps/test/test_system_web_app_installation.cc +++ b/chrome/browser/web_applications/system_web_apps/test/test_system_web_app_installation.cc
@@ -115,8 +115,13 @@ bool UnittestingSystemAppDelegate::ShouldShowNewWindowMenuOption() const { return show_new_window_menu_option_; } -bool UnittestingSystemAppDelegate::ShouldIncludeLaunchDirectory() const { - return include_launch_directory_; +base::FilePath UnittestingSystemAppDelegate::GetLaunchDirectory( + const apps::AppLaunchParams& params) const { + // When set to include a launch directory, use the directory of the first + // file. + return include_launch_directory_ && !params.launch_files.empty() + ? params.launch_files[0].DirName() + : base::FilePath(); } std::vector<int> UnittestingSystemAppDelegate::GetAdditionalSearchTerms()
diff --git a/chrome/browser/web_applications/system_web_apps/test/test_system_web_app_installation.h b/chrome/browser/web_applications/system_web_apps/test/test_system_web_app_installation.h index 6491a3b1..d46293a 100644 --- a/chrome/browser/web_applications/system_web_apps/test/test_system_web_app_installation.h +++ b/chrome/browser/web_applications/system_web_apps/test/test_system_web_app_installation.h
@@ -35,7 +35,8 @@ gfx::Size GetMinimumWindowSize() const override; bool ShouldReuseExistingWindow() const override; bool ShouldShowNewWindowMenuOption() const override; - bool ShouldIncludeLaunchDirectory() const override; + base::FilePath GetLaunchDirectory( + const apps::AppLaunchParams& params) const override; std::vector<int> GetAdditionalSearchTerms() const override; bool ShouldShowInLauncher() const override; bool ShouldShowInSearch() const override;
diff --git a/chrome/browser/web_applications/web_app_install_task.cc b/chrome/browser/web_applications/web_app_install_task.cc index ee24bb1d..61b86af 100644 --- a/chrome/browser/web_applications/web_app_install_task.cc +++ b/chrome/browser/web_applications/web_app_install_task.cc
@@ -61,7 +61,7 @@ std::string ExtractQueryValueForName(const GURL& url, const std::string& name) { for (net::QueryIterator it(url); !it.IsAtEnd(); it.Advance()) { if (it.GetKey() == name) - return it.GetValue(); + return std::string(it.GetValue()); } return std::string(); }
diff --git a/chrome/browser/web_applications/web_app_registrar.cc b/chrome/browser/web_applications/web_app_registrar.cc index a3ce81c..a2909e4 100644 --- a/chrome/browser/web_applications/web_app_registrar.cc +++ b/chrome/browser/web_applications/web_app_registrar.cc
@@ -77,6 +77,12 @@ observer.OnWebAppProtocolSettingsChanged(); } +void WebAppRegistrar::NotifyWebAppFileHandlerApprovalStateChanged( + const AppId& app_id) { + for (AppRegistrarObserver& observer : observers_) + observer.OnWebAppFileHandlerApprovalStateChanged(app_id); +} + void WebAppRegistrar::NotifyWebAppInstalled(const AppId& app_id) { for (AppRegistrarObserver& observer : observers_) observer.OnWebAppInstalled(app_id);
diff --git a/chrome/browser/web_applications/web_app_registrar.h b/chrome/browser/web_applications/web_app_registrar.h index b3ac6b5..4d845bfb 100644 --- a/chrome/browser/web_applications/web_app_registrar.h +++ b/chrome/browser/web_applications/web_app_registrar.h
@@ -252,6 +252,7 @@ void NotifyWebAppManifestUpdated(const AppId& app_id, base::StringPiece old_name); void NotifyWebAppProtocolSettingsChanged(); + void NotifyWebAppFileHandlerApprovalStateChanged(const AppId& app_id); void NotifyWebAppsWillBeUpdatedFromSync( const std::vector<const WebApp*>& new_apps_state); void NotifyWebAppUninstalled(const AppId& app_id);
diff --git a/chrome/browser/web_applications/web_app_sync_bridge.cc b/chrome/browser/web_applications/web_app_sync_bridge.cc index c47e5d09..03380919 100644 --- a/chrome/browser/web_applications/web_app_sync_bridge.cc +++ b/chrome/browser/web_applications/web_app_sync_bridge.cc
@@ -425,10 +425,11 @@ void WebAppSyncBridge::SetAppFileHandlerApprovalState(const AppId& app_id, ApiApprovalState state) { - ScopedRegistryUpdate(this)->UpdateApp(app_id)->SetFileHandlerApprovalState( - state); - // TODO(estade): when needed for updating UIs, call - // NotifyWebAppFileHandlerApprovalStateChanged() here. + { + ScopedRegistryUpdate(this)->UpdateApp(app_id)->SetFileHandlerApprovalState( + state); + } + registrar_->NotifyWebAppFileHandlerApprovalStateChanged(app_id); } void WebAppSyncBridge::CheckRegistryUpdateData(
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 5fc9bc8..343a04d5 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1639504726-00818556d27ae6f0ca222d22829579a009d0b826.profdata +chrome-linux-main-1639526239-a0d881f0048d045d354f668c449f9cc1d5fb2651.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index ce96eb9..d832a87f 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1639504726-fb9e43adc0e4760052265cf82e7db19c61befe33.profdata +chrome-mac-main-1639526239-f999c2751396f2d955909c0c12681befd8319247.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 37e8b846..f51359e5 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1639504726-e7cdc104acb454455e958b92ea4ea0702a57e906.profdata +chrome-win32-main-1639526239-fba5218e9f7efbe8971262d0927a477c0a0708f7.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 48ccf98..9abdd9e 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1639504726-a5cec93f623091d76267247a1ff888db818a2b02.profdata +chrome-win64-main-1639537168-0b06bcc6c7eeeb1a4010c2caccb9a5d589914c95.profdata
diff --git a/chrome/common/media/cdm_registration.cc b/chrome/common/media/cdm_registration.cc index 33b52d2c..2edc662 100644 --- a/chrome/common/media/cdm_registration.cc +++ b/chrome/common/media/cdm_registration.cc
@@ -11,7 +11,9 @@ #include "base/path_service.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" +#include "content/public/common/cdm_info.h" #include "media/cdm/cdm_capability.h" +#include "media/cdm/cdm_type.h" #include "third_party/widevine/cdm/buildflags.h" #if BUILDFLAG(ENABLE_LIBRARY_CDMS) @@ -57,7 +59,7 @@ return std::make_unique<content::CdmInfo>( kWidevineKeySystem, Robustness::kSoftwareSecure, std::move(capability), /*supports_sub_key_systems=*/false, kWidevineCdmDisplayName, - kWidevineCdmType, version, cdm_library_path, kWidevineCdmFileSystemId); + kWidevineCdmType, version, cdm_library_path); } #if !BUILDFLAG(IS_CHROMEOS_ASH) @@ -282,14 +284,9 @@ capability.session_types.insert(media::CdmSessionType::kTemporary); capability.session_types.insert(media::CdmSessionType::kPersistentLicense); - // TODO(crbug.com/1231162): This corresponds to `kChromeOsCdmFileSystemId` in - // content/browser/media/media_interface_proxy.cc. Consolidate these once an - // enum of CDM types is created. - const base::Token kChromeOsCdmType{0xa6ecd3fc63b3ded2ull, - 0x9306d3270227ce5full}; - cdms->push_back(content::CdmInfo(kWidevineKeySystem, - Robustness::kHardwareSecure, - std::move(capability), kChromeOsCdmType)); + cdms->push_back( + content::CdmInfo(kWidevineKeySystem, Robustness::kHardwareSecure, + std::move(capability), content::kChromeOsCdmType)); #endif // BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA) } @@ -331,13 +328,12 @@ Robustness::kSoftwareSecure, capability, /*supports_sub_key_systems=*/false, media::kClearKeyCdmDisplayName, media::kClearKeyCdmDifferentCdmType, base::Version("0.1.0.0"), - clear_key_cdm_path, media::kClearKeyCdmFileSystemId)); + clear_key_cdm_path)); cdms->push_back(content::CdmInfo( kExternalClearKeyKeySystem, Robustness::kSoftwareSecure, capability, /*supports_sub_key_systems=*/true, media::kClearKeyCdmDisplayName, - media::kClearKeyCdmType, base::Version("0.1.0.0"), clear_key_cdm_path, - media::kClearKeyCdmFileSystemId)); + media::kClearKeyCdmType, base::Version("0.1.0.0"), clear_key_cdm_path)); } #endif // BUILDFLAG(ENABLE_LIBRARY_CDMS)
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 4d35024..9c0c0a1 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -1600,6 +1600,7 @@ "../browser/media/webrtc/conditional_focus_browsertest.cc", "../browser/media/webrtc/media_stream_devices_controller_browsertest.cc", "../browser/media/webrtc/region_capture_browsertest.cc", + "../browser/media/webrtc/same_origin_observer_browsertest.cc", "../browser/media/webrtc/test_stats_dictionary_unittest.cc", "../browser/media/webrtc/webrtc_apprtc_browsertest.cc", "../browser/media/webrtc/webrtc_browsertest_perf.cc",
diff --git a/chrome/test/data/pdf/test_util.js b/chrome/test/data/pdf/test_util.js index 8e6c1ec7..b52b673 100644 --- a/chrome/test/data/pdf/test_util.js +++ b/chrome/test/data/pdf/test_util.js
@@ -14,6 +14,9 @@ * @param {?MockSizer} sizer */ constructor(width, height, sizer) { + /** @type {string} */ + this.dir = ''; + /** @type {number} */ this.offsetWidth = width; @@ -41,6 +44,16 @@ this.resizeCallback = null; } + /** @return {number} */ + get clientWidth() { + return this.offsetWidth; + } + + /** @return {number} */ + get clientHeight() { + return this.offsetHeight; + } + /** * @param {string} e The event name * @param {!Function} f The callback @@ -187,6 +200,11 @@ this.messages_ = []; } + /** @return {!Array<*>} */ + get messages() { + return this.messages_; + } + clearMessages() { this.messages_.length = 0; }
diff --git a/chrome/test/data/pdf/viewport_test.js b/chrome/test/data/pdf/viewport_test.js index d601c80..a414e67 100644 --- a/chrome/test/data/pdf/viewport_test.js +++ b/chrome/test/data/pdf/viewport_test.js
@@ -4,7 +4,9 @@ import {FittingType, PAGE_SHADOW, Viewport} from 'chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/pdf_viewer_wrapper.js'; -import {createMockUnseasonedPdfPluginForTest, getZoomableViewport, MockDocumentDimensions, MockElement, MockSizer, MockViewportChangedCallback} from './test_util.js'; +import {createMockUnseasonedPdfPluginForTest, getZoomableViewport, MockDocumentDimensions, MockElement, MockSizer, MockUnseasonedPdfPluginElement, MockViewportChangedCallback} from './test_util.js'; + +const SCROLLBAR_WIDTH = 15; class ScrollEventCounter { constructor() { @@ -15,6 +17,20 @@ } } +/** + * Simulates acknowledgements to all "syncScrollToRemote" messages. + * @param {!Viewport} viewport + * @param {!MockUnseasonedPdfPluginElement} plugin + */ +function ackAllScrollToRemoteMessages(viewport, plugin) { + for (const message of plugin.messages) { + if (message.type === 'syncScrollToRemote') { + viewport.ackScrollToRemote( + /** @type {{x: number, y: number}} */ (message)); + } + } +} + function assertRoughlyEquals(expected, actual, tolerance) { chrome.test.assertTrue( Math.abs(expected - actual) <= tolerance, @@ -339,7 +355,7 @@ // Test fitting works with scrollbars. The page will need to be zoomed to // fit to width, which will cause the page height to span outside of the // viewport, triggering 15px scrollbars to be shown. - viewport = getZoomableViewport(mockWindow, mockSizer, 15, 1); + viewport = getZoomableViewport(mockWindow, mockSizer, SCROLLBAR_WIDTH, 1); viewport.setViewportChangedCallback(mockCallback.callback); documentDimensions.reset(); documentDimensions.addPage(50, 100); @@ -1249,6 +1265,8 @@ const mockWindow = new MockElement(100, 100, null); const viewport = getZoomableViewport(mockWindow, new MockSizer(), 0, 1); viewport.setRemoteContent(createMockUnseasonedPdfPluginForTest()); + viewport.setDocumentDimensions(new MockDocumentDimensions(200, 200)); + viewport.setZoom(1); viewport.setPosition({x: 20, y: 30}); chrome.test.assertEq(0, mockWindow.scrollLeft); chrome.test.assertEq(0, mockWindow.scrollTop); @@ -1301,6 +1319,8 @@ function testSetRemoteContent_scrollToRemote() { const viewport = getZoomableViewport( new MockElement(100, 100, null), new MockSizer(), 0, 1); + viewport.setDocumentDimensions(new MockDocumentDimensions(200, 200)); + viewport.setZoom(1); viewport.setPosition({x: 20, y: 30}); const mockPlugin = createMockUnseasonedPdfPluginForTest(); @@ -1334,6 +1354,8 @@ new MockElement(100, 100, null), new MockSizer(), 0, 1); const mockPlugin = createMockUnseasonedPdfPluginForTest(); viewport.setRemoteContent(mockPlugin); + viewport.setDocumentDimensions(new MockDocumentDimensions(200, 200)); + viewport.setZoom(1); mockPlugin.clearMessages(); viewport.setPosition({x: 20, y: 30}); @@ -1346,34 +1368,193 @@ chrome.test.succeed(); }, - function testSetPosition_remote_NaN() { + function testSetPosition_remote_modifiedByAck() { const viewport = getZoomableViewport( new MockElement(100, 100, null), new MockSizer(), 0, 1); const mockPlugin = createMockUnseasonedPdfPluginForTest(); viewport.setRemoteContent(mockPlugin); - mockPlugin.clearMessages(); + viewport.setDocumentDimensions(new MockDocumentDimensions(200, 200)); + viewport.setZoom(1); + ackAllScrollToRemoteMessages(viewport, mockPlugin); + + const scrollCounter = new ScrollEventCounter(); + viewport.setPosition({x: 20, y: 30}); + viewport.ackScrollToRemote({x: 10, y: 50}); + + chrome.test.assertEq(1, scrollCounter.count); + chrome.test.assertEq(10, viewport.position.x); + chrome.test.assertEq(50, viewport.position.y); + chrome.test.succeed(); + }, + + function testSetPosition_remote_modifiedByAck_ignoreOverlapping() { + const viewport = getZoomableViewport( + new MockElement(100, 100, null), new MockSizer(), 0, 1); + const mockPlugin = createMockUnseasonedPdfPluginForTest(); + viewport.setRemoteContent(mockPlugin); + viewport.setDocumentDimensions(new MockDocumentDimensions(200, 200)); + viewport.setZoom(1); + ackAllScrollToRemoteMessages(viewport, mockPlugin); + + const scrollCounter = new ScrollEventCounter(); + viewport.setPosition({x: 20, y: 30}); + viewport.setPosition({x: 30, y: 40}); + viewport.ackScrollToRemote({x: 10, y: 50}); + + chrome.test.assertEq(1, scrollCounter.count); + chrome.test.assertEq(30, viewport.position.x); + chrome.test.assertEq(40, viewport.position.y); + chrome.test.succeed(); + }, + + function testSetPosition_remote_modifiedByAck_multiple() { + const viewport = getZoomableViewport( + new MockElement(100, 100, null), new MockSizer(), 0, 1); + const mockPlugin = createMockUnseasonedPdfPluginForTest(); + viewport.setRemoteContent(mockPlugin); + viewport.setDocumentDimensions(new MockDocumentDimensions(200, 200)); + viewport.setZoom(1); + ackAllScrollToRemoteMessages(viewport, mockPlugin); + + const scrollCounter = new ScrollEventCounter(); + viewport.setPosition({x: 20, y: 30}); + viewport.setPosition({x: 30, y: 40}); + viewport.ackScrollToRemote({x: 10, y: 50}); + viewport.ackScrollToRemote({x: 10, y: 60}); + + chrome.test.assertEq(2, scrollCounter.count); + chrome.test.assertEq(10, viewport.position.x); + chrome.test.assertEq(60, viewport.position.y); + chrome.test.succeed(); + }, + + function testSetPosition_remote_NaN() { + const viewport = getZoomableViewport( + new MockElement(100, 100, null), new MockSizer(), 0, 1); + viewport.setRemoteContent(createMockUnseasonedPdfPluginForTest()); viewport.setPosition({x: NaN, y: NaN}); - const {x, y} = mockPlugin.findMessage('syncScrollToRemote'); - chrome.test.assertEq(0, x); chrome.test.assertEq(0, viewport.position.x); - chrome.test.assertEq(0, y); chrome.test.assertEq(0, viewport.position.y); chrome.test.succeed(); }, + function testSetPosition_remote_underflow_leftAndTop() { + const viewport = getZoomableViewport( + new MockElement(100, 100, null), new MockSizer(), SCROLLBAR_WIDTH, 1); + viewport.setRemoteContent(createMockUnseasonedPdfPluginForTest()); + viewport.setDocumentDimensions(new MockDocumentDimensions(200, 200)); + viewport.setZoom(1); + + viewport.setPosition({x: -1, y: -1}); + + chrome.test.assertEq(0, viewport.position.x); + chrome.test.assertEq(0, viewport.position.y); + chrome.test.succeed(); + }, + + function testSetPosition_remote_underflow_rightAndTop() { + const mockWindow = new MockElement(100, 100, null); + mockWindow.dir = 'rtl'; + const viewport = + getZoomableViewport(mockWindow, new MockSizer(), SCROLLBAR_WIDTH, 1); + viewport.setRemoteContent(createMockUnseasonedPdfPluginForTest()); + viewport.setDocumentDimensions(new MockDocumentDimensions(200, 200)); + viewport.setZoom(1); + + viewport.setPosition({x: 1, y: -1}); + + chrome.test.assertEq(0, viewport.position.x); + chrome.test.assertEq(0, viewport.position.y); + chrome.test.succeed(); + }, + + function testSetPosition_remote_overflow_rightAndBottom() { + const viewport = getZoomableViewport( + new MockElement(100, 100, null), new MockSizer(), SCROLLBAR_WIDTH, 1); + viewport.setRemoteContent(createMockUnseasonedPdfPluginForTest()); + viewport.setDocumentDimensions(new MockDocumentDimensions(200, 300)); + viewport.setZoom(1); + + viewport.setPosition({x: 116, y: 216}); + + chrome.test.assertEq(115, viewport.position.x); + chrome.test.assertEq(215, viewport.position.y); + chrome.test.succeed(); + }, + + function testSetPosition_remote_overflow_leftAndBottom() { + const mockWindow = new MockElement(100, 100, null); + mockWindow.dir = 'rtl'; + const viewport = + getZoomableViewport(mockWindow, new MockSizer(), SCROLLBAR_WIDTH, 1); + viewport.setRemoteContent(createMockUnseasonedPdfPluginForTest()); + viewport.setDocumentDimensions(new MockDocumentDimensions(200, 300)); + viewport.setZoom(1); + + viewport.setPosition({x: -116, y: 216}); + + chrome.test.assertEq(-115, viewport.position.x); + chrome.test.assertEq(215, viewport.position.y); + chrome.test.succeed(); + }, + + function testSetPosition_remote_overflowWithoutVerticalScrollbar_right() { + const viewport = getZoomableViewport( + new MockElement(100, 100, null), new MockSizer(), SCROLLBAR_WIDTH, 1); + viewport.setRemoteContent(createMockUnseasonedPdfPluginForTest()); + viewport.setDocumentDimensions(new MockDocumentDimensions(200, 85)); + viewport.setZoom(1); + + viewport.setPosition({x: 101, y: 1}); + + chrome.test.assertEq(100, viewport.position.x); + chrome.test.assertEq(0, viewport.position.y); + chrome.test.succeed(); + }, + + function testSetPosition_remote_overflowWithoutVerticalScrollbar_left() { + const mockWindow = new MockElement(100, 100, null); + mockWindow.dir = 'rtl'; + const viewport = + getZoomableViewport(mockWindow, new MockSizer(), SCROLLBAR_WIDTH, 1); + viewport.setRemoteContent(createMockUnseasonedPdfPluginForTest()); + viewport.setDocumentDimensions(new MockDocumentDimensions(200, 85)); + viewport.setZoom(1); + + viewport.setPosition({x: -101, y: 1}); + + chrome.test.assertEq(-100, viewport.position.x); + chrome.test.assertEq(0, viewport.position.y); + chrome.test.succeed(); + }, + + function testSetPosition_remote_overflowWithoutHorizontalScrollbar_bottom() { + const viewport = getZoomableViewport( + new MockElement(100, 100, null), new MockSizer(), SCROLLBAR_WIDTH, 1); + viewport.setRemoteContent(createMockUnseasonedPdfPluginForTest()); + viewport.setDocumentDimensions(new MockDocumentDimensions(85, 300)); + viewport.setZoom(1); + + viewport.setPosition({x: 1, y: 201}); + + chrome.test.assertEq(0, viewport.position.x); + chrome.test.assertEq(200, viewport.position.y); + chrome.test.succeed(); + }, + function testSyncScrollFromRemote() { const viewport = getZoomableViewport( new MockElement(100, 100, null), new MockSizer(), 0, 1); - viewport.setRemoteContent(createMockUnseasonedPdfPluginForTest()); + const mockPlugin = createMockUnseasonedPdfPluginForTest(); + viewport.setRemoteContent(mockPlugin); + ackAllScrollToRemoteMessages(viewport, mockPlugin); const scrollCounter = new ScrollEventCounter(); - viewport.ackScrollToRemote(); - chrome.test.assertEq(1, scrollCounter.count); viewport.syncScrollFromRemote({x: 30, y: 20}); - chrome.test.assertEq(2, scrollCounter.count); + chrome.test.assertEq(1, scrollCounter.count); chrome.test.assertEq(30, viewport.position.x); chrome.test.assertEq(20, viewport.position.y); chrome.test.succeed(); @@ -1382,8 +1563,9 @@ function testSyncScrollFromRemote_duplicateScroll() { const viewport = getZoomableViewport( new MockElement(100, 100, null), new MockSizer(), 0, 1); - viewport.setRemoteContent(createMockUnseasonedPdfPluginForTest()); - viewport.ackScrollToRemote(); + const mockPlugin = createMockUnseasonedPdfPluginForTest(); + viewport.setRemoteContent(mockPlugin); + ackAllScrollToRemoteMessages(viewport, mockPlugin); viewport.syncScrollFromRemote({x: 30, y: 20}); const scrollCounter = new ScrollEventCounter(); @@ -1398,7 +1580,9 @@ function testSyncScrollFromRemote_scrollToRemoteUnacked() { const viewport = getZoomableViewport( new MockElement(100, 100, null), new MockSizer(), 0, 1); - viewport.setRemoteContent(createMockUnseasonedPdfPluginForTest()); + const mockPlugin = createMockUnseasonedPdfPluginForTest(); + viewport.setRemoteContent(mockPlugin); + chrome.test.assertTrue(!!mockPlugin.findMessage('syncScrollToRemote')); const scrollCounter = new ScrollEventCounter(); viewport.syncScrollFromRemote({x: 30, y: 20});
diff --git a/chrome/test/data/webui/access_code_cast/access_code_cast_browsertest.js b/chrome/test/data/webui/access_code_cast/access_code_cast_browsertest.js index 8af144d1..54181b87 100644 --- a/chrome/test/data/webui/access_code_cast/access_code_cast_browsertest.js +++ b/chrome/test/data/webui/access_code_cast/access_code_cast_browsertest.js
@@ -59,3 +59,19 @@ TEST_F('AccessCodeCastCodeInputElementTest', 'All', function() { mocha.run(); }); + +// eslint-disable-next-line no-var +var AccessCodeCastErrorMessageElementTest = class extends AccessCodeCastBrowserTest { + /** @override */ + get browsePreload() { + return 'chrome://access-code-cast/test_loader.html?module=access_code_cast/error_message_test.js'; + } +}; + +/** + * This browsertest acts as a thin wrapper to run the unit tests found + * at code_input_test.js + */ +TEST_F('AccessCodeCastErrorMessageElementTest', 'All', function() { + mocha.run(); +});
diff --git a/chrome/test/data/webui/access_code_cast/access_code_cast_test.js b/chrome/test/data/webui/access_code_cast/access_code_cast_test.js index 354d539..9dbb1b7 100644 --- a/chrome/test/data/webui/access_code_cast/access_code_cast_test.js +++ b/chrome/test/data/webui/access_code_cast/access_code_cast_test.js
@@ -162,4 +162,58 @@ assertFalse(visited); } ); + + test('addSinkAndCast surfaces errors', async () => { + let testProxy = createTestProxy( + AddSinkResultCode.UNKNOWN_ERROR, + RouteRequestResultCode.OK, + () => {} + ); + BrowserProxy.setInstance(testProxy); + app.setAccessCodeForTest('qwerty'); + + assertEquals(0, app.$.errorMessage.getMessageCode()); + await app.addSinkAndCast(); + assertEquals(1, app.$.errorMessage.getMessageCode()); + + testProxy = createTestProxy( + AddSinkResultCode.INVALID_ACCESS_CODE, + RouteRequestResultCode.OK, + () => {} + ); + BrowserProxy.setInstance(testProxy); + + await app.addSinkAndCast(); + assertEquals(2, app.$.errorMessage.getMessageCode()); + + testProxy = createTestProxy( + AddSinkResultCode.SERVICE_NOT_PRESENT, + RouteRequestResultCode.OK, + () => {} + ); + BrowserProxy.setInstance(testProxy); + + await app.addSinkAndCast(); + assertEquals(3, app.$.errorMessage.getMessageCode()); + + testProxy = createTestProxy( + AddSinkResultCode.AUTH_ERROR, + RouteRequestResultCode.OK, + () => {} + ); + BrowserProxy.setInstance(testProxy); + + await app.addSinkAndCast(); + assertEquals(4, app.$.errorMessage.getMessageCode()); + + testProxy = createTestProxy( + AddSinkResultCode.TOO_MANY_REQUESTS, + RouteRequestResultCode.OK, + () => {} + ); + BrowserProxy.setInstance(testProxy); + + await app.addSinkAndCast(); + assertEquals(5, app.$.errorMessage.getMessageCode()); + }); });
diff --git a/chrome/test/data/webui/access_code_cast/error_message_test.js b/chrome/test/data/webui/access_code_cast/error_message_test.js new file mode 100644 index 0000000..44c3405 --- /dev/null +++ b/chrome/test/data/webui/access_code_cast/error_message_test.js
@@ -0,0 +1,88 @@ +// 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. + +import 'chrome://access-code-cast/error_message/error_message.js'; + +import {AddSinkResultCode} from 'chrome://access-code-cast/access_code_cast.mojom-webui.js'; +import {RouteRequestResultCode} from 'chrome://access-code-cast/route_request_result_code.mojom-webui.js'; + +suite('ErrorMessageElementTest', () => { + /** @type {!ErrorMessageElement} */ + let c2cErrorMessage; + + setup(() => { + PolymerTest.clearBody(); + + c2cErrorMessage = document.createElement('c2c-error-message'); + document.body.appendChild(c2cErrorMessage); + }); + + test('setAddSinkError', () => { + c2cErrorMessage.setNoError(); + + const testValues = [ + {addResult: AddSinkResultCode.UNKNOWN_ERROR, expectedMessage: 1}, + {addResult: AddSinkResultCode.OK, expectedMessage: 0}, + {addResult: AddSinkResultCode.AUTH_ERROR, expectedMessage: 4}, + { + addResult: AddSinkResultCode.HTTP_RESPONSE_CODE_ERROR, + expectedMessage: 3 + }, + {addResult: AddSinkResultCode.RESPONSE_MALFORMED, expectedMessage: 3}, + {addResult: AddSinkResultCode.EMPTY_RESPONSE, expectedMessage: 3}, + {addResult: AddSinkResultCode.INVALID_ACCESS_CODE, expectedMessage: 2}, + {addResult: AddSinkResultCode.ACCESS_CODE_NOT_FOUND, expectedMessage: 2}, + {addResult: AddSinkResultCode.TOO_MANY_REQUESTS, expectedMessage: 5}, + {addResult: AddSinkResultCode.SERVICE_NOT_PRESENT, expectedMessage: 3}, + {addResult: AddSinkResultCode.SERVER_ERROR, expectedMessage: 3}, + {addResult: AddSinkResultCode.SINK_CREATION_ERROR, expectedMessage: 1}, + ]; + + for (let i = 0; i < testValues.length; i++) { + c2cErrorMessage.setAddSinkError(testValues[i].addResult); + assertEquals(testValues[i].expectedMessage, c2cErrorMessage.messageCode); + c2cErrorMessage.setNoError(); + } + }); + + test('setCastError', () => { + c2cErrorMessage.setNoError(); + + const testValues = [ + {castResult: RouteRequestResultCode.UNKNOWN_ERROR, expectedMessage: 1}, + {castResult: RouteRequestResultCode.OK, expectedMessage: 0}, + {castResult: RouteRequestResultCode.TIMED_OUT, expectedMessage: 3}, + {castResult: RouteRequestResultCode.ROUTE_NOT_FOUND, expectedMessage: 3}, + {castResult: RouteRequestResultCode.SINK_NOT_FOUND, expectedMessage: 3}, + {castResult: RouteRequestResultCode.INVALID_ORIGIN, expectedMessage: 1}, + { + castResult: RouteRequestResultCode.OFF_THE_RECORD_MISMATCH, + expectedMessage: 1 + }, + { + castResult: RouteRequestResultCode.NO_SUPPORTED_PROVIDER, + expectedMessage: 1 + }, + {castResult: RouteRequestResultCode.CANCELLED, expectedMessage: 1}, + { + castResult: RouteRequestResultCode.ROUTE_ALREADY_EXISTS, + expectedMessage: 1 + }, + { + castResult: RouteRequestResultCode.DESKTOP_PICKER_FAILED, + expectedMessage: 1 + }, + { + castResult: RouteRequestResultCode.ROUTE_ALREADY_TERMINATED, + expectedMessage: 1 + }, + ]; + + for (let i = 0; i < testValues.length; i++) { + c2cErrorMessage.setCastError(testValues[i].castResult); + assertEquals(testValues[i].expectedMessage, c2cErrorMessage.messageCode); + c2cErrorMessage.setNoError(); + } + }); +}); \ No newline at end of file
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/reimaging_calibration_failed_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/reimaging_calibration_failed_page_test.js index aaf02b6..b4aad61 100644 --- a/chrome/test/data/webui/chromeos/shimless_rma/reimaging_calibration_failed_page_test.js +++ b/chrome/test/data/webui/chromeos/shimless_rma/reimaging_calibration_failed_page_test.js
@@ -8,7 +8,7 @@ import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js'; import {ReimagingCalibrationFailedPage} from 'chrome://shimless-rma/reimaging_calibration_failed_page.js'; import {ShimlessRma} from 'chrome://shimless-rma/shimless_rma.js'; -import {CalibrationComponentStatus, CalibrationStatus} from 'chrome://shimless-rma/shimless_rma_types.js'; +import {CalibrationComponentStatus, CalibrationStatus, ComponentType} from 'chrome://shimless-rma/shimless_rma_types.js'; import {assertDeepEquals, assertEquals, assertFalse, assertNotEquals, assertTrue} from '../../chai_assert.js'; import {flushTasks} from '../../test_util.js'; @@ -73,7 +73,6 @@ function clickComponentCameraToggle() { const cameraComponent = component.shadowRoot.querySelector('#componentCamera'); - assertFalse(cameraComponent.disabled); cameraComponent.click(); return flushTasks(); } @@ -96,39 +95,6 @@ return component.getComponentsList_(); } - /** - * @param {!Array<!CalibrationComponentStatus>} components - * @return {!Array<!CalibrationComponentStatus>} - */ - function getExpectedComponentsList(components) { - /** @type {!Array<!CalibrationComponentStatus>} */ - let expectedComponents = []; - components.forEach(componentStatus => { - let status = componentStatus.status; - if (status === CalibrationStatus.kCalibrationFailed) { - status = CalibrationStatus.kCalibrationWaiting; - } - expectedComponents.push({ - component: componentStatus.component, - status: status, - progress: 0.0 - }); - }); - return expectedComponents; - } - - /** - * @param {!Array<!CalibrationComponentStatus>} components - * @return {!Array<!CalibrationComponentStatus>} - */ - function getAllSkippedComponentsList(components) { - components.forEach(component => { - component.status = CalibrationStatus.kCalibrationSkip; - component.progress = 0.0; - }); - return components; - } - test('Initializes', async () => { await initializeCalibrationPage(fakeCalibrationComponents); @@ -144,48 +110,51 @@ const touchpadComponent = component.shadowRoot.querySelector('#componentTouchpad'); assertEquals('Camera', cameraComponent.componentName); - assertFalse(cameraComponent.disabled); - assertFalse(cameraComponent.skip); - assertFalse(cameraComponent.completed); + assertFalse(cameraComponent.checked); + assertFalse(cameraComponent.failed); assertEquals('Battery', batteryComponent.componentName); - assertTrue(batteryComponent.disabled); - assertFalse(batteryComponent.skip); - assertTrue(batteryComponent.completed); + assertFalse(batteryComponent.checked); + assertFalse(batteryComponent.failed); assertEquals( 'Base Accelerometer', baseAccelerometerComponent.componentName); - assertTrue(baseAccelerometerComponent.disabled); - assertFalse(baseAccelerometerComponent.skip); - assertFalse(baseAccelerometerComponent.completed); + assertFalse(baseAccelerometerComponent.checked); + assertFalse(baseAccelerometerComponent.failed); assertEquals('Lid Accelerometer', lidAccelerometerComponent.componentName); - assertFalse(lidAccelerometerComponent.disabled); - assertFalse(lidAccelerometerComponent.skip); - assertFalse(lidAccelerometerComponent.completed); + assertFalse(lidAccelerometerComponent.checked); + assertTrue(lidAccelerometerComponent.failed); assertEquals('Touchpad', touchpadComponent.componentName); - assertFalse(touchpadComponent.disabled); - assertTrue(touchpadComponent.skip); - assertFalse(touchpadComponent.completed); + assertFalse(touchpadComponent.checked); + assertFalse(touchpadComponent.failed); }); test('ToggleComponent', async () => { await initializeCalibrationPage(fakeCalibrationComponents); + getComponentsList().forEach( + component => + assertEquals(CalibrationStatus.kCalibrationSkip, component.status)); + + // Click the camera button to check it. await clickComponentCameraToggle(); - let expectedComponents = - getExpectedComponentsList(fakeCalibrationComponents); - let components = getComponentsList(); - assertNotEquals(expectedComponents, components); // Camera should be the first entry in the list. - expectedComponents[0].status = CalibrationStatus.kCalibrationSkip; - assertDeepEquals(expectedComponents, components); + assertEquals( + CalibrationStatus.kCalibrationWaiting, getComponentsList()[0].status); + + // Click the camera button to check it. + await clickComponentCameraToggle(); + // Camera should be the first entry in the list. + assertEquals( + CalibrationStatus.kCalibrationSkip, getComponentsList()[0].status); }); test('NextButtonTriggersCalibrationComplete', async () => { const resolver = new PromiseResolver(); await initializeCalibrationPage(fakeCalibrationComponents); - let expectedComponents = - getAllSkippedComponentsList(fakeCalibrationComponents); let startCalibrationCalls = 0; service.startCalibration = (components) => { - assertDeepEquals(expectedComponents, components); + assertEquals(5, components.length); + components.forEach( + component => assertEquals( + CalibrationStatus.kCalibrationSkip, component.status)); startCalibrationCalls++; return resolver.promise; }; @@ -205,11 +174,21 @@ test('RetryButtonTriggersCalibration', async () => { const resolver = new PromiseResolver(); await initializeCalibrationPage(fakeCalibrationComponents); - let expectedComponents = - getExpectedComponentsList(fakeCalibrationComponents); + + getComponentsList().forEach( + component => + assertEquals(CalibrationStatus.kCalibrationSkip, component.status)); + await clickComponentCameraToggle(); + let startCalibrationCalls = 0; service.startCalibration = (components) => { - assertDeepEquals(expectedComponents, components); + assertEquals(5, components.length); + components.forEach( + component => assertEquals( + component.component === ComponentType.kCamera ? + CalibrationStatus.kCalibrationWaiting : + CalibrationStatus.kCalibrationSkip, + component.status)); startCalibrationCalls++; return resolver.promise; };
diff --git a/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_pairing_device_item_test.js b/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_pairing_device_item_test.js index 9d94042..efb55f0f0 100644 --- a/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_pairing_device_item_test.js +++ b/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_pairing_device_item_test.js
@@ -86,9 +86,9 @@ }); test('Pairing message is shown', async function() { - const deviceName = 'BeatsX'; const device = createDefaultBluetoothDevice( - /*id=*/ '12//345&6789', deviceName, + /*id=*/ '12//345&6789', + /*publicName=*/ 'BeatsX', /*connectionState=*/ chromeos.bluetoothConfig.mojom.DeviceConnectionState.kConnected, /*nickname=*/ 'device1', @@ -98,28 +98,11 @@ bluetoothPairingDeviceItem.device = device.deviceProperties; await flushAsync(); - const itemIndex = 1; - const listSize = 10; - bluetoothPairingDeviceItem.itemIndex = itemIndex; - bluetoothPairingDeviceItem.listSize = listSize; - const getSecondaryLabel = () => bluetoothPairingDeviceItem.shadowRoot.querySelector('#secondaryLabel'); - const getItemSecondaryA11yLabel = () => - bluetoothPairingDeviceItem.shadowRoot.querySelector('.text-row') - .ariaLabel; - const getItemA11yLabel = () => - bluetoothPairingDeviceItem.shadowRoot.querySelector('#container') - .ariaLabel; assertTrue(!!getSecondaryLabel()); assertEquals('', getSecondaryLabel().textContent.trim()); - assertEquals( - getItemA11yLabel(), - bluetoothPairingDeviceItem.i18n( - 'bluetoothPairingDeviceItemA11YLabelMouse', itemIndex + 1, listSize, - deviceName)); - assertEquals(getItemSecondaryA11yLabel(), ''); bluetoothPairingDeviceItem.deviceItemState = DeviceItemState.PAIRING; await flushAsync(); @@ -127,10 +110,6 @@ assertEquals( bluetoothPairingDeviceItem.i18n('bluetoothPairing'), getSecondaryLabel().textContent.trim()); - assertEquals( - getItemSecondaryA11yLabel(), - bluetoothPairingDeviceItem.i18n( - 'bluetoothPairingDeviceItemSecondaryPairingA11YLabel', deviceName)); bluetoothPairingDeviceItem.deviceItemState = DeviceItemState.FAILED; await flushAsync(); @@ -138,10 +117,6 @@ assertEquals( bluetoothPairingDeviceItem.i18n('bluetoothPairingFailed'), getSecondaryLabel().textContent.trim()); - assertEquals( - getItemSecondaryA11yLabel(), - bluetoothPairingDeviceItem.i18n( - 'bluetoothPairingDeviceItemSecondaryErrorA11YLabel', deviceName)); bluetoothPairingDeviceItem.deviceItemState = DeviceItemState.DEFAULT; await flushAsync();
diff --git a/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_pairing_device_selection_page_test.js b/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_pairing_device_selection_page_test.js index ca199d07..b1c095b 100644 --- a/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_pairing_device_selection_page_test.js +++ b/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_pairing_device_selection_page_test.js
@@ -36,6 +36,7 @@ deviceSelectionPage = /** @type {?SettingsBluetoothPairingDeviceSelectionPageElement} */ ( document.createElement('bluetooth-pairing-device-selection-page')); + deviceSelectionPage.isBluetoothEnabled = true; document.body.appendChild(deviceSelectionPage); flush(); @@ -65,6 +66,9 @@ const getDeviceListItems = () => deviceSelectionPage.shadowRoot.querySelectorAll( 'bluetooth-pairing-device-item'); + const getBasePage = () => + deviceSelectionPage.shadowRoot.querySelector('bluetooth-base-page'); + assertTrue(getBasePage().showScanProgress); const learnMoreLink = deviceSelectionPage.shadowRoot.querySelector('localized-link'); @@ -116,5 +120,17 @@ await flushAsync(); assertEquals( getDeviceListItems()[0].deviceItemState, DeviceItemState.PAIRING); + + // Disable Bluetooth. + deviceSelectionPage.isBluetoothEnabled = false; + await flushAsync(); + + // Scanning progress should be hidden and the 'Bluetooth disabled' message + // shown. + assertFalse(getBasePage().showScanProgress); + assertFalse(!!getDeviceList()); + assertEquals( + deviceSelectionPage.i18n('bluetoothDisabled'), + getDeviceListTitle().textContent.trim()); }); });
diff --git a/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_pairing_ui_test.js b/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_pairing_ui_test.js index 971b410..904afbf 100644 --- a/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_pairing_ui_test.js +++ b/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_pairing_ui_test.js
@@ -33,6 +33,8 @@ setup(async function() { bluetoothConfig = new FakeBluetoothConfig(); + bluetoothConfig.setSystemState( + chromeos.bluetoothConfig.mojom.BluetoothSystemState.kEnabled); setBluetoothConfigForTesting(bluetoothConfig); }); @@ -264,6 +266,7 @@ assertTrue(!!getSpinnerPage()); assertFalse(!!getDeviceSelectionPage()); await flushTasks(); + await waitAfterNextRender(bluetoothPairingUi); // Once we begin pairing we should still be in the spinner page. assertTrue(!!getSpinnerPage()); @@ -638,7 +641,7 @@ // Simulate pressing 'Confirm'. let event = new CustomEvent('confirm-code'); getConfirmCodePage().dispatchEvent(event); - await flushTasks(); + await waitAfterNextRender(bluetoothPairingUi); // Spinner should be shown. assertTrue(!!getSpinnerPage()); @@ -669,6 +672,7 @@ await simulateCancelation(); deviceHandler.completePairDevice(/*success=*/ false); await flushTasks(); + await waitAfterNextRender(bluetoothPairingUi); // The device selection page should be shown. assertTrue(!!getDeviceSelectionPage()); @@ -720,6 +724,9 @@ /*opt_audioCapability=*/ mojom.AudioOutputCapability.kCapableOfAudioOutput, /*opt_deviceType=*/ mojom.DeviceType.kMouse); + bluetoothConfig.appendToDiscoveredDeviceList([device.deviceProperties]); + await flushTasks(); + const pairingCode = '123456'; // Try pairing. @@ -762,4 +769,102 @@ assertTrue(!!getDeviceSelectionPage()); assertFalse(!!getDeviceSelectionPage().failedPairingDeviceId); }); + + test('Disable Bluetooth during pairing', async function() { + await init(); + assertTrue(!!getDeviceSelectionPage()); + assertTrue(getDeviceSelectionPage().isBluetoothEnabled); + + const deviceId = '123456'; + const device = createDefaultBluetoothDevice( + deviceId, + /*publicName=*/ 'BeatsX', + /*connectionState=*/ + chromeos.bluetoothConfig.mojom.DeviceConnectionState.kConnected, + /*opt_nickname=*/ 'device1', + /*opt_audioCapability=*/ + mojom.AudioOutputCapability.kCapableOfAudioOutput, + /*opt_deviceType=*/ mojom.DeviceType.kMouse); + bluetoothConfig.appendToDiscoveredDeviceList([device.deviceProperties]); + await flushTasks(); + + // Disable Bluetooth. + bluetoothConfig.setSystemState( + chromeos.bluetoothConfig.mojom.BluetoothSystemState.kDisabled); + await flushTasks(); + + // This should propagate to the device selection page. + assertFalse(getDeviceSelectionPage().isBluetoothEnabled); + + // Re-enable and select the device. + bluetoothConfig.setSystemState( + chromeos.bluetoothConfig.mojom.BluetoothSystemState.kEnabled); + await flushTasks(); + await waitAfterNextRender(bluetoothPairingUi); + + assertTrue(getDeviceSelectionPage().isBluetoothEnabled); + await selectDevice(device.deviceProperties); + await flushTasks(); + + const pairingCode = '123456'; + let deviceHandler = bluetoothConfig.getLastCreatedPairingHandler(); + deviceHandler.requireAuthentication( + PairingAuthType.CONFIRM_PASSKEY, pairingCode); + await flushTasks(); + + // Confirmation code page should be shown. + assertTrue(!!getConfirmCodePage()); + assertEquals(getConfirmCodePage().code, pairingCode); + + // Disable Bluetooth. + bluetoothConfig.setSystemState( + chromeos.bluetoothConfig.mojom.BluetoothSystemState.kDisabled); + await flushTasks(); + + // We should be back to the device selection page again. + assertFalse(!!getConfirmCodePage()); + assertTrue(!!getDeviceSelectionPage()); + assertFalse(getDeviceSelectionPage().isBluetoothEnabled); + + // Re-enable. + bluetoothConfig.setSystemState( + chromeos.bluetoothConfig.mojom.BluetoothSystemState.kEnabled); + await flushTasks(); + await waitAfterNextRender(bluetoothPairingUi); + + assertTrue(getDeviceSelectionPage().isBluetoothEnabled); + + // Error text shouldn't be showing because this pairing failed due to + // Bluetooth disabling. + assertEquals(getDeviceSelectionPage().failedPairingDeviceId, ''); + + // Select the device. + await selectDevice(device.deviceProperties); + await flushTasks(); + + // Simulate pairing failing. + deviceHandler = bluetoothConfig.getLastCreatedPairingHandler(); + deviceHandler.completePairDevice(/*success=*/ false); + await flushTasks(); + await waitAfterNextRender(bluetoothPairingUi); + + // Error text should be showing. + assertTrue(!!getDeviceSelectionPage()); + assertEquals(getDeviceSelectionPage().failedPairingDeviceId, deviceId); + + // Disable and re-enable. + bluetoothConfig.setSystemState( + chromeos.bluetoothConfig.mojom.BluetoothSystemState.kDisabled); + await flushTasks(); + + assertFalse(getDeviceSelectionPage().isBluetoothEnabled); + bluetoothConfig.setSystemState( + chromeos.bluetoothConfig.mojom.BluetoothSystemState.kEnabled); + await flushTasks(); + + assertTrue(getDeviceSelectionPage().isBluetoothEnabled); + + // Error text should no longer be showing. + assertEquals(getDeviceSelectionPage().failedPairingDeviceId, ''); + }); });
diff --git a/chrome/test/data/webui/cr_components/chromeos/bluetooth/fake_bluetooth_config.js b/chrome/test/data/webui/cr_components/chromeos/bluetooth/fake_bluetooth_config.js index 9ba12107..65204de 100644 --- a/chrome/test/data/webui/cr_components/chromeos/bluetooth/fake_bluetooth_config.js +++ b/chrome/test/data/webui/cr_components/chromeos/bluetooth/fake_bluetooth_config.js
@@ -106,6 +106,8 @@ this.pendingForgetRequest_ = null; /** + * The last pairing handler created. If defined, indicates discovery in is + * progress. If null, indicates no discovery is occurring. * @private {?FakeDevicePairingHandler} */ this.lastPairingHandler_ = null; @@ -236,6 +238,21 @@ */ (Object.assign({}, this.systemProperties_)); this.notifyObserversPropertiesUpdated_(); + + // If discovery is in progress and Bluetooth is no longer enabled, stop + // discovery and any pairing that may be occurring. + if (!this.lastPairingHandler_) { + return; + } + + if (systemState === + chromeos.bluetoothConfig.mojom.BluetoothSystemState.kEnabled) { + return; + } + + this.lastPairingHandler_.rejectPairDevice(); + this.lastPairingHandler_ = null; + this.notifyDiscoveryStopped_(); } /** @@ -443,6 +460,14 @@ } /** + * @private + * Notifies the last delegate that device discovery has stopped. + */ + notifyDiscoveryStopped_() { + this.lastDiscoveryDelegate_.onBluetoothDiscoveryStopped(); + } + + /** * @return {?FakeDevicePairingHandler} */ getLastCreatedPairingHandler() {
diff --git a/chrome/test/data/webui/cr_components/chromeos/bluetooth/fake_device_pairing_handler.js b/chrome/test/data/webui/cr_components/chromeos/bluetooth/fake_device_pairing_handler.js index e8fe62229..4ff6cbe 100644 --- a/chrome/test/data/webui/cr_components/chromeos/bluetooth/fake_device_pairing_handler.js +++ b/chrome/test/data/webui/cr_components/chromeos/bluetooth/fake_device_pairing_handler.js
@@ -28,6 +28,11 @@ */ this.pairDeviceCallback_ = null; + /** + * @private {?function()} + */ + this.pairDeviceRejectCallback_ = null; + /** @private {number} */ this.pairDeviceCalledCount_ = 0; @@ -47,6 +52,7 @@ this.devicePairingDelegate_ = delegate; let promise = new Promise((resolve, reject) => { this.pairDeviceCallback_ = resolve; + this.pairDeviceRejectCallback_ = reject; }); return promise; } @@ -146,6 +152,16 @@ } /** + * Simulates pairing failing due to an exception, such as the Mojo pipe + * disconnecting. + */ + rejectPairDevice() { + if (this.pairDeviceRejectCallback_) { + this.pairDeviceRejectCallback_(); + } + } + + /** * @return {number} */ getPairDeviceCalledCount() {
diff --git a/chrome/updater/mac/keystone/ksadmin.mm b/chrome/updater/mac/keystone/ksadmin.mm index 030d57ea..312367e 100644 --- a/chrome/updater/mac/keystone/ksadmin.mm +++ b/chrome/updater/mac/keystone/ksadmin.mm
@@ -7,7 +7,6 @@ #include <stdio.h> #include <algorithm> -#include <map> #include <string> #include <utility> #include <vector> @@ -17,6 +16,7 @@ #include "base/callback.h" #include "base/command_line.h" #include "base/containers/contains.h" +#include "base/containers/flat_map.h" #include "base/files/file_path.h" #include "base/logging.h" #include "base/memory/scoped_refptr.h" @@ -52,6 +52,7 @@ constexpr char kCommandSystemStore[] = "system-store"; constexpr char kCommandUserInitiated[] = "user-initiated"; constexpr char kCommandUserStore[] = "user-store"; +constexpr char kCommandStorePath[] = "store"; constexpr char kCommandBrandKey[] = "brand-key"; constexpr char kCommandBrandPath[] = "brand-path"; constexpr char kCommandProductId[] = "productid"; @@ -68,8 +69,9 @@ // converts an argv set into a map of switch name to switch value; for example // `ksadmin --register --productid com.goog.chrome -v 1.2.3.4 e` to // `{"register": "", "productid": "com.goog.chrome", "v": "1.2.3.4", "e": ""}`. -std::map<std::string, std::string> ParseCommandLine(int argc, char* argv[]) { - std::map<std::string, std::string> result; +base::flat_map<std::string, std::string> ParseCommandLine(int argc, + char* argv[]) { + base::flat_map<std::string, std::string> result; std::string last_arg; for (int i = 1; i < argc; ++i) { std::string arg(argv[i]); @@ -95,10 +97,10 @@ } bool HasSwitch(const std::string& arg, - const std::map<std::string, std::string>& switches) { + const base::flat_map<std::string, std::string>& switches) { if (base::Contains(switches, arg)) return true; - const static std::map<std::string, std::vector<std::string>> aliases = { + const static base::flat_map<std::string, std::vector<std::string>> aliases = { {kCommandDelete, {"d"}}, {kCommandInstall, {"i"}}, {kCommandList, {"l"}}, {kCommandKsadminVersion, {"k"}}, {kCommandPrintTag, {"G"}}, {kCommandPrintTickets, {"print", "p"}}, @@ -114,14 +116,47 @@ return false; } -UpdaterScope Scope(const std::map<std::string, std::string>& switches) { - return HasSwitch(kCommandSystemStore, switches) ? UpdaterScope::kSystem - : UpdaterScope::kUser; +std::string SwitchValue( + const std::string& arg, + const base::flat_map<std::string, std::string>& switches) { + if (base::Contains(switches, arg)) + return switches.at(arg); + const static base::flat_map<std::string, std::string> aliases = { + {kCommandBrandKey, "b"}, {kCommandBrandPath, "B"}, + {kCommandProductId, "P"}, {kCommandTag, "g"}, + {kCommandTagKey, "K"}, {kCommandTagPath, "H"}, + {kCommandVersion, "v"}, {kCommandVersionKey, "e"}, + {kCommandVersionPath, "a"}, {kCommandXCPath, "x"}, + {kCommandStorePath, {"s"}}, + }; + if (!base::Contains(aliases, arg)) + return ""; + const std::string& alias = aliases.at(arg); + return base::Contains(switches, alias) ? switches.at(alias) : ""; +} + +std::string KeystoneTicketStorePath(UpdaterScope scope) { + return GetKeystoneFolderPath(scope) + ->Append(FILE_PATH_LITERAL("TicketStore")) + .Append(FILE_PATH_LITERAL("Keystone.ticketstore")) + .AsUTF8Unsafe(); +} + +UpdaterScope Scope(const base::flat_map<std::string, std::string>& switches) { + if (HasSwitch(kCommandSystemStore, switches)) + return UpdaterScope::kSystem; + if (HasSwitch(kCommandUserStore, switches)) + return UpdaterScope::kUser; + + return SwitchValue(kCommandStorePath, switches) == + KeystoneTicketStorePath(UpdaterScope::kSystem) + ? UpdaterScope::kSystem + : UpdaterScope::kUser; } class KSAdminApp : public App { public: - explicit KSAdminApp(const std::map<std::string, std::string>& switches) + explicit KSAdminApp(const base::flat_map<std::string, std::string>& switches) : switches_(switches), service_proxy_(base::MakeRefCounted<UpdateServiceProxy>(Scope())) {} @@ -146,7 +181,7 @@ NSDictionary<NSString*, KSTicket*>* LoadTicketStore(); - const std::map<std::string, std::string> switches_; + const base::flat_map<std::string, std::string> switches_; scoped_refptr<UpdateServiceProxy> service_proxy_; }; @@ -255,19 +290,7 @@ } std::string KSAdminApp::SwitchValue(const std::string& arg) const { - if (base::Contains(switches_, arg)) - return switches_.at(arg); - const static std::map<std::string, std::string> aliases = { - {kCommandBrandKey, "b"}, {kCommandBrandPath, "B"}, - {kCommandProductId, "P"}, {kCommandTag, "g"}, - {kCommandTagKey, "K"}, {kCommandTagPath, "H"}, - {kCommandVersion, "v"}, {kCommandVersionKey, "e"}, - {kCommandVersionPath, "a"}, {kCommandXCPath, "x"}, - }; - if (!base::Contains(aliases, arg)) - return ""; - const std::string& alias = aliases.at(arg); - return base::Contains(switches_, alias) ? switches_.at(alias) : ""; + return updater::SwitchValue(arg, switches_); } UpdaterScope KSAdminApp::Scope() const { @@ -280,13 +303,9 @@ } NSDictionary<NSString*, KSTicket*>* KSAdminApp::LoadTicketStore() { - return [KSTicketStore - readStoreWithPath:base::SysUTF8ToNSString( - GetKeystoneFolderPath(Scope()) - ->Append(FILE_PATH_LITERAL("TicketStore")) - .Append( - FILE_PATH_LITERAL("Keystone.ticketstore")) - .AsUTF8Unsafe())]; + return + [KSTicketStore readStoreWithPath:base::SysUTF8ToNSString( + KeystoneTicketStorePath(Scope()))]; } int KSAdminApp::PrintKeystoneTag(const std::string& app_id) { @@ -390,7 +409,7 @@ Shutdown(1); } } - const std::map<std::string, void (KSAdminApp::*)()> commands = { + const base::flat_map<std::string, void (KSAdminApp::*)()> commands = { {kCommandDelete, &KSAdminApp::Delete}, {kCommandInstall, &KSAdminApp::CheckForUpdates}, {kCommandList, &KSAdminApp::CheckForUpdates}, @@ -413,7 +432,7 @@ int KSAdminAppMain(int argc, char* argv[]) { base::AtExitManager exit_manager; base::CommandLine::Init(argc, argv); - std::map<std::string, std::string> command_line = + base::flat_map<std::string, std::string> command_line = ParseCommandLine(argc, argv); updater::InitLogging(Scope(command_line), FILE_PATH_LITERAL("updater.log")); base::SingleThreadTaskExecutor main_task_executor(base::MessagePumpType::UI);
diff --git a/chromecast/common/cast_content_client.cc b/chromecast/common/cast_content_client.cc index b119e04..4839ceaf 100644 --- a/chromecast/common/cast_content_client.cc +++ b/chromecast/common/cast_content_client.cc
@@ -70,8 +70,7 @@ return std::make_unique<content::CdmInfo>( kWidevineKeySystem, content::CdmInfo::Robustness::kSoftwareSecure, std::move(capability), /*supports_sub_key_systems=*/false, - kWidevineCdmDisplayName, kWidevineCdmType, version, cdm_library_path, - kWidevineCdmFileSystemId); + kWidevineCdmDisplayName, kWidevineCdmType, version, cdm_library_path); } // On desktop Linux, given |cdm_base_path| that points to a folder containing
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd index 76b227d..994662f5 100644 --- a/chromeos/chromeos_strings.grd +++ b/chromeos/chromeos_strings.grd
@@ -2237,7 +2237,7 @@ Finalizing repair </message> <message name="IDS_SHIMLESS_RMA_FINALIZE_PROGRESS" translateable="false" desc="Message to display current progress of finalization."> - Progress <ph name="PROGRESS_PERCENT">$1<ex>25</ex></ph>%. + Finalizing the device. Do not turn off power. </message> <message name="IDS_SHIMLESS_RMA_FINALIZE_COMPLETE" translateable="false" desc="Message to display when finalization is complete."> Complete.
diff --git a/chromeos/components/multidevice/remote_device_ref.h b/chromeos/components/multidevice/remote_device_ref.h index 65047f36..3a76b36 100644 --- a/chromeos/components/multidevice/remote_device_ref.h +++ b/chromeos/components/multidevice/remote_device_ref.h
@@ -15,7 +15,11 @@ namespace ash { class EasyUnlockServiceRegular; -} +namespace tether { +class TetherHostFetcherImpl; +class TetherHostFetcherImplTest; +} // namespace tether +} // namespace ash namespace chromeos { namespace multidevice_setup { @@ -27,11 +31,6 @@ class SecureChannelClientImpl; } // namespace secure_channel -namespace tether { -class TetherHostFetcherImpl; -class TetherHostFetcherImplTest; -} // namespace tether - namespace multidevice { class ProximityAuthWebUIHandler; @@ -106,9 +105,9 @@ // TODO(crbug.com/752273): Remove these once clients have migrated to Device // Sync service. - friend class ash::EasyUnlockServiceRegular; - friend class tether::TetherHostFetcherImpl; - friend class tether::TetherHostFetcherImplTest; + friend class ::ash::EasyUnlockServiceRegular; + friend class ::ash::tether::TetherHostFetcherImplTest; + friend class ::ash::tether::TetherHostFetcherImpl; friend class ProximityAuthWebUIHandler; explicit RemoteDeviceRef(std::shared_ptr<RemoteDevice> remote_device);
diff --git a/chromeos/components/multidevice/remote_device_test_util.h b/chromeos/components/multidevice/remote_device_test_util.h index 8e4ae7c2..c5e3108 100644 --- a/chromeos/components/multidevice/remote_device_test_util.h +++ b/chromeos/components/multidevice/remote_device_test_util.h
@@ -67,8 +67,11 @@ // source migration is finished. namespace ash { namespace multidevice { +using ::chromeos::multidevice::CreateRemoteDeviceListForTest; +using ::chromeos::multidevice::CreateRemoteDeviceRefForTest; +using ::chromeos::multidevice::CreateRemoteDeviceRefListForTest; using ::chromeos::multidevice::RemoteDeviceRefBuilder; -} +} // namespace multidevice } // namespace ash #endif // CHROMEOS_COMPONENTS_MULTIDEVICE_REMOTE_DEVICE_TEST_UTIL_H_
diff --git a/chromeos/login/auth/login_event_recorder.cc b/chromeos/login/auth/login_event_recorder.cc deleted file mode 100644 index c40072a..0000000 --- a/chromeos/login/auth/login_event_recorder.cc +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/login/auth/login_event_recorder.h" - -#include <vector> - -#include "base/lazy_instance.h" - -namespace chromeos { - -static base::LazyInstance<LoginEventRecorder>::DestructorAtExit - g_login_event_recorder = LAZY_INSTANCE_INITIALIZER; - -LoginEventRecorder::LoginEventRecorder() : delegate_(NULL) {} - -LoginEventRecorder::~LoginEventRecorder() = default; - -// static -LoginEventRecorder* LoginEventRecorder::Get() { - return g_login_event_recorder.Pointer(); -} - -void LoginEventRecorder::SetDelegate(LoginEventRecorder::Delegate* delegate) { - delegate_ = delegate; -} - -void LoginEventRecorder::AddLoginTimeMarker(const char* marker_name, - bool send_to_uma) { - if (delegate_) - delegate_->AddLoginTimeMarker(marker_name, send_to_uma); -} - -void LoginEventRecorder::RecordAuthenticationSuccess() { - if (delegate_) - delegate_->RecordAuthenticationSuccess(); -} - -void LoginEventRecorder::RecordAuthenticationFailure() { - if (delegate_) - delegate_->RecordAuthenticationFailure(); -} - -} // namespace chromeos
diff --git a/chromeos/login/auth/login_event_recorder.h b/chromeos/login/auth/login_event_recorder.h deleted file mode 100644 index b24f48c..0000000 --- a/chromeos/login/auth/login_event_recorder.h +++ /dev/null
@@ -1,60 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMEOS_LOGIN_AUTH_LOGIN_EVENT_RECORDER_H_ -#define CHROMEOS_LOGIN_AUTH_LOGIN_EVENT_RECORDER_H_ - -#include "base/component_export.h" - -namespace chromeos { - -// LoginEventRecorder records the bootimes of Chrome OS. -// Actual implementation is handled by delegate. -class COMPONENT_EXPORT(CHROMEOS_LOGIN_AUTH) LoginEventRecorder { - public: - class Delegate { - public: - // Add a time marker for login. A timeline will be dumped to - // /tmp/login-times-sent after login is done. If |send_to_uma| is true - // the time between this marker and the last will be sent to UMA with - // the identifier BootTime.|marker_name|. - virtual void AddLoginTimeMarker(const char* marker_name, - bool send_to_uma) = 0; - - // Record events for successful authentication. - virtual void RecordAuthenticationSuccess() = 0; - - // Record events for authentication failure. - virtual void RecordAuthenticationFailure() = 0; - }; - LoginEventRecorder(); - - LoginEventRecorder(const LoginEventRecorder&) = delete; - LoginEventRecorder& operator=(const LoginEventRecorder&) = delete; - - virtual ~LoginEventRecorder(); - - static LoginEventRecorder* Get(); - - void SetDelegate(Delegate* delegate); - - // Add a time marker for login. A timeline will be dumped to - // /tmp/login-times-sent after login is done. If |send_to_uma| is true - // the time between this marker and the last will be sent to UMA with - // the identifier BootTime.|marker_name|. - void AddLoginTimeMarker(const char* marker_name, bool send_to_uma); - - // Record events for successful authentication. - void RecordAuthenticationSuccess(); - - // Record events for authentication failure. - void RecordAuthenticationFailure(); - - private: - Delegate* delegate_; -}; - -} // namespace chromeos - -#endif // CHROMEOS_LOGIN_AUTH_LOGIN_EVENT_RECORDER_H_
diff --git a/chromeos/network/cellular_connection_handler.h b/chromeos/network/cellular_connection_handler.h index 8439c485..77f66f8 100644 --- a/chromeos/network/cellular_connection_handler.h +++ b/chromeos/network/cellular_connection_handler.h
@@ -207,4 +207,9 @@ } // namespace chromeos +// TODO(https://crbug.com/1164001): remove when this file is moved to ash. +namespace ash { +using ::chromeos::CellularConnectionHandler; +} // namespace ash + #endif // CHROMEOS_NETWORK_CELLULAR_CONNECTION_HANDLER_H_
diff --git a/chromeos/network/managed_state.h b/chromeos/network/managed_state.h index 88dc8bf..54d8221 100644 --- a/chromeos/network/managed_state.h +++ b/chromeos/network/managed_state.h
@@ -13,9 +13,15 @@ #include "base/compiler_specific.h" #include "base/component_export.h" +namespace ash { +namespace tether { +class NetworkListSorterTest; +} // namespace tether +} // namespace ash + namespace base { class Value; -} +} // namespace base namespace chromeos { @@ -23,10 +29,6 @@ class NetworkState; class NetworkTypePattern; -namespace tether { -class NetworkListSorterTest; -} - // Base class for states managed by NetworkStateManger which are associated // with a Shill path (e.g. service path or device path). class COMPONENT_EXPORT(CHROMEOS_NETWORK) ManagedState { @@ -125,9 +127,9 @@ void set_type(const std::string& type) { type_ = type; } private: + friend class ::ash::tether::NetworkListSorterTest; friend class NetworkStateHandler; friend class NetworkStateTestHelper; - friend class chromeos::tether::NetworkListSorterTest; ManagedType managed_type_; @@ -147,4 +149,9 @@ } // namespace chromeos +// TODO(https://crbug.com/1164001): remove when this file is moved to ash. +namespace ash { +using ::chromeos::ManagedState; +} // namespace ash + #endif // CHROMEOS_NETWORK_MANAGED_STATE_H_
diff --git a/chromeos/network/mock_managed_network_configuration_handler.h b/chromeos/network/mock_managed_network_configuration_handler.h index 2e78effa..19e1a84 100644 --- a/chromeos/network/mock_managed_network_configuration_handler.h +++ b/chromeos/network/mock_managed_network_configuration_handler.h
@@ -96,4 +96,9 @@ } // namespace chromeos +// TODO(https://crbug.com/1164001): remove when this file is moved to ash. +namespace ash { +using ::chromeos::MockManagedNetworkConfigurationHandler; +} // namespace ash + #endif // CHROMEOS_NETWORK_MOCK_MANAGED_NETWORK_CONFIGURATION_HANDLER_H_
diff --git a/chromeos/network/network_connection_handler.h b/chromeos/network/network_connection_handler.h index 82a846f2..542872c 100644 --- a/chromeos/network/network_connection_handler.h +++ b/chromeos/network/network_connection_handler.h
@@ -13,9 +13,17 @@ #include "base/component_export.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/cellular_connection_handler.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/managed_network_configuration_handler.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_configuration_handler.h" #include "chromeos/network/network_connection_observer.h" #include "chromeos/network/network_handler.h" #include "chromeos/network/network_handler_callbacks.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/network_state_handler.h" namespace chromeos { @@ -37,11 +45,6 @@ enum class ConnectCallbackMode { ON_STARTED, ON_COMPLETED }; -class CellularConnectionHandler; -class NetworkStateHandler; -class NetworkConfigurationHandler; -class ManagedNetworkConfigurationHandler; - class COMPONENT_EXPORT(CHROMEOS_NETWORK) NetworkConnectionHandler { public: // Constants for |error_name| from |error_callback| for Connect. Whenever a @@ -256,6 +259,7 @@ // TODO(https://crbug.com/1164001): remove when moved to ash. namespace ash { using ::chromeos::ConnectCallbackMode; +using ::chromeos::NetworkConnectionHandler; } #endif // CHROMEOS_NETWORK_NETWORK_CONNECTION_HANDLER_H_
diff --git a/chromeos/network/network_state.h b/chromeos/network/network_state.h index 1a55e42..c843211 100644 --- a/chromeos/network/network_state.h +++ b/chromeos/network/network_state.h
@@ -18,14 +18,14 @@ #include "components/onc/onc_constants.h" #include "url/gurl.h" -namespace base { -class Value; -} - // TODO(https://crbug.com/1164001): remove when moved to ash. namespace ash { class MobileActivatorTest; -} +} // namespace ash + +namespace base { +class Value; +} // namespace base namespace chromeos {
diff --git a/chromeos/network/network_state_handler.h b/chromeos/network/network_state_handler.h index 31c6d24c..b448a1b 100644 --- a/chromeos/network/network_state_handler.h +++ b/chromeos/network/network_state_handler.h
@@ -31,7 +31,6 @@ namespace chromeos { class DeviceState; -class NetworkState; class NetworkStateHandlerObserver; class NetworkStateHandlerTest;
diff --git a/chromeos/network/network_state_handler_observer.h b/chromeos/network/network_state_handler_observer.h index 703d40a..dcec5e0 100644 --- a/chromeos/network/network_state_handler_observer.h +++ b/chromeos/network/network_state_handler_observer.h
@@ -9,13 +9,13 @@ #include <vector> #include "base/component_export.h" +// TODO(https://crbug.com/1164001): move to forward declaration +#include "chromeos/network/device_state.h" #include "chromeos/network/network_state.h" #include "chromeos/network/network_type_pattern.h" namespace chromeos { -class DeviceState; - // Observer class for all network state changes, including changes to // active (connecting or connected) services. class COMPONENT_EXPORT(CHROMEOS_NETWORK) NetworkStateHandlerObserver {
diff --git a/chromeos/network/shill_property_util.h b/chromeos/network/shill_property_util.h index 9a14ae9..b5559dd 100644 --- a/chromeos/network/shill_property_util.h +++ b/chromeos/network/shill_property_util.h
@@ -100,4 +100,12 @@ } // namespace chromeos +// TODO(https://crbug.com/1164001): remove when this file is moved to ash. +namespace ash { +namespace shill_property_util { +using ::chromeos::shill_property_util::GetSSIDFromProperties; +using ::chromeos::shill_property_util::SetSSID; +} // namespace shill_property_util +} // namespace ash + #endif // CHROMEOS_NETWORK_SHILL_PROPERTY_UTIL_H_
diff --git a/chromeos/services/device_sync/cryptauth_device_manager.h b/chromeos/services/device_sync/cryptauth_device_manager.h index 89a0d74..0b1108d 100644 --- a/chromeos/services/device_sync/cryptauth_device_manager.h +++ b/chromeos/services/device_sync/cryptauth_device_manager.h
@@ -123,4 +123,11 @@ } // namespace chromeos +// TODO(https://crbug.com/1164001): remove when this file is moved to ash. +namespace ash { +namespace device_sync { +using ::chromeos::device_sync::CryptAuthDeviceManager; +} // namespace device_sync +} // namespace ash + #endif // CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_DEVICE_MANAGER_H_
diff --git a/chromeos/services/device_sync/cryptauth_v2_device_manager.h b/chromeos/services/device_sync/cryptauth_v2_device_manager.h index d53c6fc..2dc494f 100644 --- a/chromeos/services/device_sync/cryptauth_v2_device_manager.h +++ b/chromeos/services/device_sync/cryptauth_v2_device_manager.h
@@ -91,4 +91,11 @@ } // namespace chromeos +// TODO(https://crbug.com/1164001): remove when this file is moved to ash. +namespace ash { +namespace device_sync { +using ::chromeos::device_sync::CryptAuthV2DeviceManager; +} // namespace device_sync +} // namespace ash + #endif // CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_V2_DEVICE_MANAGER_H_
diff --git a/chromeos/services/device_sync/fake_remote_device_provider.h b/chromeos/services/device_sync/fake_remote_device_provider.h index dcd0456..58c5ee12 100644 --- a/chromeos/services/device_sync/fake_remote_device_provider.h +++ b/chromeos/services/device_sync/fake_remote_device_provider.h
@@ -39,4 +39,11 @@ } // namespace chromeos +// TODO(https://crbug.com/1164001): remove when this file is moved to ash. +namespace ash { +namespace device_sync { +using ::chromeos::device_sync::FakeRemoteDeviceProvider; +} // namespace device_sync +} // namespace ash + #endif // CHROMEOS_SERVICES_DEVICE_SYNC_FAKE_REMOTE_DEVICE_PROVIDER_H_
diff --git a/chromeos/services/device_sync/remote_device_provider.h b/chromeos/services/device_sync/remote_device_provider.h index b2b6860..7505527 100644 --- a/chromeos/services/device_sync/remote_device_provider.h +++ b/chromeos/services/device_sync/remote_device_provider.h
@@ -44,4 +44,11 @@ } // namespace chromeos +// TODO(https://crbug.com/1164001): remove when this file is moved to ash. +namespace ash { +namespace device_sync { +using ::chromeos::device_sync::RemoteDeviceProvider; +} // namespace device_sync +} // namespace ash + #endif // CHROMEOS_SERVICES_DEVICE_SYNC_REMOTE_DEVICE_PROVIDER_H_
diff --git a/chromeos/services/device_sync/remote_device_provider_impl.h b/chromeos/services/device_sync/remote_device_provider_impl.h index 9c99129..c5abced5 100644 --- a/chromeos/services/device_sync/remote_device_provider_impl.h +++ b/chromeos/services/device_sync/remote_device_provider_impl.h
@@ -131,4 +131,11 @@ } // namespace chromeos +// TODO(https://crbug.com/1164001): remove when this file is moved to ash. +namespace ash { +namespace device_sync { +using ::chromeos::device_sync::RemoteDeviceProviderImpl; +} // namespace device_sync +} // namespace ash + #endif // CHROMEOS_SERVICES_DEVICE_SYNC_REMOTE_DEVICE_PROVIDER_IMPL_H_
diff --git a/chromeos/services/secure_channel/public/cpp/client/client_channel.h b/chromeos/services/secure_channel/public/cpp/client/client_channel.h index 35f0e8b0..235057ff 100644 --- a/chromeos/services/secure_channel/public/cpp/client/client_channel.h +++ b/chromeos/services/secure_channel/public/cpp/client/client_channel.h
@@ -98,4 +98,11 @@ } // namespace chromeos +// TODO(https://crbug.com/1164001): remove when this file is moved to ash. +namespace ash { +namespace secure_channel { +using ::chromeos::secure_channel::ClientChannel; +} // namespace secure_channel +} // namespace ash + #endif // CHROMEOS_SERVICES_SECURE_CHANNEL_PUBLIC_CPP_CLIENT_CLIENT_CHANNEL_H_
diff --git a/chromeos/services/secure_channel/public/cpp/client/connection_attempt.h b/chromeos/services/secure_channel/public/cpp/client/connection_attempt.h index c13c0e3f..38d3e14 100644 --- a/chromeos/services/secure_channel/public/cpp/client/connection_attempt.h +++ b/chromeos/services/secure_channel/public/cpp/client/connection_attempt.h
@@ -53,4 +53,11 @@ } // namespace chromeos +// TODO(https://crbug.com/1164001): remove when this file is moved to ash. +namespace ash { +namespace secure_channel { +using ::chromeos::secure_channel::ConnectionAttempt; +} // namespace secure_channel +} // namespace ash + #endif // CHROMEOS_SERVICES_SECURE_CHANNEL_PUBLIC_CPP_CLIENT_CONNECTION_ATTEMPT_H_
diff --git a/chromeos/services/secure_channel/public/cpp/client/fake_client_channel.h b/chromeos/services/secure_channel/public/cpp/client/fake_client_channel.h index f1394d2..0fdd5eb 100644 --- a/chromeos/services/secure_channel/public/cpp/client/fake_client_channel.h +++ b/chromeos/services/secure_channel/public/cpp/client/fake_client_channel.h
@@ -73,4 +73,11 @@ } // namespace chromeos +// TODO(https://crbug.com/1164001): remove when this file is moved to ash. +namespace ash { +namespace secure_channel { +using ::chromeos::secure_channel::FakeClientChannel; +} // namespace secure_channel +} // namespace ash + #endif // CHROMEOS_SERVICES_SECURE_CHANNEL_PUBLIC_CPP_CLIENT_FAKE_CLIENT_CHANNEL_H_
diff --git a/chromeos/services/secure_channel/public/cpp/client/fake_connection_attempt.h b/chromeos/services/secure_channel/public/cpp/client/fake_connection_attempt.h index 914cc88..b010d8d4 100644 --- a/chromeos/services/secure_channel/public/cpp/client/fake_connection_attempt.h +++ b/chromeos/services/secure_channel/public/cpp/client/fake_connection_attempt.h
@@ -51,4 +51,11 @@ } // namespace chromeos +// TODO(https://crbug.com/1164001): remove when this file is moved to ash. +namespace ash { +namespace secure_channel { +using ::chromeos::secure_channel::FakeConnectionAttempt; +} // namespace secure_channel +} // namespace ash + #endif // CHROMEOS_SERVICES_SECURE_CHANNEL_PUBLIC_CPP_CLIENT_FAKE_CONNECTION_ATTEMPT_H_
diff --git a/chromeos/services/secure_channel/public/cpp/shared/connection_priority.h b/chromeos/services/secure_channel/public/cpp/shared/connection_priority.h index e735701..f445ad4e 100644 --- a/chromeos/services/secure_channel/public/cpp/shared/connection_priority.h +++ b/chromeos/services/secure_channel/public/cpp/shared/connection_priority.h
@@ -41,4 +41,11 @@ } // namespace chromeos +// TODO(https://crbug.com/1164001): remove when this file is moved to ash. +namespace ash { +namespace secure_channel { +using ::chromeos::secure_channel::ConnectionPriority; +} // namespace secure_channel +} // namespace ash + #endif // CHROMEOS_SERVICES_SECURE_CHANNEL_PUBLIC_CPP_SHARED_CONNECTION_PRIORITY_H_
diff --git a/components/autofill_assistant/content/browser/content_autofill_assistant_driver.cc b/components/autofill_assistant/content/browser/content_autofill_assistant_driver.cc index fa200d9..3b3c986 100644 --- a/components/autofill_assistant/content/browser/content_autofill_assistant_driver.cc +++ b/components/autofill_assistant/content/browser/content_autofill_assistant_driver.cc
@@ -60,6 +60,7 @@ DCHECK(annotate_dom_model_service_); if (!annotate_dom_model_service_) { std::move(callback).Run(base::File()); + return; } absl::optional<base::File> file = annotate_dom_model_service_->GetModelFile();
diff --git a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/ThrottlingNotificationScheduler.java b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/ThrottlingNotificationScheduler.java index 646a07f0..f8b773d 100644 --- a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/ThrottlingNotificationScheduler.java +++ b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/ThrottlingNotificationScheduler.java
@@ -25,9 +25,9 @@ * notifications to the NotificationManager. */ public class ThrottlingNotificationScheduler { - // To avoid notification updates being throttled by Android, using 250 ms as the interval - // so that no more than 5 updates are posted per second. - public static final long UPDATE_DELAY_MILLIS = 250; + // To avoid notification updates being throttled by Android, using 350 ms as the interval + // so that no more than 3 updates are posted per second. + public static final long UPDATE_DELAY_MILLIS = 350; // Priority queue hold all the pending notifications. private final PriorityQueue<PendingNotificationTask> mPendingNotificationTasks =
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb index 11259745..25c74a87 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
@@ -49,6 +49,7 @@ <translation id="2212565012507486665">Kukilərə icazə verin</translation> <translation id="2228071138934252756"><ph name="APP_NAME" /> tətbiqinə kameranıza giriş icazəsi vermək üçün <ph name="BEGIN_LINK" />Android Ayarlarında<ph name="END_LINK" /> kameranı da aktiv edin.</translation> <translation id="2241634353105152135">Sadəcə bir dəfə</translation> +<translation id="2253414712144136228"><ph name="NAME_OF_LIST_ITEM" /> Silin</translation> <translation id="2289270750774289114">Sayt yaxınlıqdakı Bluetooth cihazlarını kəşf etmək istədikdə soruşun (tövsiyə edilir)</translation> <translation id="2315043854645842844">Müştəri sayt sertifikatı seçimi əməliyyat sistemi tərəfindən dəstəklənmir.</translation> <translation id="2359808026110333948">Davam edin</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb index d9450c2b..23d2d75b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
@@ -49,6 +49,7 @@ <translation id="2212565012507486665">Αποδοχή cookie</translation> <translation id="2228071138934252756">Για να επιτρέψετε στην εφαρμογή <ph name="APP_NAME" /> να αποκτήσει πρόσβαση στην κάμερά σας, ενεργοποιήστε επίσης την κάμερα στις <ph name="BEGIN_LINK" />Ρυθμίσεις Android<ph name="END_LINK" />.</translation> <translation id="2241634353105152135">Μόνο μία φορά</translation> +<translation id="2253414712144136228"><ph name="NAME_OF_LIST_ITEM" /> Κατάργηση</translation> <translation id="2289270750774289114">Να γίνεται ερώτηση όταν ένας ιστότοπος επιθυμεί να εντοπίσει κοντινές συσκευες Bluetooth (συνιστάται)</translation> <translation id="2315043854645842844">Η επιλογή πιστοποιητικού από τον πελάτη δεν υποστηρίζεται από το λειτουργικό σύστημα.</translation> <translation id="2359808026110333948">Συνέχεια</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb index d002a0820..dad39d8 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
@@ -49,6 +49,7 @@ <translation id="2212565012507486665">Allow cookies</translation> <translation id="2228071138934252756">To let <ph name="APP_NAME" /> access your camera, also turn on camera in <ph name="BEGIN_LINK" />Android settings<ph name="END_LINK" />.</translation> <translation id="2241634353105152135">Just once</translation> +<translation id="2253414712144136228"><ph name="NAME_OF_LIST_ITEM" /> Remove</translation> <translation id="2289270750774289114">Ask when a site wants to discover nearby Bluetooth devices (recommended)</translation> <translation id="2315043854645842844">Client side certificate selection is not supported by the operating system.</translation> <translation id="2359808026110333948">Continue</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb index 99d18ef..dbaeb1e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
@@ -49,6 +49,7 @@ <translation id="2212565012507486665">Cookies файлдарына уруксат берүү</translation> <translation id="2228071138934252756"><ph name="APP_NAME" /> колдонмосуна камерага кирүүгө уруксат берүү үчүн, <ph name="BEGIN_LINK" />Android Жөндөөлөрүнөн<ph name="END_LINK" /> камераны күйгүзүңүз.</translation> <translation id="2241634353105152135">Бир гана жлу</translation> +<translation id="2253414712144136228"><ph name="NAME_OF_LIST_ITEM" /> өчүрүү</translation> <translation id="2289270750774289114">Сайт жакын жердеги Bluetooth түзмөктөрүн колдонгону жатканда уруксат суралсын (сунушталат)</translation> <translation id="2315043854645842844">Кардар тандаган тастыктама операциялык тутумда колдоого алынбайт.</translation> <translation id="2359808026110333948">Улантуу</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb index e2ac788..263cc9d 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
@@ -49,6 +49,7 @@ <translation id="2212565012507486665">കുക്കികൾ അനുവദിക്കുക</translation> <translation id="2228071138934252756"><ph name="APP_NAME" /> ആപ്പിനെ നിങ്ങളുടെ ക്യാമറ ആക്സസ് ചെയ്യാൻ അനുവദിക്കുന്നതിന്, <ph name="BEGIN_LINK" />Android ക്രമീകരണത്തിലും<ph name="END_LINK" /> ക്യാമറ ഓണാക്കുക.</translation> <translation id="2241634353105152135">ഒരിക്കൽ മാത്രം</translation> +<translation id="2253414712144136228"><ph name="NAME_OF_LIST_ITEM" /> നീക്കം ചെയ്യുക</translation> <translation id="2289270750774289114">സമീപത്തുള്ള Bluetooth ഉപകരണങ്ങൾ കണ്ടെത്താൻ ഒരു സൈറ്റ് താൽപ്പര്യപ്പെടുമ്പോൾ ചോദിക്കുക (ശുപാർശചെയ്തത്)</translation> <translation id="2315043854645842844">ഓപ്പറേറ്റിംഗ് സിസ്റ്റം ക്ലയന്റിന്റെ സർട്ടിഫിക്കറ്റ് തിരഞ്ഞെടുക്കലിനെ പിന്തുണയ്ക്കുന്നില്ല.</translation> <translation id="2359808026110333948">തുടരുക</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb index 5e11c9f4..c5c31a7 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
@@ -49,6 +49,7 @@ <translation id="2212565012507486665">Permitir cookies</translation> <translation id="2228071138934252756">Para permitir que o app <ph name="APP_NAME" /> acesse sua câmera, ative-a também nas <ph name="BEGIN_LINK" />configurações do Android<ph name="END_LINK" />.</translation> <translation id="2241634353105152135">Apenas uma vez</translation> +<translation id="2253414712144136228">Remover <ph name="NAME_OF_LIST_ITEM" /></translation> <translation id="2289270750774289114">Perguntar quando um site quer descobrir dispositivos Bluetooth nas proximidades (recomendado)</translation> <translation id="2315043854645842844">A seleção de certificado do cliente não é compatível com o sistema operacional.</translation> <translation id="2359808026110333948">Continuar</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb index 89277fb..a083d655 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb
@@ -49,6 +49,7 @@ <translation id="2212565012507486665">Permitir cookies</translation> <translation id="2228071138934252756">Para permitir que a app <ph name="APP_NAME" /> aceda à câmara, ative também a câmara nas <ph name="BEGIN_LINK" />Definições do Android<ph name="END_LINK" />.</translation> <translation id="2241634353105152135">Apenas uma vez</translation> +<translation id="2253414712144136228"><ph name="NAME_OF_LIST_ITEM" /> Remover</translation> <translation id="2289270750774289114">Perguntar quando um site pretende detetar dispositivos Bluetooth próximos (recomendado)</translation> <translation id="2315043854645842844">O sistema operativo não suporta a seleção do certificado do lado do cliente.</translation> <translation id="2359808026110333948">Continuar</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb index 8f5d53d1..52d40d8 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
@@ -49,6 +49,7 @@ <translation id="2212565012507486665">Povoliť súbory cookie</translation> <translation id="2228071138934252756">Ak chcete povoliť aplikácii <ph name="APP_NAME" /> používať váš fotoaparát, zapnite ho aj v <ph name="BEGIN_LINK" />nastaveniach Androidu<ph name="END_LINK" />.</translation> <translation id="2241634353105152135">Iba raz</translation> +<translation id="2253414712144136228">Odobrať osobu alebo odstrániť položku <ph name="NAME_OF_LIST_ITEM" /></translation> <translation id="2289270750774289114">Opýtať sa, keď chce web objavovať zariadenia Bluetooth v okolí (odporúčané)</translation> <translation id="2315043854645842844">Operačný systém nepodporuje výber certifikátu na strane klienta.</translation> <translation id="2359808026110333948">Pokračovať</translation>
diff --git a/components/cast_channel/cast_socket_unittest.cc b/components/cast_channel/cast_socket_unittest.cc index 7f52126..85f07a52 100644 --- a/components/cast_channel/cast_socket_unittest.cc +++ b/components/cast_channel/cast_socket_unittest.cc
@@ -349,20 +349,6 @@ std::move(nested_socket), net::HostPortPair(), net::SSLConfig(), ssl_socket_data_provider_.get()); } - std::unique_ptr<net::ProxyClientSocket> CreateProxyClientSocket( - std::unique_ptr<net::StreamSocket> stream_socket, - const std::string& user_agent, - const net::HostPortPair& endpoint, - const net::ProxyServer& proxy_server, - net::HttpAuthController* http_auth_controller, - bool tunnel, - bool using_spdy, - net::NextProto negotiated_protocol, - net::ProxyDelegate* proxy_delegate, - const net::NetworkTrafficAnnotationTag& traffic_annotation) override { - NOTIMPLEMENTED(); - return nullptr; - } net::IPEndPoint ip_; // Simulated connect data
diff --git a/components/content_capture/browser/BUILD.gn b/components/content_capture/browser/BUILD.gn index 35dc98a..eb510420 100644 --- a/components/content_capture/browser/BUILD.gn +++ b/components/content_capture/browser/BUILD.gn
@@ -31,7 +31,10 @@ "content_capture_test_helper.h", ] - public_deps = [ ":browser" ] + public_deps = [ + ":browser", + "//testing/gtest", + ] } source_set("unit_tests") {
diff --git a/components/content_capture/browser/content_capture_receiver_test.cc b/components/content_capture/browser/content_capture_receiver_test.cc index ea309199..963a288 100644 --- a/components/content_capture/browser/content_capture_receiver_test.cc +++ b/components/content_capture/browser/content_capture_receiver_test.cc
@@ -4,23 +4,14 @@ #include "components/content_capture/browser/content_capture_receiver.h" -#include <memory> -#include <utility> - #include "base/json/json_reader.h" -#include "base/memory/raw_ptr.h" -#include "base/strings/utf_string_conversions.h" -#include "base/task/post_task.h" #include "base/test/scoped_feature_list.h" #include "base/test/test_mock_time_task_runner.h" #include "build/build_config.h" #include "components/content_capture/browser/content_capture_test_helper.h" -#include "content/public/browser/content_browser_client.h" -#include "content/public/browser/web_contents.h" #include "content/public/common/content_features.h" #include "content/public/test/test_renderer_host.h" #include "content/public/test/test_utils.h" -#include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/mojom/favicon/favicon_url.mojom.h" #include "ui/gfx/geometry/size.h" @@ -83,56 +74,6 @@ child_frame_sender_->Bind(child_frame_); } - const std::vector<int64_t>& expected_removed_ids() const { - return expected_removed_ids_; - } - - ContentCaptureFrame GetExpectedTestData(bool main_frame) const { - ContentCaptureFrame expected(helper()->test_data()); - // Replaces the id with expected id. - expected.id = ContentCaptureReceiver::GetIdFrom( - main_frame ? main_frame_.get() : child_frame_.get()); - return expected; - } - - ContentCaptureFrame GetExpectedTestDataChange(int64_t expected_id) const { - ContentCaptureFrame expected(helper()->test_data_change()); - // Replaces the id with expected id. - expected.id = expected_id; - return expected; - } - - ContentCaptureFrame GetExpectedTestData2(bool main_frame) const { - ContentCaptureFrame expected(helper()->test_data2()); - // Replaces the id with expected id. - expected.id = ContentCaptureReceiver::GetIdFrom( - main_frame ? main_frame_.get() : child_frame_.get()); - return expected; - } - - ContentCaptureFrame GetExpectedTestDataUpdate(bool main_frame) const { - ContentCaptureFrame expected(helper()->test_data_update()); - // Replaces the id with expected id. - expected.id = ContentCaptureReceiver::GetIdFrom( - main_frame ? main_frame_.get() : child_frame_.get()); - return expected; - } - - SessionRemovedTestHelper* session_removed_test_helper() { - return &session_removed_test_helper_; - } - - void VerifySession(const ContentCaptureSession& expected, - const ContentCaptureSession& result) const { - EXPECT_EQ(expected.size(), result.size()); - for (size_t i = 0; i < expected.size(); i++) { - EXPECT_EQ(expected[i].id, result[i].id); - EXPECT_EQ(expected[i].url, result[i].url); - EXPECT_EQ(expected[i].bounds, result[i].bounds); - EXPECT_TRUE(result[i].children.empty()); - } - } - void BuildChildSession(const ContentCaptureSession& parent, const ContentCaptureFrame& data, ContentCaptureSession* child) { @@ -144,6 +85,19 @@ child->push_back(parent.front()); } + int64_t GetFrameId(bool main_frame) { + return ContentCaptureReceiver::GetIdFrom(main_frame ? main_frame_.get() + : child_frame_.get()); + } + + const std::vector<int64_t>& expected_removed_ids() const { + return expected_removed_ids_; + } + + SessionRemovedTestHelper* session_removed_test_helper() { + return &session_removed_test_helper_; + } + OnscreenContentProvider* provider() const { return helper_.onscreen_content_provider(); } @@ -187,7 +141,8 @@ true /* first_data */); EXPECT_TRUE(consumer()->parent_session().empty()); EXPECT_TRUE(consumer()->removed_sessions().empty()); - EXPECT_EQ(GetExpectedTestData(true /* main_frame */), + EXPECT_EQ(GetExpectedTestData(helper()->test_data(), + GetFrameId(true /* main_frame */)), consumer()->captured_data()); } @@ -200,20 +155,22 @@ true /* first_data */); EXPECT_TRUE(consumer()->parent_session().empty()); EXPECT_TRUE(consumer()->removed_sessions().empty()); - EXPECT_EQ(GetExpectedTestData(true /* main_frame */), + EXPECT_EQ(GetExpectedTestData(helper()->test_data(), + GetFrameId(true /* main_frame */)), consumer()->captured_data()); EXPECT_TRUE(consumer2->parent_session().empty()); EXPECT_TRUE(consumer2->removed_sessions().empty()); - EXPECT_EQ(GetExpectedTestData(true /* main_frame */), + EXPECT_EQ(GetExpectedTestData(helper()->test_data(), + GetFrameId(true /* main_frame */)), consumer2->captured_data()); // Verifies to get the remove session callback in RemoveConsumer. provider()->RemoveConsumer(*(consumer2.get())); EXPECT_TRUE(consumer()->removed_sessions().empty()); EXPECT_EQ(1u, consumer2->removed_sessions().size()); - std::vector<ContentCaptureFrame> expected{ - GetExpectedTestData(true /* main_frame */)}; + std::vector<ContentCaptureFrame> expected{GetExpectedTestData( + helper()->test_data(), GetFrameId(true /* main_frame */))}; VerifySession(expected, consumer2->removed_sessions().front()); EXPECT_EQ(1u, provider()->GetConsumersForTesting().size()); EXPECT_EQ(consumer(), provider()->GetConsumersForTesting()[0]); @@ -232,7 +189,8 @@ // Verifies to get test_data() with correct frame content id. EXPECT_TRUE(consumer()->parent_session().empty()); EXPECT_TRUE(consumer()->removed_sessions().empty()); - EXPECT_EQ(GetExpectedTestData(true /* main_frame */), + EXPECT_EQ(GetExpectedTestData(helper()->test_data(), + GetFrameId(true /* main_frame */)), consumer()->captured_data()); // Simulates to update the content within the same document. main_frame_sender()->DidCaptureContent(helper()->test_data_update(), @@ -241,7 +199,8 @@ EXPECT_TRUE(consumer()->parent_session().empty()); // Verifies that the session isn't removed. EXPECT_TRUE(consumer()->removed_sessions().empty()); - EXPECT_EQ(GetExpectedTestDataUpdate(true /* main_frame */), + EXPECT_EQ(GetExpectedTestData(helper()->test_data_update(), + GetFrameId(true /* main_frame */)), consumer()->captured_data()); } @@ -257,15 +216,15 @@ true /* first_data */); EXPECT_TRUE(consumer()->parent_session().empty()); EXPECT_TRUE(consumer()->removed_sessions().empty()); - ContentCaptureFrame expected_data = - GetExpectedTestData(true /* main_frame */); + ContentCaptureFrame expected_data = GetExpectedTestData( + helper()->test_data(), GetFrameId(true /* main_frame */)); EXPECT_EQ(expected_data, consumer()->captured_data()); // Simulate content change. main_frame_sender()->DidUpdateContent(helper()->test_data_change()); EXPECT_TRUE(consumer()->updated_parent_session().empty()); EXPECT_TRUE(consumer()->removed_sessions().empty()); - EXPECT_EQ(GetExpectedTestDataChange(expected_data.id), + EXPECT_EQ(GetExpectedTestData(helper()->test_data_change(), expected_data.id), consumer()->updated_data()); } @@ -275,7 +234,8 @@ // Verifies to get test_data() with correct frame content id. EXPECT_TRUE(consumer()->parent_session().empty()); EXPECT_TRUE(consumer()->removed_sessions().empty()); - EXPECT_EQ(GetExpectedTestData(true /* main_frame */), + EXPECT_EQ(GetExpectedTestData(helper()->test_data(), + GetFrameId(true /* main_frame */)), consumer()->captured_data()); // Simulates to navigate other document. main_frame_sender()->DidCaptureContent(helper()->test_data2(), @@ -283,11 +243,12 @@ EXPECT_TRUE(consumer()->parent_session().empty()); // Verifies that the previous session was removed. EXPECT_EQ(1u, consumer()->removed_sessions().size()); - std::vector<ContentCaptureFrame> expected{ - GetExpectedTestData(true /* main_frame */)}; + std::vector<ContentCaptureFrame> expected{GetExpectedTestData( + helper()->test_data(), GetFrameId(true /* main_frame */))}; VerifySession(expected, consumer()->removed_sessions().front()); // Verifies that we get the test_data2() from the new document. - EXPECT_EQ(GetExpectedTestData2(true /* main_frame */), + EXPECT_EQ(GetExpectedTestData(helper()->test_data2(), + GetFrameId(true /* main_frame */)), consumer()->captured_data()); } @@ -297,7 +258,8 @@ // Verifies to get test_data() with correct frame content id. EXPECT_TRUE(consumer()->parent_session().empty()); EXPECT_TRUE(consumer()->removed_sessions().empty()); - EXPECT_EQ(GetExpectedTestData(true /* main_frame */), + EXPECT_EQ(GetExpectedTestData(helper()->test_data(), + GetFrameId(true /* main_frame */)), consumer()->captured_data()); // Simulates to remove the content. main_frame_sender()->DidRemoveContent(expected_removed_ids()); @@ -305,8 +267,8 @@ EXPECT_TRUE(consumer()->removed_sessions().empty()); // Verifies that the removed_ids() was removed from the correct session. EXPECT_EQ(expected_removed_ids(), consumer()->removed_ids()); - std::vector<ContentCaptureFrame> expected{ - GetExpectedTestData(true /* main_frame */)}; + std::vector<ContentCaptureFrame> expected{GetExpectedTestData( + helper()->test_data(), GetFrameId(true /* main_frame */))}; VerifySession(expected, consumer()->session()); } @@ -319,19 +281,21 @@ // Verifies to get test_data() with correct frame content id. EXPECT_TRUE(consumer()->parent_session().empty()); EXPECT_TRUE(consumer()->removed_sessions().empty()); - EXPECT_EQ(GetExpectedTestData(true /* main_frame */), + EXPECT_EQ(GetExpectedTestData(helper()->test_data(), + GetFrameId(true /* main_frame */)), consumer()->captured_data()); // Simulate to capture the content from child frame. child_frame_sender()->DidCaptureContent(helper()->test_data2(), true /* first_data */); // Verifies that the parent_session was set correctly. EXPECT_FALSE(consumer()->parent_session().empty()); - std::vector<ContentCaptureFrame> expected{ - GetExpectedTestData(true /* main_frame */)}; + std::vector<ContentCaptureFrame> expected{GetExpectedTestData( + helper()->test_data(), GetFrameId(true /* main_frame */))}; VerifySession(expected, consumer()->parent_session()); EXPECT_TRUE(consumer()->removed_sessions().empty()); // Verifies that we receive the correct content from child frame. - EXPECT_EQ(GetExpectedTestData2(false /* main_frame */), + EXPECT_EQ(GetExpectedTestData(helper()->test_data2(), + GetFrameId(false /* main_frame */)), consumer()->captured_data()); } @@ -417,7 +381,8 @@ // Verifies that the parent_session was set correctly. EXPECT_FALSE(consumer()->parent_session().empty()); - ContentCaptureFrame data = GetExpectedTestData(true /* main_frame */); + ContentCaptureFrame data = GetExpectedTestData( + helper()->test_data(), GetFrameId(true /* main_frame */)); // Currently, there is no way to fake frame size, set it to 0. data.bounds = gfx::Rect(); ContentCaptureSession expected{data}; @@ -425,12 +390,14 @@ VerifySession(expected, consumer()->parent_session()); EXPECT_TRUE(consumer()->removed_sessions().empty()); // Verifies that we receive the correct content from child frame. - EXPECT_EQ(GetExpectedTestData2(false /* main_frame */), + EXPECT_EQ(GetExpectedTestData(helper()->test_data2(), + GetFrameId(false /* main_frame */)), consumer()->captured_data()); // Get the child session, so we can verify that it has been removed in next // navigation - ContentCaptureFrame child_frame = GetExpectedTestData2(false); + ContentCaptureFrame child_frame = GetExpectedTestData( + helper()->test_data2(), GetFrameId(false /* main_frame */)); // child_frame.children.clear(); ContentCaptureSession removed_child_session; BuildChildSession(expected, consumer()->captured_data(), @@ -466,7 +433,8 @@ // or RenderDocument is enabled on same-site main frame navigation, where we // will get new RenderFrameHosts after the navigation to |kMainFrameUrl2|. if (content::CanSameSiteMainFrameNavigationsChangeRenderFrameHosts()) - data = GetExpectedTestData(/* main_frame =*/true); + data = GetExpectedTestData(helper()->test_data(), + GetFrameId(true /* main_frame */)); data.url = kMainFrameUrl2; // Currently, there is no way to fake frame size, set it to 0. @@ -494,7 +462,8 @@ child_frame_sender()->DidCaptureContent(helper()->test_data2(), true /* first_data */); - data = GetExpectedTestData2(true /* main_frame */); + data = GetExpectedTestData(helper()->test_data2(), + GetFrameId(true /* main_frame */)); // Currently, there is no way to fake frame size, set it to 0. data.bounds = gfx::Rect(); expected.clear(); @@ -524,7 +493,8 @@ // Verifies to get test_data() with correct frame content id. EXPECT_TRUE(consumer()->parent_session().empty()); EXPECT_TRUE(consumer()->removed_sessions().empty()); - EXPECT_EQ(GetExpectedTestData(true /* main_frame */), + EXPECT_EQ(GetExpectedTestData(helper()->test_data(), + GetFrameId(true /* main_frame */)), consumer()->captured_data()); NavigateMainFrameSameDocument(); // Verifies the session wasn't removed for the same document navigation.
diff --git a/components/content_capture/browser/content_capture_test_helper.cc b/components/content_capture/browser/content_capture_test_helper.cc index c0081804..90647b2 100644 --- a/components/content_capture/browser/content_capture_test_helper.cc +++ b/components/content_capture/browser/content_capture_test_helper.cc
@@ -4,6 +4,8 @@ #include "components/content_capture/browser/content_capture_test_helper.h" +#include "testing/gtest/include/gtest/gtest.h" + namespace content_capture { FakeContentCaptureSender::FakeContentCaptureSender() = default; @@ -152,4 +154,23 @@ test_data_update_.children.push_back(child2); } +void VerifySession(const ContentCaptureSession& expected, + const ContentCaptureSession& result) { + EXPECT_EQ(expected.size(), result.size()); + for (size_t i = 0; i < expected.size(); i++) { + EXPECT_EQ(expected[i].id, result[i].id); + EXPECT_EQ(expected[i].url, result[i].url); + EXPECT_EQ(expected[i].bounds, result[i].bounds); + EXPECT_TRUE(result[i].children.empty()); + } +} + +ContentCaptureFrame GetExpectedTestData(const ContentCaptureData& data, + int64_t expected_id) { + ContentCaptureFrame expected(data); + // Replaces the id with expected id. + expected.id = expected_id; + return expected; +} + } // namespace content_capture
diff --git a/components/content_capture/browser/content_capture_test_helper.h b/components/content_capture/browser/content_capture_test_helper.h index a06484c..f4be3738 100644 --- a/components/content_capture/browser/content_capture_test_helper.h +++ b/components/content_capture/browser/content_capture_test_helper.h
@@ -150,6 +150,12 @@ ContentCaptureData test_data_update_; }; +void VerifySession(const ContentCaptureSession& expected, + const ContentCaptureSession& result); + +ContentCaptureFrame GetExpectedTestData(const ContentCaptureData& data, + int64_t expected_id); + } // namespace content_capture #endif // COMPONENTS_CONTENT_CAPTURE_BROWSER_CONTENT_CAPTURE_TEST_HELPER_H_
diff --git a/components/exo/shell_surface_unittest.cc b/components/exo/shell_surface_unittest.cc index 02fe45d..5e1ceee 100644 --- a/components/exo/shell_surface_unittest.cc +++ b/components/exo/shell_surface_unittest.cc
@@ -1830,4 +1830,56 @@ EXPECT_EQ(1u, observer.observed_windows().size()); } +TEST_F(ShellSurfaceTest, Reparent) { + auto shell_surface1 = test::ShellSurfaceBuilder({20, 20}).BuildShellSurface(); + views::Widget* widget1 = shell_surface1->GetWidget(); + + // Create a second window. + auto shell_surface2 = test::ShellSurfaceBuilder({20, 20}).BuildShellSurface(); + views::Widget* widget2 = shell_surface2->GetWidget(); + + auto child_shell_surface = + test::ShellSurfaceBuilder({20, 20}).BuildShellSurface(); + child_shell_surface->SetParent(shell_surface1.get()); + views::Widget* child_widget = child_shell_surface->GetWidget(); + // By default, a child widget is not activatable. Explicitly make it + // activatable so that calling child_surface->RequestActivation() is + // possible. + child_widget->widget_delegate()->SetCanActivate(true); + + GrantPermissionToActivateIndefinitely(widget1->GetNativeWindow()); + GrantPermissionToActivateIndefinitely(widget2->GetNativeWindow()); + GrantPermissionToActivateIndefinitely(child_widget->GetNativeWindow()); + + shell_surface2->Activate(); + EXPECT_FALSE(child_widget->ShouldPaintAsActive()); + EXPECT_FALSE(widget1->ShouldPaintAsActive()); + EXPECT_TRUE(widget2->ShouldPaintAsActive()); + + child_shell_surface->Activate(); + // A widget should have the same paint-as-active state with its parent. + EXPECT_TRUE(child_widget->ShouldPaintAsActive()); + EXPECT_TRUE(widget1->ShouldPaintAsActive()); + EXPECT_FALSE(widget2->ShouldPaintAsActive()); + + // Reparent child to widget2. + child_shell_surface->SetParent(shell_surface2.get()); + EXPECT_TRUE(child_widget->ShouldPaintAsActive()); + EXPECT_TRUE(widget2->ShouldPaintAsActive()); + EXPECT_FALSE(widget1->ShouldPaintAsActive()); + + shell_surface1->Activate(); + EXPECT_FALSE(child_widget->ShouldPaintAsActive()); + EXPECT_FALSE(widget2->ShouldPaintAsActive()); + EXPECT_TRUE(widget1->ShouldPaintAsActive()); + + // Delete widget1 (i.e. the non-parent widget) shouldn't crash. + widget1->Close(); + shell_surface1.reset(); + + child_shell_surface->Activate(); + EXPECT_TRUE(child_widget->ShouldPaintAsActive()); + EXPECT_TRUE(widget2->ShouldPaintAsActive()); +} + } // namespace exo
diff --git a/components/favicon_base/favicon_url_parser.cc b/components/favicon_base/favicon_url_parser.cc index 83a7b5f6..a8c23a8a8 100644 --- a/components/favicon_base/favicon_url_parser.cc +++ b/components/favicon_base/favicon_url_parser.cc
@@ -94,7 +94,7 @@ *parsed = chrome::ParsedFaviconPath(); for (net::QueryIterator it(query_url); !it.IsAtEnd(); it.Advance()) { - const std::string key = it.GetKey(); + const base::StringPiece key = it.GetKey(); // Note: each of these keys can be used in chrome://favicon2 path. See file // "favicon_url_parser.h" for a description of what each one does. if (key == "allow_google_server_fallback") {
diff --git a/components/lens/lens_features.cc b/components/lens/lens_features.cc index 485403ba..82b1d47d 100644 --- a/components/lens/lens_features.cc +++ b/components/lens/lens_features.cc
@@ -11,10 +11,10 @@ namespace features { const base::Feature kLensStandalone{"LensStandalone", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; const base::Feature kLensRegionSearch{"LensRegionSearch", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; const base::FeatureParam<bool> kRegionSearchMacCursorFix{ &kLensRegionSearch, "region-search-mac-cursor-fix", true}; @@ -32,13 +32,13 @@ &kLensRegionSearch, "use-menu-item-alt-text-4", true}; const base::FeatureParam<bool> kEnableUKMLoggingForRegionSearch{ - &kLensRegionSearch, "region-search-enable-ukm-logging", false}; + &kLensRegionSearch, "region-search-enable-ukm-logging", true}; const base::FeatureParam<bool> kEnableUKMLoggingForImageSearch{ - &kLensStandalone, "enable-ukm-logging", false}; + &kLensStandalone, "enable-ukm-logging", true}; const base::FeatureParam<bool> kEnableSidePanelForLensRegionSearch{ - &kLensRegionSearch, "region-search-enable-side-panel", true}; + &kLensRegionSearch, "region-search-enable-side-panel", false}; const base::FeatureParam<bool> kEnableSidePanelForLensImageSearch{ &kLensStandalone, "enable-side-panel", false};
diff --git a/components/media_router/common/providers/cast/cast_media_source.cc b/components/media_router/common/providers/cast/cast_media_source.cc index fb656b8cc..c78144f 100644 --- a/components/media_router/common/providers/cast/cast_media_source.cc +++ b/components/media_router/common/providers/cast/cast_media_source.cc
@@ -152,7 +152,7 @@ base::flat_map<std::string, std::string> result; for (net::QueryIterator query_it(url); !query_it.IsAtEnd(); query_it.Advance()) { - result[query_it.GetKey()] = query_it.GetUnescapedValue(); + result[std::string(query_it.GetKey())] = query_it.GetUnescapedValue(); } return result; }
diff --git a/components/omnibox/browser/omnibox_field_trial.h b/components/omnibox/browser/omnibox_field_trial.h index d940a48..9f5b032 100644 --- a/components/omnibox/browser/omnibox_field_trial.h +++ b/components/omnibox/browser/omnibox_field_trial.h
@@ -554,7 +554,11 @@ // Zero Suggest // Specifies the HTTP cache duration for the zero prefix suggest responses. If // the provided value is a positive number, the cache duration will be sent as a -// query string parameter in the zero suggest requests. +// query string parameter in the zero suggest requests and relayed back in the +// response cache control headers. +// This param is tied to omnibox::kZeroSuggestPrefetching which controls +// prefetching and theoretically works with any caching mechanism. If no valid +// HTTP cache duration is provided the existing caching mechanism is used. extern const base::FeatureParam<int> kZeroSuggestCacheDurationSec; // New params should be inserted above this comment and formatted as:
diff --git a/components/omnibox/browser/zero_suggest_provider.cc b/components/omnibox/browser/zero_suggest_provider.cc index 7cb0327962..402c279 100644 --- a/components/omnibox/browser/zero_suggest_provider.cc +++ b/components/omnibox/browser/zero_suggest_provider.cc
@@ -14,6 +14,7 @@ #include "base/feature_list.h" #include "base/i18n/case_conversion.h" #include "base/json/json_string_value_serializer.h" +#include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h" #include "base/strings/string_util.h" @@ -68,24 +69,34 @@ ELIGIBLE_MAX_VALUE }; -// TODO(hfung): The histogram code was copied and modified from -// search_provider.cc. Refactor and consolidate the code. -// We keep track in a histogram how many suggest requests we send, how -// many suggest requests we invalidate (e.g., due to a user typing -// another character), and how many replies we receive. +// Keeps track of how many Suggest requests are sent, how many requests were +// invalidated, e.g., due to user starting to type, how many responses were +// received, and how many of those responses were loaded from the HTTP cache. // These values are written to logs. New enum values can be added, but existing // enums must never be renumbered or deleted and reused. enum ZeroSuggestRequestsHistogramValue { ZERO_SUGGEST_REQUEST_SENT = 1, ZERO_SUGGEST_REQUEST_INVALIDATED = 2, - ZERO_SUGGEST_REPLY_RECEIVED = 3, + ZERO_SUGGEST_RESPONSE_RECEIVED = 3, + ZERO_SUGGEST_RESPONSE_LOADED_FROM_HTTP_CACHE = 4, ZERO_SUGGEST_MAX_REQUEST_HISTOGRAM_VALUE }; void LogOmniboxZeroSuggestRequest( - ZeroSuggestRequestsHistogramValue request_value) { - UMA_HISTOGRAM_ENUMERATION("Omnibox.ZeroSuggestRequests", request_value, - ZERO_SUGGEST_MAX_REQUEST_HISTOGRAM_VALUE); + ZeroSuggestRequestsHistogramValue request_value, + bool is_prefetch) { + base::UmaHistogramEnumeration( + is_prefetch ? "Omnibox.ZeroSuggestRequests.Prefetch" + : "Omnibox.ZeroSuggestRequests.NonPrefetch", + request_value, ZERO_SUGGEST_MAX_REQUEST_HISTOGRAM_VALUE); +} + +void LogOmniboxZeroSuggestRequestRoundTripTime(base::TimeDelta round_trip_time, + bool is_prefetch) { + base::UmaHistogramTimes( + is_prefetch ? "Omnibox.ZeroSuggestRequests.Prefetch.RoundTripTime" + : "Omnibox.ZeroSuggestRequests.NonPrefetch.RoundTripTime", + round_trip_time); } // Relevance value to use if it was not set explicitly by the server. @@ -143,6 +154,16 @@ void ZeroSuggestProvider::Start(const AutocompleteInput& input, bool minimal_changes) { + Start(input, minimal_changes, /*is_prefetch=*/false); +} + +void ZeroSuggestProvider::StartPrefetch(const AutocompleteInput& input) { + Start(input, /*minimal_changes=*/false, /*is_prefetch=*/true); +} + +void ZeroSuggestProvider::Start(const AutocompleteInput& input, + bool minimal_changes, + bool is_prefetch) { TRACE_EVENT0("omnibox", "ZeroSuggestProvider::Start"); matches_.clear(); Stop(true, false); @@ -166,6 +187,11 @@ TemplateURLRef::SearchTermsArgs search_terms_args; search_terms_args.page_classification = current_page_classification_; search_terms_args.focus_type = input.focus_type(); + const int cache_duration_sec = + OmniboxFieldTrial::kZeroSuggestCacheDurationSec.Get(); + if (cache_duration_sec > 0) { + search_terms_args.zero_suggest_cache_duration_sec = cache_duration_sec; + } GURL suggest_url = RemoteSuggestionsService::EndpointUrl( search_terms_args, client()->GetTemplateURLService()); if (!suggest_url.is_valid()) @@ -177,32 +203,36 @@ done_ = false; - MaybeUseCachedSuggestions(); + // If no valid HTTP cache duration is provided via the cache duration feature + // param, OmniboxFieldTrial::kZeroSuggestCacheDurationSec, the response will + // never be loaded from the HTTP cache. In that case, continue to use the + // stored response, if applicable. + if (cache_duration_sec <= 0) { + MaybeUseStoredResponse(); + } search_terms_args.current_page_url = result_type_running_ == REMOTE_SEND_URL ? current_query_ : std::string(); - // Create a request for suggestions, routing completion to - // OnRemoteSuggestionsLoaderAvailable. client() ->GetRemoteSuggestionsService(/*create_if_necessary=*/true) ->CreateSuggestionsRequest( search_terms_args, client()->GetTemplateURLService(), base::BindOnce( &ZeroSuggestProvider::OnRemoteSuggestionsLoaderAvailable, - weak_ptr_factory_.GetWeakPtr()), - base::BindOnce( - &ZeroSuggestProvider::OnURLLoadComplete, - base::Unretained(this) /* this owns SimpleURLLoader */)); + weak_ptr_factory_.GetWeakPtr(), is_prefetch), + base::BindOnce(&ZeroSuggestProvider::OnURLLoadComplete, + base::Unretained(this) /* this owns SimpleURLLoader */, + is_prefetch, base::TimeTicks::Now())); } void ZeroSuggestProvider::Stop(bool clear_cached_results, bool due_to_user_inactivity) { - if (loader_) - LogOmniboxZeroSuggestRequest(ZERO_SUGGEST_REQUEST_INVALIDATED); + if (loader_) { + LogOmniboxZeroSuggestRequest(ZERO_SUGGEST_REQUEST_INVALIDATED, + /*is_prefetch=*/is_prefetch_loader_); + } loader_.reset(); - - // TODO(krb): It would allow us to remove some guards if we could also cancel - // the TopSites::GetMostVisitedURLs request. + is_prefetch_loader_ = false; done_ = true; result_type_running_ = NONE; @@ -312,12 +342,20 @@ } void ZeroSuggestProvider::OnURLLoadComplete( + bool is_prefetch, + base::TimeTicks request_time, const network::SimpleURLLoader* source, std::unique_ptr<std::string> response_body) { DCHECK(!done_); DCHECK_EQ(loader_.get(), source); - LogOmniboxZeroSuggestRequest(ZERO_SUGGEST_REPLY_RECEIVED); + LogOmniboxZeroSuggestRequestRoundTripTime( + base::TimeTicks::Now() - request_time, is_prefetch); + LogOmniboxZeroSuggestRequest(ZERO_SUGGEST_RESPONSE_RECEIVED, is_prefetch); + if (source->LoadedFromCache()) { + LogOmniboxZeroSuggestRequest(ZERO_SUGGEST_RESPONSE_LOADED_FROM_HTTP_CACHE, + is_prefetch); + } const bool results_updated = response_body && source->NetError() == net::OK && @@ -326,9 +364,14 @@ UpdateResults(SearchSuggestionParser::ExtractJsonData( source, std::move(response_body))); loader_.reset(); + is_prefetch_loader_ = false; done_ = true; result_type_running_ = NONE; - listener_->OnProviderUpdate(results_updated); + + // Do not notify the provider listener for prefetch requests. + if (!is_prefetch) { + listener_->OnProviderUpdate(results_updated); + } } bool ZeroSuggestProvider::UpdateResults(const std::string& json_data) { @@ -337,8 +380,7 @@ if (!data) return false; - // When running the REMOTE_NO_URL variant, we want to store suggestion - // responses if non-empty. + // Store non-empty response if running the REMOTE_NO_URL variant. if (result_type_running_ == REMOTE_NO_URL && !json_data.empty()) { client()->GetPrefs()->SetString(omnibox::kZeroSuggestCachedResults, json_data); @@ -390,12 +432,14 @@ } void ZeroSuggestProvider::OnRemoteSuggestionsLoaderAvailable( + bool is_prefetch, std::unique_ptr<network::SimpleURLLoader> loader) { // RemoteSuggestionsService has already started |loader|, so here it's // only necessary to grab its ownership until results come in to // OnURLLoadComplete(). loader_ = std::move(loader); - LogOmniboxZeroSuggestRequest(ZERO_SUGGEST_REQUEST_SENT); + is_prefetch_loader_ = is_prefetch; + LogOmniboxZeroSuggestRequest(ZERO_SUGGEST_REQUEST_SENT, is_prefetch); } void ZeroSuggestProvider::ConvertResultsToAutocompleteMatches() { @@ -523,7 +567,8 @@ return true; } -void ZeroSuggestProvider::MaybeUseCachedSuggestions() { +void ZeroSuggestProvider::MaybeUseStoredResponse() { + // Use the stored response only if running the REMOTE_NO_URL variant. if (result_type_running_ != REMOTE_NO_URL) { return; }
diff --git a/components/omnibox/browser/zero_suggest_provider.h b/components/omnibox/browser/zero_suggest_provider.h index 72c6045..82d6314 100644 --- a/components/omnibox/browser/zero_suggest_provider.h +++ b/components/omnibox/browser/zero_suggest_provider.h
@@ -68,6 +68,7 @@ // AutocompleteProvider: void Start(const AutocompleteInput& input, bool minimal_changes) override; + void StartPrefetch(const AutocompleteInput& input) override; void Stop(bool clear_cached_results, bool due_to_user_inactivity) override; void DeleteMatch(const AutocompleteMatch& match) override; @@ -113,6 +114,12 @@ ZeroSuggestProvider(const ZeroSuggestProvider&) = delete; ZeroSuggestProvider& operator=(const ZeroSuggestProvider&) = delete; + // Called by Start() or StartPrefetch() with the appropriate arguments. + // Contains the implementation to start a request for suggestions. + void Start(const AutocompleteInput& input, + bool minimal_changes, + bool is_prefetch); + // BaseSearchProvider: const TemplateURL* GetTemplateURL(bool is_keyword) const override; const AutocompleteInput GetInput(bool is_keyword) const override; @@ -121,7 +128,11 @@ void RecordDeletionResult(bool success) override; // Called when the network request for suggestions has completed. - void OnURLLoadComplete(const network::SimpleURLLoader* source, + // `is_prefetch` and `request_time` are bound to this callback and indicate if + // the request is a prefetch one and the time it was issued respectively. + void OnURLLoadComplete(bool is_prefetch, + base::TimeTicks request_time, + const network::SimpleURLLoader* source, std::unique_ptr<std::string> response_body); // The function updates |results_| with data parsed from |json_data|. @@ -151,11 +162,12 @@ // page. AutocompleteMatch MatchForCurrentText(); - // When the user is in the remote omnibox suggestions field trial, we ask - // the RemoteSuggestionsService for a loader to retrieve recommendations. - // When the loader has started, the remote suggestion service then calls - // back to this function with the |loader| to pass its ownership to |this|. + // Called when RemoteSuggestionsService starts `loader` for the provider to + // take over its ownership. `is_prefetch` is bound to this callback and + // indicates if the request is a prefetch one. The value of `is_prefetch` is + // stored in `is_prefetch_loader_` for the duration of the loader's lifetime. void OnRemoteSuggestionsLoaderAvailable( + bool is_prefetch, std::unique_ptr<network::SimpleURLLoader> loader); // Whether zero suggest suggestions are allowed in the given context. @@ -167,9 +179,8 @@ // functions, so the reader has to look in two places. bool AllowZeroSuggestSuggestions(const AutocompleteInput& input) const; - // Checks whether we have a set of zero suggest results cached, and if so - // populates |matches_| with cached results. - void MaybeUseCachedSuggestions(); + // Populates |matches_| using the stored zero suggest response, if any. + void MaybeUseStoredResponse(); // Returns the type of results that should be generated for the current // context. @@ -205,6 +216,10 @@ // Loader used to retrieve results. std::unique_ptr<network::SimpleURLLoader> loader_; + // Indicate whether `loader_` is retrieving prefetch results. Used for metrics + // when the provider is stopped. + bool is_prefetch_loader_; + // The verbatim match for the current text, which is always a URL. AutocompleteMatch current_text_match_;
diff --git a/components/omnibox/browser/zero_suggest_provider_unittest.cc b/components/omnibox/browser/zero_suggest_provider_unittest.cc index 160de5ec..0e13963 100644 --- a/components/omnibox/browser/zero_suggest_provider_unittest.cc +++ b/components/omnibox/browser/zero_suggest_provider_unittest.cc
@@ -12,6 +12,7 @@ #include "base/metrics/field_trial.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "build/build_config.h" @@ -36,6 +37,7 @@ #include "third_party/metrics_proto/omnibox_event.pb.h" namespace { + class FakeAutocompleteProviderClient : public MockAutocompleteProviderClient { public: FakeAutocompleteProviderClient() @@ -84,9 +86,14 @@ std::unique_ptr<TestingPrefServiceSimple> pref_service_; TestSchemeClassifier scheme_classifier_; }; + +bool MaybeUseStoredResponse() { + return OmniboxFieldTrial::kZeroSuggestCacheDurationSec.Get() <= 0; +} + } // namespace -class ZeroSuggestProviderTest : public testing::Test, +class ZeroSuggestProviderTest : public testing::TestWithParam<std::string>, public AutocompleteProviderListener { public: ZeroSuggestProviderTest() = default; @@ -108,6 +115,8 @@ TemplateURLRef::SearchTermsArgs search_terms_args; search_terms_args.page_classification = page_classification; search_terms_args.focus_type = OmniboxFocusType::ON_FOCUS; + search_terms_args.zero_suggest_cache_duration_sec = + OmniboxFieldTrial::kZeroSuggestCacheDurationSec.Get(); return RemoteSuggestionsService::EndpointUrl( search_terms_args, client_->GetTemplateURLService()); } @@ -129,6 +138,7 @@ variations::VariationsIdsProvider::Mode::kUseSignedInState}; std::unique_ptr<FakeAutocompleteProviderClient> client_; scoped_refptr<ZeroSuggestProvider> provider_; + bool provider_did_notify_; }; void ZeroSuggestProviderTest::SetUp() { @@ -143,12 +153,28 @@ turl_model->search_terms_data())); provider_ = ZeroSuggestProvider::Create(client_.get(), this); + provider_did_notify_ = false; + + // Ensure the cache is empty. + PrefService* prefs = client_->GetPrefs(); + prefs->SetString(omnibox::kZeroSuggestCachedResults, std::string()); + + scoped_feature_list_ = std::make_unique<base::test::ScopedFeatureList>(); + scoped_feature_list_->InitAndEnableFeatureWithParameters( + omnibox::kZeroSuggestPrefetching, + {{OmniboxFieldTrial::kZeroSuggestCacheDurationSec.name, GetParam()}}); } void ZeroSuggestProviderTest::OnProviderUpdate(bool updated_matches) { + provider_did_notify_ = true; } -TEST_F(ZeroSuggestProviderTest, AllowZeroSuggestSuggestions) { +INSTANTIATE_TEST_SUITE_P(All, + ZeroSuggestProviderTest, + ::testing::ValuesIn({std::string("0"), + std::string("60")})); + +TEST_P(ZeroSuggestProviderTest, AllowZeroSuggestSuggestions) { std::string input_url = "https://example.com/"; AutocompleteInput prefix_input(base::ASCIIToUTF16(input_url), @@ -230,7 +256,7 @@ } // TODO(tommycli): Break up this test into smaller ones. -TEST_F(ZeroSuggestProviderTest, TypeOfResultToRun) { +TEST_P(ZeroSuggestProviderTest, TypeOfResultToRun) { // Verifies the unconfigured state. Returns platorm-specific defaults. // TODO(tommycli): The remote_no_url_allowed idiom seems kind of confusing, // its true meaning seems closer to "expect_remote_no_url". Ideally we can @@ -289,8 +315,8 @@ #endif // Unless we allow remote suggestions for signed-out users. - scoped_feature_list_ = std::make_unique<base::test::ScopedFeatureList>(); - scoped_feature_list_->InitAndEnableFeature( + base::test::ScopedFeatureList features; + features.InitAndEnableFeature( omnibox::kOmniboxTrendingZeroPrefixSuggestionsOnNTP); ExpectPlatformSpecificDefaultZeroSuggestBehavior( other_input, @@ -312,7 +338,7 @@ /*remote_no_url_allowed=*/false); } -TEST_F(ZeroSuggestProviderTest, TypeOfResultToRunForContextualWeb) { +TEST_P(ZeroSuggestProviderTest, TypeOfResultToRunForContextualWeb) { std::string input_url = "https://example.com/"; GURL suggest_url = GetSuggestURL(metrics::OmniboxEventProto::OTHER); @@ -399,7 +425,7 @@ } } -TEST_F(ZeroSuggestProviderTest, TestDoesNotReturnMatchesForPrefix) { +TEST_P(ZeroSuggestProviderTest, TestDoesNotReturnMatchesForPrefix) { // Use NTP because REMOTE_NO_URL is enabled by default for NTP. AutocompleteInput prefix_input( u"foobar input", @@ -423,7 +449,7 @@ EXPECT_EQ(0, test_loader_factory()->NumPending()); } -TEST_F(ZeroSuggestProviderTest, TestStartWillStopForSomeInput) { +TEST_P(ZeroSuggestProviderTest, TestStartWillStopForSomeInput) { EXPECT_CALL(*client_, IsAuthenticated()) .WillRepeatedly(testing::Return(true)); @@ -445,20 +471,15 @@ EXPECT_TRUE(provider_->done_); } -TEST_F(ZeroSuggestProviderTest, TestPsuggestZeroSuggestCachingFirstRun) { +TEST_P(ZeroSuggestProviderTest, TestPsuggestZeroSuggestCachingFirstRun) { EXPECT_CALL(*client_, IsAuthenticated()) .WillRepeatedly(testing::Return(true)); - // Ensure the cache is empty. - PrefService* prefs = client_->GetPrefs(); - prefs->SetString(omnibox::kZeroSuggestCachedResults, std::string()); - AutocompleteInput input = CreateNTPOnFocusInputForRemoteNoUrl(); provider_->Start(input, false); ASSERT_EQ(ZeroSuggestProvider::REMOTE_NO_URL, provider_->GetResultTypeRunningForTesting()); - EXPECT_TRUE(prefs->GetString(omnibox::kZeroSuggestCachedResults).empty()); EXPECT_TRUE(provider_->matches().empty()); GURL suggest_url = GetSuggestURL( @@ -471,13 +492,22 @@ test_loader_factory()->AddResponse(suggest_url.spec(), json_response); base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(provider_->done()); + + // Expect the provider to have notified the provider listener. + EXPECT_TRUE(provider_did_notify_); EXPECT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match - EXPECT_EQ(json_response, - prefs->GetString(omnibox::kZeroSuggestCachedResults)); + if (MaybeUseStoredResponse()) { + PrefService* prefs = client_->GetPrefs(); + EXPECT_EQ(json_response, + prefs->GetString(omnibox::kZeroSuggestCachedResults)); + } } -TEST_F(ZeroSuggestProviderTest, TestPsuggestZeroSuggestHasCachedResults) { +TEST_P(ZeroSuggestProviderTest, TestPsuggestZeroSuggestHasCachedResults) { + base::HistogramTester histogram_tester; + EXPECT_CALL(*client_, IsAuthenticated()) .WillRepeatedly(testing::Return(true)); @@ -493,11 +523,13 @@ ASSERT_EQ(ZeroSuggestProvider::REMOTE_NO_URL, provider_->GetResultTypeRunningForTesting()); - // Expect that matches get populated synchronously out of the cache. - ASSERT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match - EXPECT_EQ(u"search1", provider_->matches()[0].contents); - EXPECT_EQ(u"search2", provider_->matches()[1].contents); - EXPECT_EQ(u"search3", provider_->matches()[2].contents); + if (MaybeUseStoredResponse()) { + // Expect that matches get populated synchronously out of the cache. + ASSERT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match + EXPECT_EQ(u"search1", provider_->matches()[0].contents); + EXPECT_EQ(u"search2", provider_->matches()[1].contents); + EXPECT_EQ(u"search3", provider_->matches()[2].contents); + } GURL suggest_url = GetSuggestURL( metrics::OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS); @@ -508,19 +540,44 @@ test_loader_factory()->AddResponse(suggest_url.spec(), json_response2); base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(provider_->done()); - // Expect the same results after the response has been handled. - ASSERT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match - EXPECT_EQ(u"search1", provider_->matches()[0].contents); - EXPECT_EQ(u"search2", provider_->matches()[1].contents); - EXPECT_EQ(u"search3", provider_->matches()[2].contents); + // Expect the provider to have notified the provider listener. + EXPECT_TRUE(provider_did_notify_); - // Expect the new results have been stored. - EXPECT_EQ(json_response2, - prefs->GetString(omnibox::kZeroSuggestCachedResults)); + // Expect correct histograms to have been logged. + histogram_tester.ExpectTotalCount("Omnibox.ZeroSuggestRequests.NonPrefetch", + 2); + histogram_tester.ExpectBucketCount("Omnibox.ZeroSuggestRequests.NonPrefetch", + 1 /*ZERO_SUGGEST_REQUEST_SENT*/, 1); + histogram_tester.ExpectBucketCount("Omnibox.ZeroSuggestRequests.NonPrefetch", + 3 /*ZERO_SUGGEST_RESPONSE_RECEIVED*/, 1); + histogram_tester.ExpectTotalCount( + "Omnibox.ZeroSuggestRequests.NonPrefetch.RoundTripTime", 1); + histogram_tester.ExpectTotalCount("Omnibox.ZeroSuggestRequests.Prefetch", 0); + histogram_tester.ExpectTotalCount( + "Omnibox.ZeroSuggestRequests.Prefetch.RoundTripTime", 0); + + if (MaybeUseStoredResponse()) { + // Expect the same results after the response has been handled. + ASSERT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match + EXPECT_EQ(u"search1", provider_->matches()[0].contents); + EXPECT_EQ(u"search2", provider_->matches()[1].contents); + EXPECT_EQ(u"search3", provider_->matches()[2].contents); + + // Expect the new results to have been stored. + EXPECT_EQ(json_response2, + prefs->GetString(omnibox::kZeroSuggestCachedResults)); + } else { + // Expect fresh results after the response has been handled. + ASSERT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match + EXPECT_EQ(u"search4", provider_->matches()[0].contents); + EXPECT_EQ(u"search5", provider_->matches()[1].contents); + EXPECT_EQ(u"search6", provider_->matches()[2].contents); + } } -TEST_F(ZeroSuggestProviderTest, TestPsuggestZeroSuggestReceivedEmptyResults) { +TEST_P(ZeroSuggestProviderTest, TestPsuggestZeroSuggestReceivedEmptyResults) { EXPECT_CALL(*client_, IsAuthenticated()) .WillRepeatedly(testing::Return(true)); @@ -536,11 +593,13 @@ ASSERT_EQ(ZeroSuggestProvider::REMOTE_NO_URL, provider_->GetResultTypeRunningForTesting()); - // Expect that matches get populated synchronously out of the cache. - ASSERT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match - EXPECT_EQ(u"search1", provider_->matches()[0].contents); - EXPECT_EQ(u"search2", provider_->matches()[1].contents); - EXPECT_EQ(u"search3", provider_->matches()[2].contents); + if (MaybeUseStoredResponse()) { + // Expect that matches get populated synchronously out of the cache. + ASSERT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match + EXPECT_EQ(u"search1", provider_->matches()[0].contents); + EXPECT_EQ(u"search2", provider_->matches()[1].contents); + EXPECT_EQ(u"search3", provider_->matches()[2].contents); + } GURL suggest_url = GetSuggestURL( metrics::OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS); @@ -549,11 +608,83 @@ test_loader_factory()->AddResponse(suggest_url.spec(), empty_response); base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(provider_->done()); + + // Expect the provider to have notified the provider listener. + EXPECT_TRUE(provider_did_notify_); // Expect that the matches have been cleared. ASSERT_TRUE(provider_->matches().empty()); - // Expect the new results have been stored. - EXPECT_EQ(empty_response, - prefs->GetString(omnibox::kZeroSuggestCachedResults)); + if (MaybeUseStoredResponse()) { + // Expect the new results to have been stored. + EXPECT_EQ(empty_response, + prefs->GetString(omnibox::kZeroSuggestCachedResults)); + } +} + +TEST_P(ZeroSuggestProviderTest, TestPsuggestZeroSuggestPrefetch) { + base::HistogramTester histogram_tester; + + EXPECT_CALL(*client_, IsAuthenticated()) + .WillRepeatedly(testing::Return(true)); + + // Set up the pref to cache the response from the previous run. + std::string json_response( + "[\"\",[\"search1\", \"search2\", \"search3\"]," + "[],[],{\"google:suggestrelevance\":[602, 601, 600]," + "\"google:verbatimrelevance\":1300}]"); + PrefService* prefs = client_->GetPrefs(); + prefs->SetString(omnibox::kZeroSuggestCachedResults, json_response); + + AutocompleteInput input = CreateNTPOnFocusInputForRemoteNoUrl(); + provider_->StartPrefetch(input); + ASSERT_EQ(ZeroSuggestProvider::REMOTE_NO_URL, + provider_->GetResultTypeRunningForTesting()); + + GURL suggest_url = GetSuggestURL( + metrics::OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS); + EXPECT_TRUE(test_loader_factory()->IsPending(suggest_url.spec())); + std::string json_response2( + "[\"\",[\"search4\", \"search5\", \"search6\"]," + "[],[],{\"google:suggestrelevance\":[602, 601, 600]," + "\"google:verbatimrelevance\":1300}]"); + test_loader_factory()->AddResponse(suggest_url.spec(), json_response2); + + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(provider_->done()); + + // Expect correct histograms to have been logged. + histogram_tester.ExpectTotalCount("Omnibox.ZeroSuggestRequests.Prefetch", 2); + histogram_tester.ExpectBucketCount("Omnibox.ZeroSuggestRequests.Prefetch", + 1 /*ZERO_SUGGEST_REQUEST_SENT*/, 1); + histogram_tester.ExpectBucketCount("Omnibox.ZeroSuggestRequests.Prefetch", + 3 /*ZERO_SUGGEST_RESPONSE_RECEIVED*/, 1); + histogram_tester.ExpectTotalCount( + "Omnibox.ZeroSuggestRequests.Prefetch.RoundTripTime", 1); + histogram_tester.ExpectTotalCount("Omnibox.ZeroSuggestRequests.NonPrefetch", + 0); + histogram_tester.ExpectTotalCount( + "Omnibox.ZeroSuggestRequests.NonPrefetch.RoundTripTime", 0); + + // Expect the provider not to have notified the provider listener. + EXPECT_FALSE(provider_did_notify_); + + if (MaybeUseStoredResponse()) { + // Expect the same results after the response has been handled. + ASSERT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match + EXPECT_EQ(u"search1", provider_->matches()[0].contents); + EXPECT_EQ(u"search2", provider_->matches()[1].contents); + EXPECT_EQ(u"search3", provider_->matches()[2].contents); + + // Expect the new results to have been stored. + EXPECT_EQ(json_response2, + prefs->GetString(omnibox::kZeroSuggestCachedResults)); + } else { + // Expect fresh results after the response has been handled. + ASSERT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match + EXPECT_EQ(u"search4", provider_->matches()[0].contents); + EXPECT_EQ(u"search5", provider_->matches()[1].contents); + EXPECT_EQ(u"search6", provider_->matches()[2].contents); + } }
diff --git a/components/page_load_metrics/browser/observers/back_forward_cache_page_load_metrics_observer.cc b/components/page_load_metrics/browser/observers/back_forward_cache_page_load_metrics_observer.cc index e349387..943ed7ab 100644 --- a/components/page_load_metrics/browser/observers/back_forward_cache_page_load_metrics_observer.cc +++ b/components/page_load_metrics/browser/observers/back_forward_cache_page_load_metrics_observer.cc
@@ -340,6 +340,16 @@ if (has_ever_entered_back_forward_cache_) { page_load_metrics::RecordPageVisitFinalStatusForTiming( timing, GetDelegate(), GetLastUkmSourceIdForBackForwardCacheRestore()); + bool is_user_initiated_navigation = + // All browser initiated page loads are user-initiated. + GetDelegate().GetUserInitiatedInfo().browser_initiated || + // Renderer-initiated navigations are user-initiated if there is an + // associated input event. + GetDelegate().GetUserInitiatedInfo().user_input_event; + ukm::builders::UserPerceivedPageVisit( + GetLastUkmSourceIdForBackForwardCacheRestore()) + .SetUserInitiated(is_user_initiated_navigation) + .Record(ukm::UkmRecorder::Get()); } }
diff --git a/components/page_load_metrics/browser/observers/back_forward_cache_page_load_metrics_observer_unittest.cc b/components/page_load_metrics/browser/observers/back_forward_cache_page_load_metrics_observer_unittest.cc index 3152f6a..e0d7b0f 100644 --- a/components/page_load_metrics/browser/observers/back_forward_cache_page_load_metrics_observer_unittest.cc +++ b/components/page_load_metrics/browser/observers/back_forward_cache_page_load_metrics_observer_unittest.cc
@@ -8,6 +8,7 @@ #include "base/test/simple_test_tick_clock.h" #include "components/page_load_metrics/browser/fake_page_load_metrics_observer_delegate.h" #include "components/page_load_metrics/browser/observers/page_load_metrics_observer_content_test_harness.h" +#include "components/page_load_metrics/browser/page_load_metrics_observer.h" #include "components/page_load_metrics/browser/page_load_tracker.h" #include "content/public/test/mock_navigation_handle.h" #include "services/metrics/public/cpp/metrics_utils.h" @@ -534,3 +535,62 @@ EXPECT_FALSE(result_metrics[1].begin()->second); } } + +TEST_F(BackForwardCachePageLoadMetricsObserverTest, TestLogsUserInitiated) { + auto& test_ukm_recorder = tester()->test_ukm_recorder(); + auto fake_bfcache_restore = + PageLoadMetricsObserverDelegate::BackForwardCacheRestore( + /*was_in_foreground=*/true, base::TimeTicks()); + fake_delegate_->AddBackForwardCacheRestore(fake_bfcache_restore); + + fake_delegate_->user_initiated_info_ = + page_load_metrics::UserInitiatedInfo::NotUserInitiated(); + observer_with_fake_delegate_->OnComplete(timing_); + + auto result_metrics = test_ukm_recorder.FilteredHumanReadableMetricForEntry( + UserPerceivedPageVisit::kEntryName, + UserPerceivedPageVisit::kUserInitiatedName); + EXPECT_EQ(1U, result_metrics.size()); + EXPECT_EQ(UserPerceivedPageVisit::kUserInitiatedName, + result_metrics[0].begin()->first); + EXPECT_FALSE(result_metrics[0].begin()->second); + + // Browser initiated; this is always considered user initiated. + fake_delegate_->user_initiated_info_ = + page_load_metrics::UserInitiatedInfo::BrowserInitiated(); + observer_with_fake_delegate_->OnComplete(timing_); + + result_metrics = test_ukm_recorder.FilteredHumanReadableMetricForEntry( + UserPerceivedPageVisit::kEntryName, + UserPerceivedPageVisit::kUserInitiatedName); + EXPECT_EQ(2U, result_metrics.size()); + EXPECT_EQ(UserPerceivedPageVisit::kUserInitiatedName, + result_metrics[1].begin()->first); + EXPECT_TRUE(result_metrics[1].begin()->second); + + // Renderer initiated, with user input, considered user initiated. + fake_delegate_->user_initiated_info_ = + page_load_metrics::UserInitiatedInfo::RenderInitiated(true, true); + observer_with_fake_delegate_->OnComplete(timing_); + + result_metrics = test_ukm_recorder.FilteredHumanReadableMetricForEntry( + UserPerceivedPageVisit::kEntryName, + UserPerceivedPageVisit::kUserInitiatedName); + EXPECT_EQ(3U, result_metrics.size()); + EXPECT_EQ(UserPerceivedPageVisit::kUserInitiatedName, + result_metrics[2].begin()->first); + EXPECT_TRUE(result_metrics[2].begin()->second); + + // Renderer initiated, without user input, not considered user initiated. + fake_delegate_->user_initiated_info_ = + page_load_metrics::UserInitiatedInfo::RenderInitiated(false, false); + observer_with_fake_delegate_->OnComplete(timing_); + + result_metrics = test_ukm_recorder.FilteredHumanReadableMetricForEntry( + UserPerceivedPageVisit::kEntryName, + UserPerceivedPageVisit::kUserInitiatedName); + EXPECT_EQ(4U, result_metrics.size()); + EXPECT_EQ(UserPerceivedPageVisit::kUserInitiatedName, + result_metrics[3].begin()->first); + EXPECT_FALSE(result_metrics[3].begin()->second); +}
diff --git a/components/policy/core/common/cloud/enterprise_metrics.h b/components/policy/core/common/cloud/enterprise_metrics.h index 7cbf5f20..80c4d13 100644 --- a/components/policy/core/common/cloud/enterprise_metrics.h +++ b/components/policy/core/common/cloud/enterprise_metrics.h
@@ -142,6 +142,9 @@ kMetricEnrollmentTooManyRequests = 62, // Enrollment failed: illegal account for packaged EDU license. kMetricEnrollmentIllegalAccountForPackagedEDULicense = 63, + // Enrollment failed: dev mode would be blocked but this is prevented by a + // command-line switch. + kMetricEnrollmentMayNotBlockDevMode = 64, // Max value for use with enumeration histogram UMA functions. kMaxValue = kMetricEnrollmentIllegalAccountForPackagedEDULicense };
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index a3a08712..b75bc772 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -4545,7 +4545,8 @@ <translation id="6438972408080276697">Se il criterio è impostato su True, vengono inviati rapporti degli eventi principali di installazione delle app Android attivati dal criterio. Se il criterio è impostato su False, non viene acquisito alcun evento.</translation> <translation id="6440051664870270040">Consenti ai siti di navigare e aprire popup contemporaneamente</translation> <translation id="6447948611083700881">Backup e ripristino disabilitati</translation> -<translation id="6449476513004303784">Non consentire più agli utenti di gestire i certificati</translation> +<translation id="6449476513004303784">Non consentire agli utenti di gestire i certificati +</translation> <translation id="6453641799812499182">Attiva le mitigazioni dei controlli <ph name="CORS" /> nella nuova implementazione <ph name="CORS" /></translation> <translation id="645425387487868471">Attiva l'accesso forzato per <ph name="PRODUCT_NAME" /></translation> <translation id="6455842857207956758">Consente di attivare la sincronizzazione delle password SAML tra più dispositivi Chrome monitorando il valore del token di sincronizzazione delle password e facendo svolgere all'utente la procedura di riautenticazione online se la password è stata aggiornata e deve essere sincronizzata.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 96f9e82..71ff8298 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -174,6 +174,7 @@ Para informações detalhadas sobre padrões de <ph name="URL_LABEL" /> válidos, consulte https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns (link em inglês). <ph name="WILDCARD_VALUE" /> não é um valor aceitável para esta política.</translation> <translation id="120937472976628837">Enviar informações sobre o ventilador</translation> +<translation id="1212233008927724662">Desativar o carregamento de Lazy Login WebUI.</translation> <translation id="1216919699175573511">Ativa a compatibilidade com Signed HTTP Exchange (SXG)</translation> <translation id="1219695476179627719">Especifica se o dispositivo deve ser revertido para a versão definida por <ph name="DEVICE_TARGET_VERSION_PREFIX_POLICY_NAME" /> se ele já estiver executando uma versão posterior. @@ -482,6 +483,23 @@ <translation id="159946228300522107">Se a política for definida como verdadeira, o Chrome maximizará a primeira janela exibida durante a primeira execução. Se ela for definida como falsa ou não for definida, o Chrome poderá maximizar a primeira janela, dependendo do tamanho da tela.</translation> +<translation id="1600107337865729434">Esta política permite por padrão o clustering do agente com origin-key. + + O cabeçalho HTTP Origin-Agent-Cluster: controla se um documento está + isolado em um cluster de agente com origin-key ou + com site-key. Como um cluster de agente com origin-key permite o isolamento de + documentos por origem, esse processo afeta a segurança. A consequência visível + para o desenvolvedor é a impossibilidade de definir o acessador + document.domain. + + O comportamento padrão, quando nenhum cabeçalho Origin-Agent-Cluster: tiver sido definido, + muda de site-key para origin-key na versão M101. Se esta política + for ativada ou for deixada sem definição, o navegador vai seguir o novo padrão dessa + versão em diante. Se a política for desativada, a mudança será revertida e os + documentos sem cabeçalhos Origin-Agent-Cluster: serão atribuídos a + clusters de agente com site-key. Consequentemente, o acessador document.domain + vai permanecer definível por padrão. Esse comportamento é correspondente ao legado. + </translation> <translation id="1600340610556453828">Se a política for definida como "Desativada", o <ph name="PRODUCT_OS_NAME" /> desativará o Wi-Fi, e não será possível mudar essa configuração. Se a política for definida como "Ativada" ou não for definida, será possível ativar ou desativar o Wi-Fi.</translation> @@ -631,6 +649,7 @@ Veja também: <ph name="REMOTE_ACCESS_HOST_CLIENT_DOMAIN_LIST_POLICY_NAME" />. Observação: esta configuração substituirá a <ph name="REMOTE_ACCESS_HOST_DOMAIN_POLICY_NAME" />, se ela estiver presente.</translation> +<translation id="1721304336924950970">Carregar Login WebUI apenas quando necessário.</translation> <translation id="172374442286684480">Permitir que todos os sites definam dados locais</translation> <translation id="1729169799290004131">Se a política for definida, a porcentagem de brilho da tela será especificada, desativando os recursos do brilho automático. O brilho inicial da tela será ajustado para o valor da política, mas os usuários poderão mudá-lo. @@ -714,6 +733,7 @@ Esta política é opcional. Se não for definida, a solicitação de pesquisa instantânea será enviada usando o método GET. Esta política só é seguida se a política "DefaultSearchProviderEnabled" estiver ativada.</translation> +<translation id="1850439894606905202">Por padrão, documentos são colocados em clusters de agente com site-key. O document.domain permanece definível.</translation> <translation id="1852294065645015766">Permitir reprodução automática de mídia</translation> <translation id="1859859319036806634">Aviso: o substituto da versão do TLS será removido de <ph name="PRODUCT_NAME" /> após a versão 52 (por volta de setembro de 2016), e esta política deixará de funcionar. @@ -1865,6 +1885,15 @@ <translation id="3152425128389603870">Disponibilizar e ativar por padrão a área de trabalho unificada</translation> <translation id="3159375329008977062">O usuário tem permissão para exportar/importar contêineres do Crostini por meio da IU</translation> <translation id="3164531087779621747">Modo PostScript de impressão</translation> +<translation id="3165468162820163252">Esta política controla se a parte WebUI da tela de login é carregada no início ou apenas antes de ela ser mostrada. A política se aplica à tela de login. + + Se ela for ativada, a parte WebUI será carregada apenas antes de ser mostrada. Isso acelera o processo de login. + + Se a política for desativada, a parte WebUI da tela de login sempre será carregada na inicialização (comportamento legado). + + Se a política for deixada sem definição, o comportamento será controlado pelo recurso kEnableLazyLoginWebUILoading. + + É necessário remover a política após o lançamento do kEnableLazyLoginWebUILoading.</translation> <translation id="3165808775394012744">Essas políticas estão incluídas aqui para facilitar a remoção delas.</translation> <translation id="3166210414652928099">Permite o uso de apps Android de fontes não confiáveis</translation> <translation id="316778957754360075">Esta configuração foi descontinuada a partir da versão 29 do <ph name="PRODUCT_NAME" />. O modo recomendado de configurar as coleções de extensões/aplicativos hospedados pela organização é incluir na hospedagem do site os pacotes CRX em ExtensionInstallSources e colocar links de download direto para os pacotes em uma página da Web. É possível criar um iniciador da página da Web usando a política ExtensionInstallForcelist.</translation> @@ -4006,6 +4035,7 @@ Se esta política for definida como falsa ou não for definida, os recursos da Web Components v0 ficarão desativados por padrão, a partir do M80. Esta política será removida após o Chrome 84.</translation> +<translation id="575647238840663288">Por padrão, os documentos podem ser colocados em clusters de agente com origin-key. Nesses casos, o document.domain não é definível.</translation> <translation id="5756680608782814094">Envia informações sobre os dados vitais do produto (VPD, na sigla em inglês) de um dispositivo. Se a política for definida como falsa ou se não for definida, as informações não serão enviadas. @@ -4781,6 +4811,7 @@ Especifique um hash <ph name="SUBJECT_PUBLIC_KEY_INFO" /> vinculando o nome do algoritmo dele, uma barra e a codificação Base64 desse algoritmo de hash aplicado ao <ph name="SUBJECT_PUBLIC_KEY_INFO" /> codificado por DER do certificado especificado. O formato de codificação Base64 corresponde ao de uma impressão digital SPKI. O único algoritmo de hash reconhecido é sha256, enquanto os outros são ignorados. Deixar esta política sem definição significa que se os certificados que precisam ser divulgados via Transparência dos certificados não o forem, o <ph name="PRODUCT_NAME" /> não confiará nesses certificados.</translation> +<translation id="6704445641918520643">Ativar o carregamento de Lazy Login WebUI.</translation> <translation id="6704515759227307131">Esta política está obsoleta e foi substituída pela AdvancedProtectionAllowed. Ela controla se os usuários inscritos no Programa Proteção Avançada têm permissão para enviar os downloads para o Google para verificação de malware. Se esta política for definida como verdadeira ou não for configurada, um aviso aparecerá para os usuários pedindo que enviem os arquivos ao Google para verificação detalhada. Se o usuário selecionar "Verificar", o download será enviado para o Google. Se esta política for definida como falsa, o aviso não aparecerá e os downloads não serão enviados para o Google.</translation> @@ -6503,6 +6534,11 @@ No <ph name="MS_WIN_NAME" />, essa funcionalidade está disponível apenas em instâncias associadas a um domínio do <ph name="MS_AD_NAME" />, executadas no Windows 10 Pro ou registradas no <ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" />. No <ph name="MAC_OS_NAME" />, essa funcionalidade está disponível apenas em instâncias gerenciadas por MDM ou associadas a um domínio via MCX.</translation> <translation id="8671119576957984818">Ativar hub de compartilhamento da área de trabalho</translation> +<translation id="8671314659400112135">Se a política for ativada ou for deixada sem definição, o <ph name="PRODUCT_NAME" /> vai poder aplicar a mitigação de segurança de pontos de extensão para bloquear pontos de extensão legados no processo do navegador. + + Se a política for desativada, a segurança e a estabilidade do <ph name="PRODUCT_NAME" /> serão prejudicadas, já que códigos desconhecidos e possivelmente hostis poderão ser carregados nos processos do navegador <ph name="PRODUCT_NAME" />. Desative a política apenas se softwares de terceiros que precisam ser executados nos processos do navegador <ph name="PRODUCT_NAME" /> apresentarem problemas de compatibilidade. + + Observação: leia mais sobre políticas de mitigação de processos em https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies (link em inglês).</translation> <translation id="8672321184841719703">Versão de atualização automática de destino</translation> <translation id="867410340948518937">Segundo fator universal (U2F, na sigla em inglês)</translation> <translation id="8676959842615154675">Se a política for definida como "Ativada", o host de acesso remoto fará a comparação entre o nome do usuário local associado com o host e o nome da Conta do Google registrada como proprietária do host ("joaosilva", se o host for propriedade de "joaosilva@exemplo.com"). Este host não será iniciado se o nome do proprietário do host for diferente do nome do usuário local associado com o host. Use a política <ph name="REMOTE_ACCESS_HOST_DOMAIN_POLICY_NAME" /> para garantir que a Conta do Google do proprietário seja associada com um domínio específico. @@ -6770,6 +6806,7 @@ <translation id="8948062138228904066">Lista de permissões do servidor de autenticação</translation> <translation id="8951350807133946005">Definir o diretório de cache de disco</translation> <translation id="8955719471735800169">Voltar ao início</translation> +<translation id="8956312248048980644">Permite o clustering do agente com origin-key por padrão.</translation> <translation id="8959992920425111821">Configuração padrão</translation> <translation id="8967125680876068695">Os apps do Chrome foram descontinuados no Windows, Mac e Linux. Se esta política for ativada, o <ph name="PRODUCT_NAME" /> continuará permitindo a execução de apps do Chrome nessas plataformas até que o suporte a eles seja removido de todas as plataformas na data final, em junho de 2022.
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index e6561f9d..f2cdbc3 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -288,6 +288,7 @@ Nếu chính sách này được đặt thành false, <ph name="PRODUCT_NAME" /> sẽ không cho phép bắt đầu hồ sơ khách.</translation> <translation id="1361661842732478894">Hiện nút Màn hình chính trên thanh công cụ</translation> <translation id="1363275621236827384">Bật truy vấn cấu hình Máy chủ Quirks cho phần cứng</translation> +<translation id="1371626834351873151">Tính năng Giảm thiểu tác nhân người dùng sẽ được bật cho mọi bản dùng thử theo nguyên gốc.</translation> <translation id="1372618949173323717">Tắt JavaScript</translation> <translation id="1376119291123231789">Bật chế độ sạc pin nâng cao</translation> <translation id="1384459581748403878">Tham khảo: <ph name="REFERENCE_URL" /></translation> @@ -802,6 +803,7 @@ Nếu bạn không đặt hoặc đặt chính sách này thành Tắt, thì người dùng không thể sử dụng tính năng Chuyển đổi nhanh.</translation> <translation id="1972134432340252414">Chặn các điểm tiện ích cũ trong Quá trình chạy trình duyệt</translation> <translation id="1977581177449752640">Nếu bạn đặt chính sách này, máy chủ truy cập từ xa sẽ dùng một chứng chỉ máy khách có tên thường gọi (CN) của nhà phát hành cụ thể để xác thực theo <ph name="REMOTE_ACCESS_HOST_TOKEN_VALIDATION_URL_POLICY_NAME" />. Để dùng chứng chỉ máy khách có sẵn, hãy đặt chính sách này thành <ph name="WILDCARD_VALUE" />. Tính năng này sẽ bị tắt nếu bạn để trống hoặc không đặt chính sách này.</translation> +<translation id="1985598967415986700">Có thể kiểm soát được Tính năng Giảm thiểu tác nhân người dùng qua Field-Trials và Origin-Trials.</translation> <translation id="1988345404999458987">Cung cấp cấu hình của các máy chủ máy in hiện có. Chính sách này cho phép bạn cung cấp cấu hình của các máy chủ máy in bên ngoài cho thiết bị <ph name="PRODUCT_OS_NAME" /> dưới dạng tệp JSON. @@ -2025,6 +2027,7 @@ Lưu ý: Đối với các thiết bị được quản lý <ph name="MS_AD_NAME" />, chính sách này hỗ trợ việc mở rộng <ph name="MACHINE_NAME_VARIABLE" /> sang tên máy <ph name="MS_AD_NAME" /> hoặc một chuỗi con của biến đó. Ví dụ: nếu tên máy là <ph name="MACHINE_NAME_EXAMPLE" />, <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> sẽ được thay bằng 4 ký tự bắt đầu sau vị trí thứ 6, nói cách khác là sẽ được thay bằng <ph name="MACHINE_NAME_PART_EXAMPLE" />. Vị trí này dựa trên mốc 0. Chính sách này không còn dùng nữa, vui lòng sử dụng <ph name="PRINTERS_POLICY_NAME" />.</translation> +<translation id="3300784749135986828">Bật hoặc tắt <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" />.</translation> <translation id="3302829897293005699">Nếu bạn không đặt hoặc đặt chính sách này thành Bật, thì thiết bị đã đăng ký sẽ báo cáo thông tin về phiên kiosk đang hoạt động như mã và phiên bản ứng dụng. Nếu bạn đặt chính sách này thành Tắt, thiết bị đã đăng ký sẽ không báo cáo thông tin về phiên kiosk.</translation> @@ -2985,6 +2988,7 @@ Lưu ý: Xem danh sách các biến mà bạn có thể sử dụng (https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables).</translation> <translation id="4531706050939927436">Các ứng dụng Android có thể bị buộc cài đặt từ Bảng điều khiển dành cho quản trị viên của Google bằng Google Play. Các ứng dụng đó không sử dụng chính sách này.</translation> <translation id="4534500438517478692">Tên giới hạn Android:</translation> +<translation id="4537906430022369840">Đã tắt tính năng giảm thiểu Tác nhân người dùng và không dùng Field-Trials hoặc Origin-Trials để bật tính năng này.</translation> <translation id="4541530620466526913">Tài khoản trong thiết bị</translation> <translation id="4543502256674577024">Cài đặt cập nhật thiết bị</translation> <translation id="454585952814397564">Dùng mức ưu tiên bình thường cho tiến trình âm thanh</translation> @@ -5523,6 +5527,12 @@ <translation id="7509761893401042250">Chính sách này không còn dùng nữa kể từ M96. Thay vào đó, vui lòng dùng <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" /> và <ph name="REPORT_DEVICE_AUDIO_STATUS" />. Nếu bạn bật hoặc không đặt chính sách này, thì các thiết bị đã đăng ký sẽ báo cáo số liệu thống kê phần cứng, chẳng hạn như mức sử dụng CPU/RAM. Nếu bạn tắt chính sách này thì thiết bị đã đăng ký sẽ không báo cáo số liệu thống kê phần cứng.</translation> +<translation id="7512065400265675158">Tiêu đề của yêu cầu HTTP <ph name="USER_AGENT_HEADER_NAME" /> được lên lịch để giảm bớt. Để tạo điều kiện cho hoạt động thử nghiệm và khả năng tương thích, chính sách này có thể bật tính năng giảm thiểu cho mọi trang web hoặc tắt tính năng bản dùng thử theo nguyên gốc hoặc bản thử nghiệm để bật tính năng này. + + Để tìm hiểu thêm về <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> và tiến trình của tác nhân này, hãy đọc tại đây: + + https://blog.chromium.org/2021/09/user-agent-reduction-origin-trial-and-dates.html + </translation> <translation id="7519218194072744342">URL của trình xử lý giao thức.</translation> <translation id="7519251620064708155">Cho phép tạo khóa trên các trang web này</translation> <translation id="7529144158022474049">Yếu tố phân tán tự động cập nhật</translation>
diff --git a/components/reporting/proto/synced/metric_data.proto b/components/reporting/proto/synced/metric_data.proto index 4c2b517d..4a1cf7e 100644 --- a/components/reporting/proto/synced/metric_data.proto +++ b/components/reporting/proto/synced/metric_data.proto
@@ -112,13 +112,13 @@ // Receiving bit rate measured in Mbps. optional uint32 rx_bit_rate_mbps = 4; // Transmission power measured in dBm. - optional int32 tx_power_dBm = 5; + optional int32 tx_power_dbm = 5; // Is wifi encryption key on or not. - optional bool encyption_on = 6; + optional bool encryption_on = 6; // Wifi link quality. optional uint32 link_quality = 7; // Wifi signal level in dBm. - optional int32 signal_level_dBm = 8; + optional int32 signal_level_dbm = 8; } // Configured networks telemetry data.
diff --git a/components/safe_browsing/core/browser/tailored_security_service/BUILD.gn b/components/safe_browsing/core/browser/tailored_security_service/BUILD.gn index 4225767..0aee03de 100644 --- a/components/safe_browsing/core/browser/tailored_security_service/BUILD.gn +++ b/components/safe_browsing/core/browser/tailored_security_service/BUILD.gn
@@ -13,7 +13,10 @@ "//base", "//base:i18n", "//components/keyed_service/core", + "//components/prefs:prefs", "//components/query_parser", + "//components/safe_browsing/core/common:common", + "//components/safe_browsing/core/common:safe_browsing_prefs", "//components/signin/public/identity_manager", "//components/url_formatter", "//components/variations", @@ -32,6 +35,9 @@ ":tailored_security_service", "//base", "//base/test:test_support", + "//components/prefs:test_support", + "//components/safe_browsing/core/common:common", + "//components/safe_browsing/core/common:safe_browsing_prefs", "//components/sync:test_support", "//net:test_support", "//services/network:test_support",
diff --git a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.cc b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.cc index 258148c2..7ce8b7e 100644 --- a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.cc +++ b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.cc
@@ -16,7 +16,10 @@ #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" #include "base/values.h" +#include "components/prefs/pref_service.h" #include "components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_observer.h" +#include "components/safe_browsing/core/common/features.h" +#include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "components/signin/public/identity_manager/access_token_info.h" #include "components/signin/public/identity_manager/identity_manager.h" #include "components/signin/public/identity_manager/primary_account_access_token_fetcher.h" @@ -229,9 +232,18 @@ TailoredSecurityService::TailoredSecurityService( signin::IdentityManager* identity_manager, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) - : identity_manager_(identity_manager), - url_loader_factory_(std::move(url_loader_factory)) {} + PrefService* prefs) + : identity_manager_(identity_manager), prefs_(prefs) { + // `prefs` can be nullptr in unit tests. + if (prefs_) { + pref_registrar_.Init(prefs_); + pref_registrar_.Add( + prefs::kAccountTailoredSecurityUpdateTimestamp, + base::BindRepeating( + &TailoredSecurityService::TailoredSecurityTimestampUpdateCallback, + weak_ptr_factory_.GetWeakPtr())); + } +} TailoredSecurityService::~TailoredSecurityService() { for (auto& observer : observer_list_) { @@ -254,7 +266,7 @@ const GURL& url, CompletionCallback callback, const net::NetworkTrafficAnnotationTag& traffic_annotation) { - return std::make_unique<RequestImpl>(identity_manager_, url_loader_factory_, + return std::make_unique<RequestImpl>(identity_manager_, GetURLLoaderFactory(), url, std::move(callback), traffic_annotation); } @@ -288,6 +300,21 @@ } void TailoredSecurityService::QueryTailoredSecurityBit() { + StartRequest( + base::BindOnce(&TailoredSecurityService::OnTailoredSecurityBitRetrieved, + weak_ptr_factory_.GetWeakPtr())); +} + +void TailoredSecurityService::StartRequest( + QueryTailoredSecurityBitCallback callback) { + DCHECK(!is_shut_down_); + + // Wrap the original callback into a generic completion callback. + CompletionCallback completion_callback = base::BindOnce( + &TailoredSecurityService::QueryTailoredSecurityBitCompletionCallback, + weak_ptr_factory_.GetWeakPtr(), std::move(callback)); + GURL url(kQueryTailoredSecurityServiceUrl); + static constexpr net::NetworkTrafficAnnotationTag traffic_annotation = net::DefineNetworkTrafficAnnotation("tailored_security_service", R"( @@ -316,22 +343,6 @@ } })"); - StartRequest( - base::BindOnce(&TailoredSecurityService::OnTailoredSecurityBitRetrieved, - weak_ptr_factory_.GetWeakPtr()), - traffic_annotation); -} - -void TailoredSecurityService::StartRequest( - QueryTailoredSecurityBitCallback callback, - const net::NetworkTrafficAnnotationTag& traffic_annotation) { - DCHECK(!is_shut_down_); - - // Wrap the original callback into a generic completion callback. - CompletionCallback completion_callback = base::BindOnce( - &TailoredSecurityService::QueryTailoredSecurityBitCompletionCallback, - weak_ptr_factory_.GetWeakPtr(), std::move(callback)); - GURL url(kQueryTailoredSecurityServiceUrl); std::unique_ptr<Request> request = CreateRequest(url, std::move(completion_callback), traffic_annotation); Request* request_ptr = request.get(); @@ -423,4 +434,9 @@ is_shut_down_ = true; } +void TailoredSecurityService::TailoredSecurityTimestampUpdateCallback() { + StartRequest(base::BindOnce(&TailoredSecurityService::MaybeNotifySyncUser, + weak_ptr_factory_.GetWeakPtr())); +} + } // namespace safe_browsing
diff --git a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h index 9b0cbb41..7f5b17b7 100644 --- a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h +++ b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h
@@ -19,6 +19,7 @@ #include "base/observer_list.h" #include "base/timer/timer.h" #include "components/keyed_service/core/keyed_service.h" +#include "components/prefs/pref_change_registrar.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "url/gurl.h" @@ -79,9 +80,8 @@ using CompletionCallback = base::OnceCallback<void(Request*, bool success)>; - TailoredSecurityService( - signin::IdentityManager* identity_manager, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory); + TailoredSecurityService(signin::IdentityManager* identity_manager, + PrefService* prefs); ~TailoredSecurityService() override; void AddObserver(TailoredSecurityServiceObserver* observer); @@ -98,8 +98,7 @@ void QueryTailoredSecurityBit(); // Starts the request to send to the backend to retrieve the bit. - void StartRequest(QueryTailoredSecurityBitCallback callback, - const net::NetworkTrafficAnnotationTag& traffic_annotation); + void StartRequest(QueryTailoredSecurityBitCallback callback); // Sets the state of tailored security bit to |is_enabled| for testing. void SetTailoredSecurityBitForTesting( @@ -138,14 +137,29 @@ void OnTailoredSecurityBitRetrieved(bool is_enabled, base::Time previous_update); + // After `kAccountTailoredSecurityUpdateTimestamp` is updated, we check the + // true value of the account tailored security preference and run this + // callback. + virtual void MaybeNotifySyncUser(bool is_enabled, + base::Time previous_update) = 0; + + PrefService* prefs() { return prefs_; } + + raw_ptr<signin::IdentityManager> identity_manager() { + return identity_manager_; + } + + virtual scoped_refptr<network::SharedURLLoaderFactory> + GetURLLoaderFactory() = 0; + private: + // Callback when the `kAccountTailoredSecurityUpdateTimestamp` is updated + void TailoredSecurityTimestampUpdateCallback(); + // Stores pointer to IdentityManager instance. It must outlive the // TailoredSecurityService and can be null during tests. raw_ptr<signin::IdentityManager> identity_manager_; - // Request context getter to use. - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; - // Pending TailoredSecurity queries to be canceled if not complete by // profile shutdown. std::map<Request*, std::unique_ptr<Request>> @@ -167,6 +181,16 @@ bool is_shut_down_ = false; + // The preferences for the given profile. + PrefService* prefs_; + + // This is used to observe when sync users update their Tailored Security + // setting. + PrefChangeRegistrar pref_registrar_; + + // Callback run when we should notify a sync user about a state change. + base::RepeatingCallback<void(bool)> notify_sync_user_callback_; + base::WeakPtrFactory<TailoredSecurityService> weak_ptr_factory_{this}; };
diff --git a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_unittest.cc b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_unittest.cc index c74f460..8b30236 100644 --- a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_unittest.cc +++ b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_unittest.cc
@@ -11,9 +11,14 @@ #include "base/memory/raw_ptr.h" #include "base/run_loop.h" #include "base/task/single_thread_task_runner.h" +#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/threading/thread_task_runner_handle.h" #include "base/values.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/testing_pref_service.h" +#include "components/safe_browsing/core/common/features.h" +#include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "net/http/http_status_code.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" #include "services/network/public/cpp/shared_url_loader_factory.h" @@ -36,12 +41,14 @@ class TestingTailoredSecurityService : public TailoredSecurityService { public: explicit TestingTailoredSecurityService( - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, + PrefService* prefs) // NOTE: Simply pass null object for IdentityManager. // TailoredSecurityService's only usage of this object is to fetch access // tokens via RequestImpl, and TestingTailoredSecurityService deliberately // replaces this flow with TestRequest. - : TailoredSecurityService(nullptr, url_loader_factory) {} + : TailoredSecurityService(nullptr, prefs), + url_loader_factory_(url_loader_factory) {} ~TestingTailoredSecurityService() override = default; std::unique_ptr<TailoredSecurityService::Request> CreateRequest( @@ -84,11 +91,39 @@ void Shutdown() override; + void SetNotifySyncUserCallback(base::OnceClosure callback) { + notify_sync_user_callback_ = std::move(callback); + } + bool notify_sync_user_called() const { return notify_sync_user_called_; } + bool notify_sync_user_called_enabled() const { + return notify_sync_user_called_enabled_; + } + + protected: + void MaybeNotifySyncUser(bool is_enabled, + base::Time previous_update) override; + + scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() + override { + return url_loader_factory_; + } + private: GURL expected_url_; bool expected_tailored_security_service_value_; std::string current_expected_post_data_; std::map<Request*, std::string> expected_post_data_; + + // Whether `MaybeNotifySyncUser` was called. + bool notify_sync_user_called_; + + // The value of `is_enabled` when `MaybeNotifySyncUser` was called. + bool notify_sync_user_called_enabled_; + + // Called whenever `MaybeNotifySyncUser` is called. + base::OnceClosure notify_sync_user_callback_; + + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; }; // A testing request class that allows expected values to be filled in. @@ -212,6 +247,15 @@ expected_post_data_.clear(); } +void TestingTailoredSecurityService::MaybeNotifySyncUser( + bool is_enabled, + base::Time previous_update) { + notify_sync_user_called_ = true; + notify_sync_user_called_enabled_ = is_enabled; + if (notify_sync_user_callback_) + std::move(notify_sync_user_callback_).Run(); +} + } // namespace // A test class used for testing the TailoredSecurityService class. @@ -224,11 +268,24 @@ TailoredSecurityServiceTest() : test_shared_loader_factory_( base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( - &test_url_loader_factory_)), - tailored_security_service_(test_shared_loader_factory_) {} + &test_url_loader_factory_)) {} ~TailoredSecurityServiceTest() override = default; + void SetUp() override { + scoped_feature_list_.InitAndEnableFeature(kTailoredSecurityIntegration); + prefs_.registry()->RegisterTimePref( + prefs::kAccountTailoredSecurityUpdateTimestamp, base::Time()); + prefs_.registry()->RegisterBooleanPref(prefs::kSafeBrowsingEnhanced, false); + prefs_.registry()->RegisterBooleanPref(prefs::kSafeBrowsingEnabled, true); + prefs_.registry()->RegisterBooleanPref( + prefs::kEnhancedProtectionEnabledViaTailoredSecurity, false); + + tailored_security_service_ = + std::make_unique<TestingTailoredSecurityService>( + test_shared_loader_factory_, &prefs_); + } + void TearDown() override { base::RunLoop run_loop; base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, @@ -237,27 +294,30 @@ } TestingTailoredSecurityService* tailored_security_service() { - return &tailored_security_service_; + return tailored_security_service_.get(); } - void Shutdown() { tailored_security_service_.Shutdown(); } + void Shutdown() { tailored_security_service_->Shutdown(); } + + PrefService* prefs() { return &prefs_; } private: base::test::SingleThreadTaskEnvironment task_environment_; network::TestURLLoaderFactory test_url_loader_factory_; scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_; - TestingTailoredSecurityService tailored_security_service_; + TestingPrefServiceSimple prefs_; + std::unique_ptr<TestingTailoredSecurityService> tailored_security_service_; + std::vector<bool> notify_sync_calls_; + base::test::ScopedFeatureList scoped_feature_list_; }; TEST_F(TailoredSecurityServiceTest, GetTailoredSecurityServiceEnabled) { tailored_security_service()->SetExpectedURL( GURL(kQueryTailoredSecurityServiceUrl)); tailored_security_service()->SetExpectedTailoredSecurityServiceValue(true); - tailored_security_service()->StartRequest( - base::BindOnce( - &TestingTailoredSecurityService::GetTailoredSecurityServiceCallback, - base::Unretained(tailored_security_service())), - TRAFFIC_ANNOTATION_FOR_TESTS); + tailored_security_service()->StartRequest(base::BindOnce( + &TestingTailoredSecurityService::GetTailoredSecurityServiceCallback, + base::Unretained(tailored_security_service()))); base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce( @@ -321,8 +381,7 @@ tailored_security_service()->SetExpectedPostData(""); tailored_security_service()->StartRequest( base::BindOnce(&TestingTailoredSecurityService::MultipleRequestsCallback, - base::Unretained(tailored_security_service())), - TRAFFIC_ANNOTATION_FOR_TESTS); + base::Unretained(tailored_security_service()))); // Check that both requests are no longer pending. base::ThreadTaskRunnerHandle::Get()->PostTask( @@ -412,10 +471,42 @@ GURL(kQueryTailoredSecurityServiceUrl)); tailored_security_service()->StartRequest( base::BindOnce(&TestingTailoredSecurityService::MultipleRequestsCallback, - base::Unretained(tailored_security_service())), - TRAFFIC_ANNOTATION_FOR_TESTS); + base::Unretained(tailored_security_service()))); Shutdown(); } +TEST_F(TailoredSecurityServiceTest, NotifiesSyncForEnabled) { + tailored_security_service()->SetExpectedURL( + GURL(kQueryTailoredSecurityServiceUrl)); + tailored_security_service()->SetExpectedTailoredSecurityServiceValue(true); + + base::RunLoop run_loop; + tailored_security_service()->SetNotifySyncUserCallback( + run_loop.QuitClosure()); + SetSafeBrowsingState(prefs(), SafeBrowsingState::STANDARD_PROTECTION); + prefs()->SetTime(prefs::kAccountTailoredSecurityUpdateTimestamp, + base::Time::Now()); + run_loop.Run(); + EXPECT_TRUE(tailored_security_service()->notify_sync_user_called()); + EXPECT_TRUE(tailored_security_service()->notify_sync_user_called_enabled()); +} + +TEST_F(TailoredSecurityServiceTest, NotifiesSyncForDisabled) { + tailored_security_service()->SetExpectedURL( + GURL(kQueryTailoredSecurityServiceUrl)); + tailored_security_service()->SetExpectedTailoredSecurityServiceValue(false); + + base::RunLoop run_loop; + tailored_security_service()->SetNotifySyncUserCallback( + run_loop.QuitClosure()); + SetSafeBrowsingState(prefs(), SafeBrowsingState::ENHANCED_PROTECTION, + /*is_esb_enabled_in_sync=*/true); + prefs()->SetTime(prefs::kAccountTailoredSecurityUpdateTimestamp, + base::Time::Now()); + run_loop.Run(); + EXPECT_TRUE(tailored_security_service()->notify_sync_user_called()); + EXPECT_FALSE(tailored_security_service()->notify_sync_user_called_enabled()); +} + } // namespace safe_browsing
diff --git a/components/safe_browsing/core/common/safe_browsing_prefs.cc b/components/safe_browsing/core/common/safe_browsing_prefs.cc index f560f0b4..63da327d 100644 --- a/components/safe_browsing/core/common/safe_browsing_prefs.cc +++ b/components/safe_browsing/core/common/safe_browsing_prefs.cc
@@ -221,8 +221,9 @@ prefs::kSafeBrowsingEnterpriseRealTimeUrlCheckScope, 0); registry->RegisterInt64Pref(prefs::kSafeBrowsingMetricsLastLogTime, 0); registry->RegisterDictionaryPref(prefs::kSafeBrowsingEventTimestamps); - registry->RegisterTimePref(prefs::kAccountTailoredSecurityUpdateTimestamp, - base::Time()); + registry->RegisterTimePref( + prefs::kAccountTailoredSecurityUpdateTimestamp, base::Time(), + user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF); registry->RegisterBooleanPref( prefs::kEnhancedProtectionEnabledViaTailoredSecurity, false); }
diff --git a/components/search_engines/search_terms_data.cc b/components/search_engines/search_terms_data.cc index 52eca74..cd86498 100644 --- a/components/search_engines/search_terms_data.cc +++ b/components/search_engines/search_terms_data.cc
@@ -5,6 +5,7 @@ #include "components/search_engines/search_terms_data.h" #include "base/check.h" +#include "build/build_config.h" #include "components/google/core/common/google_util.h" #include "components/lens/lens_features.h" #include "url/gurl.h" @@ -20,6 +21,7 @@ std::string SearchTermsData::GoogleBaseSearchByImageURLValue() const { const std::string kGoogleHomepageURLPath = std::string("searchbyimage/"); +#if !defined(OS_IOS) && !defined(OS_ANDROID) // If both LensStandalone and LensRegionSearch features are enabled, // LensStandalone parameters will take precedence even if the values differ. if (base::FeatureList::IsEnabled(lens::features::kLensStandalone)) { @@ -27,6 +29,8 @@ } else if (base::FeatureList::IsEnabled(lens::features::kLensRegionSearch)) { return lens::features::GetHomepageURLForRegionSearch(); } +#endif // !defined(OS_IOS) && !defined(OS_ANDROID) + return google_util::kGoogleHomepageURL + kGoogleHomepageURLPath; }
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index f77ee0e..3049f47 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -971,7 +971,7 @@ <translation id="4110652170750985508">مراجعة الدفعة</translation> <translation id="4112140312785995938">الانتقال إلى الخلف</translation> <translation id="4114146879518089587">المتابعة إلى الموقع الإلكتروني</translation> -<translation id="4116663294526079822">إلغاء الحظر دومًا على هذا الموقع</translation> +<translation id="4116663294526079822">إلغاء الحظر دومًا على هذا الموقع الإلكتروني</translation> <translation id="4116701314593212016">JIS B7</translation> <translation id="4117700440116928470">نطاق السياسة غير متوافق.</translation> <translation id="4121428309786185360">تاريخ انتهاء الصلاحية</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 3f3e5b6..9e1b915bb 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -2292,6 +2292,7 @@ <translation id="8390725133630534698"><ph name="ORIGIN_NAME" /> থেকে <ph name="VM_NAME" />-এ শেয়ার করা অ্যাডমিনিস্ট্রেটর পলিসির মাধ্যমে ব্লক করা হয়েছে</translation> <translation id="8398790343843005537">আপনার ফোন খুঁজুন</translation> <translation id="8405579342203358118">Chrome সেটিংসে আপনি কী ধরনের তথ্য সিঙ্ক করবেন, তা ম্যানেজ করুন</translation> +<translation id="8405633352367164037">হার্ট</translation> <translation id="8409413588194360210">পেমেন্ট হ্যান্ডলার</translation> <translation id="8412145213513410671">ক্র্যাশ (<ph name="CRASH_COUNT" />টি)</translation> <translation id="8412392972487953978">আপনাকে একই পাসফ্রেজ অবশ্যই দু'বার প্রবেশ করাতে হবে৷</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index 3faa575..5f30f49 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -2278,6 +2278,7 @@ <translation id="8390725133630534698">Administratzailearen gidalerroek blokeatu egin dute <ph name="ORIGIN_NAME" /> domeinuko edukia <ph name="VM_NAME" /> makinara partekatzeko aukera</translation> <translation id="8398790343843005537">Bilatu telefonoa</translation> <translation id="8405579342203358118">Kudeatu sinkronizatzen den informazioa Chrome-ren ezarpenetan</translation> +<translation id="8405633352367164037">Bihotza</translation> <translation id="8409413588194360210">ordainketa-kudeatzaileak</translation> <translation id="8412145213513410671">Hutsegiteak (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Pasaesaldi berbera bi aldiz idatzi behar duzu.</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index 53addfd..f8f88ba 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -2293,6 +2293,7 @@ <translation id="8390725133630534698">Le règlement de l'administrateur bloque le partage de <ph name="ORIGIN_NAME" /> vers <ph name="VM_NAME" /></translation> <translation id="8398790343843005537">Rechercher votre téléphone</translation> <translation id="8405579342203358118">Gérez les infos que vous synchronisez dans les paramètres Chrome</translation> +<translation id="8405633352367164037">Cœur</translation> <translation id="8409413588194360210">gestionnaires de paiement</translation> <translation id="8412145213513410671">Erreurs (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Vous devez saisir deux fois la même phrase secrète.</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 702e0a5..6dfbf69 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -2291,6 +2291,7 @@ <translation id="8390725133630534698">વ્યવસ્થાપકની નીતિને કારણે <ph name="ORIGIN_NAME" />થી <ph name="VM_NAME" />માં પેસ્ટ કરવાની સુવિધા બ્લૉક કરવામાં આવી છે</translation> <translation id="8398790343843005537">તમારો ફોન શોધો</translation> <translation id="8405579342203358118">Chrome સેટિંગમાં તમે જે માહિતી સિંક કરવા ઇચ્છતા હો, તે મેનેજ કરો</translation> +<translation id="8405633352367164037">હાર્ટ</translation> <translation id="8409413588194360210">ચુકવણી હૅન્ડલર</translation> <translation id="8412145213513410671">ક્રેશેસ (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">તમારે તે જ પાસફ્રેઝ બે વાર દાખલ કરવો આવશ્યક છે.</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index 55e2351..9b5a487 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -176,6 +176,7 @@ <translation id="1472675084647422956">Толық көрсету</translation> <translation id="1473183651233018052">JIS B10</translation> <translation id="147358896496811705">2A0</translation> +<translation id="1475299637784133125">Браузердің нұсқасын іздеп жатырсыз ба? Келесіге бетке өтіңіз:</translation> <translation id="1476595624592550506">Құпия сөзді өзгерту</translation> <translation id="1483493594462132177">Жіберу</translation> <translation id="1484290072879560759">Жөнелту мекенжайын таңдау</translation> @@ -1885,6 +1886,7 @@ <translation id="7118618213916969306">Буфердегі URL сілтемесін (<ph name="SHORT_URL" />) іздеу</translation> <translation id="7119414471315195487">Басқа қойындыларды не бағдарламаларды жабу</translation> <translation id="7129409597930077180">Бұл мекенжайға жөнелтілмейді. Басқа мекенжайды таңдаңыз.</translation> +<translation id="7132939140423847331">Әкімші бұл деректің көшірілуіне тыйым салды.</translation> <translation id="7135130955892390533">Күйін көрсету</translation> <translation id="7138472120740807366">Жеткізу әдісі</translation> <translation id="7139724024395191329">Әмірлік</translation> @@ -2444,6 +2446,7 @@ <translation id="8987245424886630962"><ph name="VIEW_CHROME_HISTORY_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome браузерін қолдану тарихын көру үшін Tab, содан кейін Enter пернесін басыңыз.</translation> <translation id="8987927404178983737">Ай</translation> <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation> +<translation id="8992061558343343009">Жүйенің нұсқасын іздеп жатырсыз ба? Келесіге бетке өтіңіз:</translation> <translation id="899688752321268742"><ph name="URL" /> сіз құрылғыны қашан белсенді пайдаланатыныңыз туралы білгісі келеді.</translation> <translation id="8996941253935762404">Алдағы сайт зиянды бағдарламаларды қамтиды</translation> <translation id="8997023839087525404">Сервер Сертификат айқындығы саясаты жалпыға жарияламаған сертификатты ұсынды. Бұл – кейбір сертификаттардың сенімді екенін растау үшін және оларды шабуылдаушылардан қорғау мақсатында қойылатын міндетті талап.</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index 7f83428..da6ca49 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -2283,6 +2283,7 @@ <translation id="8390725133630534698">Delen van <ph name="ORIGIN_NAME" /> naar <ph name="VM_NAME" /> is geblokkeerd op basis van beheerdersbeleid</translation> <translation id="8398790343843005537">Je telefoon zoeken</translation> <translation id="8405579342203358118">De informatie die je synchroniseert beheren in de Chrome-instellingen</translation> +<translation id="8405633352367164037">Hartje</translation> <translation id="8409413588194360210">betalingshandlers</translation> <translation id="8412145213513410671">Crashes (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Je moet twee keer dezelfde wachtwoordzin opgeven.</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index aed554c8..a6d464c 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -2292,6 +2292,7 @@ <translation id="8390725133630534698">Deljenje iz vira <ph name="ORIGIN_NAME" /> v navidezni računalnik <ph name="VM_NAME" /> je blokiral pravilnik skrbnika.</translation> <translation id="8398790343843005537">Poiščite telefon</translation> <translation id="8405579342203358118">Upravljajte, kateri podatki se sinhronizirajo v Chromu.</translation> +<translation id="8405633352367164037">Srce</translation> <translation id="8409413588194360210">rutine za obravnavo plačil</translation> <translation id="8412145213513410671">Zrušitve (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Dvakrat morate vnesti isto geslo.</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index 673b357..dc3e6f9 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -2294,6 +2294,7 @@ <translation id="8390725133630534698"><ph name="ORIGIN_NAME" /> నుండి <ph name="VM_NAME" />కు షేర్ చేయడం అడ్మినిస్ట్రేటర్ పాలసీ ద్వారా బ్లాక్ చేయబడింది</translation> <translation id="8398790343843005537">మీ ఫోన్ను కనుగొనండి</translation> <translation id="8405579342203358118">Chrome సెట్టింగ్లలో మీరు ఏ సమాచారాన్ని సింక్ చేయాలనుకుంటున్నారో మేనేజ్ చేయడానికి 'Enter'ను నొక్కండి</translation> +<translation id="8405633352367164037">హృదయ చిహ్నం</translation> <translation id="8409413588194360210">పేమెంట్ హ్యాండ్లర్లు</translation> <translation id="8412145213513410671">క్రాష్లు (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">అదే రహస్య పదబంధాన్ని రెండుసార్లు ఖచ్చితంగా మీరు నమోదు చేయాలి.</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index 181afa8..f1d588b5 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -2294,6 +2294,7 @@ <translation id="8390725133630534698">منتظم کی پالیسی کے ذریعے <ph name="ORIGIN_NAME" /> سے <ph name="VM_NAME" /> پر اشتراک کرنے کو مسدود کر دیا گیا ہے</translation> <translation id="8398790343843005537">اپنا فون تلاش کریں</translation> <translation id="8405579342203358118">آپ Chrome ترتیبات میں کن معلومات کو مطابقت پذیر بناتے ہیں ان کا نظم کریں</translation> +<translation id="8405633352367164037">دل</translation> <translation id="8409413588194360210">ادائیگی کے ہینڈلرز</translation> <translation id="8412145213513410671">کریشز (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">آپ کو وہی پاس فریز دوبار درج کرنا ضروری ہے۔</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index e72eb6ad..7dd7b6a 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -176,6 +176,7 @@ <translation id="1472675084647422956">Hiện thêm</translation> <translation id="1473183651233018052">JIS B10</translation> <translation id="147358896496811705">2A0</translation> +<translation id="1475299637784133125">Bạn đang tìm phiên bản trình duyệt? Hãy truy cập</translation> <translation id="1476595624592550506">Thay đổi mật khẩu của bạn</translation> <translation id="1483493594462132177">Gửi</translation> <translation id="1484290072879560759">Chọn địa chỉ giao hàng</translation> @@ -1886,6 +1887,7 @@ <translation id="7118618213916969306">Tìm kiếm URL trong bảng nhớ tạm, <ph name="SHORT_URL" /></translation> <translation id="7119414471315195487">Đóng các thẻ hoặc chương trình khác</translation> <translation id="7129409597930077180">Không thể giao hàng đến địa chỉ này. Chọn một địa chỉ khác.</translation> +<translation id="7132939140423847331">Quản trị viên của bạn đã cấm sao chép dữ liệu này.</translation> <translation id="7135130955892390533">Hiển thị trạng thái</translation> <translation id="7138472120740807366">Phương thức phân phối</translation> <translation id="7139724024395191329">Tiểu vương quốc Ả rập</translation> @@ -2445,6 +2447,7 @@ <translation id="8987245424886630962"><ph name="VIEW_CHROME_HISTORY_FOCUSED_FRIENDLY_MATCH_TEXT" />, Nhấn phím Tab rồi nhấn Enter để xem nhật ký duyệt web của bạn trong Chrome</translation> <translation id="8987927404178983737">Tháng</translation> <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation> +<translation id="8992061558343343009">Bạn đang tìm phiên bản hệ thống? Hãy truy cập</translation> <translation id="899688752321268742"><ph name="URL" /> muốn biết khi bạn đang sử dụng thiết bị này</translation> <translation id="8996941253935762404">Trang web sắp truy cập chứa chương trình độc hại</translation> <translation id="8997023839087525404">Máy chủ đã đưa ra chứng chỉ không được tiết lộ công khai theo chính sách Tính minh bạch của chứng chỉ. Đây là yêu cầu đối với một số chứng chỉ, để đảm bảo chúng đáng tin cậy và giúp chống lại những kẻ tấn công.</translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb index 1056e72..71f2c7a 100644 --- a/components/strings/components_strings_zu.xtb +++ b/components/strings/components_strings_zu.xtb
@@ -2289,6 +2289,7 @@ <translation id="8390725133630534698">Ukwabelana kusuka ku-<ph name="ORIGIN_NAME" /> kuya ku-<ph name="VM_NAME" /> kuvinjelwe inqubomgomo yomlawuli</translation> <translation id="8398790343843005537">Thola ifoni yakho</translation> <translation id="8405579342203358118">Phatha ukuthi yiluphi ulwazi oluvumelanisa kumasethingi we-Chrome</translation> +<translation id="8405633352367164037">Inhliziyo</translation> <translation id="8409413588194360210">izibambi zenkokhelo</translation> <translation id="8412145213513410671">Ukuphahlazeka (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Kuzomele ufake umusho wokungena ofanayo kabili.</translation>
diff --git a/components/viz/service/display/display_resource_provider.cc b/components/viz/service/display/display_resource_provider.cc index bddf5020..b6d90371 100644 --- a/components/viz/service/display/display_resource_provider.cc +++ b/components/viz/service/display/display_resource_provider.cc
@@ -201,13 +201,9 @@ const std::vector<TransferableResource>& resources) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - // TODO(crbug.com/855785): Fishing for misuse of DisplayResourceProvider - // causing crashes. - CHECK(child_id); auto child_it = children_.find(child_id); - // TODO(crbug.com/855785): Fishing for misuse of DisplayResourceProvider - // causing crashes. - CHECK(child_it != children_.end()); + DCHECK(child_it != children_.end()); + Child& child_info = child_it->second; DCHECK(!child_info.marked_for_deletion); for (const TransferableResource& transferable_resource : resources) { @@ -244,13 +240,9 @@ const ResourceIdSet& resources_from_child) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - // TODO(crbug.com/855785): Fishing for misuse of DisplayResourceProvider - // causing crashes. - CHECK(child); auto child_it = children_.find(child); - // TODO(crbug.com/855785): Fishing for misuse of DisplayResourceProvider - // causing crashes. - CHECK(child_it != children_.end()); + DCHECK(child_it != children_.end()); + Child& child_info = child_it->second; DCHECK(!child_info.marked_for_deletion);
diff --git a/components/webapps/browser/android/app_banner_manager_android.cc b/components/webapps/browser/android/app_banner_manager_android.cc index dd855fc2..40b3b70 100644 --- a/components/webapps/browser/android/app_banner_manager_android.cc +++ b/components/webapps/browser/android/app_banner_manager_android.cc
@@ -364,7 +364,7 @@ const std::string& name) { for (net::QueryIterator it(url); !it.IsAtEnd(); it.Advance()) { if (it.GetKey() == name) - return it.GetValue(); + return std::string(it.GetValue()); } return std::string(); }
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc index 9a84855..66c0d78 100644 --- a/content/browser/accessibility/browser_accessibility_manager.cc +++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -1435,8 +1435,11 @@ if (wrapper == GetLastFocusedNode()) SetLastFocusedNode(nullptr); - // We fire these here, immediately, to ensure we can send platform - // notifications prior to the actual destruction of the object. + // TODO(accessibility): Move this to the AXEventGenerator which fires + // MENU_POPUP_START when a node with the menu role is created. The issue to + // be solved is that after the AXEventGenerator adds MENU_POPUP_END, the + // node gets removed from the tree. Then PostprocessEvents removes the + // events from that now-removed node, thus MENU_POPUP_END never gets fired. if (node->GetRole() == ax::mojom::Role::kMenu) FireGeneratedEvent(ui::AXEventGenerator::Event::MENU_POPUP_END, wrapper); }
diff --git a/content/browser/accessibility/dump_accessibility_events_browsertest.cc b/content/browser/accessibility/dump_accessibility_events_browsertest.cc index 26974556..29cb430 100644 --- a/content/browser/accessibility/dump_accessibility_events_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_events_browsertest.cc
@@ -1028,6 +1028,11 @@ RunEventTest(FILE_PATH_LITERAL("menu-opened-closed.html")); } +IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest, + AccessibilityEventsMenuOpenedClosedViaInnerText) { + RunEventTest(FILE_PATH_LITERAL("menu-opened-closed-via-inner-text.html")); +} + #if defined(OS_WIN) && defined(ADDRESS_SANITIZER) // TODO(crbug.com/1198056#c16): Test is flaky on Windows ASAN. #define MAYBE_AccessibilityEventsMenubarShowHideMenus \
diff --git a/content/browser/back_forward_cache_internal_browsertest.cc b/content/browser/back_forward_cache_internal_browsertest.cc index aad18a0..68d83a0a 100644 --- a/content/browser/back_forward_cache_internal_browsertest.cc +++ b/content/browser/back_forward_cache_internal_browsertest.cc
@@ -82,14 +82,12 @@ // Tests that |RenderFrameHost::ForEachRenderFrameHost| and // |WebContents::ForEachRenderFrameHost| behave correctly with bfcached // RenderFrameHosts. -#if defined(OS_MAC) -// Flaky: https://crbug.com/1263536 -#define MAYBE_ForEachRenderFrameHost DISABLED_ForEachRenderFrameHost -#else -#define MAYBE_ForEachRenderFrameHost ForEachRenderFrameHost -#endif -IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, - MAYBE_ForEachRenderFrameHost) { +IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, ForEachRenderFrameHost) { + // There are sometimes unexpected messages from a renderer to the browser, + // which caused test flakiness on macOS. + // TODO(crbug.com/1263536): Fix the test flakiness. + DoNotFailForUnexpectedMessagesWhileCached(); + ASSERT_TRUE(embedded_test_server()->Start()); GURL url_a(embedded_test_server()->GetURL( "a.com", "/cross_site_iframe_factory.html?a(b(c),d)"));
diff --git a/content/browser/devtools/devtools_instrumentation.cc b/content/browser/devtools/devtools_instrumentation.cc index 35177de..8318afb2 100644 --- a/content/browser/devtools/devtools_instrumentation.cc +++ b/content/browser/devtools/devtools_instrumentation.cc
@@ -490,11 +490,13 @@ WorkerDevToolsAgentHost* agent_host = WorkerDevToolsManager::GetInstance().GetDevToolsHostFromToken( devtools_worker_token); - DCHECK(agent_host); + if (!agent_host) + return; RenderFrameHostImpl* rfh = RenderFrameHostImpl::FromID(ancestor_render_frame_host_id); - DCHECK(rfh); + if (!rfh) + return; FrameTreeNode* ftn = rfh->frame_tree_node(); DispatchToAgents(ftn, &protocol::TargetHandler::AddWorkerThrottle, agent_host,
diff --git a/content/browser/media/cdm_file_impl.h b/content/browser/media/cdm_file_impl.h index 3c8f2fe..fc35a5b 100644 --- a/content/browser/media/cdm_file_impl.h +++ b/content/browser/media/cdm_file_impl.h
@@ -94,6 +94,8 @@ const std::string file_name_; const std::string temp_file_name_; + // TODO(crbug.com/1231162): Remove some of these fields and update this + // comment when we migrate off of the PluginPrivateFileSystem. // Files are stored in the PluginPrivateFileSystem. The following are needed // to access files. const url::Origin origin_;
diff --git a/content/browser/media/cdm_registry_impl_unittest.cc b/content/browser/media/cdm_registry_impl_unittest.cc index 195b2cc..2cdd6b2b 100644 --- a/content/browser/media/cdm_registry_impl_unittest.cc +++ b/content/browser/media/cdm_registry_impl_unittest.cc
@@ -19,6 +19,7 @@ #include "content/public/common/cdm_info.h" #include "media/base/video_codecs.h" #include "media/cdm/cdm_capability.h" +#include "media/cdm/cdm_type.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -33,12 +34,11 @@ const char kTestCdmName[] = "Test CDM"; const char kAlternateCdmName[] = "Alternate CDM"; -const base::Token kTestCdmType{1234, 5678}; +const media::CdmType kTestCdmType{base::Token{1234, 5678}, "file_system_id"}; const char kTestPath[] = "/aa/bb"; const char kVersion1[] = "1.1.1.1"; const char kVersion2[] = "1.1.1.2"; const char kTestKeySystem[] = "com.example.somesystem"; -const char kTestFileSystemId[] = "file_system_id"; // Helper function to convert a VideoCodecMap to a list of VideoCodec values // so that they can be compared. VideoCodecProfiles are ignored. @@ -91,8 +91,7 @@ GetTestCdmCapability(), /*supports_sub_key_systems=*/true, kTestCdmName, kTestCdmType, base::Version(kVersion1), - base::FilePath::FromUTF8Unsafe(kTestPath), - kTestFileSystemId); + base::FilePath::FromUTF8Unsafe(kTestPath)); } void Register(CdmInfo cdm_info) { @@ -117,10 +116,10 @@ return false; } - std::vector<std::string> GetVersions(const base::Token& cdm_type) { + std::vector<std::string> GetVersions(const media::CdmType& cdm_type) { std::vector<std::string> versions; for (const auto& cdm : cdm_registry_.GetRegisteredCdms()) { - if (cdm.type == cdm_type) + if (cdm.type.id == cdm_type.id) versions.push_back(cdm.version.GetString()); } return versions; @@ -139,7 +138,7 @@ EXPECT_EQ(kTestCdmName, cdm.name); EXPECT_EQ(kVersion1, cdm.version.GetString()); EXPECT_EQ(kTestPath, cdm.path.MaybeAsASCII()); - EXPECT_EQ(kTestFileSystemId, cdm.file_system_id); + EXPECT_EQ(kTestCdmType, cdm.type); EXPECT_AUDIO_CODECS(AudioCodec::kVorbis); EXPECT_VIDEO_CODECS(VideoCodec::kVP8, VideoCodec::kVP9); EXPECT_ENCRYPTION_SCHEMES(EncryptionScheme::kCenc); @@ -222,7 +221,7 @@ EXPECT_EQ(kTestCdmName, cdm.name); EXPECT_EQ(kVersion1, cdm.version.GetString()); EXPECT_EQ(kTestPath, cdm.path.MaybeAsASCII()); - EXPECT_EQ(kTestFileSystemId, cdm.file_system_id); + EXPECT_EQ(kTestCdmType, cdm.type); EXPECT_VIDEO_CODECS(VideoCodec::kVP8, VideoCodec::kVP9); EXPECT_ENCRYPTION_SCHEMES(EncryptionScheme::kCenc); EXPECT_SESSION_TYPES(CdmSessionType::kTemporary,
diff --git a/content/browser/media/cdm_storage_impl.cc b/content/browser/media/cdm_storage_impl.cc index feae113e..c29045d 100644 --- a/content/browser/media/cdm_storage_impl.cc +++ b/content/browser/media/cdm_storage_impl.cc
@@ -17,6 +17,7 @@ #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/storage_partition.h" +#include "media/cdm/cdm_type.h" #include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/cpp/bindings/pending_associated_remote.h" #include "storage/browser/file_system/file_system_context.h" @@ -28,7 +29,7 @@ // Currently this uses the PluginPrivateFileSystem as the previous CDMs ran // as pepper plugins and we need to be able to access any existing files. -// TODO(jrummell): Switch to using a separate file system once CDMs no +// TODO(crbug.com/1231162): Switch to using a separate file system once CDMs no // longer run as pepper plugins. namespace content { @@ -36,7 +37,7 @@ // static void CdmStorageImpl::Create( RenderFrameHost* render_frame_host, - const std::string& cdm_file_system_id, + const media::CdmType& cdm_type, mojo::PendingReceiver<media::mojom::CdmStorage> receiver) { DVLOG(3) << __func__; DCHECK(!render_frame_host->GetLastCommittedOrigin().opaque()) @@ -50,34 +51,17 @@ file_system_context = storage_partition->GetFileSystemContext(); // The created object is bound to (and owned by) |receiver|. - new CdmStorageImpl(render_frame_host, cdm_file_system_id, + new CdmStorageImpl(render_frame_host, cdm_type, std::move(file_system_context), std::move(receiver)); } -// static -bool CdmStorageImpl::IsValidCdmFileSystemId( - const std::string& cdm_file_system_id) { - // To be compatible with PepperFileSystemBrowserHost::GeneratePluginId(), - // |cdm_file_system_id| must contain only letters (A-Za-z), digits(0-9), - // or "._-". - for (const auto& ch : cdm_file_system_id) { - if (!base::IsAsciiAlpha(ch) && !base::IsAsciiDigit(ch) && ch != '.' && - ch != '_' && ch != '-') { - return false; - } - } - - // Also ensure that |cdm_file_system_id| contains at least 1 character. - return !cdm_file_system_id.empty(); -} - CdmStorageImpl::CdmStorageImpl( RenderFrameHost* render_frame_host, - const std::string& cdm_file_system_id, + const media::CdmType& cdm_type, scoped_refptr<storage::FileSystemContext> file_system_context, mojo::PendingReceiver<media::mojom::CdmStorage> receiver) : DocumentService(render_frame_host, std::move(receiver)), - cdm_file_system_id_(cdm_file_system_id), + cdm_type_(cdm_type), file_system_context_(std::move(file_system_context)), child_process_id_(render_frame_host->GetProcess()->GetID()) {} @@ -89,12 +73,6 @@ DVLOG(3) << __func__ << " file: " << file_name; DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - if (!IsValidCdmFileSystemId(cdm_file_system_id_)) { - DVLOG(1) << "CdmStorageImpl not initialized properly."; - std::move(callback).Run(Status::kFailure, mojo::NullAssociatedRemote()); - return; - } - if (file_name.empty()) { DVLOG(1) << "No file specified."; std::move(callback).Run(Status::kFailure, mojo::NullAssociatedRemote()); @@ -146,7 +124,8 @@ file_system_context_->OpenPluginPrivateFileSystem( origin(), storage::kFileSystemTypePluginPrivate, fsid, - cdm_file_system_id_, storage::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, + cdm_type_.legacy_file_system_id, + storage::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, base::BindOnce(&CdmStorageImpl::OnFileSystemOpened, weak_factory_.GetWeakPtr())); } @@ -191,8 +170,8 @@ } auto cdm_file_impl = std::make_unique<CdmFileImpl>( - file_name, origin(), cdm_file_system_id_, file_system_root_uri_, - file_system_context_); + file_name, origin(), cdm_type_.legacy_file_system_id, + file_system_root_uri_, file_system_context_); if (!cdm_file_impl->Initialize()) { // Unable to initialize with the file requested.
diff --git a/content/browser/media/cdm_storage_impl.h b/content/browser/media/cdm_storage_impl.h index c5ba3f8..8975d5c2 100644 --- a/content/browser/media/cdm_storage_impl.h +++ b/content/browser/media/cdm_storage_impl.h
@@ -14,6 +14,7 @@ #include "base/memory/weak_ptr.h" #include "content/common/content_export.h" #include "content/public/browser/document_service.h" +#include "media/cdm/cdm_type.h" #include "media/mojo/mojom/cdm_storage.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/unique_associated_receiver_set.h" @@ -32,13 +33,9 @@ class CONTENT_EXPORT CdmStorageImpl final : public content::DocumentService<media::mojom::CdmStorage> { public: - // Check if |cdm_file_system_id| is valid. - static bool IsValidCdmFileSystemId(const std::string& cdm_file_system_id); - - // Create a CdmStorageImpl object for |cdm_file_system_id| and bind it to - // |request|. + // Create a CdmStorageImpl object for |cdm_type| and bind it to |request|. static void Create(RenderFrameHost* render_frame_host, - const std::string& cdm_file_system_id, + const media::CdmType& cdm_type, mojo::PendingReceiver<media::mojom::CdmStorage> receiver); CdmStorageImpl(const CdmStorageImpl&) = delete; @@ -48,13 +45,15 @@ void Open(const std::string& file_name, OpenCallback callback) final; private: + // TODO(crbug.com/1231162): Consider reimagining this design once we migrate + // off of the PluginPrivateFileSystem. // File system should only be opened once, so keep track if it has already // been opened (or is in the process of opening). State is kError if an error // happens while opening the file system. enum class FileSystemState { kUnopened, kOpening, kOpened, kError }; CdmStorageImpl(RenderFrameHost* render_frame_host, - const std::string& cdm_file_system_id, + const media::CdmType& cdm_type, scoped_refptr<storage::FileSystemContext> file_system_context, mojo::PendingReceiver<media::mojom::CdmStorage> receiver); ~CdmStorageImpl() final; @@ -70,11 +69,19 @@ OpenCallback callback, bool success); - // Files are stored in the PluginPrivateFileSystem, so keep track of the - // CDM file system ID in order to open the files in the correct context. - const std::string cdm_file_system_id_; + // TODO(crbug.com/1231162): Update this comment once we migrate off of the + // PluginPrivateFileSystem. CdmType contains a `legacy_file_system_id` used to + // access the PluginPrivateFileSystem, which will be removed once all data has + // been migrated. + // Files are stored in the PluginPrivateFileSystem, so keep track of the CDM + // file system ID in order to open the files in the correct context. + const media::CdmType cdm_type_; + // TODO(crbug.com/1231162): Remove this once we migrate off of the + // PluginPrivateFileSystem. scoped_refptr<storage::FileSystemContext> file_system_context_; + // TODO(crbug.com/1231162): Update this comment and consider removing this + // member once we migrate off of the PluginPrivateFileSystem. // The PluginPrivateFileSystem only needs to be opened once. FileSystemState file_system_state_ = FileSystemState::kUnopened; @@ -84,6 +91,8 @@ using PendingOpenData = std::pair<std::string, OpenCallback>; std::vector<PendingOpenData> pending_open_calls_; + // TODO(crbug.com/1231162): Remove this once we migrate off of the + // PluginPrivateFileSystem. // Once the PluginPrivateFileSystem is opened, keep track of the URI that // refers to it. std::string file_system_root_uri_;
diff --git a/content/browser/media/cdm_storage_impl_unittest.cc b/content/browser/media/cdm_storage_impl_unittest.cc index 1809138..610bdb6 100644 --- a/content/browser/media/cdm_storage_impl_unittest.cc +++ b/content/browser/media/cdm_storage_impl_unittest.cc
@@ -15,6 +15,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/test/navigation_simulator.h" #include "content/public/test/test_renderer_host.h" +#include "media/cdm/cdm_type.h" #include "media/mojo/mojom/cdm_storage.mojom.h" #include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/cpp/bindings/pending_associated_remote.h" @@ -30,7 +31,7 @@ namespace { -const char kTestFileSystemId[] = "test_file_system"; +const media::CdmType kTestCdmType{base::Token{1234, 5678}, "test_file_system"}; const char kTestOrigin[] = "http://www.test.com"; // Helper functions to manipulate RenderFrameHosts. @@ -86,16 +87,9 @@ rfh_ = web_contents()->GetMainFrame(); RenderFrameHostTester::For(rfh_)->InitializeRenderFrameIfNeeded(); SimulateNavigation(&rfh_, GURL(kTestOrigin)); - } - - // Creates and initializes the CdmStorage object using |file_system_id|. - // Returns true if successful, false otherwise. - void Initialize(const std::string& file_system_id) { - DVLOG(3) << __func__; - // Create the CdmStorageImpl object. |cdm_storage_| will own the resulting // object. - CdmStorageImpl::Create(rfh_, file_system_id, + CdmStorageImpl::Create(rfh_, kTestCdmType, cdm_storage_.BindNewPipeAndPassReceiver()); } @@ -217,36 +211,7 @@ std::unique_ptr<RunLoopWithExpectedCount> run_loop_with_count_; }; -TEST_F(CdmStorageTest, InvalidFileSystemIdWithSlash) { - Initialize("name/"); - - const char kFileName[] = "valid_file_name"; - mojo::AssociatedRemote<CdmFile> cdm_file; - EXPECT_FALSE(Open(kFileName, &cdm_file)); - EXPECT_FALSE(cdm_file.is_bound()); -} - -TEST_F(CdmStorageTest, InvalidFileSystemIdWithBackSlash) { - Initialize("name\\"); - - const char kFileName[] = "valid_file_name"; - mojo::AssociatedRemote<CdmFile> cdm_file; - EXPECT_FALSE(Open(kFileName, &cdm_file)); - EXPECT_FALSE(cdm_file.is_bound()); -} - -TEST_F(CdmStorageTest, InvalidFileSystemIdEmpty) { - Initialize(""); - - const char kFileName[] = "valid_file_name"; - mojo::AssociatedRemote<CdmFile> cdm_file; - EXPECT_FALSE(Open(kFileName, &cdm_file)); - EXPECT_FALSE(cdm_file.is_bound()); -} - TEST_F(CdmStorageTest, InvalidFileName) { - Initialize(kTestFileSystemId); - // Anything other than ASCII letter, digits, and -._ will fail. Add a // Unicode character to the name. const char kFileName[] = "openfile\u1234"; @@ -256,8 +221,6 @@ } TEST_F(CdmStorageTest, InvalidFileNameEmpty) { - Initialize(kTestFileSystemId); - const char kFileName[] = ""; mojo::AssociatedRemote<CdmFile> cdm_file; EXPECT_FALSE(Open(kFileName, &cdm_file)); @@ -265,8 +228,6 @@ } TEST_F(CdmStorageTest, InvalidFileNameStartWithUnderscore) { - Initialize(kTestFileSystemId); - const char kFileName[] = "_invalid"; mojo::AssociatedRemote<CdmFile> cdm_file; EXPECT_FALSE(Open(kFileName, &cdm_file)); @@ -274,8 +235,6 @@ } TEST_F(CdmStorageTest, InvalidFileNameTooLong) { - Initialize(kTestFileSystemId); - // Limit is 256 characters, so try a file name with 257. const std::string kFileName(257, 'a'); mojo::AssociatedRemote<CdmFile> cdm_file; @@ -284,8 +243,6 @@ } TEST_F(CdmStorageTest, OpenFile) { - Initialize(kTestFileSystemId); - const char kFileName[] = "test_file_name"; mojo::AssociatedRemote<CdmFile> cdm_file; EXPECT_TRUE(Open(kFileName, &cdm_file)); @@ -293,8 +250,6 @@ } TEST_F(CdmStorageTest, OpenFileLocked) { - Initialize(kTestFileSystemId); - const char kFileName[] = "test_file_name"; mojo::AssociatedRemote<CdmFile> cdm_file1; EXPECT_TRUE(Open(kFileName, &cdm_file1)); @@ -314,8 +269,6 @@ } TEST_F(CdmStorageTest, MultipleFiles) { - Initialize(kTestFileSystemId); - const char kFileName1[] = "file1"; mojo::AssociatedRemote<CdmFile> cdm_file1; EXPECT_TRUE(Open(kFileName1, &cdm_file1)); @@ -333,8 +286,6 @@ } TEST_F(CdmStorageTest, WriteThenReadFile) { - Initialize(kTestFileSystemId); - const char kFileName[] = "test_file_name"; mojo::AssociatedRemote<CdmFile> cdm_file; EXPECT_TRUE(Open(kFileName, &cdm_file)); @@ -350,8 +301,6 @@ } TEST_F(CdmStorageTest, ReadThenWriteEmptyFile) { - Initialize(kTestFileSystemId); - const char kFileName[] = "empty_file_name"; mojo::AssociatedRemote<CdmFile> cdm_file; EXPECT_TRUE(Open(kFileName, &cdm_file)); @@ -371,8 +320,6 @@ } TEST_F(CdmStorageTest, ParallelRead) { - Initialize(kTestFileSystemId); - const char kFileName[] = "duplicate_read_file_name"; mojo::AssociatedRemote<CdmFile> cdm_file; EXPECT_TRUE(Open(kFileName, &cdm_file)); @@ -390,8 +337,6 @@ } TEST_F(CdmStorageTest, ParallelWrite) { - Initialize(kTestFileSystemId); - const char kFileName[] = "duplicate_write_file_name"; mojo::AssociatedRemote<CdmFile> cdm_file; EXPECT_TRUE(Open(kFileName, &cdm_file));
diff --git a/content/browser/media/key_system_support_impl_unittest.cc b/content/browser/media/key_system_support_impl_unittest.cc index 806dbc1..7b151ae 100644 --- a/content/browser/media/key_system_support_impl_unittest.cc +++ b/content/browser/media/key_system_support_impl_unittest.cc
@@ -26,6 +26,7 @@ #include "media/base/media_switches.h" #include "media/base/video_codecs.h" #include "media/cdm/cdm_capability.h" +#include "media/cdm/cdm_type.h" #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "testing/gtest/include/gtest/gtest.h" @@ -43,10 +44,9 @@ using testing::_; const char kTestCdmName[] = "Test Content Decryption Module"; -const base::Token kTestCdmType{1234, 5678}; +const media::CdmType kTestCdmType{base::Token{1234, 5678}, "file_system_id"}; const char kVersion[] = "1.1.1.1"; const char kTestPath[] = "/aa/bb"; -const char kTestFileSystemId[] = "file_system_id"; // Helper function to convert a VideoCodecMap to a list of VideoCodec values // so that they can be compared. VideoCodecProfiles are ignored. @@ -127,11 +127,10 @@ Robustness robustness = Robustness::kSoftwareSecure) { DVLOG(1) << __func__; - CdmRegistry::GetInstance()->RegisterCdm( - CdmInfo(key_system, robustness, std::move(capability), - /*supports_sub_key_systems=*/false, kTestCdmName, kTestCdmType, - base::Version(kVersion), - base::FilePath::FromUTF8Unsafe(kTestPath), kTestFileSystemId)); + CdmRegistry::GetInstance()->RegisterCdm(CdmInfo( + key_system, robustness, std::move(capability), + /*supports_sub_key_systems=*/false, kTestCdmName, kTestCdmType, + base::Version(kVersion), base::FilePath::FromUTF8Unsafe(kTestPath))); } // Determines if |key_system| is registered. If it is, updates |codecs_|
diff --git a/content/browser/media/key_system_support_win.h b/content/browser/media/key_system_support_win.h index c8696cd..6b9966b 100644 --- a/content/browser/media/key_system_support_win.h +++ b/content/browser/media/key_system_support_win.h
@@ -9,7 +9,6 @@ #include "base/callback.h" #include "base/files/file_path.h" -#include "content/public/common/cdm_info.h" #include "media/cdm/cdm_capability.h" #include "third_party/abseil-cpp/absl/types/optional.h"
diff --git a/content/browser/media/media_interface_proxy.cc b/content/browser/media/media_interface_proxy.cc index 3bd954b..f9c0887 100644 --- a/content/browser/media/media_interface_proxy.cc +++ b/content/browser/media/media_interface_proxy.cc
@@ -15,6 +15,7 @@ #include "base/no_destructor.h" #include "base/strings/string_util.h" #include "base/time/time.h" +#include "base/unguessable_token.h" #include "build/chromeos_buildflags.h" #include "content/browser/renderer_host/render_frame_host_delegate.h" #include "content/browser/renderer_host/render_frame_host_impl.h" @@ -23,8 +24,10 @@ #include "content/public/browser/service_process_host.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_observer.h" +#include "content/public/common/cdm_info.h" #include "content/public/common/content_client.h" #include "media/base/cdm_context.h" +#include "media/cdm/cdm_type.h" #include "media/media_buildflags.h" #include "media/mojo/buildflags.h" #include "media/mojo/mojom/frame_interface_factory.mojom.h" @@ -84,9 +87,6 @@ #endif // BUILDFLAG(ENABLE_LIBRARY_CDMS) #if defined(OS_CHROMEOS) -constexpr char kChromeOsCdmFileSystemId[] = - "application_chromeos-cdm-factory-daemon"; - // These are reported to UMA server. Do not renumber or reuse values. enum class CrosCdmType { kChromeCdm = 0, @@ -136,11 +136,11 @@ public WebContentsObserver { public: FrameInterfaceFactoryImpl(RenderFrameHost* render_frame_host, - const std::string& cdm_file_system_id) + const media::CdmType& cdm_type) : WebContentsObserver( WebContents::FromRenderFrameHost(render_frame_host)), render_frame_host_(render_frame_host), - cdm_file_system_id_(cdm_file_system_id) {} + cdm_type_(cdm_type) {} // media::mojom::FrameInterfaceFactory implementation: @@ -157,13 +157,10 @@ void CreateCdmStorage( mojo::PendingReceiver<media::mojom::CdmStorage> receiver) override { #if BUILDFLAG(ENABLE_LIBRARY_CDMS) - // Only provide CdmStorageImpl when we have a valid |cdm_file_system_id|, - // which is currently only set for the CdmService (not the MediaService). - if (cdm_file_system_id_.empty()) + if (cdm_type_.id.is_zero()) return; - CdmStorageImpl::Create(render_frame_host_, cdm_file_system_id_, - std::move(receiver)); + CdmStorageImpl::Create(render_frame_host_, cdm_type_, std::move(receiver)); #endif } @@ -208,7 +205,7 @@ private: const raw_ptr<RenderFrameHost> render_frame_host_; - const std::string cdm_file_system_id_; + const media::CdmType cdm_type_; #if defined(OS_WIN) mojo::RemoteSet<media::mojom::MuteStateObserver> site_mute_observers_; @@ -221,16 +218,15 @@ : DocumentUserData(render_frame_host) { DVLOG(1) << __func__; - std::string cdm_file_system_id; + media::CdmType cdm_type; #if defined(OS_CHROMEOS) - // The file system ID passed in here is only used by the CDM obtained through - // the |media_interface_factory_ptr_|. - cdm_file_system_id = kChromeOsCdmFileSystemId; + // The CdmType passed in here is only used by the CDM obtained through the + // |media_interface_factory_ptr_|. + cdm_type = kChromeOsCdmType; #endif - auto frame_factory_getter = - base::BindRepeating(&MediaInterfaceProxy::GetFrameServices, - base::Unretained(this), cdm_file_system_id); + auto frame_factory_getter = base::BindRepeating( + &MediaInterfaceProxy::GetFrameServices, base::Unretained(this), cdm_type); media_interface_factory_ptr_ = std::make_unique<MediaInterfaceFactoryHolder>( base::BindRepeating(&GetMediaService), frame_factory_getter); secondary_interface_factory_ = std::make_unique<MediaInterfaceFactoryHolder>( @@ -433,12 +429,11 @@ } mojo::PendingRemote<media::mojom::FrameInterfaceFactory> -MediaInterfaceProxy::GetFrameServices(const std::string& cdm_file_system_id) { +MediaInterfaceProxy::GetFrameServices(const media::CdmType& cdm_type) { mojo::PendingRemote<media::mojom::FrameInterfaceFactory> factory; frame_factories_.Add( std::make_unique<FrameInterfaceFactoryImpl>( - static_cast<RenderFrameHostImpl*>(&render_frame_host()), - cdm_file_system_id), + static_cast<RenderFrameHostImpl*>(&render_frame_host()), cdm_type), factory.InitWithNewPipeAndPassReceiver()); return factory; } @@ -471,11 +466,15 @@ render_frame_host().GetBrowserContext(), render_frame_host().GetSiteInstance()->GetSiteURL(), cdm_path); - // Passing empty arguments to GetFrameServices() as MediaFoundation-based - // CDMs don't use CdmStorage currently. + // Passing an empty CdmType as MediaFoundation-based CDMs don't use CdmStorage + // currently. + // TODO(crbug.com/1231162): This works but is a bit hacky. CdmType is used for + // both CDM-process-isolation and storage isolation. We probably still want to + // have the information on whether we want to use CdmStorage in CDM + // registration and populate that info here. mf_service.CreateInterfaceFactory( mf_interface_factory_remote_.BindNewPipeAndPassReceiver(), - GetFrameServices()); + GetFrameServices(media::CdmType())); // Handle unexpected mojo pipe disconnection such as MediaFoundationService // process crashed or killed in the browser task manager. mf_interface_factory_remote_.reset_on_disconnect(); @@ -509,10 +508,6 @@ NOTREACHED() << "CDM path for " << key_system << " is empty"; return nullptr; } - if (!CdmStorageImpl::IsValidCdmFileSystemId(cdm_info->file_system_id)) { - NOTREACHED() << "Invalid file system ID " << cdm_info->file_system_id; - return nullptr; - } if (!IsValidCdmDisplayName(cdm_info->name)) { NOTREACHED() << "Invalid CDM display name " << cdm_info->name; return nullptr; @@ -524,34 +519,36 @@ if (found != cdm_factory_map_.end()) return found->second.get(); - return ConnectToCdmService(cdm_type, *cdm_info); + return ConnectToCdmService(*cdm_info); } media::mojom::CdmFactory* MediaInterfaceProxy::ConnectToCdmService( - const base::Token& cdm_type, const CdmInfo& cdm_info) { DVLOG(1) << __func__ << ": cdm_name = " << cdm_info.name; - DCHECK(!cdm_factory_map_.count(cdm_type)); + DCHECK(!cdm_factory_map_.count(cdm_info.type)); auto* browser_context = render_frame_host().GetBrowserContext(); auto& site = render_frame_host().GetSiteInstance()->GetSiteURL(); - auto& cdm_service = GetCdmService(cdm_type, browser_context, site, cdm_info); + // TODO(crbug.com/1231162): Refactor GetCdmService() to only take a CdmInfo + // object. The current arguments are redundant. + auto& cdm_service = + GetCdmService(cdm_info.type.id, browser_context, site, cdm_info); mojo::Remote<media::mojom::CdmFactory> cdm_factory_remote; cdm_service.CreateCdmFactory(cdm_factory_remote.BindNewPipeAndPassReceiver(), - GetFrameServices(cdm_info.file_system_id)); + GetFrameServices(cdm_info.type)); cdm_factory_remote.set_disconnect_handler( base::BindOnce(&MediaInterfaceProxy::OnCdmServiceConnectionError, - base::Unretained(this), cdm_type)); + base::Unretained(this), cdm_info.type)); auto* cdm_factory = cdm_factory_remote.get(); - cdm_factory_map_.emplace(cdm_type, std::move(cdm_factory_remote)); + cdm_factory_map_.emplace(cdm_info.type, std::move(cdm_factory_remote)); return cdm_factory; } void MediaInterfaceProxy::OnCdmServiceConnectionError( - const base::Token& cdm_type) { + const media::CdmType& cdm_type) { DVLOG(1) << __func__; DCHECK(thread_checker_.CalledOnValidThread());
diff --git a/content/browser/media/media_interface_proxy.h b/content/browser/media/media_interface_proxy.h index 1df7091..e0ed203 100644 --- a/content/browser/media/media_interface_proxy.h +++ b/content/browser/media/media_interface_proxy.h
@@ -18,6 +18,7 @@ #include "content/browser/media/media_interface_factory_holder.h" #include "content/public/browser/document_user_data.h" #include "content/public/common/cdm_info.h" +#include "media/cdm/cdm_type.h" #include "media/media_buildflags.h" #include "media/mojo/buildflags.h" #include "media/mojo/mojom/content_decryption_module.mojom.h" @@ -93,29 +94,25 @@ DOCUMENT_USER_DATA_KEY_DECL(); // Gets services provided by the browser (at RenderFrameHost level) to the - // mojo media (or CDM) service running remotely. |cdm_file_system_id| is - // used to register the appropriate CdmStorage interface needed by the CDM. - // If |cdm_file_system_id| is empty, CdmStorage interface won't be available. + // mojo media (or CDM) service running remotely. |cdm_type| is used to + // register the appropriate CdmStorage interface needed by the CDM. If + // |cdm_type| is empty, CdmStorage interface won't be available. mojo::PendingRemote<media::mojom::FrameInterfaceFactory> GetFrameServices( - const std::string& cdm_file_system_id = ""); + const media::CdmType& cdm_type); #if BUILDFLAG(ENABLE_LIBRARY_CDMS) // Gets a CdmFactory pointer for |key_system|. Returns null if unexpected // error happened. media::mojom::CdmFactory* GetCdmFactory(const std::string& key_system); - // Connects to the CDM service associated with |cdm_type|, adds the new + // Connects to the CDM service associated with |cdm_info|, adds the new // CdmFactoryPtr to the |cdm_factory_map_|, and returns the newly created // CdmFactory pointer. Returns nullptr if unexpected error happened. - // |cdm_path| will be used to preload the CDM, if necessary. - // |cdm_file_system_id| is used when creating the matching storage interface. - // |cdm_name| is used as the display name of the CDM (utility) process. - media::mojom::CdmFactory* ConnectToCdmService(const base::Token& cdm_type, - const CdmInfo& cdm_info); + media::mojom::CdmFactory* ConnectToCdmService(const CdmInfo& cdm_info); // Callback for connection error from the CdmFactoryPtr in the // |cdm_factory_map_| associated with |cdm_type|. - void OnCdmServiceConnectionError(const base::Token& cdm_type); + void OnCdmServiceConnectionError(const media::CdmType& cdm_type); #endif // BUILDFLAG(ENABLE_LIBRARY_CDMS) #if defined(OS_CHROMEOS) @@ -160,9 +157,9 @@ // CDM type to CDM InterfaceFactory Remotes mapping, where the // InterfaceFactory instances live in the standalone CdmService instances. // These map entries effectively own the corresponding CDM processes. - // Only using the GUID to identify the CdmFactory is sufficient because the - // BrowserContext and Site URL should never change. - std::map<base::Token, mojo::Remote<media::mojom::CdmFactory>> + // Only using the CDM type to identify the CdmFactory is sufficient because + // the BrowserContext and Site URL should never change. + std::map<media::CdmType, mojo::Remote<media::mojom::CdmFactory>> cdm_factory_map_; #endif // BUILDFLAG(ENABLE_LIBRARY_CDMS)
diff --git a/content/browser/prerender/prerender_browsertest.cc b/content/browser/prerender/prerender_browsertest.cc index f559cb38..cad0904c 100644 --- a/content/browser/prerender/prerender_browsertest.cc +++ b/content/browser/prerender/prerender_browsertest.cc
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <cstdint> + #include "base/barrier_closure.h" #include "base/base_switches.h" #include "base/callback_helpers.h" @@ -74,6 +76,7 @@ #include "mojo/public/cpp/bindings/remote_set.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/controllable_http_response.h" +#include "net/test/embedded_test_server/default_handlers.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" @@ -89,6 +92,7 @@ #include "ui/shell_dialogs/select_file_dialog.h" #include "ui/shell_dialogs/select_file_dialog_factory.h" #include "url/gurl.h" +#include "url/url_constants.h" #if BUILDFLAG(ENABLE_PLUGINS) #include "content/common/pepper_plugin.mojom.h" @@ -4456,9 +4460,8 @@ PrerenderHost::FinalStatus::kCrossOriginNavigation, 1); } -IN_PROC_BROWSER_TEST_F( - PrerenderBrowserTest, - CancelEmbedderTriggeredPrerenderingSameOriginRedirection) { +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, + EmbedderTrigger_SameOriginRedirection) { base::HistogramTester histogram_tester; const GURL kInitialUrl = GetUrl("/empty.html"); ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl)); @@ -4485,34 +4488,229 @@ PrerenderHost::FinalStatus::kEmbedderTriggeredAndSameOriginRedirected, 1); } -IN_PROC_BROWSER_TEST_F( - PrerenderBrowserTest, - CancelEmbedderTriggeredPrerenderingCrossOriginRedirection) { - base::HistogramTester histogram_tester; - const GURL kInitialUrl = GetUrl("/empty.html"); - ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl)); - const GURL kRedirectedUrl = GetCrossOriginUrl("/empty.html?prerender"); - const GURL kPrerenderingUrl = - GetUrl("/server-redirect?" + kRedirectedUrl.spec()); - - RedirectChainObserver redirect_chain_observer(*shell()->web_contents(), - kRedirectedUrl); +void PrerenderEmbedderTriggeredCrossOriginRedirectionPage( + WebContentsImpl& web_contents, + const GURL& prerendering_url, + const GURL& cross_origin_url) { + RedirectChainObserver redirect_chain_observer{web_contents, cross_origin_url}; // Start prerendering by embedder triggered prerendering. std::unique_ptr<PrerenderHandle> prerender_handle = - web_contents_impl()->StartPrerendering(kPrerenderingUrl, - PrerenderTriggerType::kEmbedder, - "EmbedderSuffixForTest"); + web_contents.StartPrerendering(prerendering_url, + PrerenderTriggerType::kEmbedder, + "EmbedderSuffixForTest"); EXPECT_TRUE(prerender_handle); - test::PrerenderTestHelper::WaitForPrerenderLoadCompletion( - *shell()->web_contents(), kPrerenderingUrl); - ASSERT_EQ(2u, redirect_chain_observer.redirect_chain().size()); + test::PrerenderTestHelper::WaitForPrerenderLoadCompletion(web_contents, + prerendering_url); + ASSERT_EQ(2u, redirect_chain_observer.redirect_chain().size()); +} + +void CheckExpectedCrossOriginMetrics( + const base::HistogramTester& histogram_tester, + PrerenderCrossOriginRedirectionMismatch mismatch_type, + absl::optional<PrerenderCrossOriginRedirectionProtocolChange> + protocol_change, + absl::optional<PrerenderCrossOriginRedirectionDomain> domain_change) { histogram_tester.ExpectUniqueSample( "Prerender.Experimental.PrerenderHostFinalStatus.Embedder_" "EmbedderSuffixForTest", PrerenderHost::FinalStatus::kEmbedderTriggeredAndCrossOriginRedirected, 1); + histogram_tester.ExpectUniqueSample( + "Prerender.Experimental.PrerenderCrossOriginRedirectionMismatch.Embedder_" + "EmbedderSuffixForTest", + mismatch_type, 1); + if (protocol_change.has_value()) { + histogram_tester.ExpectUniqueSample( + "Prerender.Experimental.CrossOriginRedirectionProtocolChange.Embedder_" + "EmbedderSuffixForTest", + protocol_change.value(), 1); + } + if (domain_change.has_value()) { + histogram_tester.ExpectUniqueSample( + "Prerender.Experimental.CrossOriginRedirectionDomain.Embedder_" + "EmbedderSuffixForTest", + domain_change.value(), 1); + } +} + +// Tests PrerenderCrossOriginRedirectionMismatch.kSchemeHostPortMismatch was +// recorded when a prerendering navigaton was redireted to another origin with +// different scheme, host and port. +IN_PROC_BROWSER_TEST_F( + PrerenderBrowserTest, + EmbedderTrigger_CrossOriginRedirection_SchemeHostPortMismatch) { + base::HistogramTester histogram_tester; + embedded_test_server()->AddDefaultHandlers(GetTestDataFilePath()); + ASSERT_TRUE(embedded_test_server()->Start()); + GURL initial_url = GetUrl("/empty.html"); + ASSERT_TRUE(NavigateToURL(shell(), initial_url)); + + // The redirected_url's origin completely differs from the prerendering one. + GURL redirected_url = embedded_test_server()->GetURL("b.test", "/empty.html"); + GURL prerendering_url = GetUrl("/server-redirect?" + redirected_url.spec()); + ASSERT_NE(prerendering_url.scheme(), redirected_url.scheme()); + ASSERT_NE(prerendering_url.host(), redirected_url.host()); + ASSERT_NE(prerendering_url.port(), redirected_url.port()); + + PrerenderEmbedderTriggeredCrossOriginRedirectionPage( + *web_contents_impl(), prerendering_url, redirected_url); + CheckExpectedCrossOriginMetrics( + histogram_tester, + PrerenderCrossOriginRedirectionMismatch::kSchemeHostPortMismatch, + /*protocol_change=*/absl::nullopt, /*domain_change=*/absl::nullopt); +} + +// Tests a prerendering navigaton goes with HTTP protocol, and being redirected +// to upgrade its protocol to HTTPS. +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, + EmbedderTrigger_CrossOriginRedirection_ProtocolUpgrade) { + base::HistogramTester histogram_tester; + embedded_test_server()->AddDefaultHandlers(GetTestDataFilePath()); + ASSERT_TRUE(embedded_test_server()->Start()); + + GURL initial_url = embedded_test_server()->GetURL("a.test", "/empty.html"); + ASSERT_TRUE(NavigateToURL(shell(), initial_url)); + + // Redirect to another url with protocol upgraded. + GURL redirected_url = ssl_server().GetURL("a.test", "/empty.html"); + GURL prerendering_url = embedded_test_server()->GetURL( + "a.test", "/server-redirect?" + redirected_url.spec()); + ASSERT_NE(prerendering_url.scheme(), redirected_url.scheme()); + ASSERT_NE(prerendering_url.port(), redirected_url.port()); + ASSERT_EQ(prerendering_url.scheme(), url::kHttpScheme); + ASSERT_EQ(redirected_url.scheme(), url::kHttpsScheme); + + PrerenderEmbedderTriggeredCrossOriginRedirectionPage( + *web_contents_impl(), prerendering_url, redirected_url); + CheckExpectedCrossOriginMetrics( + histogram_tester, + PrerenderCrossOriginRedirectionMismatch::kSchemePortMismatch, + PrerenderCrossOriginRedirectionProtocolChange::kHttpProtocolUpgrade, + /*domain_change=*/absl::nullopt); +} + +// Similar to +// CancelEmbedderTriggeredPrerenderingCrossOriginRedirection_ProtocolUpgrade, +// tests a prerendering navigaton goes with HTTPS protocol, and being redirected +// to upgrade its protocol to HTTPS. +IN_PROC_BROWSER_TEST_F( + PrerenderBrowserTest, + EmbedderTrigger_CrossOriginRedirection_ProtocolDowngrade) { + base::HistogramTester histogram_tester; + GURL initial_url = GetUrl("/empty.html"); + ASSERT_TRUE(NavigateToURL(shell(), initial_url)); + + GURL::Replacements downgrade_protocol; + downgrade_protocol.SetSchemeStr(url::kHttpScheme); + std::string port_str(base::NumberToString(ssl_server().port() + 1)); + downgrade_protocol.SetPortStr(port_str); + ASSERT_TRUE(NavigateToURL(shell(), initial_url)); + + // Redirect to another url with protocol upgraded. + GURL redirected_url = + GetUrl("/empty.html").ReplaceComponents(downgrade_protocol); + GURL prerendering_url = GetUrl("/server-redirect?" + redirected_url.spec()); + ASSERT_NE(prerendering_url.scheme(), redirected_url.scheme()); + ASSERT_NE(prerendering_url.port(), redirected_url.port()); + ASSERT_EQ(prerendering_url.scheme(), url::kHttpsScheme); + ASSERT_EQ(redirected_url.scheme(), "http"); + + PrerenderEmbedderTriggeredCrossOriginRedirectionPage( + *web_contents_impl(), prerendering_url, redirected_url); + CheckExpectedCrossOriginMetrics( + histogram_tester, + PrerenderCrossOriginRedirectionMismatch::kSchemePortMismatch, + PrerenderCrossOriginRedirectionProtocolChange::kHttpProtocolDowngrade, + /*domain_change=*/absl::nullopt); +} + +// Tests PrerenderCrossOriginRedirectionMismatch.kHostMismatch and +// PrerenderCrossOriginRedirectionDomain.kRedirectToSubDomain are recorded +// when the prerendering navigation is redirected to a subdomain URL. +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, + EmbedderTrigger_CrossOriginRedirection_ToSubdomain) { + base::HistogramTester histogram_tester; + GURL initial_url = GetUrl("/empty.html"); + ASSERT_TRUE(NavigateToURL(shell(), initial_url)); + + GURL::Replacements set_host; + set_host.SetHostStr("www.a.test"); + + GURL redirected_url = GetUrl("/empty.html").ReplaceComponents(set_host); + GURL prerendering_url = GetUrl("/server-redirect?" + redirected_url.spec()); + + PrerenderEmbedderTriggeredCrossOriginRedirectionPage( + *web_contents_impl(), prerendering_url, redirected_url); + CheckExpectedCrossOriginMetrics( + histogram_tester, PrerenderCrossOriginRedirectionMismatch::kHostMismatch, + /*protocol_change=*/absl::nullopt, + PrerenderCrossOriginRedirectionDomain::kRedirectToSubDomain); +} + +// Tests PrerenderCrossOriginRedirectionMismatch.kHostMismatch and +// PrerenderCrossOriginRedirectionDomain.kRedirectFromSubDomain are recorded +// when the prerendering navigation is redirected to a subdomain URL. +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, + EmbedderTrigger_CrossOriginRedirection_FromSubdomain) { + base::HistogramTester histogram_tester; + GURL initial_url = GetUrl("/empty.html"); + ASSERT_TRUE(NavigateToURL(shell(), initial_url)); + + GURL::Replacements set_host; + set_host.SetHostStr("www.a.test"); + + GURL redirected_url = GetUrl("/empty.html"); + GURL prerendering_url = GetUrl("/server-redirect?" + redirected_url.spec()) + .ReplaceComponents(set_host); + + PrerenderEmbedderTriggeredCrossOriginRedirectionPage( + *web_contents_impl(), prerendering_url, redirected_url); + CheckExpectedCrossOriginMetrics( + histogram_tester, PrerenderCrossOriginRedirectionMismatch::kHostMismatch, + /*protocol_change=*/absl::nullopt, + PrerenderCrossOriginRedirectionDomain::kRedirectFromSubDomain); +} + +// Tests PrerenderCrossOriginRedirectionMismatch.kHostMismatch and +// PrerenderCrossOriginRedirectionDomain.kCrossDomain are recorded +// when the prerendering navigation is redirected to a different domain. +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, + EmbedderTrigger_CrossOriginRedirection_DifferentDomain) { + base::HistogramTester histogram_tester; + GURL kInitialUrl = GetUrl("/empty.html"); + ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl)); + GURL kRedirectedUrl = GetCrossOriginUrl("/empty.html?prerender"); + GURL kPrerenderingUrl = GetUrl("/server-redirect?" + kRedirectedUrl.spec()); + PrerenderEmbedderTriggeredCrossOriginRedirectionPage( + *web_contents_impl(), kPrerenderingUrl, kRedirectedUrl); + CheckExpectedCrossOriginMetrics( + histogram_tester, PrerenderCrossOriginRedirectionMismatch::kHostMismatch, + /*protocol_change=*/absl::nullopt, + PrerenderCrossOriginRedirectionDomain::kCrossDomain); +} + +// Tests that a prerendering navigation is redirected to another origin whose +// port differs from the prerendering one. The prerender should be cancelled and +// `PrerenderCrossOriginRedirectionCase::kPortMismatch` should be recorded. +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, + EmbedderTrigger_CrossOriginRedirection_PortChanged) { + base::HistogramTester histogram_tester; + GURL initial_url = GetUrl("/empty.html"); + ASSERT_TRUE(NavigateToURL(shell(), initial_url)); + + std::string port_str(base::NumberToString(ssl_server().port() + 1)); + GURL::Replacements set_port; + set_port.SetPortStr(port_str); + GURL redirected_url = initial_url.ReplaceComponents(set_port); + GURL prerendering_url = GetUrl("/server-redirect?" + redirected_url.spec()); + PrerenderEmbedderTriggeredCrossOriginRedirectionPage( + *web_contents_impl(), prerendering_url, redirected_url); + CheckExpectedCrossOriginMetrics( + histogram_tester, PrerenderCrossOriginRedirectionMismatch::kPortMismatch, + /*protocol_change=*/absl::nullopt, + /*domain_change=*/absl::nullopt); } namespace {
diff --git a/content/browser/prerender/prerender_metrics.cc b/content/browser/prerender/prerender_metrics.cc index 828175e..863837d 100644 --- a/content/browser/prerender/prerender_metrics.cc +++ b/content/browser/prerender/prerender_metrics.cc
@@ -7,6 +7,7 @@ #include "base/metrics/histogram_functions.h" #include "base/metrics/metrics_hashes.h" #include "content/browser/renderer_host/render_frame_host_impl.h" +#include "content/public/browser/prerender_trigger_type.h" #include "services/metrics/public/cpp/ukm_builders.h" #include "services/metrics/public/cpp/ukm_recorder.h" @@ -87,4 +88,40 @@ status); } +void RecordPrerenderRedirectionMismatchType( + PrerenderCrossOriginRedirectionMismatch mismatch_type, + PrerenderTriggerType trigger_type, + const std::string& embedder_histogram_suffix) { + DCHECK_EQ(trigger_type, PrerenderTriggerType::kEmbedder); + base::UmaHistogramEnumeration( + GenerateHistogramName( + "Prerender.Experimental.PrerenderCrossOriginRedirectionMismatch", + trigger_type, embedder_histogram_suffix), + mismatch_type); +} + +void RecordPrerenderRedirectionProtocolChange( + PrerenderCrossOriginRedirectionProtocolChange change_type, + PrerenderTriggerType trigger_type, + const std::string& embedder_histogram_suffix) { + DCHECK_EQ(trigger_type, PrerenderTriggerType::kEmbedder); + base::UmaHistogramEnumeration( + GenerateHistogramName( + "Prerender.Experimental.CrossOriginRedirectionProtocolChange", + trigger_type, embedder_histogram_suffix), + change_type); +} + +void RecordPrerenderRedirectionDomain( + PrerenderCrossOriginRedirectionDomain domain_type, + PrerenderTriggerType trigger_type, + const std::string& embedder_histogram_suffix) { + DCHECK_EQ(trigger_type, PrerenderTriggerType::kEmbedder); + base::UmaHistogramEnumeration( + GenerateHistogramName( + "Prerender.Experimental.CrossOriginRedirectionDomain", trigger_type, + embedder_histogram_suffix), + domain_type); +} + } // namespace content
diff --git a/content/browser/prerender/prerender_metrics.h b/content/browser/prerender/prerender_metrics.h index 3a089f3..fc5b7ef 100644 --- a/content/browser/prerender/prerender_metrics.h +++ b/content/browser/prerender/prerender_metrics.h
@@ -26,6 +26,40 @@ kMaxValue = kNotificationService }; +// Used by PrerenderNavigationThrottle, to track the cross-origin cancellation +// reason, and break it down into more cases. +// Do not modify this enum. +enum class PrerenderCrossOriginRedirectionMismatch { + kShouldNotBeReported = 0, + kPortMismatch = 1, + kHostMismatch = 2, + kHostPortMismatch = 3, + kSchemeMismatch = 4, + kSchemePortMismatch = 5, + kSchemeHostMismatch = 6, + kSchemeHostPortMismatch = 7, + kMaxValue = kSchemeHostPortMismatch +}; + +// Used by PrerenderNavigationThrottle. This is a breakdown enum for +// PrerenderCrossOriginRedirectionMismatch.kSchemePortMismatch. +// Do not modify this enum. +enum class PrerenderCrossOriginRedirectionProtocolChange { + kHttpProtocolUpgrade = 0, + kHttpProtocolDowngrade = 1, + kMaxValue = kHttpProtocolDowngrade +}; + +// Used by PrerenderNavigationThrottle. This is a breakdown enum for +// PrerenderCrossOriginRedirectionMismatch.kHostMismatch. +// Do not modify this enum. +enum class PrerenderCrossOriginRedirectionDomain { + kRedirectToSubDomain = 0, + kRedirectFromSubDomain = 1, + kCrossDomain = 2, + kMaxValue = kCrossDomain +}; + void RecordPrerenderCancelledInterface(const std::string& interface_name); void RecordPrerenderTriggered(ukm::SourceId ukm_id); @@ -40,6 +74,24 @@ PrerenderTriggerType trigger_type, const std::string& embedder_histogram_suffix); +void RecordPrerenderRedirectionMismatchType( + PrerenderCrossOriginRedirectionMismatch case_type, + PrerenderTriggerType trigger_type, + const std::string& embedder_histogram_suffix); + +// Records whether the redirection was caused by HTTP protocol upgrade. +void RecordPrerenderRedirectionProtocolChange( + PrerenderCrossOriginRedirectionProtocolChange change_type, + PrerenderTriggerType trigger_type, + const std::string& embedder_histogram_suffix); + +// Records whether the prerendering navigation was redirected to a subdomain +// page. +void RecordPrerenderRedirectionDomain( + PrerenderCrossOriginRedirectionDomain domain_type, + PrerenderTriggerType trigger_type, + const std::string& embedder_histogram_suffix); + } // namespace content #endif // CONTENT_BROWSER_PRERENDER_PRERENDER_METRICS_H_
diff --git a/content/browser/prerender/prerender_navigation_throttle.cc b/content/browser/prerender/prerender_navigation_throttle.cc index f59a044..b8847d7 100644 --- a/content/browser/prerender/prerender_navigation_throttle.cc +++ b/content/browser/prerender/prerender_navigation_throttle.cc
@@ -6,11 +6,15 @@ #include "content/browser/prerender/prerender_host.h" #include "content/browser/prerender/prerender_host_registry.h" +#include "content/browser/prerender/prerender_metrics.h" #include "content/browser/renderer_host/frame_tree.h" #include "content/browser/renderer_host/frame_tree_node.h" #include "content/browser/renderer_host/navigation_request.h" #include "content/browser/renderer_host/render_frame_host_delegate.h" +#include "content/public/browser/prerender_trigger_type.h" #include "third_party/blink/public/common/features.h" +#include "url/origin.h" +#include "url/url_constants.h" namespace content { @@ -24,6 +28,54 @@ return response_code < 100 || response_code > 399; } +// For the given two origins, analyze what kind of redirection happened. +void AnalyzeCrossOriginRedirection( + const url::Origin& current_origin, + const url::Origin& initial_origin, + PrerenderTriggerType trigger_type, + const std::string& embedder_histogram_suffix) { + DCHECK_NE(initial_origin, current_origin); + DCHECK_EQ(trigger_type, PrerenderTriggerType::kEmbedder); + DCHECK(current_origin.GetURL().SchemeIsHTTPOrHTTPS()); + DCHECK(initial_origin.GetURL().SchemeIsHTTPOrHTTPS()); + + std::bitset<3> bits; + bits[2] = current_origin.scheme() != initial_origin.scheme(); + bits[1] = current_origin.host() != initial_origin.host(); + bits[0] = current_origin.port() != initial_origin.port(); + DCHECK(bits.any()); + auto mismatch_type = + static_cast<PrerenderCrossOriginRedirectionMismatch>(bits.to_ulong()); + + RecordPrerenderRedirectionMismatchType(mismatch_type, trigger_type, + embedder_histogram_suffix); + + if (mismatch_type == + PrerenderCrossOriginRedirectionMismatch::kSchemePortMismatch) { + RecordPrerenderRedirectionProtocolChange( + current_origin.scheme() == url::kHttpsScheme + ? PrerenderCrossOriginRedirectionProtocolChange:: + kHttpProtocolUpgrade + : PrerenderCrossOriginRedirectionProtocolChange:: + kHttpProtocolDowngrade, + trigger_type, embedder_histogram_suffix); + return; + } + if (mismatch_type == PrerenderCrossOriginRedirectionMismatch::kHostMismatch) { + if (current_origin.DomainIs(initial_origin.host())) { + RecordPrerenderRedirectionDomain( + PrerenderCrossOriginRedirectionDomain::kRedirectToSubDomain, + trigger_type, embedder_histogram_suffix); + return; + } + RecordPrerenderRedirectionDomain( + initial_origin.DomainIs(current_origin.host()) + ? PrerenderCrossOriginRedirectionDomain::kRedirectFromSubDomain + : PrerenderCrossOriginRedirectionDomain::kCrossDomain, + trigger_type, embedder_histogram_suffix); + } +} + } // namespace PrerenderNavigationThrottle::~PrerenderNavigationThrottle() = default; @@ -130,13 +182,20 @@ if (is_redirection) { url::Origin initial_origin = url::Origin::Create(prerender_host->GetInitialUrl()); - prerender_host_registry->CancelHost( - frame_tree_node->frame_tree_node_id(), - initial_origin == prerendering_origin - ? PrerenderHost::FinalStatus:: - kEmbedderTriggeredAndSameOriginRedirected - : PrerenderHost::FinalStatus:: - kEmbedderTriggeredAndCrossOriginRedirected); + if (initial_origin == prerendering_origin) { + prerender_host_registry->CancelHost( + frame_tree_node->frame_tree_node_id(), + PrerenderHost::FinalStatus:: + kEmbedderTriggeredAndSameOriginRedirected); + } else { + AnalyzeCrossOriginRedirection( + prerendering_origin, initial_origin, prerender_host->trigger_type(), + prerender_host->embedder_histogram_suffix()); + prerender_host_registry->CancelHost( + frame_tree_node->frame_tree_node_id(), + PrerenderHost::FinalStatus:: + kEmbedderTriggeredAndCrossOriginRedirected); + } return CANCEL; }
diff --git a/content/browser/service_worker/service_worker_metrics.cc b/content/browser/service_worker/service_worker_metrics.cc index 56525cf..5f875e2 100644 --- a/content/browser/service_worker/service_worker_metrics.cc +++ b/content/browser/service_worker/service_worker_metrics.cc
@@ -464,25 +464,4 @@ UMA_HISTOGRAM_ENUMERATION("ServiceWorker.StartTiming.ClockConsistency", type); } -void ServiceWorkerMetrics::RecordOfflineCapableReason( - blink::ServiceWorkerStatusCode status, - int status_code) { - if (status == blink::ServiceWorkerStatusCode::kErrorTimeout) { - base::UmaHistogramEnumeration("ServiceWorker.OfflineCapable.Reason", - OfflineCapableReason::kTimeout); - return; - } else if (status == blink::ServiceWorkerStatusCode::kOk) { - if (200 <= status_code && status_code <= 299) { - base::UmaHistogramEnumeration("ServiceWorker.OfflineCapable.Reason", - OfflineCapableReason::kSuccess); - return; - } else if (300 <= status_code && status_code <= 399) { - base::UmaHistogramEnumeration("ServiceWorker.OfflineCapable.Reason", - OfflineCapableReason::kRedirect); - return; - } - } - NOTREACHED(); -} - } // namespace content
diff --git a/content/browser/service_worker/service_worker_metrics.h b/content/browser/service_worker/service_worker_metrics.h index 3c7769f2..bd0e0f4 100644 --- a/content/browser/service_worker/service_worker_metrics.h +++ b/content/browser/service_worker/service_worker_metrics.h
@@ -132,14 +132,6 @@ base::TimeTicks local_end; }; - // Used for UMA. Append-only. - enum class OfflineCapableReason { - kTimeout = 0, - kSuccess = 1, - kRedirect = 2, - kMaxValue = kRedirect, - }; - ServiceWorkerMetrics() = delete; ServiceWorkerMetrics(const ServiceWorkerMetrics&) = delete; ServiceWorkerMetrics& operator=(const ServiceWorkerMetrics&) = delete; @@ -192,12 +184,6 @@ // Records the size of Service-Worker-Navigation-Preload header when the // navigation preload request is to be sent. static void RecordNavigationPreloadRequestHeaderSize(size_t size); - - // Records the reason a service worker was deemed to be offline capable. The - // reason may be that the service worker responded with 2xx..., 3xx..., or the - // check timed out. - static void RecordOfflineCapableReason(blink::ServiceWorkerStatusCode status, - int status_code); }; } // namespace content
diff --git a/content/browser/service_worker/service_worker_offline_capability_checker.cc b/content/browser/service_worker/service_worker_offline_capability_checker.cc index 956e62c..1b92cba3 100644 --- a/content/browser/service_worker/service_worker_offline_capability_checker.cc +++ b/content/browser/service_worker/service_worker_offline_capability_checker.cc
@@ -140,8 +140,6 @@ result == ServiceWorkerFetchDispatcher::FetchEventResult::kGotResponse && (200 <= response->status_code && response->status_code <= 399)) || status == blink::ServiceWorkerStatusCode::kErrorTimeout) { - ServiceWorkerMetrics::RecordOfflineCapableReason(status, - response->status_code); std::move(callback_).Run(OfflineCapability::kSupported, version->registration_id()); } else {
diff --git a/content/browser/webid/federated_auth_navigation_throttle.cc b/content/browser/webid/federated_auth_navigation_throttle.cc index 0518b05..25c49c1 100644 --- a/content/browser/webid/federated_auth_navigation_throttle.cc +++ b/content/browser/webid/federated_auth_navigation_throttle.cc
@@ -54,7 +54,7 @@ std::unique_ptr<NavigationThrottle> FederatedAuthNavigationThrottle::MaybeCreateThrottleFor( NavigationHandle* handle) { - if (!IsFedCmInterceptionEnabled() || !handle->IsInMainFrame()) + if (!IsFedCmInterceptionEnabled() || handle->GetParentFrameOrOuterDocument()) return nullptr; return std::make_unique<FederatedAuthNavigationThrottle>(handle);
diff --git a/content/browser/webid/federated_auth_navigation_throttle_unittest.cc b/content/browser/webid/federated_auth_navigation_throttle_unittest.cc index 7eaa56af..fc30b8b6 100644 --- a/content/browser/webid/federated_auth_navigation_throttle_unittest.cc +++ b/content/browser/webid/federated_auth_navigation_throttle_unittest.cc
@@ -21,6 +21,7 @@ #include "content/public/test/navigation_simulator.h" #include "content/public/test/test_renderer_host.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/blink/public/common/features.h" namespace content { @@ -187,4 +188,47 @@ EXPECT_EQ(test_case.expected_action, throttle->WillStartRequest().action()); } +class ContentSubresourceFilterThrottleManagerFencedFramesTest + : public FederatedAuthNavigationThrottleWithFlagEnabledTest { + public: + ContentSubresourceFilterThrottleManagerFencedFramesTest() { + scoped_feature_list_.InitAndEnableFeatureWithParameters( + blink::features::kFencedFrames, {{"implementation_type", "mparch"}}); + } + ~ContentSubresourceFilterThrottleManagerFencedFramesTest() override = default; + + content::RenderFrameHost* CreateFencedFrame( + content::RenderFrameHost* parent) { + content::RenderFrameHost* fenced_frame = + content::RenderFrameHostTester::For(parent)->AppendFencedFrame(); + return fenced_frame; + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +TEST_F(ContentSubresourceFilterThrottleManagerFencedFramesTest, + BlockThrottleCreationForFencedFrames) { + const GURL kUrl("https://idp.example"); + GURL kFencedFrameUrl("https://child.example"); + + content::RenderFrameHostTester::For(main_rfh()) + ->InitializeRenderFrameIfNeeded(); + RenderFrameHost* fenced_frame_rfh = CreateFencedFrame(main_rfh()); + + MockNavigationHandle top_frame_handle(kUrl, main_rfh()); + MockNavigationHandle fenced_frame_handle(kFencedFrameUrl, fenced_frame_rfh); + + // Should be able to create throttle for the main frame. + auto throttle = FederatedAuthNavigationThrottle::MaybeCreateThrottleFor( + &top_frame_handle); + ASSERT_TRUE(throttle); + + // A throttle should not be allowed for a fenced frame. + throttle = FederatedAuthNavigationThrottle::MaybeCreateThrottleFor( + &fenced_frame_handle); + ASSERT_FALSE(throttle); +} + } // namespace content
diff --git a/content/common/media/cdm_info.cc b/content/common/media/cdm_info.cc index 4f2c0a52..e8dd21a 100644 --- a/content/common/media/cdm_info.cc +++ b/content/common/media/cdm_info.cc
@@ -5,6 +5,7 @@ #include "content/public/common/cdm_info.h" #include "base/check.h" +#include "media/cdm/cdm_type.h" namespace content { @@ -13,10 +14,9 @@ absl::optional<media::CdmCapability> capability, bool supports_sub_key_systems, const std::string& name, - const base::Token& type, + const media::CdmType& type, const base::Version& version, - const base::FilePath& path, - const std::string& file_system_id) + const base::FilePath& path) : key_system(key_system), robustness(robustness), capability(std::move(capability)), @@ -24,15 +24,14 @@ name(name), type(type), version(version), - path(path), - file_system_id(file_system_id) { + path(path) { DCHECK(!this->capability || !this->capability->encryption_schemes.empty()); } CdmInfo::CdmInfo(const std::string& key_system, Robustness robustness, absl::optional<media::CdmCapability> capability, - const base::Token& type) + const media::CdmType& type) : key_system(key_system), robustness(robustness), capability(std::move(capability)),
diff --git a/content/common/sandbox_init_linux.cc b/content/common/sandbox_init_linux.cc index 8184861..d9930f7 100644 --- a/content/common/sandbox_init_linux.cc +++ b/content/common/sandbox_init_linux.cc
@@ -20,10 +20,8 @@ std::move(policy), std::move(proc_fd)); } -#if !defined(OS_NACL_NONSFI) std::unique_ptr<sandbox::bpf_dsl::Policy> GetBPFSandboxBaselinePolicy() { return sandbox::policy::SandboxSeccompBPF::GetBaselinePolicy(); } -#endif // !defined(OS_NACL_NONSFI) } // namespace content
diff --git a/content/common/zygote/sandbox_support_linux.cc b/content/common/zygote/sandbox_support_linux.cc index 4772a34b..b134a0d 100644 --- a/content/common/zygote/sandbox_support_linux.cc +++ b/content/common/zygote/sandbox_support_linux.cc
@@ -7,13 +7,11 @@ #include "base/pickle.h" #include "base/posix/global_descriptors.h" #include "base/posix/unix_domain_socket.h" -#include "build/build_config.h" #include "content/public/common/content_descriptors.h" #include "sandbox/policy/linux/sandbox_linux.h" namespace content { -#if !defined(OS_NACL_NONSFI) int SharedMemoryIPCSupport::MakeSharedMemorySegment(size_t length, bool executable) { base::Pickle request; @@ -29,7 +27,6 @@ return -1; return result_fd; } -#endif int GetSandboxFD() { return kSandboxIPCChannel + base::GlobalDescriptors::kBaseDescriptor;
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityEventsTest.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityEventsTest.java index de8003c1..46b962e 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityEventsTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityEventsTest.java
@@ -827,6 +827,12 @@ @Test @SmallTest + public void test_menuOpenedClosedViaInnerText() { + performTest("menu-opened-closed-via-inner-text.html", EMPTY_EXPECTATIONS_FILE); + } + + @Test + @SmallTest public void test_multipleAriaPropertiesChanged() { performTest("multiple-aria-properties-changed.html", EMPTY_EXPECTATIONS_FILE); }
diff --git a/content/public/common/cdm_info.h b/content/public/common/cdm_info.h index 562c135..4ae430d 100644 --- a/content/public/common/cdm_info.h +++ b/content/public/common/cdm_info.h
@@ -11,15 +11,26 @@ #include "base/files/file_path.h" #include "base/token.h" #include "base/version.h" +#include "build/build_config.h" #include "content/common/content_export.h" #include "media/base/content_decryption_module.h" #include "media/base/encryption_scheme.h" #include "media/base/video_codecs.h" #include "media/cdm/cdm_capability.h" +#include "media/cdm/cdm_type.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace content { +#if defined(OS_CHROMEOS) || BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA) +// TODO(crbug.com/1231162): Remove the string identifier once we've migrated off +// of the PluginPrivateFileSystem. +// CdmType for Chrome OS. +const CONTENT_EXPORT media::CdmType kChromeOsCdmType{ + base::Token{0xa6ecd3fc63b3ded2ull, 0x9306d3270227ce5full}, + "application_chromeos-cdm-factory-daemon"}; +#endif // defined(OS_CHROMEOS) || BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA) + // Represents a Content Decryption Module implementation and its capabilities. struct CONTENT_EXPORT CdmInfo { enum class Robustness { @@ -32,14 +43,13 @@ absl::optional<media::CdmCapability> capability, bool supports_sub_key_systems, const std::string& name, - const base::Token& type, + const media::CdmType& type, const base::Version& version, - const base::FilePath& path, - const std::string& file_system_id); + const base::FilePath& path); CdmInfo(const std::string& key_system, Robustness robustness, absl::optional<media::CdmCapability> capability, - const base::Token& type); + const media::CdmType& type); CdmInfo(const CdmInfo& other); ~CdmInfo(); @@ -67,10 +77,10 @@ // Display name of the CDM (e.g. Widevine Content Decryption Module). std::string name; - // A token to uniquely identify the type of the CDM. Used for per-CDM-type + // An object to uniquely identify the type of the CDM. Used for per-CDM-type // isolation, e.g. for running different CDMs in different child processes, // and per-CDM-type storage. - base::Token type; + media::CdmType type; // Version of the CDM. May be empty if the version is not known. base::Version version; @@ -78,11 +88,6 @@ // Path to the library implementing the CDM. May be empty if the // CDM is not a separate library (e.g. Widevine on Android). base::FilePath path; - - // Identifier used by the PluginPrivateFileSystem to identify the files - // stored by this CDM. Valid identifiers only contain letters (A-Za-z), - // digits(0-9), or "._-". - std::string file_system_id; }; } // namespace content
diff --git a/content/public/common/sandbox_init.h b/content/public/common/sandbox_init.h index 0d950088..7988123f 100644 --- a/content/public/common/sandbox_init.h +++ b/content/public/common/sandbox_init.h
@@ -59,7 +59,7 @@ const base::HandlesToInheritVector& handles_to_inherit, base::Process* process); -#elif defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_NACL_NONSFI) +#elif defined(OS_LINUX) || defined(OS_CHROMEOS) // Initialize a seccomp-bpf sandbox. |policy| may not be NULL. // If an existing layer of sandboxing is present that would prevent access to @@ -73,7 +73,7 @@ // policy that is derived from the baseline. CONTENT_EXPORT std::unique_ptr<sandbox::bpf_dsl::Policy> GetBPFSandboxBaselinePolicy(); -#endif // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_NACL_NONSFI) +#endif // defined(OS_LINUX) || defined(OS_CHROMEOS) } // namespace content
diff --git a/content/public/common/zygote/sandbox_support_linux.h b/content/public/common/zygote/sandbox_support_linux.h index 279f983..3e0bfa4 100644 --- a/content/public/common/zygote/sandbox_support_linux.h +++ b/content/public/common/zygote/sandbox_support_linux.h
@@ -7,14 +7,12 @@ #include <stddef.h> -#include "build/build_config.h" #include "content/common/content_export.h" class NaClListener; namespace content { -#if !defined(OS_NACL_NONSFI) // TODO(crbug.com/982879): Remove this when NaCl is unshipped. class CONTENT_EXPORT SharedMemoryIPCSupport { private: @@ -31,7 +29,6 @@ SharedMemoryIPCSupport() = delete; }; -#endif // Gets the well-known file descriptor on which we expect to find the // sandbox IPC channel.
diff --git a/content/services/auction_worklet/BUILD.gn b/content/services/auction_worklet/BUILD.gn index 4cd7d76..c807632 100644 --- a/content/services/auction_worklet/BUILD.gn +++ b/content/services/auction_worklet/BUILD.gn
@@ -59,6 +59,8 @@ "seller_worklet.h", "trusted_signals.cc", "trusted_signals.h", + "trusted_signals_request_manager.cc", + "trusted_signals_request_manager.h", "worklet_loader.cc", "worklet_loader.h", ] @@ -96,6 +98,7 @@ "bidder_worklet_unittest.cc", "debug_command_queue_unittest.cc", "seller_worklet_unittest.cc", + "trusted_signals_request_manager_unittest.cc", "trusted_signals_unittest.cc", "worklet_devtools_debug_test_util.cc", "worklet_devtools_debug_test_util.h",
diff --git a/content/services/auction_worklet/bidder_worklet.cc b/content/services/auction_worklet/bidder_worklet.cc index 3f8f21a4..e382e36 100644 --- a/content/services/auction_worklet/bidder_worklet.cc +++ b/content/services/auction_worklet/bidder_worklet.cc
@@ -15,6 +15,7 @@ #include "base/callback.h" #include "base/cxx17_backports.h" #include "base/logging.h" +#include "base/memory/scoped_refptr.h" #include "base/strings/strcat.h" #include "base/strings/stringprintf.h" #include "base/time/time.h" @@ -224,7 +225,9 @@ !trusted_bidding_signals_keys_->empty()) { generate_bid_task->trusted_bidding_signals = TrustedSignals::LoadBiddingSignals( - url_loader_factory_.get(), *trusted_bidding_signals_keys_, + url_loader_factory_.get(), + std::set<std::string>(trusted_bidding_signals_keys_->begin(), + trusted_bidding_signals_keys_->end()), top_window_origin.host(), *trusted_bidding_signals_url_, v8_helper_, base::BindOnce(&BidderWorklet::OnTrustedBiddingSignalsDownloaded, base::Unretained(this), generate_bid_task)); @@ -386,7 +389,7 @@ const url::Origin& browser_signal_top_window_origin, const url::Origin& browser_signal_seller_origin, base::Time auction_start_time, - std::unique_ptr<TrustedSignals::Result> trusted_bidding_signals_result, + scoped_refptr<TrustedSignals::Result> trusted_bidding_signals_result, GenerateBidCallbackInternal callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(v8_sequence_checker_); @@ -717,7 +720,7 @@ void BidderWorklet::OnTrustedBiddingSignalsDownloaded( GenerateBidTaskList::iterator task, - std::unique_ptr<TrustedSignals::Result> result, + scoped_refptr<TrustedSignals::Result> result, absl::optional<std::string> error_msg) { DCHECK_CALLED_ON_VALID_SEQUENCE(user_sequence_checker_);
diff --git a/content/services/auction_worklet/bidder_worklet.h b/content/services/auction_worklet/bidder_worklet.h index f481ec2..331005e 100644 --- a/content/services/auction_worklet/bidder_worklet.h +++ b/content/services/auction_worklet/bidder_worklet.h
@@ -102,7 +102,7 @@ // Set while loading is in progress. std::unique_ptr<TrustedSignals> trusted_bidding_signals; // Results of loading trusted bidding signals. - std::unique_ptr<TrustedSignals::Result> trusted_bidding_signals_result; + scoped_refptr<TrustedSignals::Result> trusted_bidding_signals_result; // Error message returned by attempt to load `trusted_bidding_signals_`. // Errors loading it are not fatal, so such errors are cached here and only // reported on bid completion. @@ -165,7 +165,7 @@ const url::Origin& browser_signal_top_window_origin, const url::Origin& browser_signal_seller_origin, base::Time auction_start_time, - std::unique_ptr<TrustedSignals::Result> trusted_bidding_signals_result, + scoped_refptr<TrustedSignals::Result> trusted_bidding_signals_result, GenerateBidCallbackInternal callback); void ConnectDevToolsAgent( @@ -213,7 +213,7 @@ void OnTrustedBiddingSignalsDownloaded( GenerateBidTaskList::iterator task, - std::unique_ptr<TrustedSignals::Result> result, + scoped_refptr<TrustedSignals::Result> result, absl::optional<std::string> error_msg); // Checks if the script has been loaded successfully, and the
diff --git a/content/services/auction_worklet/seller_worklet.cc b/content/services/auction_worklet/seller_worklet.cc index a6b661d..1ebc4f8c 100644 --- a/content/services/auction_worklet/seller_worklet.cc +++ b/content/services/auction_worklet/seller_worklet.cc
@@ -13,6 +13,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/logging.h" +#include "base/memory/scoped_refptr.h" #include "base/strings/strcat.h" #include "base/time/time.h" #include "content/services/auction_worklet/auction_v8_helper.h" @@ -191,8 +192,10 @@ score_ad_task->trusted_scoring_signals = TrustedSignals::LoadScoringSignals( url_loader_factory_.get(), /*render_urls=*/ - std::vector<std::string>{browser_signal_render_url.spec()}, - score_ad_task->browser_signal_ad_components, + std::set<std::string>{browser_signal_render_url.spec()}, + /*ad_component_render_urls=*/ + {score_ad_task->browser_signal_ad_components.begin(), + score_ad_task->browser_signal_ad_components.end()}, browser_signal_top_window_origin.host(), *score_ad_task->auction_config->trusted_scoring_signals_url, v8_helper_, base::BindOnce(&SellerWorklet::OnTrustedScoringSignalsDownloaded, @@ -260,7 +263,7 @@ const std::string& ad_metadata_json, double bid, blink::mojom::AuctionAdConfigPtr auction_config, - std::unique_ptr<TrustedSignals::Result> trusted_scoring_signals, + scoped_refptr<TrustedSignals::Result> trusted_scoring_signals, const url::Origin& browser_signal_top_window_origin, const url::Origin& browser_signal_interest_group_owner, const GURL& browser_signal_render_url, @@ -530,7 +533,7 @@ void SellerWorklet::OnTrustedScoringSignalsDownloaded( ScoreAdTaskList::iterator task, - std::unique_ptr<TrustedSignals::Result> result, + scoped_refptr<TrustedSignals::Result> result, absl::optional<std::string> error_msg) { DCHECK_CALLED_ON_VALID_SEQUENCE(user_sequence_checker_);
diff --git a/content/services/auction_worklet/seller_worklet.h b/content/services/auction_worklet/seller_worklet.h index e5d698c..5464783 100644 --- a/content/services/auction_worklet/seller_worklet.h +++ b/content/services/auction_worklet/seller_worklet.h
@@ -13,6 +13,7 @@ #include <vector> #include "base/callback.h" +#include "base/memory/scoped_refptr.h" #include "base/sequence_checker.h" #include "content/services/auction_worklet/auction_v8_helper.h" #include "content/services/auction_worklet/public/mojom/auction_worklet_service.mojom-forward.h" @@ -128,17 +129,16 @@ void SetWorkletScript(WorkletLoader::Result worklet_script); - void ScoreAd( - const std::string& ad_metadata_json, - double bid, - blink::mojom::AuctionAdConfigPtr auction_config, - std::unique_ptr<TrustedSignals::Result> trusted_scoring_signals, - const url::Origin& browser_signal_top_window_origin, - const url::Origin& browser_signal_interest_group_owner, - const GURL& browser_signal_render_url, - const std::vector<std::string>& browser_signal_ad_components, - uint32_t browser_signal_bidding_duration_msecs, - ScoreAdCallbackInternal callback); + void ScoreAd(const std::string& ad_metadata_json, + double bid, + blink::mojom::AuctionAdConfigPtr auction_config, + scoped_refptr<TrustedSignals::Result> trusted_scoring_signals, + const url::Origin& browser_signal_top_window_origin, + const url::Origin& browser_signal_interest_group_owner, + const GURL& browser_signal_render_url, + const std::vector<std::string>& browser_signal_ad_components, + uint32_t browser_signal_bidding_duration_msecs, + ScoreAdCallbackInternal callback); void ReportResult(blink::mojom::AuctionAdConfigPtr auction_config, const url::Origin& browser_signal_top_window_origin, @@ -196,7 +196,7 @@ // V8 thread. void OnTrustedScoringSignalsDownloaded( ScoreAdTaskList::iterator task, - std::unique_ptr<TrustedSignals::Result> result, + scoped_refptr<TrustedSignals::Result> result, absl::optional<std::string> error_msg); void DeliverScoreAdCallbackOnUserThread(ScoreAdTaskList::iterator task,
diff --git a/content/services/auction_worklet/trusted_signals.cc b/content/services/auction_worklet/trusted_signals.cc index cae5f69..7bf27f0 100644 --- a/content/services/auction_worklet/trusted_signals.cc +++ b/content/services/auction_worklet/trusted_signals.cc
@@ -7,10 +7,12 @@ #include <memory> #include <set> #include <string> +#include <vector> #include "base/bind.h" #include "base/callback.h" #include "base/check.h" +#include "base/memory/scoped_refptr.h" #include "base/strings/strcat.h" #include "base/strings/stringprintf.h" #include "content/services/auction_worklet/auction_downloader.h" @@ -148,8 +150,6 @@ : render_url_json_data_(std::move(render_url_json_data)), ad_component_json_data_(std::move(ad_component_json_data)) {} -TrustedSignals::Result::~Result() = default; - v8::Local<v8::Object> TrustedSignals::Result::GetBiddingSignals( AuctionV8Helper* v8_helper, v8::Local<v8::Context> context, @@ -192,23 +192,23 @@ return out; } +TrustedSignals::Result::~Result() = default; + std::unique_ptr<TrustedSignals> TrustedSignals::LoadBiddingSignals( network::mojom::URLLoaderFactory* url_loader_factory, - const std::vector<std::string>& bidding_signals_keys, + std::set<std::string> bidding_signals_keys, const std::string& hostname, const GURL& trusted_bidding_signals_url, scoped_refptr<AuctionV8Helper> v8_helper, LoadSignalsCallback load_signals_callback) { DCHECK(!bidding_signals_keys.empty()); - std::unique_ptr<TrustedSignals> trusted_signals = - base::WrapUnique(new TrustedSignals( - /*bidding_signals_keys=*/std::set<std::string>( - bidding_signals_keys.begin(), bidding_signals_keys.end()), - /*render_urls=*/absl::nullopt, - /*ad_component_render_urls=*/absl::nullopt, - trusted_bidding_signals_url, std::move(v8_helper), - std::move(load_signals_callback))); + std::unique_ptr<TrustedSignals> trusted_signals = base::WrapUnique( + new TrustedSignals(std::move(bidding_signals_keys), + /*render_urls=*/absl::nullopt, + /*ad_component_render_urls=*/absl::nullopt, + trusted_bidding_signals_url, std::move(v8_helper), + std::move(load_signals_callback))); std::string query_params = "hostname=" + net::EscapeQueryParamValue(hostname, /*use_plus=*/true) + @@ -222,8 +222,8 @@ std::unique_ptr<TrustedSignals> TrustedSignals::LoadScoringSignals( network::mojom::URLLoaderFactory* url_loader_factory, - const std::vector<std::string>& render_urls, - const std::vector<std::string>& ad_component_render_urls, + std::set<std::string> render_urls, + std::set<std::string> ad_component_render_urls, const std::string& hostname, const GURL& trusted_scoring_signals_url, scoped_refptr<AuctionV8Helper> v8_helper, @@ -232,14 +232,9 @@ std::unique_ptr<TrustedSignals> trusted_signals = base::WrapUnique(new TrustedSignals( - /*bidding_signals_keys=*/absl::nullopt, - /*render_urls=*/ - std::set<std::string>(render_urls.begin(), render_urls.end()), - /*ad_component_render_urls=*/ - std::set<std::string>(ad_component_render_urls.begin(), - ad_component_render_urls.end()), - trusted_scoring_signals_url, std::move(v8_helper), - std::move(load_signals_callback))); + /*bidding_signals_keys=*/absl::nullopt, std::move(render_urls), + std::move(ad_component_render_urls), trusted_scoring_signals_url, + std::move(v8_helper), std::move(load_signals_callback))); std::string query_params = "hostname=" + net::EscapeQueryParamValue(hostname, /*use_plus=*/true) + @@ -339,15 +334,15 @@ v8::Local<v8::Object> v8_object = v8_data.As<v8::Object>(); - std::unique_ptr<Result> result; + scoped_refptr<Result> result; if (bidding_signals_keys) { // Handle bidding signals case. - result = std::make_unique<Result>( + result = base::MakeRefCounted<Result>( ParseKeyValueMap(v8_helper.get(), v8_object, *bidding_signals_keys)); } else { // Handle scoring signals case. - result = std::make_unique<Result>( + result = base::MakeRefCounted<Result>( ParseChildKeyValueMap(v8_helper.get(), v8_object, "renderUrls", *render_urls), ParseChildKeyValueMap(v8_helper.get(), v8_object, @@ -362,7 +357,7 @@ void TrustedSignals::PostCallbackToUserThread( scoped_refptr<base::SequencedTaskRunner> user_thread_task_runner, base::WeakPtr<TrustedSignals> weak_instance, - std::unique_ptr<Result> result, + scoped_refptr<Result> result, absl::optional<std::string> error_msg) { user_thread_task_runner->PostTask( FROM_HERE, @@ -371,7 +366,7 @@ } void TrustedSignals::DeliverCallbackOnUserThread( - std::unique_ptr<Result> result, + scoped_refptr<Result> result, absl::optional<std::string> error_msg) { std::move(load_signals_callback_) .Run(std::move(result), std::move(error_msg));
diff --git a/content/services/auction_worklet/trusted_signals.h b/content/services/auction_worklet/trusted_signals.h index 5aeb5c4..10357a3 100644 --- a/content/services/auction_worklet/trusted_signals.h +++ b/content/services/auction_worklet/trusted_signals.h
@@ -12,6 +12,7 @@ #include <vector> #include "base/callback.h" +#include "base/memory/ref_counted.h" #include "base/memory/scoped_refptr.h" #include "services/network/public/mojom/url_loader_factory.mojom-forward.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -43,7 +44,7 @@ // // This can be created and destroyed on any thread, but GetSignals() can only // be used on the V8 thread. - class Result { + class Result : public base::RefCountedThreadSafe<Result> { public: // Constructor for bidding signals. explicit Result(std::map<std::string, std::string> bidder_json_data); @@ -53,9 +54,6 @@ std::map<std::string, std::string> ad_component_json_data); explicit Result(const Result&) = delete; - - ~Result(); - Result& operator=(const Result&) = delete; // Retrieves the trusted bidding signals associated with the passed in keys, @@ -84,16 +82,22 @@ const std::vector<std::string>& ad_component_render_urls) const; private: + friend class base::RefCountedThreadSafe<Result>; + + ~Result(); + // Map of keys to the associated JSON data for trusted bidding signals. - absl::optional<std::map<std::string, std::string>> bidder_json_data_; + const absl::optional<std::map<std::string, std::string>> bidder_json_data_; // Map of keys to the associated JSON data for trusted scoring signals. - absl::optional<std::map<std::string, std::string>> render_url_json_data_; - absl::optional<std::map<std::string, std::string>> ad_component_json_data_; + const absl::optional<std::map<std::string, std::string>> + render_url_json_data_; + const absl::optional<std::map<std::string, std::string>> + ad_component_json_data_; }; using LoadSignalsCallback = - base::OnceCallback<void(std::unique_ptr<Result> result, + base::OnceCallback<void(scoped_refptr<Result> result, absl::optional<std::string> error_msg)>; explicit TrustedSignals(const TrustedSignals&) = delete; @@ -112,7 +116,7 @@ // There are no lifetime constraints of `url_loader_factory`. static std::unique_ptr<TrustedSignals> LoadBiddingSignals( network::mojom::URLLoaderFactory* url_loader_factory, - const std::vector<std::string>& bidding_signals_keys, + std::set<std::string> bidding_signals_keys, const std::string& hostname, const GURL& trusted_bidding_signals_url, scoped_refptr<AuctionV8Helper> v8_helper, @@ -121,8 +125,8 @@ // Just like LoadBiddingSignals() above, but for fetching seller signals. static std::unique_ptr<TrustedSignals> LoadScoringSignals( network::mojom::URLLoaderFactory* url_loader_factory, - const std::vector<std::string>& render_urls, - const std::vector<std::string>& ad_component_render_urls, + std::set<std::string> render_urls, + std::set<std::string> ad_component_render_urls, const std::string& hostname, const GURL& trusted_scoring_signals_url, scoped_refptr<AuctionV8Helper> v8_helper, @@ -161,11 +165,11 @@ static void PostCallbackToUserThread( scoped_refptr<base::SequencedTaskRunner> user_thread_task_runner, base::WeakPtr<TrustedSignals> weak_instance, - std::unique_ptr<Result> result, + scoped_refptr<Result> result, absl::optional<std::string> error_msg); // Called on user thread. - void DeliverCallbackOnUserThread(std::unique_ptr<Result>, + void DeliverCallbackOnUserThread(scoped_refptr<Result>, absl::optional<std::string> error_msg); // Keys being fetched. For bidding signals, only `bidding_signals_keys_` is
diff --git a/content/services/auction_worklet/trusted_signals_request_manager.cc b/content/services/auction_worklet/trusted_signals_request_manager.cc new file mode 100644 index 0000000..e2d9d04 --- /dev/null +++ b/content/services/auction_worklet/trusted_signals_request_manager.cc
@@ -0,0 +1,200 @@ +// 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 "content/services/auction_worklet/trusted_signals_request_manager.h" + +#include <memory> +#include <set> +#include <string> +#include <vector> + +#include "base/callback.h" +#include "base/check.h" +#include "base/containers/unique_ptr_adapters.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" +#include "base/memory/weak_ptr.h" +#include "base/notreached.h" +#include "content/services/auction_worklet/auction_v8_helper.h" +#include "content/services/auction_worklet/trusted_signals.h" +#include "services/network/public/mojom/url_loader_factory.mojom-forward.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "url/gurl.h" +#include "url/origin.h" + +namespace auction_worklet { + +TrustedSignalsRequestManager::TrustedSignalsRequestManager( + Type type, + network::mojom::URLLoaderFactory* url_loader_factory, + const url::Origin& top_level_origin, + const GURL& trusted_signals_url, + AuctionV8Helper* v8_helper) + : type_(type), + url_loader_factory_(url_loader_factory), + top_level_origin_(top_level_origin), + trusted_signals_url_(trusted_signals_url), + v8_helper_(v8_helper) {} + +TrustedSignalsRequestManager::~TrustedSignalsRequestManager() { + // All outstanding Requests should have been destroyed before `this`. + DCHECK(queued_requests_.empty()); + DCHECK(batched_requests_.empty()); +} + +std::unique_ptr<TrustedSignalsRequestManager::Request> +TrustedSignalsRequestManager::RequestBiddingSignals( + const std::vector<std::string>& keys, + LoadSignalsCallback load_signals_callback) { + DCHECK_EQ(Type::kBiddingSignals, type_); + + std::unique_ptr<RequestImpl> request = std::make_unique<RequestImpl>( + this, std::set<std::string>(keys.begin(), keys.end()), + std::move(load_signals_callback)); + queued_requests_.insert(request.get()); + return request; +} + +std::unique_ptr<TrustedSignalsRequestManager::Request> +TrustedSignalsRequestManager::RequestScoringSignals( + const GURL& render_url, + const std::vector<std::string>& ad_component_render_urls, + LoadSignalsCallback load_signals_callback) { + DCHECK_EQ(Type::kScoringSignals, type_); + + std::unique_ptr<RequestImpl> request = std::make_unique<RequestImpl>( + this, render_url, + std::set<std::string>(ad_component_render_urls.begin(), + ad_component_render_urls.end()), + std::move(load_signals_callback)); + queued_requests_.insert(request.get()); + return request; +} + +void TrustedSignalsRequestManager::StartBatchedTrustedSignalsRequest() { + if (queued_requests_.empty()) + return; + + BatchedTrustedSignalsRequest* batched_request = + batched_requests_ + .emplace(std::make_unique<BatchedTrustedSignalsRequest>()) + .first->get(); + batched_request->requests = std::move(queued_requests_); + if (type_ == Type::kBiddingSignals) { + // Append all keys into a single set, and clear each request's list of keys, + // as it's no longer needed. Consumers provide their own list of keys again + // when they request v8 objects from the TrustedSignals::Results returned by + // `this`. + std::set<std::string> keys; + for (RequestImpl* request : batched_request->requests) { + keys.insert(request->bidder_keys_->begin(), request->bidder_keys_->end()); + request->bidder_keys_.reset(); + request->batched_request_ = batched_request; + } + batched_request->trusted_signals = TrustedSignals::LoadBiddingSignals( + url_loader_factory_, std::move(keys), top_level_origin_.host(), + trusted_signals_url_, v8_helper_, + base::BindOnce(&TrustedSignalsRequestManager::OnSignalsLoaded, + base::Unretained(this), batched_request)); + return; + } + + DCHECK_EQ(type_, Type::kScoringSignals); + // Append urls into two sets, and clear each request's URLs, as they're no + // longer needed. + std::set<std::string> render_urls; + std::set<std::string> ad_component_render_urls; + for (RequestImpl* request : batched_request->requests) { + render_urls.insert(request->render_url_->spec()); + ad_component_render_urls.insert(request->ad_component_render_urls_->begin(), + request->ad_component_render_urls_->end()); + request->render_url_.reset(); + request->ad_component_render_urls_.reset(); + request->batched_request_ = batched_request; + } + batched_request->trusted_signals = TrustedSignals::LoadScoringSignals( + url_loader_factory_, std::move(render_urls), + std::move(ad_component_render_urls), top_level_origin_.host(), + trusted_signals_url_, v8_helper_, + base::BindOnce(&TrustedSignalsRequestManager::OnSignalsLoaded, + base::Unretained(this), batched_request)); +} + +TrustedSignalsRequestManager::RequestImpl::RequestImpl( + TrustedSignalsRequestManager* trusted_signals_request_manager, + std::set<std::string> bidder_keys, + LoadSignalsCallback load_signals_callback) + : bidder_keys_(std::move(bidder_keys)), + load_signals_callback_(std::move(load_signals_callback)), + trusted_signals_request_manager_(trusted_signals_request_manager) { + DCHECK(!bidder_keys_->empty()); +} + +TrustedSignalsRequestManager::RequestImpl::RequestImpl( + TrustedSignalsRequestManager* trusted_signals_request_manager, + const GURL& render_url, + std::set<std::string> ad_component_render_urls, + LoadSignalsCallback load_signals_callback) + : render_url_(render_url), + ad_component_render_urls_(std::move(ad_component_render_urls)), + load_signals_callback_(std::move(load_signals_callback)), + trusted_signals_request_manager_(trusted_signals_request_manager) {} + +TrustedSignalsRequestManager::RequestImpl::~RequestImpl() { + if (trusted_signals_request_manager_) + trusted_signals_request_manager_->OnRequestDestroyed(this); +} + +TrustedSignalsRequestManager::BatchedTrustedSignalsRequest:: + BatchedTrustedSignalsRequest() = default; + +TrustedSignalsRequestManager::BatchedTrustedSignalsRequest:: + ~BatchedTrustedSignalsRequest() = default; + +void TrustedSignalsRequestManager::OnSignalsLoaded( + BatchedTrustedSignalsRequest* batched_request, + scoped_refptr<Result> result, + absl::optional<std::string> error_msg) { + DCHECK(batched_requests_.find(batched_request) != batched_requests_.end()); + for (RequestImpl* request : batched_request->requests) { + DCHECK_EQ(request->batched_request_, batched_request); + + // Remove association with `this` and `batched_request` before invoking + // callback, which may destroy the Request. + request->trusted_signals_request_manager_ = nullptr; + request->batched_request_ = nullptr; + + // It is illegal for this this to destroy another request, so + // `batched_request->requests` should not be affected by invoking this, + // other than the current element's pointer potentially now pointing to a + // destroyed object. + std::move(request->load_signals_callback_).Run(result, error_msg); + } + batched_requests_.erase(batched_requests_.find(batched_request)); +} + +void TrustedSignalsRequestManager::OnRequestDestroyed(RequestImpl* request) { + // If the request is not assigned to a BatchedTrustedSignalsRequest, it's + // still in `queued_requests_`, so remove it from that. + if (!request->batched_request_) { + size_t removed = queued_requests_.erase(request); + DCHECK_EQ(removed, 1u); + return; + } + + // Otherwise, it should not be in `queued_requests_`. + DCHECK_EQ(queued_requests_.count(request), 0u); + + // But it should be in the `requests` set of the BatchedTrustedSignalsRequest + // it's pointing to. + size_t removed = request->batched_request_->requests.erase(request); + DCHECK_EQ(removed, 1u); + + // Cancel and delete the corresponding BatchedTrustedSignalsRequest if it's + // no longer associated with any live requests. + if (request->batched_request_->requests.empty()) + batched_requests_.erase(batched_requests_.find(request->batched_request_)); +} + +} // namespace auction_worklet
diff --git a/content/services/auction_worklet/trusted_signals_request_manager.h b/content/services/auction_worklet/trusted_signals_request_manager.h new file mode 100644 index 0000000..eb70c1a --- /dev/null +++ b/content/services/auction_worklet/trusted_signals_request_manager.h
@@ -0,0 +1,194 @@ +// 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 CONTENT_SERVICES_AUCTION_WORKLET_TRUSTED_SIGNALS_REQUEST_MANAGER_H_ +#define CONTENT_SERVICES_AUCTION_WORKLET_TRUSTED_SIGNALS_REQUEST_MANAGER_H_ + +#include <memory> +#include <set> +#include <string> +#include <vector> + +#include "base/callback.h" +#include "base/containers/unique_ptr_adapters.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" +#include "base/memory/weak_ptr.h" +#include "content/services/auction_worklet/trusted_signals.h" +#include "services/network/public/mojom/url_loader_factory.mojom-forward.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "url/gurl.h" +#include "url/origin.h" + +namespace auction_worklet { + +class AuctionV8Helper; +class TrustedSignals; + +// Manages trusted signals requests and responses. Currently only batches +// requests. +// +// TODO(https://crbug.com/1276639): Cache responses as well. +class TrustedSignalsRequestManager { + public: + // Use same callback and result classes as TrustedSignals. + using LoadSignalsCallback = TrustedSignals::LoadSignalsCallback; + using Result = TrustedSignals::Result; + + enum class Type { + kBiddingSignals, + kScoringSignals, + }; + + // Represents a single pending request for TrustedSignals from a consumer. + // Destroying it cancels the request. All live Requests must be destroyed + // before the TrustedSignalsRequestManager used to create them. + // + // It is illegal to destroy other pending Requests when a Request's callback + // is invoked. + class Request { + public: + Request(Request&) = delete; + Request& operator=(Request&) = delete; + virtual ~Request() = default; + + protected: + Request() = default; + }; + + // Creates a TrustedSignalsRequestManager object for a worklet with the + // provided parameters. `type` indicates if this is for bidding or scoring + // signals. A single TrustedSignalsRequestManager object may only be used with + // worklets with a single `trusted_signals_url` and running auctions for a + // single `top_level_origin`. + // + // `url_loader_factory` must remain valid for the lifetime of the + // TrustedSignalsRequestManager. Keeps an owning reference to `v8_helper`. + TrustedSignalsRequestManager( + Type type, + network::mojom::URLLoaderFactory* url_loader_factory, + const url::Origin& top_level_origin, + const GURL& trusted_signals_url, + AuctionV8Helper* v8_helper); + + explicit TrustedSignalsRequestManager(const TrustedSignalsRequestManager&) = + delete; + TrustedSignalsRequestManager& operator=(const TrustedSignalsRequestManager&) = + delete; + + ~TrustedSignalsRequestManager(); + + // Queues a bidding signals request. Does not start a network request until + // StartBatchedTrustedSignalsRequest() is invoked. `this` must be of Type + // kBiddingSignals. + std::unique_ptr<Request> RequestBiddingSignals( + const std::vector<std::string>& keys, + LoadSignalsCallback load_signals_callback); + + // Queues a scoring signals request. Does not start a network request until + // StartBatchedTrustedSignalsRequest() is invoked. `this` must be of Type + // kScoringSignals. + // + // `ad_component_render_urls` are taken as a vector of std::strings so that + // the format matches the one accepted by ScoringSignals::Result, which + // minimizes conversions. + std::unique_ptr<Request> RequestScoringSignals( + const GURL& render_url, + const std::vector<std::string>& ad_component_render_urls, + LoadSignalsCallback load_signals_callback); + + // Starts a single TrustedSignals request for all currently queued Requests. + void StartBatchedTrustedSignalsRequest(); + + private: + struct BatchedTrustedSignalsRequest; + + class RequestImpl : public Request { + public: + RequestImpl(TrustedSignalsRequestManager* trusted_signals_request_manager, + std::set<std::string> bidder_keys, + LoadSignalsCallback load_signals_callback); + + RequestImpl(TrustedSignalsRequestManager* trusted_signals_request_manager, + const GURL& render_urls, + std::set<std::string> ad_component_render_urls, + LoadSignalsCallback load_signals_callback); + + RequestImpl(RequestImpl&) = delete; + RequestImpl& operator=(RequestImpl&) = delete; + ~RequestImpl() override; + + private: + friend class TrustedSignalsRequestManager; + + // Used for requests for bidder signals. Must be non-null and non-empty for + // bidder signals requests, null for scoring signals requests. + absl::optional<std::set<std::string>> bidder_keys_; + + // Used for requests for scoring signals. `render_url_` must be non-null + // and non-empty for scoring signals requests, and + // `ad_component_render_urls_` non-null. Both must be null for bidding + // signals requests. + absl::optional<GURL> render_url_; + // Stored as a std::set for simpler + absl::optional<std::set<std::string>> ad_component_render_urls_; + + LoadSignalsCallback load_signals_callback_; + + // The TrustedSignalsRequestManager that created `this`. Cleared on + // completion. + TrustedSignalsRequestManager* trusted_signals_request_manager_ = nullptr; + + // If this request is currently assigned to a batched request, points to + // that request. nullptr otherwise. + BatchedTrustedSignalsRequest* batched_request_ = nullptr; + }; + + // Manages a single TrustedSignals object, which is associated with one or + // more Requests. Tracks all associated live Requests, and manages invoking + // their callbacks. Only created when a TrustedSignals request is started. + // Lives entirely on the UI thread. + struct BatchedTrustedSignalsRequest { + public: + BatchedTrustedSignalsRequest(); + BatchedTrustedSignalsRequest(BatchedTrustedSignalsRequest&) = delete; + BatchedTrustedSignalsRequest& operator=(BatchedTrustedSignalsRequest&) = + delete; + ~BatchedTrustedSignalsRequest(); + + std::unique_ptr<TrustedSignals> trusted_signals; + + // The batched Requests this is for. + std::set<RequestImpl*> requests; + }; + + void OnSignalsLoaded(BatchedTrustedSignalsRequest* batched_request, + scoped_refptr<Result> result, + absl::optional<std::string> error_msg); + + // Called when a request is destroyed. If it's in `queued_requests_`, removes + // it. If there's a BatchedTrustedSignalsRequest for it, disassociates the + // request with it, cancelling the request if it's no longer needed. + void OnRequestDestroyed(RequestImpl* request); + + const Type type_; + network::mojom::URLLoaderFactory* const url_loader_factory_; + const url::Origin top_level_origin_; + const GURL trusted_signals_url_; + const scoped_refptr<AuctionV8Helper> v8_helper_; + + // All live requests that haven't yet been assigned to a + // BatchedTrustedSignalsRequest. + std::set<RequestImpl*> queued_requests_; + + std::set<std::unique_ptr<BatchedTrustedSignalsRequest>, + base::UniquePtrComparator> + batched_requests_; + + base::WeakPtrFactory<TrustedSignalsRequestManager> weak_ptr_factory{this}; +}; + +} // namespace auction_worklet + +#endif // CONTENT_SERVICES_AUCTION_WORKLET_TRUSTED_SIGNALS_REQUEST_MANAGER_H_
diff --git a/content/services/auction_worklet/trusted_signals_request_manager_unittest.cc b/content/services/auction_worklet/trusted_signals_request_manager_unittest.cc new file mode 100644 index 0000000..5f4cb54 --- /dev/null +++ b/content/services/auction_worklet/trusted_signals_request_manager_unittest.cc
@@ -0,0 +1,836 @@ +// 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 "content/services/auction_worklet/trusted_signals_request_manager.h" + +#include <memory> +#include <string> +#include <utility> +#include <vector> + +#include "base/bind.h" +#include "base/memory/scoped_refptr.h" +#include "base/run_loop.h" +#include "base/synchronization/waitable_event.h" +#include "base/test/bind.h" +#include "base/test/task_environment.h" +#include "content/services/auction_worklet/auction_v8_helper.h" +#include "content/services/auction_worklet/trusted_signals.h" +#include "content/services/auction_worklet/worklet_test_util.h" +#include "net/http/http_status_code.h" +#include "services/network/test/test_url_loader_factory.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" +#include "v8/include/v8-context.h" +#include "v8/include/v8-forward.h" + +namespace auction_worklet { +namespace { + +// Common JSON used for most bidding signals tests. +const char kBaseBiddingJson[] = R"( + { + "key1": 1, + "key2": [2], + "key3": "3" + } +)"; + +// Common JSON used for most scoring signals tests. +const char kBaseScoringJson[] = R"( + { + "renderUrls": { + "https://foo.test/": 1, + "https://bar.test/": [2] + }, + "adComponentRenderUrls": { + "https://foosub.test/": 2, + "https://barsub.test/": [3], + "https://bazsub.test/": "4" + } + } +)"; + +const char kTopLevelOrigin[] = "https://publisher"; + +// Callback for loading signals that stores the result and runs a closure to +// exit a message loop. +void LoadSignalsCallback(scoped_refptr<TrustedSignals::Result>* results_out, + absl::optional<std::string>* error_msg_out, + base::OnceClosure quit_closure, + scoped_refptr<TrustedSignals::Result> result, + absl::optional<std::string> error_msg) { + *results_out = std::move(result); + *error_msg_out = std::move(error_msg); + EXPECT_EQ(results_out->get() == nullptr, error_msg_out->has_value()); + std::move(quit_closure).Run(); +} + +// Callback that should never be invoked, for cancellation tests. +void NeverInvokedLoadSignalsCallback( + scoped_refptr<TrustedSignals::Result> result, + absl::optional<std::string> error_msg) { + ADD_FAILURE() << "This should not be invoked"; +} + +class TrustedSignalsRequestManagerTest : public testing::Test { + public: + TrustedSignalsRequestManagerTest() + : v8_helper_( + AuctionV8Helper::Create(AuctionV8Helper::CreateTaskRunner())), + bidding_request_manager_( + TrustedSignalsRequestManager::Type::kBiddingSignals, + &url_loader_factory_, + url::Origin::Create(GURL(kTopLevelOrigin)), + trusted_signals_url_, + v8_helper_.get()), + scoring_request_manager_( + TrustedSignalsRequestManager::Type::kScoringSignals, + &url_loader_factory_, + url::Origin::Create(GURL(kTopLevelOrigin)), + trusted_signals_url_, + v8_helper_.get()) {} + + ~TrustedSignalsRequestManagerTest() override { + task_environment_.RunUntilIdle(); + } + + // Sets the HTTP response and then fetches bidding signals and waits for + // completion. Returns nullptr on failure. + scoped_refptr<TrustedSignals::Result> FetchBiddingSignalsWithResponse( + const GURL& url, + const std::string& response, + const std::vector<std::string>& trusted_bidding_signals_keys) { + AddJsonResponse(&url_loader_factory_, url, response); + return FetchBiddingSignals(trusted_bidding_signals_keys); + } + + // Fetches bidding signals and waits for completion. Returns nullptr on + // failure. + scoped_refptr<TrustedSignals::Result> FetchBiddingSignals( + const std::vector<std::string>& trusted_bidding_signals_keys) { + scoped_refptr<TrustedSignals::Result> signals; + base::RunLoop run_loop; + auto request = bidding_request_manager_.RequestBiddingSignals( + std::move(trusted_bidding_signals_keys), + base::BindOnce(&LoadSignalsCallback, &signals, &error_msg_, + run_loop.QuitClosure())); + bidding_request_manager_.StartBatchedTrustedSignalsRequest(); + run_loop.Run(); + return signals; + } + + // Sets the HTTP response and then fetches scoring signals and waits for + // completion. Returns nullptr on failure. + scoped_refptr<TrustedSignals::Result> FetchScoringSignalsWithResponse( + const GURL& url, + const std::string& response, + const GURL& render_url, + const std::vector<std::string>& ad_component_render_urls) { + AddJsonResponse(&url_loader_factory_, url, response); + return FetchScoringSignals(render_url, ad_component_render_urls); + } + + // Fetches scoring signals and waits for completion. Returns nullptr on + // failure. + scoped_refptr<TrustedSignals::Result> FetchScoringSignals( + const GURL& render_url, + const std::vector<std::string>& ad_component_render_urls) { + scoped_refptr<TrustedSignals::Result> signals; + base::RunLoop run_loop; + auto request = scoring_request_manager_.RequestScoringSignals( + render_url, ad_component_render_urls, + base::BindOnce(&LoadSignalsCallback, &signals, &error_msg_, + run_loop.QuitClosure())); + scoring_request_manager_.StartBatchedTrustedSignalsRequest(); + run_loop.Run(); + return signals; + } + + // Returns the results of calling TrustedSignals::Result::GetBiddingSignals() + // with `trusted_bidding_signals_keys`. Returns value as a JSON std::string, + // for easy testing. + std::string ExtractBiddingSignals( + TrustedSignals::Result* signals, + std::vector<std::string> trusted_bidding_signals_keys) { + base::RunLoop run_loop; + + std::string result; + v8_helper_->v8_runner()->PostTask( + FROM_HERE, base::BindLambdaForTesting([&]() { + AuctionV8Helper::FullIsolateScope isolate_scope(v8_helper_.get()); + v8::Isolate* isolate = v8_helper_->isolate(); + // Could use the scratch context, but using a separate one more + // closely resembles actual use. + v8::Local<v8::Context> context = v8::Context::New(isolate); + v8::Context::Scope context_scope(context); + + v8::Local<v8::Value> value = signals->GetBiddingSignals( + v8_helper_.get(), context, trusted_bidding_signals_keys); + + if (!v8_helper_->ExtractJson(context, value, &result)) { + result = "JSON extraction failed."; + } + run_loop.Quit(); + })); + run_loop.Run(); + return result; + } + + // Returns the results of calling TrustedSignals::Result::GetScoringSignals() + // with the provided parameters. Returns value as a JSON std::string, for easy + // testing. + std::string ExtractScoringSignals( + TrustedSignals::Result* signals, + const GURL& render_url, + const std::vector<std::string>& ad_component_render_urls) { + base::RunLoop run_loop; + + std::string result; + v8_helper_->v8_runner()->PostTask( + FROM_HERE, base::BindLambdaForTesting([&]() { + AuctionV8Helper::FullIsolateScope isolate_scope(v8_helper_.get()); + v8::Isolate* isolate = v8_helper_->isolate(); + // Could use the scratch context, but using a separate one more + // closely resembles actual use. + v8::Local<v8::Context> context = v8::Context::New(isolate); + v8::Context::Scope context_scope(context); + + v8::Local<v8::Value> value = signals->GetScoringSignals( + v8_helper_.get(), context, render_url, ad_component_render_urls); + + if (!v8_helper_->ExtractJson(context, value, &result)) { + result = "JSON extraction failed."; + } + run_loop.Quit(); + })); + run_loop.Run(); + return result; + } + + protected: + base::test::TaskEnvironment task_environment_; + + // URL without query params attached. + const GURL trusted_signals_url_ = GURL("https://url.test/"); + + // The fetch helpers store the most recent error message, if any, here. + absl::optional<std::string> error_msg_; + + network::TestURLLoaderFactory url_loader_factory_; + scoped_refptr<AuctionV8Helper> v8_helper_; + TrustedSignalsRequestManager bidding_request_manager_; + TrustedSignalsRequestManager scoring_request_manager_; +}; + +TEST_F(TrustedSignalsRequestManagerTest, BiddingSignalsError) { + url_loader_factory_.AddResponse( + "https://url.test/?hostname=publisher&keys=key1", kBaseBiddingJson, + net::HTTP_NOT_FOUND); + EXPECT_FALSE(FetchBiddingSignals({"key1"})); + EXPECT_EQ( + "Failed to load https://url.test/?hostname=publisher&keys=key1 " + "HTTP status = 404 Not Found.", + error_msg_); +} + +TEST_F(TrustedSignalsRequestManagerTest, ScoringSignalsError) { + url_loader_factory_.AddResponse( + "https://url.test/" + "?hostname=publisher&renderUrls=https%3A%2F%2Ffoo.test%2F", + kBaseScoringJson, net::HTTP_NOT_FOUND); + EXPECT_FALSE(FetchScoringSignals(GURL("https://foo.test/"), + /*ad_component_render_urls=*/{})); + EXPECT_EQ( + "Failed to load " + "https://url.test/" + "?hostname=publisher&renderUrls=https%3A%2F%2Ffoo.test%2F " + "HTTP status = 404 Not Found.", + error_msg_); +} + +TEST_F(TrustedSignalsRequestManagerTest, BiddingSignalsBatchedRequestError) { + url_loader_factory_.AddResponse( + "https://url.test/?hostname=publisher&keys=key1,key2", kBaseBiddingJson, + net::HTTP_NOT_FOUND); + + base::RunLoop run_loop1; + scoped_refptr<TrustedSignals::Result> signals1; + absl::optional<std::string> error_msg1; + auto request1 = bidding_request_manager_.RequestBiddingSignals( + {"key1"}, base::BindOnce(&LoadSignalsCallback, &signals1, &error_msg1, + run_loop1.QuitClosure())); + + base::RunLoop run_loop2; + scoped_refptr<TrustedSignals::Result> signals2; + absl::optional<std::string> error_msg2; + auto request2 = bidding_request_manager_.RequestBiddingSignals( + {"key2"}, base::BindOnce(&LoadSignalsCallback, &signals2, &error_msg2, + run_loop2.QuitClosure())); + + bidding_request_manager_.StartBatchedTrustedSignalsRequest(); + + const char kExpectedError[] = + "Failed to load https://url.test/?hostname=publisher&keys=key1,key2 " + "HTTP status = 404 Not Found."; + + run_loop1.Run(); + EXPECT_FALSE(signals1); + EXPECT_EQ(kExpectedError, error_msg1); + + run_loop2.Run(); + EXPECT_FALSE(signals2); + EXPECT_EQ(kExpectedError, error_msg2); +} + +TEST_F(TrustedSignalsRequestManagerTest, ScoringSignalsBatchedRequestError) { + url_loader_factory_.AddResponse( + "https://url.test/?hostname=publisher&" + "renderUrls=https%3A%2F%2Fbar.test%2F,https%3A%2F%2Ffoo.test%2F", + kBaseScoringJson, net::HTTP_NOT_FOUND); + + base::RunLoop run_loop1; + scoped_refptr<TrustedSignals::Result> signals1; + absl::optional<std::string> error_msg1; + auto request1 = scoring_request_manager_.RequestScoringSignals( + GURL("https://foo.test/"), + /*ad_component_render_urls=*/{}, + base::BindOnce(&LoadSignalsCallback, &signals1, &error_msg1, + run_loop1.QuitClosure())); + + base::RunLoop run_loop2; + scoped_refptr<TrustedSignals::Result> signals2; + absl::optional<std::string> error_msg2; + auto request2 = scoring_request_manager_.RequestScoringSignals( + GURL("https://bar.test/"), + /*ad_component_render_urls=*/{}, + base::BindOnce(&LoadSignalsCallback, &signals2, &error_msg2, + run_loop2.QuitClosure())); + + scoring_request_manager_.StartBatchedTrustedSignalsRequest(); + + const char kExpectedError[] = + "Failed to load https://url.test/?hostname=publisher" + "&renderUrls=https%3A%2F%2Fbar.test%2F,https%3A%2F%2Ffoo.test%2F " + "HTTP status = 404 Not Found."; + + run_loop1.Run(); + EXPECT_FALSE(signals1); + EXPECT_EQ(kExpectedError, error_msg1); + + run_loop2.Run(); + EXPECT_FALSE(signals2); + EXPECT_EQ(kExpectedError, error_msg2); +} + +TEST_F(TrustedSignalsRequestManagerTest, BiddingSignalsOneRequest) { + const std::vector<std::string> kKeys{"key2", "key1"}; + scoped_refptr<TrustedSignals::Result> signals = + FetchBiddingSignalsWithResponse( + GURL("https://url.test/?hostname=publisher&keys=key1,key2"), + kBaseBiddingJson, kKeys); + ASSERT_TRUE(signals); + EXPECT_FALSE(error_msg_.has_value()); + EXPECT_EQ(R"({"key2":[2],"key1":1})", + ExtractBiddingSignals(signals.get(), kKeys)); +} + +TEST_F(TrustedSignalsRequestManagerTest, ScoringSignalsOneRequest) { + const GURL kRenderUrl = GURL("https://foo.test/"); + const std::vector<std::string> kAdComponentRenderUrls{ + "https://foosub.test/", "https://barsub.test/", "https://bazsub.test/"}; + // URLs are currently added in lexical order. + scoped_refptr<TrustedSignals::Result> signals = + FetchScoringSignalsWithResponse( + GURL("https://url.test/?hostname=publisher" + "&renderUrls=https%3A%2F%2Ffoo.test%2F" + "&adComponentRenderUrls=https%3A%2F%2Fbarsub.test%2F," + "https%3A%2F%2Fbazsub.test%2F,https%3A%2F%2Ffoosub.test%2F"), + kBaseScoringJson, kRenderUrl, kAdComponentRenderUrls); + ASSERT_TRUE(signals); + EXPECT_FALSE(error_msg_.has_value()); + EXPECT_EQ( + R"({"renderUrl":{"https://foo.test/":1},")" + R"(adComponentRenderUrls":{"https://foosub.test/":2,)" + R"("https://barsub.test/":[3],"https://bazsub.test/":"4"}})", + ExtractScoringSignals(signals.get(), kRenderUrl, kAdComponentRenderUrls)); +} + +TEST_F(TrustedSignalsRequestManagerTest, BiddingSignalsSequentialRequests) { + // Use partially overlapping keys, to cover both the shared and distinct key + // cases. + const std::vector<std::string> kKeys1{"key1", "key3"}; + const std::vector<std::string> kKeys2{"key2", "key3"}; + + // Note that these responses use different values for the shared key. + scoped_refptr<TrustedSignals::Result> signals1 = + FetchBiddingSignalsWithResponse( + GURL("https://url.test/?hostname=publisher&keys=key1,key3"), + R"({"key1":1,"key3":3})", kKeys1); + ASSERT_TRUE(signals1); + EXPECT_FALSE(error_msg_.has_value()); + EXPECT_EQ(R"({"key1":1,"key3":3})", + ExtractBiddingSignals(signals1.get(), kKeys1)); + + scoped_refptr<TrustedSignals::Result> signals2 = + FetchBiddingSignalsWithResponse( + GURL("https://url.test/?hostname=publisher&keys=key2,key3"), + R"({"key2":[2],"key3":[3]})", kKeys2); + ASSERT_TRUE(signals1); + EXPECT_FALSE(error_msg_.has_value()); + EXPECT_EQ(R"({"key2":[2],"key3":[3]})", + ExtractBiddingSignals(signals2.get(), kKeys2)); +} + +TEST_F(TrustedSignalsRequestManagerTest, ScoringSignalsSequentialRequests) { + // Use partially overlapping keys, to cover both the shared and distinct key + // cases. + + const GURL kRenderUrl1 = GURL("https://foo.test/"); + const std::vector<std::string> kAdComponentRenderUrls1{ + "https://foosub.test/", "https://bazsub.test/"}; + + const GURL kRenderUrl2 = GURL("https://bar.test/"); + const std::vector<std::string> kAdComponentRenderUrls2{ + "https://barsub.test/", "https://bazsub.test/"}; + + // Note that these responses use different values for the shared key. + scoped_refptr<TrustedSignals::Result> signals1 = + FetchScoringSignalsWithResponse( + GURL("https://url.test/?hostname=publisher" + "&renderUrls=https%3A%2F%2Ffoo.test%2F" + "&adComponentRenderUrls=https%3A%2F%2Fbazsub.test%2F," + "https%3A%2F%2Ffoosub.test%2F"), + R"( +{ + "renderUrls": { + "https://foo.test/": 1 + }, + "adComponentRenderUrls": { + "https://foosub.test/": 2, + "https://bazsub.test/": 3 + } +} + )", + kRenderUrl1, kAdComponentRenderUrls1); + ASSERT_TRUE(signals1); + EXPECT_FALSE(error_msg_.has_value()); + EXPECT_EQ(R"({"renderUrl":{"https://foo.test/":1},")" + R"(adComponentRenderUrls":{"https://foosub.test/":2,)" + R"("https://bazsub.test/":3}})", + ExtractScoringSignals(signals1.get(), kRenderUrl1, + kAdComponentRenderUrls1)); + + scoped_refptr<TrustedSignals::Result> signals2 = + FetchScoringSignalsWithResponse( + GURL("https://url.test/?hostname=publisher" + "&renderUrls=https%3A%2F%2Fbar.test%2F" + "&adComponentRenderUrls=https%3A%2F%2Fbarsub.test%2F," + "https%3A%2F%2Fbazsub.test%2F"), + R"( +{ + "renderUrls": { + "https://bar.test/": 4 + }, + "adComponentRenderUrls": { + "https://barsub.test/": 5, + "https://bazsub.test/": 6 + } +} + )", + kRenderUrl2, kAdComponentRenderUrls2); + ASSERT_TRUE(signals2); + EXPECT_FALSE(error_msg_.has_value()); + EXPECT_EQ(R"({"renderUrl":{"https://bar.test/":4},")" + R"(adComponentRenderUrls":{"https://barsub.test/":5,)" + R"("https://bazsub.test/":6}})", + ExtractScoringSignals(signals2.get(), kRenderUrl2, + kAdComponentRenderUrls2)); +} + +// Test the case where there are multiple network requests live at once. +TEST_F(TrustedSignalsRequestManagerTest, + BiddingSignalsSimultaneousNetworkRequests) { + // Use partially overlapping keys, to cover both the shared and distinct key + // cases. + + const std::vector<std::string> kKeys1{"key1", "key3"}; + const GURL kUrl1 = + GURL("https://url.test/?hostname=publisher&keys=key1,key3"); + + const std::vector<std::string> kKeys2{"key2", "key3"}; + const GURL kUrl2 = + GURL("https://url.test/?hostname=publisher&keys=key2,key3"); + + base::RunLoop run_loop1; + scoped_refptr<TrustedSignals::Result> signals1; + absl::optional<std::string> error_msg1; + auto request1 = bidding_request_manager_.RequestBiddingSignals( + kKeys1, base::BindOnce(&LoadSignalsCallback, &signals1, &error_msg1, + run_loop1.QuitClosure())); + + bidding_request_manager_.StartBatchedTrustedSignalsRequest(); + + base::RunLoop run_loop2; + scoped_refptr<TrustedSignals::Result> signals2; + absl::optional<std::string> error_msg2; + auto request2 = bidding_request_manager_.RequestBiddingSignals( + kKeys2, base::BindOnce(&LoadSignalsCallback, &signals2, &error_msg2, + run_loop2.QuitClosure())); + + bidding_request_manager_.StartBatchedTrustedSignalsRequest(); + + base::RunLoop().RunUntilIdle(); + + ASSERT_TRUE(url_loader_factory_.IsPending(kUrl1.spec())); + ASSERT_TRUE(url_loader_factory_.IsPending(kUrl2.spec())); + + // Note that these responses use different values for the shared key. + AddJsonResponse(&url_loader_factory_, kUrl1, R"({"key1":1,"key3":3})"); + AddJsonResponse(&url_loader_factory_, kUrl2, R"({"key2":[2],"key3":[3]})"); + + run_loop1.Run(); + EXPECT_FALSE(error_msg1); + ASSERT_TRUE(signals1); + EXPECT_EQ(R"({"key1":1,"key3":3})", + ExtractBiddingSignals(signals1.get(), kKeys1)); + + run_loop2.Run(); + EXPECT_FALSE(error_msg2); + ASSERT_TRUE(signals2); + EXPECT_EQ(R"({"key2":[2],"key3":[3]})", + ExtractBiddingSignals(signals2.get(), kKeys2)); +} + +// Test the case where there are multiple network requests live at once. +TEST_F(TrustedSignalsRequestManagerTest, + ScoringSignalsSimultaneousNetworkRequests) { + // Use partially overlapping keys, to cover both the shared and distinct key + // cases. + + const GURL kRenderUrl1 = GURL("https://foo.test/"); + const std::vector<std::string> kAdComponentRenderUrls1{ + "https://foosub.test/", "https://bazsub.test/"}; + const GURL kSignalsUrl1 = GURL( + "https://url.test/?hostname=publisher" + "&renderUrls=https%3A%2F%2Ffoo.test%2F" + "&adComponentRenderUrls=https%3A%2F%2Fbazsub.test%2F," + "https%3A%2F%2Ffoosub.test%2F"); + const GURL kRenderUrl2 = GURL("https://bar.test/"); + const std::vector<std::string> kAdComponentRenderUrls2{ + "https://barsub.test/", "https://bazsub.test/"}; + const GURL kSignalsUrl2 = GURL( + "https://url.test/?hostname=publisher" + "&renderUrls=https%3A%2F%2Fbar.test%2F" + "&adComponentRenderUrls=https%3A%2F%2Fbarsub.test%2F," + "https%3A%2F%2Fbazsub.test%2F"); + + base::RunLoop run_loop1; + scoped_refptr<TrustedSignals::Result> signals1; + absl::optional<std::string> error_msg1; + auto request1 = scoring_request_manager_.RequestScoringSignals( + kRenderUrl1, kAdComponentRenderUrls1, + base::BindOnce(&LoadSignalsCallback, &signals1, &error_msg1, + run_loop1.QuitClosure())); + + scoring_request_manager_.StartBatchedTrustedSignalsRequest(); + + base::RunLoop run_loop2; + scoped_refptr<TrustedSignals::Result> signals2; + absl::optional<std::string> error_msg2; + auto request2 = scoring_request_manager_.RequestScoringSignals( + kRenderUrl2, kAdComponentRenderUrls2, + base::BindOnce(&LoadSignalsCallback, &signals2, &error_msg2, + run_loop2.QuitClosure())); + + scoring_request_manager_.StartBatchedTrustedSignalsRequest(); + + base::RunLoop().RunUntilIdle(); + + ASSERT_TRUE(url_loader_factory_.IsPending(kSignalsUrl1.spec())); + ASSERT_TRUE(url_loader_factory_.IsPending(kSignalsUrl2.spec())); + + // Note that these responses use different values for the shared key. + + AddJsonResponse(&url_loader_factory_, kSignalsUrl1, R"( +{ + "renderUrls": { + "https://foo.test/": 1 + }, + "adComponentRenderUrls": { + "https://foosub.test/": 2, + "https://bazsub.test/": 3 + } +} + )"); + + AddJsonResponse(&url_loader_factory_, kSignalsUrl2, R"( +{ + "renderUrls": { + "https://bar.test/": 4 + }, + "adComponentRenderUrls": { + "https://barsub.test/": 5, + "https://bazsub.test/": 6 + } +} + )"); + + run_loop1.Run(); + EXPECT_FALSE(error_msg1); + ASSERT_TRUE(signals1); + EXPECT_EQ(R"({"renderUrl":{"https://foo.test/":1},")" + R"(adComponentRenderUrls":{"https://foosub.test/":2,)" + R"("https://bazsub.test/":3}})", + ExtractScoringSignals(signals1.get(), kRenderUrl1, + kAdComponentRenderUrls1)); + + run_loop2.Run(); + EXPECT_FALSE(error_msg2); + ASSERT_TRUE(signals2); + EXPECT_EQ(R"({"renderUrl":{"https://bar.test/":4},")" + R"(adComponentRenderUrls":{"https://barsub.test/":5,)" + R"("https://bazsub.test/":6}})", + ExtractScoringSignals(signals2.get(), kRenderUrl2, + kAdComponentRenderUrls2)); +} + +TEST_F(TrustedSignalsRequestManagerTest, BiddingSignalsBatchedRequests) { + // Use partially overlapping keys, to cover both the shared and distinct key + // cases. + const std::vector<std::string> kKeys1{"key1", "key3"}; + const std::vector<std::string> kKeys2{"key2", "key3"}; + + AddJsonResponse( + &url_loader_factory_, + GURL("https://url.test/?hostname=publisher&keys=key1,key2,key3"), + kBaseBiddingJson); + + base::RunLoop run_loop1; + scoped_refptr<TrustedSignals::Result> signals1; + absl::optional<std::string> error_msg1; + auto request1 = bidding_request_manager_.RequestBiddingSignals( + kKeys1, base::BindOnce(&LoadSignalsCallback, &signals1, &error_msg1, + run_loop1.QuitClosure())); + + base::RunLoop run_loop2; + scoped_refptr<TrustedSignals::Result> signals2; + absl::optional<std::string> error_msg2; + auto request2 = bidding_request_manager_.RequestBiddingSignals( + kKeys2, base::BindOnce(&LoadSignalsCallback, &signals2, &error_msg2, + run_loop2.QuitClosure())); + + bidding_request_manager_.StartBatchedTrustedSignalsRequest(); + + run_loop1.Run(); + EXPECT_FALSE(error_msg1); + ASSERT_TRUE(signals1); + EXPECT_EQ(R"({"key1":1,"key3":"3"})", + ExtractBiddingSignals(signals1.get(), kKeys1)); + + run_loop2.Run(); + EXPECT_FALSE(error_msg2); + ASSERT_TRUE(signals2); + EXPECT_EQ(R"({"key2":[2],"key3":"3"})", + ExtractBiddingSignals(signals2.get(), kKeys2)); +} + +TEST_F(TrustedSignalsRequestManagerTest, ScoringSignalsBatchedRequests) { + // Use partially overlapping keys, to cover both the shared and distinct key + // cases. + const GURL kRenderUrl1 = GURL("https://foo.test/"); + const std::vector<std::string> kAdComponentRenderUrls1{ + "https://foosub.test/", "https://bazsub.test/"}; + + const GURL kRenderUrl2 = GURL("https://bar.test/"); + const std::vector<std::string> kAdComponentRenderUrls2{ + "https://barsub.test/", "https://bazsub.test/"}; + + const GURL kRenderUrl3 = GURL("https://foo.test/"); + const std::vector<std::string> kAdComponentRenderUrls3{}; + + AddJsonResponse( + &url_loader_factory_, + GURL("https://url.test/?hostname=publisher" + "&renderUrls=https%3A%2F%2Fbar.test%2F,https%3A%2F%2Ffoo.test%2F" + "&adComponentRenderUrls=https%3A%2F%2Fbarsub.test%2F," + "https%3A%2F%2Fbazsub.test%2F,https%3A%2F%2Ffoosub.test%2F"), + kBaseScoringJson); + + base::RunLoop run_loop1; + scoped_refptr<TrustedSignals::Result> signals1; + absl::optional<std::string> error_msg1; + auto request1 = scoring_request_manager_.RequestScoringSignals( + kRenderUrl1, kAdComponentRenderUrls1, + base::BindOnce(&LoadSignalsCallback, &signals1, &error_msg1, + run_loop1.QuitClosure())); + + base::RunLoop run_loop2; + scoped_refptr<TrustedSignals::Result> signals2; + absl::optional<std::string> error_msg2; + auto request2 = scoring_request_manager_.RequestScoringSignals( + kRenderUrl2, kAdComponentRenderUrls2, + base::BindOnce(&LoadSignalsCallback, &signals2, &error_msg2, + run_loop2.QuitClosure())); + + base::RunLoop run_loop3; + scoped_refptr<TrustedSignals::Result> signals3; + absl::optional<std::string> error_msg3; + auto request3 = scoring_request_manager_.RequestScoringSignals( + kRenderUrl3, kAdComponentRenderUrls3, + base::BindOnce(&LoadSignalsCallback, &signals3, &error_msg3, + run_loop3.QuitClosure())); + + scoring_request_manager_.StartBatchedTrustedSignalsRequest(); + + run_loop1.Run(); + EXPECT_FALSE(error_msg1); + ASSERT_TRUE(signals1); + EXPECT_EQ(R"({"renderUrl":{"https://foo.test/":1},")" + R"(adComponentRenderUrls":{"https://foosub.test/":2,)" + R"("https://bazsub.test/":"4"}})", + ExtractScoringSignals(signals1.get(), kRenderUrl1, + kAdComponentRenderUrls1)); + + run_loop2.Run(); + EXPECT_FALSE(error_msg2); + ASSERT_TRUE(signals2); + EXPECT_EQ(R"({"renderUrl":{"https://bar.test/":[2]},")" + R"(adComponentRenderUrls":{"https://barsub.test/":[3],)" + R"("https://bazsub.test/":"4"}})", + ExtractScoringSignals(signals2.get(), kRenderUrl2, + kAdComponentRenderUrls2)); + + run_loop3.Run(); + EXPECT_FALSE(error_msg3); + ASSERT_TRUE(signals3); + EXPECT_EQ(R"({"renderUrl":{"https://foo.test/":1}})", + ExtractScoringSignals(signals3.get(), kRenderUrl3, + kAdComponentRenderUrls3)); +} + +// Make two requests, cancel both, then try to start a network request. No +// requests should be made. Only test bidders, since sellers have no significant +// differences in this path. +TEST_F(TrustedSignalsRequestManagerTest, CancelAllQueuedRequests) { + const std::vector<std::string> kKeys1{"key1"}; + const std::vector<std::string> kKeys2{"key2"}; + + auto request1 = bidding_request_manager_.RequestBiddingSignals( + kKeys1, base::BindOnce(&NeverInvokedLoadSignalsCallback)); + auto request2 = bidding_request_manager_.RequestBiddingSignals( + kKeys2, base::BindOnce(&NeverInvokedLoadSignalsCallback)); + + request1.reset(); + request2.reset(); + + bidding_request_manager_.StartBatchedTrustedSignalsRequest(); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(0, url_loader_factory_.NumPending()); +} + +// Make two requests, cancel the first one, then try to start a network request. +// A request should be made, but only for the key in the request that was not +// cancelled. Only test bidders, since sellers have no significant differences +// in this path. +TEST_F(TrustedSignalsRequestManagerTest, CancelOneRequest) { + const std::vector<std::string> kKeys1{"key1"}; + const std::vector<std::string> kKeys2{"key2"}; + + // The request for `key1` will be cancelled before the network request is + // created. + AddJsonResponse(&url_loader_factory_, + GURL("https://url.test/?hostname=publisher&keys=key2"), + kBaseBiddingJson); + + auto request1 = bidding_request_manager_.RequestBiddingSignals( + kKeys1, base::BindOnce(&NeverInvokedLoadSignalsCallback)); + + base::RunLoop run_loop2; + scoped_refptr<TrustedSignals::Result> signals2; + absl::optional<std::string> error_msg2; + auto request2 = bidding_request_manager_.RequestBiddingSignals( + kKeys2, base::BindOnce(&LoadSignalsCallback, &signals2, &error_msg2, + run_loop2.QuitClosure())); + + request1.reset(); + + bidding_request_manager_.StartBatchedTrustedSignalsRequest(); + base::RunLoop().RunUntilIdle(); + + run_loop2.Run(); + EXPECT_FALSE(error_msg2); + ASSERT_TRUE(signals2); + EXPECT_EQ(R"({"key2":[2]})", ExtractBiddingSignals(signals2.get(), kKeys2)); +} + +// Make two requests, try to start a network request, then cancel both requests. +// The network request should be cancelled. Only test bidders, since sellers +// have no significant differences in this path. +TEST_F(TrustedSignalsRequestManagerTest, CancelAllLiveRequests) { + const std::vector<std::string> kKeys1{"key1"}; + const std::vector<std::string> kKeys2{"key2"}; + const GURL kSignalsUrl = + GURL("https://url.test/?hostname=publisher&keys=key1,key2"); + + auto request1 = bidding_request_manager_.RequestBiddingSignals( + kKeys1, base::BindOnce(&NeverInvokedLoadSignalsCallback)); + auto request2 = bidding_request_manager_.RequestBiddingSignals( + kKeys2, base::BindOnce(&NeverInvokedLoadSignalsCallback)); + + // Wait for network request to be made, which should include both keys in the + // URLs. + bidding_request_manager_.StartBatchedTrustedSignalsRequest(); + base::RunLoop().RunUntilIdle(); + ASSERT_TRUE(url_loader_factory_.IsPending(kSignalsUrl.spec())); + + // Cancel both requests, which should cancel the network request. + request1.reset(); + request2.reset(); + base::RunLoop().RunUntilIdle(); + EXPECT_FALSE( + (*url_loader_factory_.pending_requests())[0].client.is_connected()); +} + +// Make two requests, try to start a network request, then cancel the first one. +// The request that was not cancelled should complete normally. Only test +// bidders, since sellers have no significant differences in this path. +TEST_F(TrustedSignalsRequestManagerTest, CancelOneLiveRequest) { + const std::vector<std::string> kKeys1{"key1"}; + const std::vector<std::string> kKeys2{"key2"}; + const GURL kSignalsUrl = + GURL("https://url.test/?hostname=publisher&keys=key1,key2"); + + auto request1 = bidding_request_manager_.RequestBiddingSignals( + kKeys1, base::BindOnce(&NeverInvokedLoadSignalsCallback)); + + base::RunLoop run_loop2; + scoped_refptr<TrustedSignals::Result> signals2; + absl::optional<std::string> error_msg2; + auto request2 = bidding_request_manager_.RequestBiddingSignals( + kKeys2, base::BindOnce(&LoadSignalsCallback, &signals2, &error_msg2, + run_loop2.QuitClosure())); + + // Wait for network request to be made, which should include both keys in the + // URLs. + bidding_request_manager_.StartBatchedTrustedSignalsRequest(); + base::RunLoop().RunUntilIdle(); + ASSERT_TRUE(url_loader_factory_.IsPending(kSignalsUrl.spec())); + + // Cancel `request1` and then serve the JSON. + request1.reset(); + AddJsonResponse(&url_loader_factory_, kSignalsUrl, kBaseBiddingJson); + + // `request2` should still complete. + run_loop2.Run(); + EXPECT_FALSE(error_msg2); + ASSERT_TRUE(signals2); + EXPECT_EQ(R"({"key2":[2]})", ExtractBiddingSignals(signals2.get(), kKeys2)); + + // The callback of `request1` should not be invoked, since it was cancelled. + base::RunLoop().RunUntilIdle(); +} + +} // namespace +} // namespace auction_worklet
diff --git a/content/services/auction_worklet/trusted_signals_unittest.cc b/content/services/auction_worklet/trusted_signals_unittest.cc index 2babf9b..aad7fc7f 100644 --- a/content/services/auction_worklet/trusted_signals_unittest.cc +++ b/content/services/auction_worklet/trusted_signals_unittest.cc
@@ -4,11 +4,14 @@ #include "content/services/auction_worklet/trusted_signals.h" +#include <memory> +#include <set> #include <string> #include <utility> #include <vector> #include "base/bind.h" +#include "base/memory/scoped_refptr.h" #include "base/run_loop.h" #include "base/synchronization/waitable_event.h" #include "base/test/bind.h" @@ -69,26 +72,27 @@ // Sets the HTTP response and then fetches bidding signals and waits for // completion. Returns nullptr on failure. - std::unique_ptr<TrustedSignals::Result> FetchBiddingSignalsWithResponse( + scoped_refptr<TrustedSignals::Result> FetchBiddingSignalsWithResponse( const GURL& url, const std::string& response, - std::vector<std::string> trusted_bidding_signals_keys, + std::set<std::string> trusted_bidding_signals_keys, const std::string& hostname) { AddJsonResponse(&url_loader_factory_, url, response); - return FetchBiddingSignals(trusted_bidding_signals_keys, hostname); + return FetchBiddingSignals(std::move(trusted_bidding_signals_keys), + hostname); } // Fetches bidding signals and waits for completion. Returns nullptr on // failure. - std::unique_ptr<TrustedSignals::Result> FetchBiddingSignals( - std::vector<std::string> trusted_bidding_signals_keys, + scoped_refptr<TrustedSignals::Result> FetchBiddingSignals( + std::set<std::string> trusted_bidding_signals_keys, const std::string& hostname) { CHECK(!load_signals_run_loop_); DCHECK(!load_signals_result_); auto bidding_signals = TrustedSignals::LoadBiddingSignals( - &url_loader_factory_, std::move(trusted_bidding_signals_keys), - std::move(hostname), base_url_, v8_helper_, + &url_loader_factory_, std::move(trusted_bidding_signals_keys), hostname, + base_url_, v8_helper_, base::BindOnce(&TrustedSignalsTest::LoadSignalsCallback, base::Unretained(this))); WaitForLoadComplete(); @@ -97,29 +101,29 @@ // Sets the HTTP response and then fetches scoring signals and waits for // completion. Returns nullptr on failure. - std::unique_ptr<TrustedSignals::Result> FetchScoringSignalsWithResponse( + scoped_refptr<TrustedSignals::Result> FetchScoringSignalsWithResponse( const GURL& url, const std::string& response, - std::vector<std::string> render_urls, - std::vector<std::string> ad_component_render_urls, + std::set<std::string> render_urls, + std::set<std::string> ad_component_render_urls, const std::string& hostname) { AddJsonResponse(&url_loader_factory_, url, response); - return FetchScoringSignals(render_urls, ad_component_render_urls, hostname); + return FetchScoringSignals(std::move(render_urls), + std::move(ad_component_render_urls), hostname); } // Fetches scoring signals and waits for completion. Returns nullptr on // failure. - std::unique_ptr<TrustedSignals::Result> FetchScoringSignals( - std::vector<std::string> render_urls, - std::vector<std::string> ad_component_render_urls, + scoped_refptr<TrustedSignals::Result> FetchScoringSignals( + std::set<std::string> render_urls, + std::set<std::string> ad_component_render_urls, const std::string& hostname) { CHECK(!load_signals_run_loop_); DCHECK(!load_signals_result_); auto scoring_signals = TrustedSignals::LoadScoringSignals( &url_loader_factory_, std::move(render_urls), - std::move(ad_component_render_urls), std::move(hostname), base_url_, - v8_helper_, + std::move(ad_component_render_urls), hostname, base_url_, v8_helper_, base::BindOnce(&TrustedSignalsTest::LoadSignalsCallback, base::Unretained(this))); WaitForLoadComplete(); @@ -198,11 +202,11 @@ } protected: - void LoadSignalsCallback(std::unique_ptr<TrustedSignals::Result> result, + void LoadSignalsCallback(scoped_refptr<TrustedSignals::Result> result, absl::optional<std::string> error_msg) { load_signals_result_ = std::move(result); error_msg_ = std::move(error_msg); - EXPECT_EQ(load_signals_result_ == nullptr, error_msg_.has_value()); + EXPECT_EQ(load_signals_result_.get() == nullptr, error_msg_.has_value()); load_signals_run_loop_->Quit(); } @@ -215,7 +219,7 @@ // creating the worklet, to cause a crash if the callback is invoked // synchronously. std::unique_ptr<base::RunLoop> load_signals_run_loop_; - std::unique_ptr<TrustedSignals::Result> load_signals_result_; + scoped_refptr<TrustedSignals::Result> load_signals_result_; absl::optional<std::string> error_msg_; network::TestURLLoaderFactory url_loader_factory_; @@ -293,7 +297,7 @@ } TEST_F(TrustedSignalsTest, ScoringSignalsExpectedEntriesNotPresent) { - std::unique_ptr<TrustedSignals::Result> signals = + scoped_refptr<TrustedSignals::Result> signals = FetchScoringSignalsWithResponse( GURL("https://url.test/?hostname=publisher" "&renderUrls=https%3A%2F%2Ffoo.test%2F" @@ -311,7 +315,7 @@ } TEST_F(TrustedSignalsTest, ScoringSignalsNestedEntriesNotObjects) { - std::unique_ptr<TrustedSignals::Result> signals = + scoped_refptr<TrustedSignals::Result> signals = FetchScoringSignalsWithResponse( GURL("https://url.test/?hostname=publisher" "&renderUrls=https%3A%2F%2Ffoo.test%2F" @@ -329,7 +333,7 @@ } TEST_F(TrustedSignalsTest, BiddingSignalsKeyMissing) { - std::unique_ptr<TrustedSignals::Result> signals = + scoped_refptr<TrustedSignals::Result> signals = FetchBiddingSignalsWithResponse( GURL("https://url.test/?hostname=publisher&keys=key4"), kBaseBiddingJson, {"key4"}, kHostname); @@ -338,7 +342,7 @@ } TEST_F(TrustedSignalsTest, ScoringSignalsKeysMissing) { - std::unique_ptr<TrustedSignals::Result> signals = + scoped_refptr<TrustedSignals::Result> signals = FetchScoringSignalsWithResponse( GURL("https://url.test/?hostname=publisher" "&renderUrls=https%3A%2F%2Ffoo.test%2F" @@ -357,7 +361,7 @@ } TEST_F(TrustedSignalsTest, BiddingSignalsOneKey) { - std::unique_ptr<TrustedSignals::Result> signals = + scoped_refptr<TrustedSignals::Result> signals = FetchBiddingSignalsWithResponse( GURL("https://url.test/?hostname=publisher&keys=key1"), kBaseBiddingJson, {"key1"}, kHostname); @@ -366,7 +370,7 @@ } TEST_F(TrustedSignalsTest, ScoringSignalsForOneRenderUrl) { - std::unique_ptr<TrustedSignals::Result> signals = + scoped_refptr<TrustedSignals::Result> signals = FetchScoringSignalsWithResponse( GURL("https://url.test/" "?hostname=publisher&renderUrls=https%3A%2F%2Ffoo.test%2F"), @@ -382,7 +386,7 @@ } TEST_F(TrustedSignalsTest, BiddingSignalsMultipleKeys) { - std::unique_ptr<TrustedSignals::Result> signals = + scoped_refptr<TrustedSignals::Result> signals = FetchBiddingSignalsWithResponse( GURL("https://url.test/?hostname=publisher&keys=key1,key2,key3,key5"), kBaseBiddingJson, {"key3", "key1", "key5", "key2"}, kHostname); @@ -399,7 +403,7 @@ TEST_F(TrustedSignalsTest, ScoringSignalsMultipleUrls) { // URLs are currently added in lexical order. - std::unique_ptr<TrustedSignals::Result> signals = + scoped_refptr<TrustedSignals::Result> signals = FetchScoringSignalsWithResponse( GURL("https://url.test/?hostname=publisher" "&renderUrls=https%3A%2F%2Fbar.test%2F," @@ -426,22 +430,25 @@ } TEST_F(TrustedSignalsTest, BiddingSignalsDuplicateKeys) { - std::vector<std::string> bidder_signals{"key1", "key2", "key2", "key1", - "key2"}; - std::unique_ptr<TrustedSignals::Result> signals = + std::vector<std::string> bidder_signals_vector{"key1", "key2", "key2", "key1", + "key2"}; + scoped_refptr<TrustedSignals::Result> signals = FetchBiddingSignalsWithResponse( GURL("https://url.test/?hostname=publisher&keys=key1,key2"), - kBaseBiddingJson, bidder_signals, kHostname); + kBaseBiddingJson, + std::set<std::string>{bidder_signals_vector.begin(), + bidder_signals_vector.end()}, + kHostname); ASSERT_TRUE(signals); EXPECT_EQ(R"({"key1":1,"key2":[2]})", - ExtractBiddingSignals(signals.get(), bidder_signals)); + ExtractBiddingSignals(signals.get(), bidder_signals_vector)); } TEST_F(TrustedSignalsTest, ScoringSignalsDuplicateKeys) { - std::vector<std::string> ad_component_render_urls{ + std::vector<std::string> ad_component_render_urls_vector{ "https://barsub.test/", "https://foosub.test/", "https://foosub.test/", "https://barsub.test/"}; - std::unique_ptr<TrustedSignals::Result> signals = + scoped_refptr<TrustedSignals::Result> signals = FetchScoringSignalsWithResponse( GURL("https://url.test/?hostname=publisher" "&renderUrls=https%3A%2F%2Fbar.test%2F,https%3A%2F%2Ffoo.test%2F" @@ -451,7 +458,9 @@ /*render_urls=*/ {"https://foo.test/", "https://foo.test/", "https://bar.test/", "https://bar.test/", "https://foo.test/"}, - ad_component_render_urls, kHostname); + std::set<std::string>{ad_component_render_urls_vector.begin(), + ad_component_render_urls_vector.end()}, + kHostname); ASSERT_TRUE(signals); EXPECT_FALSE(error_msg_.has_value()); EXPECT_EQ(R"({"renderUrl":{"https://bar.test/":[2]},")" @@ -459,14 +468,14 @@ R"("https://barsub.test/":[3],"https://foosub.test/":2}})", ExtractScoringSignals(signals.get(), /*render_url=*/GURL("https://bar.test/"), - ad_component_render_urls)); + ad_component_render_urls_vector)); } // Test when a single URL is used as both a `renderUrl` and // `adComponentRenderUrl`. TEST_F(TrustedSignalsTest, ScoringSignalsSharedUrl) { // URLs are currently added in lexical order. - std::unique_ptr<TrustedSignals::Result> signals = + scoped_refptr<TrustedSignals::Result> signals = FetchScoringSignalsWithResponse( GURL("https://url.test/?hostname=publisher" "&renderUrls=https%3A%2F%2Fshared.test%2F" @@ -488,7 +497,7 @@ } TEST_F(TrustedSignalsTest, BiddingSignalsEscapeQueryParams) { - std::unique_ptr<TrustedSignals::Result> signals = + scoped_refptr<TrustedSignals::Result> signals = FetchBiddingSignalsWithResponse( GURL("https://url.test/" "?hostname=pub+li%26sher&keys=key+6,key%2C8,key%3D7"), @@ -500,7 +509,7 @@ } TEST_F(TrustedSignalsTest, ScoringSignalsEscapeQueryParams) { - std::unique_ptr<TrustedSignals::Result> signals = + scoped_refptr<TrustedSignals::Result> signals = FetchScoringSignalsWithResponse( GURL("https://url.test/?hostname=pub+li%26sher" "&renderUrls=https%3A%2F%2Ffoo.test%2F%3F%26%3D" @@ -540,7 +549,7 @@ auto bidding_signals = TrustedSignals::LoadBiddingSignals( &url_loader_factory_, {"key1"}, "publisher", base_url_, v8_helper_, - base::BindOnce([](std::unique_ptr<TrustedSignals::Result> result, + base::BindOnce([](scoped_refptr<TrustedSignals::Result> result, absl::optional<std::string> error_msg) { ADD_FAILURE() << "Callback should not be invoked since loader deleted"; })); @@ -564,7 +573,7 @@ &url_loader_factory_, /*render_urls=*/{"http://foo.test/"}, /*ad_component_render_urls=*/{}, "publisher", base_url_, v8_helper_, - base::BindOnce([](std::unique_ptr<TrustedSignals::Result> result, + base::BindOnce([](scoped_refptr<TrustedSignals::Result> result, absl::optional<std::string> error_msg) { ADD_FAILURE() << "Callback should not be invoked since loader deleted"; }));
diff --git a/content/test/data/accessibility/event/menu-opened-closed-via-inner-text-expected-auralinux.txt b/content/test/data/accessibility/event/menu-opened-closed-via-inner-text-expected-auralinux.txt new file mode 100644 index 0000000..c4f9769 --- /dev/null +++ b/content/test/data/accessibility/event/menu-opened-closed-via-inner-text-expected-auralinux.txt
@@ -0,0 +1,7 @@ +STATE-CHANGE:SHOWING:TRUE role=ROLE_MENU name='(null)' ENABLED,FOCUSABLE,SENSITIVE,SHOWING,VERTICAL,VISIBLE +=== Start Continuation === +STATE-CHANGE:SHOWING:FALSE role=ROLE_MENU name='(null)' ENABLED,FOCUSABLE,SENSITIVE,SHOWING,VERTICAL,VISIBLE +=== Start Continuation === +STATE-CHANGE:SHOWING:TRUE role=ROLE_MENU name='(null)' ENABLED,FOCUSABLE,SENSITIVE,SHOWING,VERTICAL,VISIBLE +=== Start Continuation === +STATE-CHANGE:SHOWING:FALSE role=ROLE_MENU name='(null)' ENABLED,FOCUSABLE,SENSITIVE,SHOWING,VERTICAL,VISIBLE
diff --git a/content/test/data/accessibility/event/menu-opened-closed-via-inner-text-expected-mac.txt b/content/test/data/accessibility/event/menu-opened-closed-via-inner-text-expected-mac.txt new file mode 100644 index 0000000..6063402 --- /dev/null +++ b/content/test/data/accessibility/event/menu-opened-closed-via-inner-text-expected-mac.txt
@@ -0,0 +1,7 @@ +AXMenuOpened on AXMenu +=== Start Continuation === +AXMenuClosed on AXWebArea +=== Start Continuation === +AXMenuOpened on AXMenu +=== Start Continuation === +AXMenuClosed on AXWebArea
diff --git a/content/test/data/accessibility/event/menu-opened-closed-via-inner-text-expected-win.txt b/content/test/data/accessibility/event/menu-opened-closed-via-inner-text-expected-win.txt new file mode 100644 index 0000000..cef4e90 --- /dev/null +++ b/content/test/data/accessibility/event/menu-opened-closed-via-inner-text-expected-win.txt
@@ -0,0 +1,7 @@ +EVENT_SYSTEM_MENUPOPUPSTART on <div#menu> role=ROLE_SYSTEM_MENUPOPUP FOCUSABLE IA2_STATE_VERTICAL SetSize=3 +=== Start Continuation === +EVENT_SYSTEM_MENUPOPUPEND on <div#menu> role=ROLE_SYSTEM_MENUPOPUP FOCUSABLE IA2_STATE_VERTICAL SetSize=3 +=== Start Continuation === +EVENT_SYSTEM_MENUPOPUPSTART on <div#menu> role=ROLE_SYSTEM_MENUPOPUP FOCUSABLE IA2_STATE_VERTICAL SetSize=3 +=== Start Continuation === +EVENT_SYSTEM_MENUPOPUPEND on <div#menu> role=ROLE_SYSTEM_MENUPOPUP FOCUSABLE IA2_STATE_VERTICAL SetSize=3
diff --git a/content/test/data/accessibility/event/menu-opened-closed-via-inner-text.html b/content/test/data/accessibility/event/menu-opened-closed-via-inner-text.html new file mode 100644 index 0000000..231cae0 --- /dev/null +++ b/content/test/data/accessibility/event/menu-opened-closed-via-inner-text.html
@@ -0,0 +1,43 @@ +<!-- +@AURALINUX-DENY:CHILDREN-CHANGED* +@AURALINUX-DENY:STATE-CHANGE:DEFUNCT* +@WIN-DENY:EVENT_OBJECT_REORDER* +@WIN-DENY:EVENT_OBJECT_SHOW* +@WIN-DENY:EVENT_OBJECT_HIDE* +@WIN-DENY:IA2_EVENT_TEXT_INSERTED* +@WIN-DENY:IA2_EVENT_TEXT_REMOVED* +@UIA-WIN-DENY:*StructureChanged* +@UIA-WIN_DENY:AutomationFocusChanged* +--> +<!DOCTYPE html> +<div id="container"></div> +<script> + function show_menu(add_ancestor_divs) { + prefix = '<div><div>'; + suffix = '</div></div>'; + content = '<div id="menu" role="menu" tabIndex="-1">' + + ' <div role="menuitem" tabIndex="-1">Cut</div>' + + ' <div role="menuitem" tabIndex="-1">Copy</div>' + + ' <div role="menuitem" tabIndex="-1">Paste</div>' + + '</div>'; + document.getElementById("container").innerHTML = add_ancestor_divs + ? prefix + content + suffix + : content; + } + function hide_menu() { + document.getElementById("container").innerHTML = ''; + } + + const go_passes = [ + () => show_menu(false), + () => hide_menu(), + () => show_menu(true), + () => hide_menu(), + ]; + + var current_pass = 0; + function go() { + go_passes[current_pass++].call(); + return current_pass < go_passes.length; + } +</script>
diff --git a/extensions/browser/api/declarative_net_request/ruleset_matcher_base.cc b/extensions/browser/api/declarative_net_request/ruleset_matcher_base.cc index c489925..5f0f0a4 100644 --- a/extensions/browser/api/declarative_net_request/ruleset_matcher_base.cc +++ b/extensions/browser/api/declarative_net_request/ruleset_matcher_base.cc
@@ -110,7 +110,7 @@ bool query_changed = false; for (net::QueryIterator it(url); !it.IsAtEnd(); it.Advance()) { - std::string key = it.GetKey(); + const base::StringPiece key = it.GetKey(); // Remove query param. if (std::binary_search(remove_query_params.begin(), remove_query_params.end(), key)) {
diff --git a/headless/BUILD.gn b/headless/BUILD.gn index 067b40f..26b0a0e 100644 --- a/headless/BUILD.gn +++ b/headless/BUILD.gn
@@ -546,6 +546,10 @@ } } + if (is_linux || is_chromeos) { + data_deps += [ "//components/crash/core/app:chrome_crashpad_handler" ] + } + # Normally set to false (see build/args/headless.gn), but we can optionally # use external v8 startup data too. if ((!is_win || is_component_build) && v8_use_external_startup_data) { @@ -811,10 +815,11 @@ ] if (is_mac) { - deps += [ - "//services/device/public/cpp:test_support", - "//third_party/crashpad/crashpad/client", - ] + deps += [ "//services/device/public/cpp:test_support" ] + } + + if (!is_fuchsia) { + deps += [ "//third_party/crashpad/crashpad/client" ] } if (enable_basic_printing) {
diff --git a/headless/lib/browser/headless_content_browser_client.cc b/headless/lib/browser/headless_content_browser_client.cc index 8cb5ee1..8130ca70 100644 --- a/headless/lib/browser/headless_content_browser_client.cc +++ b/headless/lib/browser/headless_content_browser_client.cc
@@ -34,7 +34,6 @@ #include "headless/lib/browser/headless_browser_main_parts.h" #include "headless/lib/browser/headless_devtools_manager_delegate.h" #include "headless/lib/browser/headless_quota_permission_context.h" -#include "headless/lib/headless_macros.h" #include "mojo/public/cpp/bindings/binder_map.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver_set.h" @@ -48,12 +47,11 @@ #include "ui/base/ui_base_switches.h" #include "ui/gfx/switches.h" -#if defined(HEADLESS_USE_BREAKPAD) -#include "base/debug/leak_annotations.h" -#include "components/crash/content/browser/crash_handler_host_linux.h" -#include "components/crash/core/app/breakpad_linux.h" +#if defined(OS_LINUX) || defined(OS_CHROMEOS) +#include "components/crash/core/app/crash_switches.h" +#include "components/crash/core/app/crashpad.h" #include "content/public/common/content_descriptors.h" -#endif // defined(HEADLESS_USE_BREAKPAD) +#endif // defined(OS_LINUX) || defined(OS_CHROMEOS) #if defined(HEADLESS_USE_POLICY) #include "components/policy/content/policy_blocklist_navigation_throttle.h" @@ -68,67 +66,18 @@ namespace headless { +#if defined(OS_LINUX) || defined(OS_CHROMEOS) namespace { -#if defined(HEADLESS_USE_BREAKPAD) -breakpad::CrashHandlerHostLinux* CreateCrashHandlerHost( - const std::string& process_type, - const HeadlessBrowser::Options& options) { - base::FilePath dumps_path = options.crash_dumps_dir; - if (dumps_path.empty()) { - bool ok = base::PathService::Get(base::DIR_MODULE, &dumps_path); - DCHECK(ok); - } - - { - ANNOTATE_SCOPED_MEMORY_LEAK; -#if defined(OFFICIAL_BUILD) - // Upload crash dumps in official builds, unless we're running in unattended - // mode (not to be confused with headless mode in general -- see - // chrome/common/env_vars.cc). - static const char kHeadless[] = "CHROME_HEADLESS"; - bool upload = (getenv(kHeadless) == nullptr); -#else - bool upload = false; -#endif - breakpad::CrashHandlerHostLinux* crash_handler = - new breakpad::CrashHandlerHostLinux(process_type, dumps_path, upload); - crash_handler->StartUploaderThread(); - return crash_handler; - } -} - int GetCrashSignalFD(const base::CommandLine& command_line, const HeadlessBrowser::Options& options) { - if (!breakpad::IsCrashReporterEnabled()) - return -1; - - std::string process_type = - command_line.GetSwitchValueASCII(::switches::kProcessType); - - if (process_type == ::switches::kRendererProcess) { - static breakpad::CrashHandlerHostLinux* crash_handler = - CreateCrashHandlerHost(process_type, options); - return crash_handler->GetDeathSignalSocket(); - } - - if (process_type == ::switches::kPpapiPluginProcess) { - static breakpad::CrashHandlerHostLinux* crash_handler = - CreateCrashHandlerHost(process_type, options); - return crash_handler->GetDeathSignalSocket(); - } - - if (process_type == ::switches::kGpuProcess) { - static breakpad::CrashHandlerHostLinux* crash_handler = - CreateCrashHandlerHost(process_type, options); - return crash_handler->GetDeathSignalSocket(); - } - - return -1; + int fd; + pid_t pid; + return crash_reporter::GetHandlerSocket(&fd, &pid) ? fd : -1; } -#endif // defined(HEADLESS_USE_BREAKPAD) } // namespace +#endif // defined(OS_LINUX) || defined(OS_CHROMEOS) // Implements a stub BadgeService. This implementation does nothing, but is // required because inbound Mojo messages which do not have a registered @@ -230,18 +179,16 @@ return content::GeneratedCodeCacheSettings(true, 0, context->GetPath()); } -#if defined(OS_POSIX) && !defined(OS_MAC) +#if defined(OS_LINUX) || defined(OS_CHROMEOS) void HeadlessContentBrowserClient::GetAdditionalMappedFilesForChildProcess( const base::CommandLine& command_line, int child_process_id, content::PosixFileDescriptorInfo* mappings) { -#if defined(HEADLESS_USE_BREAKPAD) int crash_signal_fd = GetCrashSignalFD(command_line, *browser_->options()); if (crash_signal_fd >= 0) mappings->Share(kCrashDumpSignal, crash_signal_fd); -#endif // defined(HEADLESS_USE_BREAKPAD) } -#endif // defined(OS_POSIX) && !defined(OS_MAC) +#endif // defined(OS_LINUX) || defined(OS_CHROMEOS) void HeadlessContentBrowserClient::AppendExtraCommandLineSwitches( base::CommandLine* command_line, @@ -257,11 +204,16 @@ switches::kUserAgent, old_command_line.GetSwitchValueNative(switches::kUserAgent)); } -#if defined(HEADLESS_USE_BREAKPAD) - // This flag tells child processes to also turn on crash reporting. - if (breakpad::IsCrashReporterEnabled()) - command_line->AppendSwitch(::switches::kEnableCrashReporter); -#endif // defined(HEADLESS_USE_BREAKPAD) + +#if defined(OS_LINUX) || defined(OS_CHROMEOS) + int fd; + pid_t pid; + if (crash_reporter::GetHandlerSocket(&fd, &pid)) { + command_line->AppendSwitchASCII( + crash_reporter::switches::kCrashpadHandlerPid, + base::NumberToString(pid)); + } +#endif // defined(OS_LINUX) || defined(OS_CHROMEOS) // If we're spawning a renderer, then override the language switch. std::string process_type =
diff --git a/headless/lib/headless_content_main_delegate.cc b/headless/lib/headless_content_main_delegate.cc index 1f950de..a69d5c1f 100644 --- a/headless/lib/headless_content_main_delegate.cc +++ b/headless/lib/headless_content_main_delegate.cc
@@ -32,7 +32,6 @@ #include "headless/lib/browser/headless_browser_impl.h" #include "headless/lib/browser/headless_content_browser_client.h" #include "headless/lib/headless_crash_reporter_client.h" -#include "headless/lib/headless_macros.h" #include "headless/lib/renderer/headless_content_renderer_client.h" #include "headless/lib/utility/headless_content_utility_client.h" #include "sandbox/policy/switches.h" @@ -48,13 +47,13 @@ #include "headless/embedded_resource_pak.h" #endif -#if defined(OS_MAC) || defined(OS_WIN) +#if defined(OS_MAC) || defined(OS_LINUX) || defined(OS_CHROMEOS) #include "components/crash/core/app/crashpad.h" -#endif +#endif // defined(OS_MAC) || defined(OS_LINUX) || defined(OS_CHROMEOS) #if defined(OS_LINUX) || defined(OS_CHROMEOS) -#include "components/crash/core/app/breakpad_linux.h" -#endif +#include "components/crash/core/app/crash_switches.h" +#endif // defined(OS_LINUX) || defined(OS_CHROMEOS) #if defined(OS_POSIX) #include <signal.h> @@ -311,15 +310,14 @@ void HeadlessContentMainDelegate::InitCrashReporter( const base::CommandLine& command_line) { - if (command_line.HasSwitch(::switches::kDisableBreakpad)) + if (!options()->enable_crash_reporter) return; + #if defined(OS_FUCHSIA) - // TODO(crbug.com/1226159): Implement this when crash reporting/Breakpad are - // available in Fuchsia. + // TODO(crbug.com/1226159): Implement this when crash reporting is available + // for Fuchsia. NOTIMPLEMENTED(); #else - const std::string process_type = - command_line.GetSwitchValueASCII(::switches::kProcessType); crash_reporter::SetCrashReporterClient(g_headless_crash_client.Pointer()); g_headless_crash_client.Pointer()->set_crash_dumps_dir( options()->crash_dumps_dir); @@ -327,22 +325,12 @@ crash_reporter::InitializeCrashKeys(); crash_keys::SetSwitchesFromCommandLine(command_line, nullptr); -#if defined(HEADLESS_USE_BREAKPAD) - if (!options()->enable_crash_reporter) { - DCHECK(!breakpad::IsCrashReporterEnabled()); - return; - } +#if !defined(OS_WIN) + const std::string process_type = + command_line.GetSwitchValueASCII(::switches::kProcessType); if (process_type != switches::kZygoteProcess) - breakpad::InitCrashReporter(process_type); -#elif defined(OS_MAC) - crash_reporter::InitializeCrashpad(process_type.empty(), process_type); -// Avoid adding this dependency in Windows Chrome non component builds, since -// crashpad is already enabled. -// TODO(dvallet): Ideally we would also want to avoid this for component builds. -#elif defined(OS_WIN) - // InitializeCrashpad is already called from main() on Windows, no need to - // call it from here. -#endif // defined(HEADLESS_USE_BREAKPAD) + crash_reporter::InitializeCrashpad(process_type.empty(), process_type); +#endif // !defined(OS_WIN) #endif // defined(OS_FUCHSIA) // Mark any bug reports from headless mode as such. @@ -350,7 +338,6 @@ headless_key.Set("true"); } - void HeadlessContentMainDelegate::PreSandboxStartup() { const base::CommandLine& command_line( *base::CommandLine::ForCurrentProcess()); @@ -426,14 +413,11 @@ } const base::CommandLine& command_line( *base::CommandLine::ForCurrentProcess()); - const std::string process_type = - command_line.GetSwitchValueASCII(::switches::kProcessType); - // Unconditionally try to turn on crash reporting since we do not have access - // to the latest browser options at this point when testing. Breakpad will - // bail out gracefully if the browser process hasn't enabled crash reporting. -#if defined(HEADLESS_USE_BREAKPAD) - breakpad::InitCrashReporter(process_type); -#endif + if (command_line.HasSwitch(crash_reporter::switches::kCrashpadHandlerPid)) { + const std::string process_type = + command_line.GetSwitchValueASCII(::switches::kProcessType); + crash_reporter::InitializeCrashpad(false, process_type); + } } #endif // defined(OS_LINUX) || defined(OS_CHROMEOS)
diff --git a/headless/lib/headless_crash_reporter_client.cc b/headless/lib/headless_crash_reporter_client.cc index 3896ef7..b136b2b 100644 --- a/headless/lib/headless_crash_reporter_client.cc +++ b/headless/lib/headless_crash_reporter_client.cc
@@ -8,6 +8,7 @@ #include <utility> #include "base/command_line.h" +#include "base/environment.h" #include "base/path_service.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" @@ -31,13 +32,6 @@ #if defined(OS_POSIX) && !defined(OS_MAC) void HeadlessCrashReporterClient::GetProductNameAndVersion( - const char** product_name, - const char** version) { - *product_name = kChromeHeadlessProductName; - *version = PRODUCT_VERSION; -} - -void HeadlessCrashReporterClient::GetProductNameAndVersion( std::string* product_name, std::string* version, std::string* channel) { @@ -45,10 +39,6 @@ *version = PRODUCT_VERSION; *channel = ""; } - -base::FilePath HeadlessCrashReporterClient::GetReporterLogFilename() { - return base::FilePath(FILE_PATH_LITERAL("uploads.log")); -} #endif // defined(OS_POSIX) && !defined(OS_MAC) bool HeadlessCrashReporterClient::GetCrashDumpLocation( @@ -64,6 +54,9 @@ !base::PathService::Get(base::DIR_MODULE, &crash_directory)) { return false; } + if (crash_dumps_dir_.empty()) { + crash_directory = crash_directory.Append(FILE_PATH_LITERAL("Crashpad")); + } #if defined(OS_WIN) *crash_dir = crash_directory.value(); #else @@ -72,12 +65,20 @@ return true; } -bool HeadlessCrashReporterClient::EnableBreakpadForProcess( - const std::string& process_type) { - return process_type == ::switches::kRendererProcess || - process_type == ::switches::kPpapiPluginProcess || - process_type == ::switches::kZygoteProcess || - process_type == ::switches::kGpuProcess; +bool HeadlessCrashReporterClient::IsRunningUnattended() { + // CHROME_HEADLESS is not equivalent to running in headless mode. This + // environment variable is set in non-production environments which might be + // running with crash-dumping enabled. It is used to disable certain dialogs + // and in this particular usage disables crash report upload, while leaving + // dumping enabled. + std::unique_ptr<base::Environment> env(base::Environment::Create()); + return env->HasVar("CHROME_HEADLESS"); +} + +bool HeadlessCrashReporterClient::GetCollectStatsConsent() { + // Headless has no way to configure this setting so consent is implied by + // the crash reporter being enabled. + return true; } } // namespace content
diff --git a/headless/lib/headless_crash_reporter_client.h b/headless/lib/headless_crash_reporter_client.h index 806e4242..eacb8df 100644 --- a/headless/lib/headless_crash_reporter_client.h +++ b/headless/lib/headless_crash_reporter_client.h
@@ -29,16 +29,9 @@ const base::FilePath& crash_dumps_dir() const { return crash_dumps_dir_; } #if defined(OS_POSIX) && !defined(OS_MAC) - // Returns a textual description of the product type and version to include - // in the crash report. - void GetProductNameAndVersion(const char** product_name, - const char** version) override; - void GetProductNameAndVersion(std::string* product_name, std::string* version, std::string* channel) override; - - base::FilePath GetReporterLogFilename() override; #endif // defined(OS_POSIX) && !defined(OS_MAC) #if defined(OS_WIN) @@ -47,7 +40,9 @@ bool GetCrashDumpLocation(base::FilePath* crash_dir) override; #endif - bool EnableBreakpadForProcess(const std::string& process_type) override; + bool IsRunningUnattended() override; + + bool GetCollectStatsConsent() override; private: base::FilePath crash_dumps_dir_;
diff --git a/headless/lib/headless_macros.h b/headless/lib/headless_macros.h deleted file mode 100644 index f7bb9af1..0000000 --- a/headless/lib/headless_macros.h +++ /dev/null
@@ -1,14 +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 HEADLESS_LIB_HEADLESS_MACROS_H_ -#define HEADLESS_LIB_HEADLESS_MACROS_H_ - -#include "build/build_config.h" - -#if defined(OS_POSIX) && !defined(OS_MAC) -#define HEADLESS_USE_BREAKPAD -#endif // defined(OS_POSIX) && !defined(OS_MAC) - -#endif // HEADLESS_LIB_HEADLESS_MACROS_H_
diff --git a/headless/test/headless_browser_browsertest.cc b/headless/test/headless_browser_browsertest.cc index e0d9065..c6fbf17 100644 --- a/headless/test/headless_browser_browsertest.cc +++ b/headless/test/headless_browser_browsertest.cc
@@ -32,7 +32,6 @@ #include "headless/lib/browser/headless_browser_impl.h" #include "headless/lib/browser/headless_web_contents_impl.h" #include "headless/lib/browser/policy/headless_mode_policy.h" -#include "headless/lib/headless_macros.h" #include "headless/public/devtools/domains/inspector.h" #include "headless/public/devtools/domains/network.h" #include "headless/public/devtools/domains/page.h" @@ -53,7 +52,7 @@ #include "ui/base/clipboard/scoped_clipboard_writer.h" #include "ui/gfx/geometry/size.h" -#if defined(OS_MAC) +#if !defined(OS_FUCHSIA) #include "third_party/crashpad/crashpad/client/crash_report_database.h" // nogncheck #endif @@ -474,15 +473,8 @@ base::FilePath crash_dumps_dir_; }; -// TODO(skyostil): Minidump generation currently is only supported on Linux and -// Mac. -#if (defined(HEADLESS_USE_BREAKPAD) || defined(OS_MAC)) && \ - !defined(ADDRESS_SANITIZER) -#define MAYBE_GenerateMinidump GenerateMinidump -#else -#define MAYBE_GenerateMinidump DISABLED_GenerateMinidump -#endif // defined(HEADLESS_USE_BREAKPAD) || defined(OS_MAC) -IN_PROC_BROWSER_TEST_F(CrashReporterTest, MAYBE_GenerateMinidump) { +#if !defined(OS_FUCHSIA) && !defined(OS_WIN) +IN_PROC_BROWSER_TEST_F(CrashReporterTest, GenerateMinidump) { content::ScopedAllowRendererCrashes scoped_allow_renderer_crashes; // Navigates a tab to chrome://crash and checks that a minidump is generated. @@ -507,20 +499,11 @@ { base::ScopedAllowBlockingForTesting allow_blocking; -#if defined(OS_MAC) auto database = crashpad::CrashReportDatabase::Initialize(crash_dumps_dir_); std::vector<crashpad::CrashReportDatabase::Report> reports; ASSERT_EQ(database->GetPendingReports(&reports), crashpad::CrashReportDatabase::kNoError); EXPECT_EQ(reports.size(), 1u); -#else - base::FileEnumerator it(crash_dumps_dir_, /* recursive */ false, - base::FileEnumerator::FILES); - base::FilePath minidump = it.Next(); - EXPECT_FALSE(minidump.empty()); - EXPECT_EQ(FILE_PATH_LITERAL(".dmp"), minidump.Extension()); - EXPECT_TRUE(it.Next().empty()); -#endif } web_contents_->RemoveObserver(this); @@ -530,6 +513,7 @@ browser_context_->Close(); browser_context_ = nullptr; } +#endif // !defined(OS_FUCHSIA) && !defined(OS_WIN) IN_PROC_BROWSER_TEST_F(HeadlessBrowserTest, PermissionManagerAlwaysASK) { GURL url("https://example.com");
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 88d79fd..3c326c0 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1673,6 +1673,12 @@ <message name="IDS_IOS_SCANNER_TORCH_ON_ACCESSIBILITY_VALUE" desc="Accessibility value of the button to turn torch off in the Scanner. The button communicates that the torch is currently on. [Length: unlimited] [iOS only]" meaning="The user will put on the torch [20em] [Read by Text-to-Speech]"> On </message> + <message name="IDS_IOS_TRACK_PRICES_ON_TABS" desc="This text shows in the price tracking settings dialog. It tells users the switch on the side can be used to turn on/off the 'Track prices on tabs' feature."> + Track Prices on Tabs + </message> + <message name="IDS_IOS_TRACK_PRICES_ON_TABS_DESCRIPTION" desc="This text shows below 'Track prices on tabs'. It describes what will happen when turning on this feature."> + See price drops on your tabs. + </message> <message name="IDS_IOS_QR_SCANNER_VIEWPORT_CAPTION" desc="Message displayed below the QR scanner viewport instructing the user to position the scanned QR or bar code inside the viewport. [Length: unlimited] [iOS only]"> Position QR code or barcode in this frame </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TRACK_PRICES_ON_TABS.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TRACK_PRICES_ON_TABS.png.sha1 new file mode 100644 index 0000000..c291bae --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TRACK_PRICES_ON_TABS.png.sha1
@@ -0,0 +1 @@ +328d52b99992ddfabc1f4d81d60f7386005b2ee7 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TRACK_PRICES_ON_TABS_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TRACK_PRICES_ON_TABS_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..c291bae --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TRACK_PRICES_ON_TABS_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +328d52b99992ddfabc1f4d81d60f7386005b2ee7 \ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index 617cf06a..4d0c40c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -345,7 +345,7 @@ <translation id="4272631900155121838">لمسح رمز الاستجابة السريعة ضوئيًا، يمكنك تفعيل الكاميرا من الإعدادات</translation> <translation id="4277990410970811858">التصفُّح الآمن</translation> <translation id="4281844954008187215">بنود الخدمة</translation> -<translation id="430793432425771671">مزامنة كل شيء</translation> +<translation id="430793432425771671">مزامنة جميع البيانات</translation> <translation id="4309403553630140242">يُرجى النقر مرّتَين للحصول على المزيد من المعلومات.</translation> <translation id="430967081421617822">جميع الأوقات</translation> <translation id="4334428914252001502">مقالة واحدة غير مقروءة</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb index 6628991..f7c282e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -168,6 +168,7 @@ <translation id="2584132361465095047">Gehitu kontu bat…</translation> <translation id="2600682495497606169">Garbitu webguneko cookieak</translation> <translation id="2625189173221582860">Kopiatu da pasahitza</translation> +<translation id="2626236249646841566">Egiaztatu konektatuta zaudela eta saiatu berriro saioa hasten.</translation> <translation id="2637313651144986786">Bilatu fitxak…</translation> <translation id="2647269890314209800">Erabiltzen diren cookieak</translation> <translation id="2648803196158606475">Ezabatu irakurritakoak</translation> @@ -364,6 +365,7 @@ <translation id="4508750114462689118">Itxi saioa hasteko promozioa</translation> <translation id="4526249700380860531">Ikusi eta kudeatu gordetako pasahitzak <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> estekan.</translation> <translation id="4536418791685807335">Hasi saioa berriro.</translation> +<translation id="4540780316273593836">Arazoren bat izan da</translation> <translation id="457386861538956877">Gehiago…</translation> <translation id="4592368184551360546">Teklatua</translation> <translation id="461440297010471931">Google-rekin bilatzen</translation> @@ -479,6 +481,7 @@ <translation id="5669528293118408608">www</translation> <translation id="567881659373499783"><ph name="PRODUCT_VERSION" /> bertsioa</translation> <translation id="5690398455483874150">{count,plural, =1{Chrome-ko leiho bat dago ikusgai}other{Chrome-ko {count} leiho daude ikusgai}}</translation> +<translation id="5704908597376970822">Ezin da hasi saioa.</translation> <translation id="5706552126692816153">Aktibo duela 1 egun</translation> <translation id="5711039611392265845">Pribatutasunarekin, segurtasunarekin eta datu-bilketarekin lotutako ezarpen gehiago ikusteko, joan <ph name="BEGIN_LINK" />Sinkronizazioa eta Google-ren zerbitzuak<ph name="END_LINK" /> atalera.</translation> <translation id="5724941645893276623">Sarea modu pribatuan arakatzeko, gehitu beste fitxa bat</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb index 0fd72d38..edf08835 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -168,6 +168,7 @@ <translation id="2584132361465095047">Ajouter un compte…</translation> <translation id="2600682495497606169">Effacer les témoins du site</translation> <translation id="2625189173221582860">Mot de passe copié</translation> +<translation id="2626236249646841566">Vérifiez votre connexion et réessayez de vous connecter.</translation> <translation id="2647269890314209800">Témoins en cours d'utilisation</translation> <translation id="2648803196158606475">Supprimer les éléments lus</translation> <translation id="2653659639078652383">Envoyer</translation> @@ -363,6 +364,7 @@ <translation id="4508750114462689118">Fermer la promotion de connexion</translation> <translation id="4526249700380860531">Afficher et gérer les mots de passe enregistrés à l'adresse <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="4536418791685807335">Essayez de vous reconnecter.</translation> +<translation id="4540780316273593836">Un problème est survenu</translation> <translation id="457386861538956877">Autres...</translation> <translation id="4592368184551360546">Clavier</translation> <translation id="461440297010471931">Recherche avec Google</translation> @@ -478,6 +480,7 @@ <translation id="5669528293118408608">www</translation> <translation id="567881659373499783">Version <ph name="PRODUCT_VERSION" /></translation> <translation id="5690398455483874150">{count,plural, =1{Une fenêtre de Chrome est maintenant affichée}one{{count} fenêtre de Chrome est maintenant affichée}other{{count} fenêtres de Chrome sont maintenant affichées}}</translation> +<translation id="5704908597376970822">Impossible de se connecter.</translation> <translation id="5706552126692816153">Actif il y a 1 jour</translation> <translation id="5711039611392265845">Pour voir plus de paramètres relatifs à la confidentialité, à la sécurité et à la collecte de données, consultez l'article <ph name="BEGIN_LINK" />Synchronisation et services Google<ph name="END_LINK" />.</translation> <translation id="5724941645893276623">Pour naviguer confidentiellement sur le Web, ouvrez un nouvel onglet</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb index f25251a0..ee14eb4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -169,6 +169,7 @@ <translation id="2600682495497606169">Сайттың cookie файлдарын өшіру</translation> <translation id="2625189173221582860">Құпия сөз көшірілді</translation> <translation id="2626236249646841566">Байланысты тексеріп, қайта кіріп көріңіз.</translation> +<translation id="2637313651144986786">Қойындыларды іздеу...</translation> <translation id="2647269890314209800">Пайдаланылатын cookie файлдары</translation> <translation id="2648803196158606475">Оқылғандарды жою</translation> <translation id="2653659639078652383">Жіберу</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index eea685b1..843e79a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -169,6 +169,7 @@ <translation id="2600682495497606169">Xóa cookie của trang web</translation> <translation id="2625189173221582860">Đã sao chép mật khẩu</translation> <translation id="2626236249646841566">Hãy kiểm tra kết nối của bạn rồi thử đăng nhập lại.</translation> +<translation id="2637313651144986786">Tìm kiếm trong Thẻ...</translation> <translation id="2647269890314209800">Các cookie đang được sử dụng</translation> <translation id="2648803196158606475">Xóa mục đã đọc</translation> <translation id="2653659639078652383">Gửi</translation>
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 742de13..2579b1d 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -594,9 +594,6 @@ kInterestFeedV2ClickAndViewActionsConditionalUploadDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(feed::kInterestFeedV2ClicksAndViewsConditionalUpload)}, - {"tabs-bulkactions-ios", flag_descriptions::kTabsBulkActionsName, - flag_descriptions::kTabsBulkActionsDescription, flags_ui::kOsIos, - FEATURE_VALUE_TYPE(kTabsBulkActions)}, {"tabs-search-ios", flag_descriptions::kTabsSearchName, flag_descriptions::kTabsSearchDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kTabsSearch)},
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index 4a2bdf9..cc56933 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -219,10 +219,10 @@ "When enabled, the instructions to turn on Password AutoFill will have " "shorter steps and come with a button that links the user to iOS Settings."; -const char kEnableWebChannelsName[] = "Enable Web Channels"; +const char kEnableWebChannelsName[] = "Enable WebChannels"; const char kEnableWebChannelsDescription[] = "Enable folowing content from web and display Following feed on NTP based " - "on websites that users followed."; + "on web channels that users followed."; const char kExpandedTabStripName[] = "Enable expanded tabstrip"; const char kExpandedTabStripDescription[] = @@ -491,11 +491,6 @@ "Enable showing the Start Surface when launching Chrome via clicking the " "icon or the app switcher."; -const char kTabsBulkActionsName[] = "Enable Tab Grid Bulk Actions"; -const char kTabsBulkActionsDescription[] = - "Enables the selection mode in the Tab grid where users can perform " - "actions on multiple tabs at once for iOS 13 and above."; - const char kTabsSearchName[] = "Enable Tabs Search"; const char kTabsSearchDescription[] = "Enables the search mode in the Tab grid where users can search open tabs "
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index 6a63ee9..54b5591 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -442,10 +442,6 @@ extern const char kSyncTrustedVaultPassphraseRecoveryName[]; extern const char kSyncTrustedVaultPassphraseRecoveryDescription[]; -// Title and description for the flag to enable tabs bulk actions feature. -extern const char kTabsBulkActionsName[]; -extern const char kTabsBulkActionsDescription[]; - // Title and description for the flag to enable tabs search feature. extern const char kTabsSearchName[]; extern const char kTabsSearchDescription[];
diff --git a/ios/chrome/browser/ui/history/BUILD.gn b/ios/chrome/browser/ui/history/BUILD.gn index 1cd52e6..cad8cdb 100644 --- a/ios/chrome/browser/ui/history/BUILD.gn +++ b/ios/chrome/browser/ui/history/BUILD.gn
@@ -9,15 +9,13 @@ "history_coordinator.mm", "history_mediator.h", "history_mediator.mm", - "ios_browsing_history_driver.h", - "ios_browsing_history_driver.mm", ] deps = [ ":clear_browsing_data", + ":history_driver", ":history_ui", "//base", "//components/browser_sync", - "//components/browsing_data/core", "//components/history/core/browser", "//components/keyed_service/core", "//ios/chrome/browser/browser_state", @@ -79,7 +77,6 @@ "resources:history_empty", "//base", "//base:i18n", - "//components/browsing_data/core", "//components/history/core/browser", "//components/strings", "//components/url_formatter", @@ -115,6 +112,25 @@ ] } +source_set("history_driver") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ + "ios_browsing_history_driver.h", + "ios_browsing_history_driver.mm", + "ios_browsing_history_driver_delegate.h", + "ios_browsing_history_driver_delegate_bridge.h", + "ios_browsing_history_driver_delegate_bridge.mm", + ] + deps = [ + ":history_ui", + "//base", + "//components/browsing_data/core", + "//components/history/core/browser", + "//ios/chrome/browser/browser_state", + "//ios/chrome/browser/history", + ] +} + source_set("clear_browsing_data") { configs += [ "//build/config/compiler:enable_arc" ] sources = [
diff --git a/ios/chrome/browser/ui/history/history_consumer.h b/ios/chrome/browser/ui/history/history_consumer.h index e65d563f..3dce2a5 100644 --- a/ios/chrome/browser/ui/history/history_consumer.h +++ b/ios/chrome/browser/ui/history/history_consumer.h
@@ -5,21 +5,22 @@ #ifndef IOS_CHROME_BROWSER_UI_HISTORY_HISTORY_CONSUMER_H_ #define IOS_CHROME_BROWSER_UI_HISTORY_HISTORY_CONSUMER_H_ -#include <vector> +#import <Foundation/Foundation.h> #include "components/history/core/browser/browsing_history_service.h" // Defines methods to manage history query results and deletion actions. -@protocol HistoryConsumer +@protocol HistoryConsumer <NSObject> // Tells the consumer that the result of a history query has been retrieved. // Entries in |result| are already sorted. - (void) -historyQueryWasCompletedWithResults: - (const std::vector<history::BrowsingHistoryService::HistoryEntry>&)results - queryResultsInfo:(const history::BrowsingHistoryService:: - QueryResultsInfo&)queryResultsInfo - continuationClosure:(base::OnceClosure)continuationClosure; + historyQueryWasCompletedWithResults: + (const std::vector<history::BrowsingHistoryService::HistoryEntry>&) + results + queryResultsInfo:(const history::BrowsingHistoryService:: + QueryResultsInfo&)queryResultsInfo + continuationClosure:(base::OnceClosure)continuationClosure; // Tells the consumer that history entries have been deleted by a different // client.
diff --git a/ios/chrome/browser/ui/history/history_coordinator.mm b/ios/chrome/browser/ui/history/history_coordinator.mm index 7658240..898b72d1 100644 --- a/ios/chrome/browser/ui/history/history_coordinator.mm +++ b/ios/chrome/browser/ui/history/history_coordinator.mm
@@ -23,6 +23,7 @@ #import "ios/chrome/browser/ui/history/history_transitioning_delegate.h" #include "ios/chrome/browser/ui/history/history_ui_delegate.h" #include "ios/chrome/browser/ui/history/ios_browsing_history_driver.h" +#include "ios/chrome/browser/ui/history/ios_browsing_history_driver_delegate_bridge.h" #import "ios/chrome/browser/ui/history/public/history_presentation_delegate.h" #import "ios/chrome/browser/ui/menu/browser_action_factory.h" #import "ios/chrome/browser/ui/menu/menu_histograms.h" @@ -37,6 +38,9 @@ @interface HistoryCoordinator () <BrowserObserving, HistoryMenuProvider, HistoryUIDelegate> { + // Provides delegate bridge instance for |_browsingHistoryDriver|. + std::unique_ptr<IOSBrowsingHistoryDriverDelegateBridge> + _browsingHistoryDriverDelegate; // Provides dependencies and funnels callbacks from BrowsingHistoryService. std::unique_ptr<IOSBrowsingHistoryDriver> _browsingHistoryDriver; // Abstraction to communicate with HistoryService and WebHistoryService. @@ -87,8 +91,11 @@ self.historyTableViewController.imageDataSource = self.mediator; // Initialize and configure HistoryServices. + _browsingHistoryDriverDelegate = + std::make_unique<IOSBrowsingHistoryDriverDelegateBridge>( + self.historyTableViewController); _browsingHistoryDriver = std::make_unique<IOSBrowsingHistoryDriver>( - self.browser->GetBrowserState(), self.historyTableViewController); + self.browser->GetBrowserState(), _browsingHistoryDriverDelegate.get()); _browsingHistoryService = std::make_unique<history::BrowsingHistoryService>( _browsingHistoryDriver.get(), ios::HistoryServiceFactory::GetForBrowserState( @@ -163,6 +170,7 @@ self.historyClearBrowsingDataCoordinator = nil; _browsingHistoryDriver = nullptr; _browsingHistoryService = nullptr; + _browsingHistoryDriverDelegate = nullptr; } #pragma mark - HistoryUIDelegate
diff --git a/ios/chrome/browser/ui/history/ios_browsing_history_driver.h b/ios/chrome/browser/ui/history/ios_browsing_history_driver.h index 74069d0..fbd653e2 100644 --- a/ios/chrome/browser/ui/history/ios_browsing_history_driver.h +++ b/ios/chrome/browser/ui/history/ios_browsing_history_driver.h
@@ -13,18 +13,14 @@ #include "url/gurl.h" class ChromeBrowserState; -namespace history { -class HistoryService; -} - -@protocol HistoryConsumer; +class IOSBrowsingHistoryDriverDelegate; // A simple implementation of BrowsingHistoryServiceHandler that delegates to -// objective-c object HistoryConsumer for most actions. +// IOSBrowsingHistoryDriverDelegate for most actions. class IOSBrowsingHistoryDriver : public history::BrowsingHistoryDriver { public: IOSBrowsingHistoryDriver(ChromeBrowserState* browser_state, - id<HistoryConsumer> consumer); + IOSBrowsingHistoryDriverDelegate* delegate); IOSBrowsingHistoryDriver(const IOSBrowsingHistoryDriver&) = delete; IOSBrowsingHistoryDriver& operator=(const IOSBrowsingHistoryDriver&) = delete; @@ -56,8 +52,7 @@ // The current browser state. ChromeBrowserState* browser_state_; // weak - // Consumer for IOSBrowsingHistoryDriver. Serves as client for HistoryService. - __weak id<HistoryConsumer> consumer_; + IOSBrowsingHistoryDriverDelegate* delegate_ = nullptr; // weak }; #endif // IOS_CHROME_BROWSER_UI_HISTORY_IOS_BROWSING_HISTORY_DRIVER_H_
diff --git a/ios/chrome/browser/ui/history/ios_browsing_history_driver.mm b/ios/chrome/browser/ui/history/ios_browsing_history_driver.mm index 56d7b7e..c2d51bf 100644 --- a/ios/chrome/browser/ui/history/ios_browsing_history_driver.mm +++ b/ios/chrome/browser/ui/history/ios_browsing_history_driver.mm
@@ -13,6 +13,7 @@ #include "ios/chrome/browser/history/history_utils.h" #include "ios/chrome/browser/history/web_history_service_factory.h" #include "ios/chrome/browser/ui/history/history_consumer.h" +#include "ios/chrome/browser/ui/history/ios_browsing_history_driver_delegate.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -24,14 +25,12 @@ IOSBrowsingHistoryDriver::IOSBrowsingHistoryDriver( ChromeBrowserState* browser_state, - id<HistoryConsumer> consumer) - : browser_state_(browser_state), consumer_(consumer) { + IOSBrowsingHistoryDriverDelegate* delegate) + : browser_state_(browser_state), delegate_(delegate) { DCHECK(browser_state_); } -IOSBrowsingHistoryDriver::~IOSBrowsingHistoryDriver() { - consumer_ = nil; -} +IOSBrowsingHistoryDriver::~IOSBrowsingHistoryDriver() = default; #pragma mark - Private methods @@ -39,10 +38,8 @@ const std::vector<BrowsingHistoryService::HistoryEntry>& results, const BrowsingHistoryService::QueryResultsInfo& query_results_info, base::OnceClosure continuation_closure) { - [consumer_ - historyQueryWasCompletedWithResults:results - queryResultsInfo:query_results_info - continuationClosure:std::move(continuation_closure)]; + delegate_->HistoryQueryCompleted(results, query_results_info, + std::move(continuation_closure)); } void IOSBrowsingHistoryDriver::OnRemoveVisitsComplete() { @@ -59,13 +56,13 @@ } void IOSBrowsingHistoryDriver::HistoryDeleted() { - [consumer_ historyWasDeleted]; + delegate_->HistoryWasDeleted(); } void IOSBrowsingHistoryDriver::HasOtherFormsOfBrowsingHistory( bool has_other_forms, bool has_synced_results) { - [consumer_ showNoticeAboutOtherFormsOfBrowsingHistory:has_other_forms]; + delegate_->ShowNoticeAboutOtherFormsOfBrowsingHistory(has_other_forms); } bool IOSBrowsingHistoryDriver::AllowHistoryDeletions() {
diff --git a/ios/chrome/browser/ui/history/ios_browsing_history_driver_delegate.h b/ios/chrome/browser/ui/history/ios_browsing_history_driver_delegate.h new file mode 100644 index 0000000..d15ff2b --- /dev/null +++ b/ios/chrome/browser/ui/history/ios_browsing_history_driver_delegate.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 IOS_CHROME_BROWSER_UI_HISTORY_IOS_BROWSING_HISTORY_DRIVER_DELEGATE_H_ +#define IOS_CHROME_BROWSER_UI_HISTORY_IOS_BROWSING_HISTORY_DRIVER_DELEGATE_H_ + +#include <vector> + +#include "components/history/core/browser/browsing_history_service.h" + +class IOSBrowsingHistoryDriverDelegate { + public: + IOSBrowsingHistoryDriverDelegate() = default; + + IOSBrowsingHistoryDriverDelegate(const IOSBrowsingHistoryDriverDelegate&) = + delete; + IOSBrowsingHistoryDriverDelegate& operator=( + const IOSBrowsingHistoryDriverDelegate&) = delete; + + virtual void HistoryQueryCompleted( + const std::vector<history::BrowsingHistoryService::HistoryEntry>& results, + const history::BrowsingHistoryService::QueryResultsInfo& + query_results_info, + base::OnceClosure continuation_closure) = 0; + + virtual void HistoryWasDeleted() = 0; + + virtual void ShowNoticeAboutOtherFormsOfBrowsingHistory( + BOOL should_show_notice) = 0; + + protected: + virtual ~IOSBrowsingHistoryDriverDelegate() = default; +}; + +#endif // IOS_CHROME_BROWSER_UI_HISTORY_IOS_BROWSING_HISTORY_DRIVER_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/history/ios_browsing_history_driver_delegate_bridge.h b/ios/chrome/browser/ui/history/ios_browsing_history_driver_delegate_bridge.h new file mode 100644 index 0000000..7f90f40 --- /dev/null +++ b/ios/chrome/browser/ui/history/ios_browsing_history_driver_delegate_bridge.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 IOS_CHROME_BROWSER_UI_HISTORY_IOS_BROWSING_HISTORY_DRIVER_DELEGATE_BRIDGE_H_ +#define IOS_CHROME_BROWSER_UI_HISTORY_IOS_BROWSING_HISTORY_DRIVER_DELEGATE_BRIDGE_H_ + +#import "ios/chrome/browser/ui/history/history_consumer.h" +#import "ios/chrome/browser/ui/history/ios_browsing_history_driver_delegate.h" + +// Adapter to use an id<HistoryConsumer> as a IOSHistoryDriverDelegate. +class IOSBrowsingHistoryDriverDelegateBridge + : public IOSBrowsingHistoryDriverDelegate { + public: + explicit IOSBrowsingHistoryDriverDelegateBridge(id<HistoryConsumer> delegate); + + IOSBrowsingHistoryDriverDelegateBridge( + const IOSBrowsingHistoryDriverDelegateBridge&) = delete; + IOSBrowsingHistoryDriverDelegateBridge& operator=( + const IOSBrowsingHistoryDriverDelegateBridge&) = delete; + + ~IOSBrowsingHistoryDriverDelegateBridge() override; + + // IOSHistoryDriverDelegate overrides. + void HistoryQueryCompleted( + const std::vector<history::BrowsingHistoryService::HistoryEntry>& results, + const history::BrowsingHistoryService::QueryResultsInfo& + query_results_info, + base::OnceClosure continuation_closure) override; + void HistoryWasDeleted() override; + void ShowNoticeAboutOtherFormsOfBrowsingHistory( + BOOL should_show_notice) override; + + private: + __weak id<HistoryConsumer> delegate_ = nil; +}; + +#endif // IOS_CHROME_BROWSER_UI_HISTORY_IOS_BROWSING_HISTORY_DRIVER_DELEGATE_BRIDGE_H_
diff --git a/ios/chrome/browser/ui/history/ios_browsing_history_driver_delegate_bridge.mm b/ios/chrome/browser/ui/history/ios_browsing_history_driver_delegate_bridge.mm new file mode 100644 index 0000000..9d842c5 --- /dev/null +++ b/ios/chrome/browser/ui/history/ios_browsing_history_driver_delegate_bridge.mm
@@ -0,0 +1,35 @@ +// 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 "ios/chrome/browser/ui/history/ios_browsing_history_driver_delegate_bridge.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +IOSBrowsingHistoryDriverDelegateBridge::IOSBrowsingHistoryDriverDelegateBridge( + id<HistoryConsumer> delegate) + : delegate_(delegate) {} + +IOSBrowsingHistoryDriverDelegateBridge:: + ~IOSBrowsingHistoryDriverDelegateBridge() = default; + +void IOSBrowsingHistoryDriverDelegateBridge::HistoryQueryCompleted( + const std::vector<history::BrowsingHistoryService::HistoryEntry>& results, + const history::BrowsingHistoryService::QueryResultsInfo& query_results_info, + base::OnceClosure continuation_closure) { + [delegate_ + historyQueryWasCompletedWithResults:results + queryResultsInfo:query_results_info + continuationClosure:std::move(continuation_closure)]; +} + +void IOSBrowsingHistoryDriverDelegateBridge::HistoryWasDeleted() { + [delegate_ historyWasDeleted]; +} + +void IOSBrowsingHistoryDriverDelegateBridge:: + ShowNoticeAboutOtherFormsOfBrowsingHistory(BOOL should_show_notice) { + [delegate_ showNoticeAboutOtherFormsOfBrowsingHistory:should_show_notice]; +}
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/features.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/features.h index 6b1d23b..62769bbd 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/features.h +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/features.h
@@ -7,15 +7,9 @@ #include "base/feature_list.h" -// Feature flag to enable Bulk Actions. -extern const base::Feature kTabsBulkActions; - // Feature flag to enable Tabs Search. extern const base::Feature kTabsSearch; -// Whether the kTabsBulkActions flag is enabled. -bool IsTabsBulkActionsEnabled(); - // Whether the kTabsSearch flag is enabled. bool IsTabsSearchEnabled();
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/features.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/features.mm index 58faa21e..95276d4d 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/features.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/features.mm
@@ -8,16 +8,9 @@ #error "This file requires ARC support." #endif -const base::Feature kTabsBulkActions{"TabsBulkActions", - base::FEATURE_ENABLED_BY_DEFAULT}; - const base::Feature kTabsSearch{"TabsSearch", base::FEATURE_DISABLED_BY_DEFAULT}; -bool IsTabsBulkActionsEnabled() { - return base::FeatureList::IsEnabled(kTabsBulkActions); -} - bool IsTabsSearchEnabled() { return base::FeatureList::IsEnabled(kTabsSearch); }
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_cell.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_cell.mm index 87dba22..e11625a 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_cell.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_cell.mm
@@ -223,7 +223,7 @@ } - (NSArray*)accessibilityCustomActions { - if (IsTabsBulkActionsEnabled() && self.isInSelectionMode) { + if (self.isInSelectionMode) { // If the cell is in tab grid selection mode, only allow toggling the // selection state. return nil; @@ -376,17 +376,15 @@ closeIconView.image = [[UIImage imageNamed:@"grid_cell_close_button"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - if (IsTabsBulkActionsEnabled()) { - UIImageView* selectIconView = [[UIImageView alloc] init]; - selectIconView.translatesAutoresizingMaskIntoConstraints = NO; - selectIconView.contentMode = UIViewContentModeScaleAspectFit; - selectIconView.hidden = !self.isInSelectionMode; + UIImageView* selectIconView = [[UIImageView alloc] init]; + selectIconView.translatesAutoresizingMaskIntoConstraints = NO; + selectIconView.contentMode = UIViewContentModeScaleAspectFit; + selectIconView.hidden = !self.isInSelectionMode; - selectIconView.image = [self selectIconImageForCurrentState]; + selectIconView.image = [self selectIconImageForCurrentState]; - [topBar addSubview:selectIconView]; - _selectIconView = selectIconView; - } + [topBar addSubview:selectIconView]; + _selectIconView = selectIconView; [topBar addSubview:iconView]; [topBar addSubview:activityIndicator];
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_context_menu_helper.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_context_menu_helper.mm index 3ba046135..44cc1df 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_context_menu_helper.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_context_menu_helper.mm
@@ -150,12 +150,10 @@ } } - if (IsTabsBulkActionsEnabled()) { - if ([self.contextMenuDelegate respondsToSelector:@selector(selectTabs)]) { - [menuElements addObject:[actionFactory actionToSelectTabsWithBlock:^{ - [self.contextMenuDelegate selectTabs]; - }]]; - } + if ([self.contextMenuDelegate respondsToSelector:@selector(selectTabs)]) { + [menuElements addObject:[actionFactory actionToSelectTabsWithBlock:^{ + [self.contextMenuDelegate selectTabs]; + }]]; } if ([self.contextMenuDelegate
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.mm index 898baa6..2052733b 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.mm
@@ -98,7 +98,6 @@ - (void)setMode:(TabGridMode)mode { if (_mode == mode) return; - DCHECK(IsTabsBulkActionsEnabled() || mode == TabGridModeNormal); _mode = mode; // Reset selected tabs count when mode changes. self.selectedTabsCount = 0; @@ -262,28 +261,26 @@ [[UIBarButtonItem alloc] initWithCustomView:_smallNewTabButton]; // Create selection mode buttons - if (IsTabsBulkActionsEnabled()) { - _editButton = [[UIBarButtonItem alloc] init]; - _editButton.tintColor = UIColorFromRGB(kTabGridToolbarTextButtonColor); - _editButton.title = l10n_util::GetNSString(IDS_IOS_TAB_GRID_EDIT_BUTTON); - _editButton.accessibilityIdentifier = kTabGridEditButtonIdentifier; + _editButton = [[UIBarButtonItem alloc] init]; + _editButton.tintColor = UIColorFromRGB(kTabGridToolbarTextButtonColor); + _editButton.title = l10n_util::GetNSString(IDS_IOS_TAB_GRID_EDIT_BUTTON); + _editButton.accessibilityIdentifier = kTabGridEditButtonIdentifier; - _addToButton = [[UIBarButtonItem alloc] init]; - _addToButton.tintColor = UIColorFromRGB(kTabGridToolbarTextButtonColor); - _addToButton.title = l10n_util::GetNSString(IDS_IOS_TAB_GRID_ADD_TO_BUTTON); - _addToButton.accessibilityIdentifier = kTabGridEditAddToButtonIdentifier; - _shareButton = [[UIBarButtonItem alloc] - initWithBarButtonSystemItem:UIBarButtonSystemItemAction - target:nil - action:nil]; - _shareButton.tintColor = UIColorFromRGB(kTabGridToolbarTextButtonColor); - _shareButton.accessibilityIdentifier = kTabGridEditShareButtonIdentifier; - _closeTabsButton = [[UIBarButtonItem alloc] init]; - _closeTabsButton.tintColor = UIColorFromRGB(kTabGridToolbarTextButtonColor); - _closeTabsButton.accessibilityIdentifier = - kTabGridEditCloseTabsButtonIdentifier; - [self updateCloseTabsButtonTitle]; - } + _addToButton = [[UIBarButtonItem alloc] init]; + _addToButton.tintColor = UIColorFromRGB(kTabGridToolbarTextButtonColor); + _addToButton.title = l10n_util::GetNSString(IDS_IOS_TAB_GRID_ADD_TO_BUTTON); + _addToButton.accessibilityIdentifier = kTabGridEditAddToButtonIdentifier; + _shareButton = [[UIBarButtonItem alloc] + initWithBarButtonSystemItem:UIBarButtonSystemItemAction + target:nil + action:nil]; + _shareButton.tintColor = UIColorFromRGB(kTabGridToolbarTextButtonColor); + _shareButton.accessibilityIdentifier = kTabGridEditShareButtonIdentifier; + _closeTabsButton = [[UIBarButtonItem alloc] init]; + _closeTabsButton.tintColor = UIColorFromRGB(kTabGridToolbarTextButtonColor); + _closeTabsButton.accessibilityIdentifier = + kTabGridEditCloseTabsButtonIdentifier; + [self updateCloseTabsButtonTitle]; _compactConstraints = @[ [_toolbar.topAnchor constraintEqualToAnchor:self.topAnchor], @@ -347,7 +344,6 @@ -kTabGridFloatingButtonVerticalInset; if (self.mode == TabGridModeSelection) { - DCHECK(IsTabsBulkActionsEnabled()); [_toolbar setItems:@[ _closeTabsButton, _spaceItem, _shareButton, _spaceItem, _addToButton ]]; @@ -358,7 +354,7 @@ return; } UIBarButtonItem* leadingButton = _closeAllOrUndoButton; - if (IsTabsBulkActionsEnabled() && !_undoActive) + if (!_undoActive) leadingButton = _editButton; UIBarButtonItem* trailingButton = _doneButton;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_egtest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_egtest.mm index ad6b405..1f69295 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_egtest.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_egtest.mm
@@ -98,28 +98,6 @@ - (AppLaunchConfiguration)appConfigurationForTestCase { AppLaunchConfiguration config; - // Features are enabled or disabled based on the name of the test that is - // running. This is done because it is inefficient to use - // ensureAppLaunchedWithConfiguration for each test. - if ([self isRunningTest:@selector(testCloseAllAndUndoCloseAll)] || - [self isRunningTest:@selector - (testUndoCloseAllNotAvailableAfterNewTabCreation)] || - [self isRunningTest:@selector(testTabGridBulkActionCloseTabs)] || - [self isRunningTest:@selector(testTabGridBulkActionDeselectAll)] || - [self isRunningTest:@selector(testTabGridBulkActionSelectAll)] || - [self isRunningTest:@selector(testTabGridBulkActionAddToBookmarks)] || - [self isRunningTest:@selector(testTabGridBulkActionAddToReadingList)] || - [self isRunningTest:@selector(testTabGridBulkActionShare)]) { - config.features_enabled.push_back(kTabsBulkActions); - } else if ( - [self isRunningTest:@selector - (testCloseAllAndUndoCloseAll_BulkActionsDisabled)] || - [self isRunningTest:@selector - (testUndoCloseAllNotAvailableAfterNewTabCreation_BulkActionsDisabled - )]) { - config.features_disabled.push_back(kTabsBulkActions); - } - config.features_disabled.push_back(kStartSurface); return config; @@ -177,33 +155,6 @@ // Tests that tapping Close All shows no tabs, shows Undo button, and displays // the empty state. Then tests tapping Undo shows Close All button again. -// Validates this case when Tab Grid Bulk Actions feature is disabled. -- (void)testCloseAllAndUndoCloseAll_BulkActionsDisabled { - [[EarlGrey selectElementWithMatcher:chrome_test_util::ShowTabsButton()] - performAction:grey_tap()]; - [[EarlGrey selectElementWithMatcher:chrome_test_util::TabGridCloseAllButton()] - performAction:grey_tap()]; - [[EarlGrey selectElementWithMatcher:chrome_test_util::TabGridCellAtIndex(0)] - assertWithMatcher:grey_nil()]; - [[EarlGrey - selectElementWithMatcher:chrome_test_util::TabGridUndoCloseAllButton()] - assertWithMatcher:grey_sufficientlyVisible()]; - [[EarlGrey selectElementWithMatcher:chrome_test_util::TabGridCloseAllButton()] - assertWithMatcher:grey_nil()]; - [[EarlGrey selectElementWithMatcher:chrome_test_util:: - TabGridRegularTabsEmptyStateView()] - assertWithMatcher:grey_sufficientlyVisible()]; - [[EarlGrey - selectElementWithMatcher:chrome_test_util::TabGridUndoCloseAllButton()] - performAction:grey_tap()]; - [[EarlGrey selectElementWithMatcher:chrome_test_util::TabGridCellAtIndex(0)] - assertWithMatcher:grey_sufficientlyVisible()]; - [[EarlGrey selectElementWithMatcher:chrome_test_util::TabGridCloseAllButton()] - assertWithMatcher:grey_sufficientlyVisible()]; -} - -// Tests that tapping Close All shows no tabs, shows Undo button, and displays -// the empty state. Then tests tapping Undo shows Close All button again. // Validates this case when Tab Grid Bulk Actions feature is enabled. - (void)testCloseAllAndUndoCloseAll { [[EarlGrey selectElementWithMatcher:chrome_test_util::ShowTabsButton()] @@ -244,30 +195,6 @@ // Tests that the Undo button is no longer available after tapping Close All, // then creating a new tab, then coming back to the tab grid. -// Validates this case when Tab Grid Bulk Actions feature is disabled. -- (void)testUndoCloseAllNotAvailableAfterNewTabCreation_BulkActionsDisabled { - [[EarlGrey selectElementWithMatcher:chrome_test_util::ShowTabsButton()] - performAction:grey_tap()]; - [[EarlGrey selectElementWithMatcher:chrome_test_util::TabGridCloseAllButton()] - performAction:grey_tap()]; - [[EarlGrey - selectElementWithMatcher:chrome_test_util::TabGridUndoCloseAllButton()] - assertWithMatcher:grey_sufficientlyVisible()]; - // Create a new tab then come back to tab grid. - [[EarlGrey selectElementWithMatcher:chrome_test_util::TabGridNewTabButton()] - performAction:grey_tap()]; - [[EarlGrey selectElementWithMatcher:chrome_test_util::ShowTabsButton()] - performAction:grey_tap()]; - // Undo is no longer available. - [[EarlGrey - selectElementWithMatcher:chrome_test_util::TabGridUndoCloseAllButton()] - assertWithMatcher:grey_nil()]; - [[EarlGrey selectElementWithMatcher:chrome_test_util::TabGridCloseAllButton()] - assertWithMatcher:grey_sufficientlyVisible()]; -} - -// Tests that the Undo button is no longer available after tapping Close All, -// then creating a new tab, then coming back to the tab grid. // Validates this case when Tab Grid Bulk Actions feature is enabled. - (void)testUndoCloseAllNotAvailableAfterNewTabCreation { [[EarlGrey selectElementWithMatcher:chrome_test_util::ShowTabsButton()]
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_top_toolbar.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_top_toolbar.mm index 825d1a7..c7438856 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_top_toolbar.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_top_toolbar.mm
@@ -275,7 +275,7 @@ } // In Landscape normal mode leading button is always "closeAll", or "Edit" if // bulk actions feature is enabled. - if (IsTabsBulkActionsEnabled() && !_undoActive) + if (!_undoActive) _leadingButton = _editButton; else _leadingButton = _closeAllOrUndoButton; @@ -290,7 +290,7 @@ return; } - if (IsTabsBulkActionsEnabled() && _mode == TabGridModeSelection) { + if (_mode == TabGridModeSelection) { // In the selection mode, Done button is much smaller than SelectAll // we need to calculate the difference on the width and use it as a // fixed space to make sure that the title is still centered. @@ -353,37 +353,34 @@ _doneButton.accessibilityIdentifier = kTabGridDoneButtonIdentifier; _doneButton.title = l10n_util::GetNSString(IDS_IOS_TAB_GRID_DONE_BUTTON); - if (IsTabsBulkActionsEnabled()) { - _editButton = [[UIBarButtonItem alloc] init]; - _editButton.tintColor = UIColorFromRGB(kTabGridToolbarTextButtonColor); - _editButton.title = l10n_util::GetNSString(IDS_IOS_TAB_GRID_EDIT_BUTTON); - _editButton.accessibilityIdentifier = kTabGridEditButtonIdentifier; + _editButton = [[UIBarButtonItem alloc] init]; + _editButton.tintColor = UIColorFromRGB(kTabGridToolbarTextButtonColor); + _editButton.title = l10n_util::GetNSString(IDS_IOS_TAB_GRID_EDIT_BUTTON); + _editButton.accessibilityIdentifier = kTabGridEditButtonIdentifier; - _selectAllButton = [[UIBarButtonItem alloc] init]; - _selectAllButton.tintColor = UIColorFromRGB(kTabGridToolbarTextButtonColor); - _selectAllButton.title = - l10n_util::GetNSString(IDS_IOS_TAB_GRID_SELECT_ALL_BUTTON); - _selectAllButton.accessibilityIdentifier = - kTabGridEditSelectAllButtonIdentifier; + _selectAllButton = [[UIBarButtonItem alloc] init]; + _selectAllButton.tintColor = UIColorFromRGB(kTabGridToolbarTextButtonColor); + _selectAllButton.title = + l10n_util::GetNSString(IDS_IOS_TAB_GRID_SELECT_ALL_BUTTON); + _selectAllButton.accessibilityIdentifier = + kTabGridEditSelectAllButtonIdentifier; - _selectedTabsItem = [[UIBarButtonItem alloc] init]; - _selectedTabsItem.title = - l10n_util::GetNSString(IDS_IOS_TAB_GRID_SELECT_TABS_TITLE); - _selectedTabsItem.tintColor = - UIColorFromRGB(kTabGridToolbarTextButtonColor); - _selectedTabsItem.action = nil; - _selectedTabsItem.target = nil; - _selectedTabsItem.enabled = NO; - [_selectedTabsItem setTitleTextAttributes:@{ - NSForegroundColorAttributeName : - UIColorFromRGB(kTabGridToolbarTextButtonColor), - NSFontAttributeName : [[UIFontMetrics - metricsForTextStyle:UIFontTextStyleBody] - scaledFontForFont:[UIFont systemFontOfSize:kSelectionModeButtonSize - weight:UIFontWeightSemibold]] - } - forState:UIControlStateDisabled]; + _selectedTabsItem = [[UIBarButtonItem alloc] init]; + _selectedTabsItem.title = + l10n_util::GetNSString(IDS_IOS_TAB_GRID_SELECT_TABS_TITLE); + _selectedTabsItem.tintColor = UIColorFromRGB(kTabGridToolbarTextButtonColor); + _selectedTabsItem.action = nil; + _selectedTabsItem.target = nil; + _selectedTabsItem.enabled = NO; + [_selectedTabsItem setTitleTextAttributes:@{ + NSForegroundColorAttributeName : + UIColorFromRGB(kTabGridToolbarTextButtonColor), + NSFontAttributeName : + [[UIFontMetrics metricsForTextStyle:UIFontTextStyleBody] + scaledFontForFont:[UIFont systemFontOfSize:kSelectionModeButtonSize + weight:UIFontWeightSemibold]] } + forState:UIControlStateDisabled]; if (IsTabsSearchEnabled()) { _searchButton = [[UIBarButtonItem alloc]
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm index b1d4a44d..8523124 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm
@@ -254,8 +254,7 @@ [self setupTopToolbar]; [self setupBottomToolbar]; - if (IsTabsBulkActionsEnabled()) - [self setupEditButton]; + [self setupEditButton]; // Hide the toolbars and the floating button, so they can fade in the first // time there's a transition into this view controller.
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.h b/ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.h index 52542c7..a2dfffd 100644 --- a/ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.h +++ b/ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.h
@@ -39,7 +39,6 @@ // UILabels corresponding to |text| and |detailText| from the item. @property(nonatomic, readonly, strong) UILabel* textLabel; -@property(nonatomic, readonly, strong) UILabel* detailTextLabel; // The layout constraint axis of the text labels within the cell. Defaults // to a horizontal, edge aligned layout. @@ -51,6 +50,10 @@ // the full width of the cell. - (void)setIconImage:(UIImage*)image; +// Sets the detail text. |detailText| can be nil (or empty) to hide the detail +// text. +- (void)setDetailText:(NSString*)detailText; + @end #endif // IOS_CHROME_BROWSER_UI_TABLE_VIEW_CELLS_TABLE_VIEW_DETAIL_ICON_ITEM_H_
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.mm index f983df2b..b808c21a 100644 --- a/ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.mm +++ b/ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.h" +#import "base/check.h" #import "ios/chrome/browser/ui/settings/cells/settings_cells_constants.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h" #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h" @@ -19,7 +20,10 @@ // Proportion of Cell's textLabel/detailTextLabel. This guarantees that the // textLabel occupies 75% of the row space and detailTextLabel occupies 25%. -const CGFloat kCellLabelsWidthProportion = 3.0f; +constexpr CGFloat kCellLabelsWidthProportion = 3.f; + +// Minimum cell height when the cell has 2 lines. +constexpr CGFloat kChromeTableViewTwoLinesCellHeight = 58.f; } // namespace @@ -39,7 +43,7 @@ withStyler:(ChromeTableViewStyler*)styler { [super configureCell:cell withStyler:styler]; cell.textLabel.text = self.text; - cell.detailTextLabel.text = self.detailText; + [cell setDetailText:self.detailText]; // Update the icon image, if one is present. UIImage* iconImage = nil; @@ -56,15 +60,18 @@ @interface TableViewDetailIconCell () -// When they are activated, the labels are on one line. -// They conflict with the accessibilityConstraints. -@property(nonatomic, strong) NSArray<NSLayoutConstraint*>* standardConstraints; -// When they are activated, each label is on its own line, with no line number -// limit. They conflict with the standardConstraints. -@property(nonatomic, strong) - NSArray<NSLayoutConstraint*>* accessibilityConstraints; // View containing UILabels |text| and |detailText|. @property(nonatomic, strong) UIStackView* textStackView; +// Padding layout constraints. +@property(nonatomic, strong) + NSArray<NSLayoutConstraint*>* verticalPaddingConstraints; +// Constraint to set the cell minimun height. +@property(nonatomic, strong) NSLayoutConstraint* minimumCellHeightConstraint; +// Text width constraint between the title and the detail text. +@property(nonatomic, strong) NSLayoutConstraint* textWidthConstraint; +// Detail text. Can be nil if no text is set. +@property(nonatomic, strong) UILabel* detailTextLabel; + @end @implementation TableViewDetailIconCell { @@ -95,16 +102,8 @@ _textLabel.textColor = [UIColor colorNamed:kTextPrimaryColor]; _textLabel.backgroundColor = UIColor.clearColor; - _detailTextLabel = [[UILabel alloc] init]; - _detailTextLabel.translatesAutoresizingMaskIntoConstraints = NO; - _detailTextLabel.font = - [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; - _detailTextLabel.adjustsFontForContentSizeCategory = YES; - _detailTextLabel.textColor = [UIColor colorNamed:kTextSecondaryColor]; - _detailTextLabel.backgroundColor = UIColor.clearColor; - - _textStackView = [[UIStackView alloc] - initWithArrangedSubviews:@[ _textLabel, _detailTextLabel ]]; + _textStackView = + [[UIStackView alloc] initWithArrangedSubviews:@[ _textLabel ]]; _textStackView.translatesAutoresizingMaskIntoConstraints = NO; [contentView addSubview:_textStackView]; @@ -117,37 +116,14 @@ constraintEqualToAnchor:_iconImageView.trailingAnchor constant:kTableViewImagePadding]; - // In case the two labels don't fit in width, have the |textLabel| be 3 - // times the width of the |detailTextLabel| (so 75% / 25%). - NSLayoutConstraint* widthConstraint = [_textLabel.widthAnchor - constraintEqualToAnchor:_detailTextLabel.widthAnchor - multiplier:kCellLabelsWidthProportion]; - // Set low priority to the proportion constraint between |_textLabel| and - // |_detailTextLabel|, so that it won't break other layouts. - widthConstraint.priority = UILayoutPriorityDefaultLow; - - NSLayoutConstraint* heightConstraint = [self.contentView.heightAnchor + _minimumCellHeightConstraint = [contentView.heightAnchor constraintGreaterThanOrEqualToConstant:kChromeTableViewCellHeight]; - // Don't set the priority to required to avoid clashing with the estimated - // height. - heightConstraint.priority = UILayoutPriorityRequired - 1; - - _standardConstraints = @[ - [_textStackView.centerYAnchor - constraintEqualToAnchor:contentView.centerYAnchor], - widthConstraint, - heightConstraint, - ]; - - _accessibilityConstraints = @[ - [_textStackView.topAnchor - constraintEqualToAnchor:contentView.topAnchor - constant:kTableViewLargeVerticalSpacing], - [_textStackView.bottomAnchor - constraintEqualToAnchor:contentView.bottomAnchor - constant:-kTableViewLargeVerticalSpacing], - - ]; + // Lower the priority for transition. The content view has autoresizing mask + // to have the same height than the cell. To avoid breaking the constaints + // while updatingn the minimum height constant, the constraint has to have + // a lower priority. + _minimumCellHeightConstraint.priority = UILayoutPriorityDefaultHigh - 1; + _minimumCellHeightConstraint.active = YES; [NSLayoutConstraint activateConstraints:@[ // Image. @@ -165,6 +141,8 @@ [_textStackView.trailingAnchor constraintEqualToAnchor:contentView.trailingAnchor constant:-kTableViewHorizontalSpacing], + [_textStackView.centerYAnchor + constraintEqualToAnchor:contentView.centerYAnchor], _iconHiddenConstraint, // Leading constraint for |customSeparator|. @@ -172,10 +150,10 @@ constraintEqualToAnchor:_textStackView.leadingAnchor], ]]; - AddOptionalVerticalPadding(contentView, _textStackView, - kTableViewOneLabelCellVerticalSpacing); + _verticalPaddingConstraints = AddOptionalVerticalPadding( + contentView, _textStackView, kTableViewTwoLabelsCellVerticalSpacing); - [self updateForAccessibilityContentSizeCategory: + [self updateCellForAccessibilityContentSizeCategory: UIContentSizeCategoryIsAccessibilityCategory( self.traitCollection.preferredContentSizeCategory)]; } @@ -199,27 +177,50 @@ } } +#pragma mark - Properties + - (void)setTextLayoutConstraintAxis: (UILayoutConstraintAxis)textLayoutConstraintAxis { - UIFontTextStyle preferredFont = - textLayoutConstraintAxis == UILayoutConstraintAxisVertical - ? kTableViewSublabelFontStyle - : UIFontTextStyleBody; - self.detailTextLabel.font = [UIFont preferredFontForTextStyle:preferredFont]; + CGFloat verticalPaddingConstant = 0; + switch (textLayoutConstraintAxis) { + case UILayoutConstraintAxisVertical: + verticalPaddingConstant = kTableViewTwoLabelsCellVerticalSpacing; + self.minimumCellHeightConstraint.constant = + kChromeTableViewTwoLinesCellHeight; + DCHECK(self.detailTextLabel); + break; + case UILayoutConstraintAxisHorizontal: + verticalPaddingConstant = kTableViewOneLabelCellVerticalSpacing; + self.minimumCellHeightConstraint.constant = kChromeTableViewCellHeight; + break; + } + DCHECK(verticalPaddingConstant); + for (NSLayoutConstraint* constraint in self.verticalPaddingConstraints) { + constraint.constant = verticalPaddingConstant; + } self.textStackView.axis = textLayoutConstraintAxis; - [self updateForAccessibilityContentSizeCategory: + [self updateCellForAccessibilityContentSizeCategory: UIContentSizeCategoryIsAccessibilityCategory( self.traitCollection.preferredContentSizeCategory)]; } -#pragma mark - Properties - - (UILayoutConstraintAxis)textLayoutConstraintAxis { return self.textStackView.axis; } +- (void)setDetailText:(NSString*)detailText { + if (detailText.length > 0) { + if (!self.detailTextLabel) { + [self createDetailTextLabel]; + } + self.detailTextLabel.text = detailText; + } else if (self.detailTextLabel) { + [self removeDetailTextLabel]; + } +} + #pragma mark - UIView - (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { @@ -230,7 +231,7 @@ if (isCurrentCategoryAccessibility != UIContentSizeCategoryIsAccessibilityCategory( previousTraitCollection.preferredContentSizeCategory)) { - [self updateForAccessibilityContentSizeCategory: + [self updateCellForAccessibilityContentSizeCategory: isCurrentCategoryAccessibility]; } } @@ -242,26 +243,60 @@ [self setTextLayoutConstraintAxis:UILayoutConstraintAxisHorizontal]; [self setIconImage:nil]; + [self setDetailText:nil]; } #pragma mark - Private +- (void)createDetailTextLabel { + if (self.detailTextLabel) { + return; + } + self.detailTextLabel = [[UILabel alloc] init]; + self.detailTextLabel.translatesAutoresizingMaskIntoConstraints = NO; + self.detailTextLabel.font = + [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; + self.detailTextLabel.adjustsFontForContentSizeCategory = YES; + self.detailTextLabel.textColor = [UIColor colorNamed:kTextSecondaryColor]; + self.detailTextLabel.backgroundColor = UIColor.clearColor; + [self.textStackView addArrangedSubview:self.detailTextLabel]; + // In case the two labels don't fit in width, have the |textLabel| be 3 + // times the width of the |detailTextLabel| (so 75% / 25%). + self.textWidthConstraint = [self.textLabel.widthAnchor + constraintEqualToAnchor:self.detailTextLabel.widthAnchor + multiplier:kCellLabelsWidthProportion]; + // Set low priority to the proportion constraint between |self.textLabel| and + // |self.detailTextLabel|, so that it won't break other layouts. + self.textWidthConstraint.priority = UILayoutPriorityDefaultLow; + [self updateCellForAccessibilityContentSizeCategory: + UIContentSizeCategoryIsAccessibilityCategory( + self.traitCollection.preferredContentSizeCategory)]; +} + +- (void)removeDetailTextLabel { + if (!self.detailTextLabel) { + return; + } + [self.detailTextLabel removeFromSuperview]; + self.detailTextLabel = nil; + self.textWidthConstraint = nil; + self.textLayoutConstraintAxis = UILayoutConstraintAxisHorizontal; +} + // Updates the cell such as it is layouted correctly with regard to the // preferred content size category, if it is an // |accessibilityContentSizeCategory| or not. -- (void)updateForAccessibilityContentSizeCategory: +- (void)updateCellForAccessibilityContentSizeCategory: (BOOL)accessibilityContentSizeCategory { if (accessibilityContentSizeCategory) { - [NSLayoutConstraint deactivateConstraints:_standardConstraints]; - [NSLayoutConstraint activateConstraints:_accessibilityConstraints]; + _textWidthConstraint.active = NO; // detailTextLabel is laid below textLabel with accessibility content size // category. _detailTextLabel.textAlignment = NSTextAlignmentNatural; _detailTextLabel.numberOfLines = 0; _textLabel.numberOfLines = 0; } else { - [NSLayoutConstraint deactivateConstraints:_accessibilityConstraints]; - [NSLayoutConstraint activateConstraints:_standardConstraints]; + _textWidthConstraint.active = YES; // detailTextLabel is laid after textLabel and should have a trailing text // alignment with non-accessibility content size category if in horizontal // axis layout. @@ -277,6 +312,11 @@ _detailTextLabel.numberOfLines = 1; _textLabel.numberOfLines = 1; } + UIFontTextStyle preferredFont = + _textStackView.axis == UILayoutConstraintAxisVertical + ? kTableViewSublabelFontStyle + : UIFontTextStyleBody; + _detailTextLabel.font = [UIFont preferredFontForTextStyle:preferredFont]; } - (NSString*)accessibilityLabel {
diff --git a/ios/chrome/common/ui/util/constraints_ui_util.h b/ios/chrome/common/ui/util/constraints_ui_util.h index 42f0a634..27818b1 100644 --- a/ios/chrome/common/ui/util/constraints_ui_util.h +++ b/ios/chrome/common/ui/util/constraints_ui_util.h
@@ -190,13 +190,16 @@ // the padding is optional so that the inner views are not artificially // shortened when fixed-size cells cut into that padding. The padding is added // between |outerView| and |innerView|. -void AddOptionalVerticalPadding(id<EdgeLayoutGuideProvider> outerView, - id<EdgeLayoutGuideProvider> innerView, - CGFloat padding); -void AddOptionalVerticalPadding(id<EdgeLayoutGuideProvider> outerView, - id<EdgeLayoutGuideProvider> topInnerView, - id<EdgeLayoutGuideProvider> bottomInnerView, - CGFloat padding); +// Returns the top and bottom layouts that have been created. +NSArray<NSLayoutConstraint*>* AddOptionalVerticalPadding( + id<EdgeLayoutGuideProvider> outerView, + id<EdgeLayoutGuideProvider> innerView, + CGFloat padding); +NSArray<NSLayoutConstraint*>* AddOptionalVerticalPadding( + id<EdgeLayoutGuideProvider> outerView, + id<EdgeLayoutGuideProvider> topInnerView, + id<EdgeLayoutGuideProvider> bottomInnerView, + CGFloat padding); // Returns the vertical constraint of |innerView| and |outerView|. The height of // |outerView| equals to the height of |innerView| plus |inset|.
diff --git a/ios/chrome/common/ui/util/constraints_ui_util.mm b/ios/chrome/common/ui/util/constraints_ui_util.mm index 0cf0228..d2520e7 100644 --- a/ios/chrome/common/ui/util/constraints_ui_util.mm +++ b/ios/chrome/common/ui/util/constraints_ui_util.mm
@@ -168,27 +168,30 @@ [NSLayoutConstraint activateConstraints:constraints]; } -void AddOptionalVerticalPadding(id<EdgeLayoutGuideProvider> outerView, - id<EdgeLayoutGuideProvider> innerView, - CGFloat padding) { - AddOptionalVerticalPadding(outerView, innerView, innerView, padding); +NSArray<NSLayoutConstraint*>* AddOptionalVerticalPadding( + id<EdgeLayoutGuideProvider> outerView, + id<EdgeLayoutGuideProvider> innerView, + CGFloat padding) { + return AddOptionalVerticalPadding(outerView, innerView, innerView, padding); } -void AddOptionalVerticalPadding(id<EdgeLayoutGuideProvider> outerView, - id<EdgeLayoutGuideProvider> topInnerView, - id<EdgeLayoutGuideProvider> bottomInnerView, - CGFloat padding) { +NSArray<NSLayoutConstraint*>* AddOptionalVerticalPadding( + id<EdgeLayoutGuideProvider> outerView, + id<EdgeLayoutGuideProvider> topInnerView, + id<EdgeLayoutGuideProvider> bottomInnerView, + CGFloat padding) { NSLayoutConstraint* topPaddingConstraint = [topInnerView.topAnchor constraintGreaterThanOrEqualToAnchor:outerView.topAnchor constant:padding]; topPaddingConstraint.priority = UILayoutPriorityDefaultLow; - NSLayoutConstraint* bottomPaddingConstraint = [bottomInnerView.bottomAnchor - constraintLessThanOrEqualToAnchor:outerView.bottomAnchor - constant:-padding]; + NSLayoutConstraint* bottomPaddingConstraint = [outerView.bottomAnchor + constraintLessThanOrEqualToAnchor:bottomInnerView.bottomAnchor + constant:padding]; bottomPaddingConstraint.priority = UILayoutPriorityDefaultLow; - - [NSLayoutConstraint - activateConstraints:@[ topPaddingConstraint, bottomPaddingConstraint ]]; + NSArray<NSLayoutConstraint*>* contraints = + @[ topPaddingConstraint, bottomPaddingConstraint ]; + [NSLayoutConstraint activateConstraints:contraints]; + return contraints; } NSLayoutConstraint* VerticalConstraintsWithInset(UIView* innerView,
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bn.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bn.xtb index 9905b53..b6202d1 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bn.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bn.xtb
@@ -9,12 +9,16 @@ <translation id="1706288056912586527">পাসওয়ার্ড দেখুন</translation> <translation id="1870148520156231997">পাসওয়ার্ড দেখুন</translation> <translation id="1977167321677356409">পাসওয়ার্ড</translation> +<translation id="2211969839027957773">Google পাসওয়ার্ড ম্যানেজার</translation> <translation id="2320166752086256636">কীবোর্ড লুকান</translation> +<translation id="2489483078139081050">সেভ থাকা পাসওয়ার্ড আপনার ডিভাইসের অন্যান্য অ্যাপেও ব্যবহার করতে পারবেন। এটি শুধুমাত্র এই ডিভাইস Google পাসওয়ার্ড ম্যানেজার বিকল্পে সেভ করা আছে।</translation> +<translation id="2677128368066534822">আরও দ্রুত পাসওয়ার্ড পেতে, iCloud কী চেনের থেকে টিক চিহ্ন সরিয়ে দিন</translation> <translation id="2712586044587587728">আপনার Chrome-এ সেভ করা পাসওয়ার্ড অন্যান্য অ্যাপেও ব্যবহার করার জন্য উপলভ্য থাকবে। সেটিংস অ্যাপ থেকে যেকোনও সময় এটি বন্ধ করতে পারবেন।</translation> <translation id="2747003861858887689">পূর্ববর্তী ফিল্ড</translation> <translation id="3280734926621805458">ব্যবহার করুন</translation> <translation id="3580107423202590938">Chrome-এ কোনও পাসওয়ার্ড সেভ করা নেই</translation> <translation id="368844171100841558">বদলান</translation> +<translation id="3739920431472254679">আপনি যেকোনও ডিভাইসেই যাতে পাসওয়ার্ড ব্যবহার করতে পারেন, সেই জন্য Google পাসওয়ার্ড ম্যানেজার বিকল্পে পাসওয়ার্ড সেভ করা হয়।</translation> <translation id="3753678329684433031">Chrome-এ সেভ থাকা পাসওয়ার্ড অটো-ফিল করা</translation> <translation id="3789385946721385622">ইউজারনেম</translation> <translation id="4064278913989596727">সহায়তা</translation> @@ -26,6 +30,7 @@ <translation id="5366190986669335938">Chrome-এ আপনার সেভ করা পাসওয়ার্ড যেকোনও অ্যাপ থেকে অ্যাক্সেস করুন।</translation> <translation id="579113627088729016">অটো-ফিল চালু করুন</translation> <translation id="5824290706342306555">শুরু করতে, Chrome-এ কিছু পাসওয়ার্ড সেভ করুন অথবা আপনার Google অ্যাকাউন্ট দিয়ে সাইন-ইন করুন।</translation> +<translation id="6002340317268558779">সেভ থাকা পাসওয়ার্ড আপনার ডিভাইসের অন্যান্য অ্যাপেও ব্যবহার করতে পারবেন। এটি <ph name="EMAIL" />-এর Google পাসওয়ার্ড ম্যানেজার বিকল্পে সেভ করা আছে।</translation> <translation id="6159839020698489198">ঐচ্ছিক</translation> <translation id="6216401132953873625">নতুন পাসওয়ার্ড যোগ করুন</translation> <translation id="6539092367496845964">কোনও সমস্যা হয়েছে। পরে আবার চেষ্টা করুন।</translation> @@ -53,4 +58,5 @@ <translation id="8730621377337864115">হয়ে গেছে</translation> <translation id="8877181643142698531">ইউআরএল</translation> <translation id="9069288651897538648"><ph name="URL" />-এর জন্য</translation> +<translation id="9168839987494597225">পাসওয়ার্ড শুধুমাত্র এই ডিভাইসের Google পাসওয়ার্ড ম্যানেজার বিকল্পে সেভ করা হয়।</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_eu.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_eu.xtb index 61fbcbd..355bd2b 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_eu.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_eu.xtb
@@ -9,12 +9,16 @@ <translation id="1706288056912586527">Erakutsi pasahitza</translation> <translation id="1870148520156231997">Erakutsi pasahitza</translation> <translation id="1977167321677356409">Pasahitza</translation> +<translation id="2211969839027957773">Google-ren Pasahitz-kudeatzailea</translation> <translation id="2320166752086256636">Ezkutatu teklatua</translation> +<translation id="2489483078139081050">Gordetako pasahitzak gailuko beste aplikazio batzuetan erabil ditzakezu. Gailu honetan soilik gordetzen dira Google-ren Pasahitz-kudeatzailea atalean.</translation> +<translation id="2677128368066534822">Pasahitzak bizkorrago eskuratzeko, desautatu iCloud keychain</translation> <translation id="2712586044587587728">Chrome-ko zure pasahitzak beste aplikazio batzuetan erabili ahal izango dituzu. Aukera hori desaktibatzeko, joan Ezarpenak aplikaziora.</translation> <translation id="2747003861858887689">Aurreko eremua</translation> <translation id="3280734926621805458">Erabili</translation> <translation id="3580107423202590938">Ez dago pasahitzik Chrome-n</translation> <translation id="368844171100841558">Ordeztu</translation> +<translation id="3739920431472254679">Google-ren Pasahitz-kudeatzailea atalean gordetzen dira pasahitzak, eta edozein gailutan erabil ditzakezu.</translation> <translation id="3753678329684433031">Bete automatikoki Chrome-n gordetako pasahitzarekin</translation> <translation id="3789385946721385622">Erabiltzaile-izena</translation> <translation id="4064278913989596727">Laguntza</translation> @@ -26,6 +30,7 @@ <translation id="5366190986669335938">Atzitu Chrome-n gordeta dauzkazun pasahitz guztiak edozein aplikaziotatik.</translation> <translation id="579113627088729016">Aktibatu automatikoki betetzeko aukera</translation> <translation id="5824290706342306555">Hasteko, gorde zenbait pasahitz Chrome-n edo hasi saioa Google-ko kontuarekin.</translation> +<translation id="6002340317268558779">Gordetako pasahitzak gailuko beste aplikazio batzuetan erabil ditzakezu. <ph name="EMAIL" /> kontuan saioa hasita zeneukala gorde dituzunak Google-ren Pasahitz-kudeatzailea atalean gordetzen dira.</translation> <translation id="6159839020698489198">aukerakoa</translation> <translation id="6216401132953873625">Gehitu beste pasahitz bat</translation> <translation id="6539092367496845964">Arazoren bat izan da. Saiatu berriro geroago.</translation> @@ -53,4 +58,5 @@ <translation id="8730621377337864115">Eginda</translation> <translation id="8877181643142698531">URLa</translation> <translation id="9069288651897538648">Webgunea: <ph name="URL" /></translation> +<translation id="9168839987494597225">Pasahitzak gailu honetan soilik gordetzen dira Google-ren Pasahitz-kudeatzailea atalean.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr.xtb index b28a441..3aba7d7 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr.xtb
@@ -9,12 +9,16 @@ <translation id="1706288056912586527">Afficher le mot de passe</translation> <translation id="1870148520156231997">Afficher le mot de passe</translation> <translation id="1977167321677356409">Mot de passe</translation> +<translation id="2211969839027957773">Gestionnaire de mots de passe Google</translation> <translation id="2320166752086256636">Masquer le clavier</translation> +<translation id="2489483078139081050">Vous pouvez utiliser les mots de passe enregistrés dans d'autres applis sur votre appareil. Ils sont enregistrés dans le Gestionnaire de mots de passe Google sur cet appareil uniquement.</translation> +<translation id="2677128368066534822">Pour obtenir vos mots de passe plus vite, désélectionnez le trousseau iCloud</translation> <translation id="2712586044587587728">Vos mots de passe Chrome pourront être utilisés dans d'autres applications. Sachez que vous pouvez désactiver cette option à tout moment dans l'application Paramètres.</translation> <translation id="2747003861858887689">Champ précédent</translation> <translation id="3280734926621805458">Utiliser</translation> <translation id="3580107423202590938">Aucun mot de passe Chrome</translation> <translation id="368844171100841558">Remplacer</translation> +<translation id="3739920431472254679">Les mots de passe sont enregistrés dans le Gestionnaire de mots de passe Google et vous pouvez les utiliser sur tous vos appareils.</translation> <translation id="3753678329684433031">Saisir automatiquement les mots de passe Chrome</translation> <translation id="3789385946721385622">Nom d'utilisateur</translation> <translation id="4064278913989596727">Aide</translation> @@ -26,6 +30,7 @@ <translation id="5366190986669335938">Accédez aux mots de passe enregistrés dans Chrome depuis n'importe quelle application.</translation> <translation id="579113627088729016">Activer la saisie automatique</translation> <translation id="5824290706342306555">Pour commencer, enregistrez certains mots de passe dans Chrome ou connectez-vous avec votre compte Google.</translation> +<translation id="6002340317268558779">Vous pouvez utiliser les mots de passe enregistrés dans d'autres applis sur votre appareil. Ils sont enregistrés dans le Gestionnaire de mots de passe Google pour <ph name="EMAIL" />.</translation> <translation id="6159839020698489198">facultatif</translation> <translation id="6216401132953873625">Ajouter un mot de passe</translation> <translation id="6539092367496845964">Un problème est survenu. Réessayez plus tard.</translation> @@ -53,4 +58,5 @@ <translation id="8730621377337864115">OK</translation> <translation id="8877181643142698531">URL</translation> <translation id="9069288651897538648">Pour <ph name="URL" /></translation> +<translation id="9168839987494597225">Les mots de passe sont enregistrés dans le Gestionnaire de mots de passe Google uniquement sur cet appareil.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gu.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gu.xtb index e2bef2e8..39ef6e60 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gu.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gu.xtb
@@ -9,12 +9,16 @@ <translation id="1706288056912586527">પાસવર્ડ બતાવો</translation> <translation id="1870148520156231997">પાસવર્ડ જણાવો</translation> <translation id="1977167321677356409">પાસવર્ડ</translation> +<translation id="2211969839027957773">Google પાસવર્ડ મેનેજર</translation> <translation id="2320166752086256636">કીબોર્ડ છુપાવો</translation> +<translation id="2489483078139081050">તમે સાચવેલા પાસવર્ડનો ઉપયોગ તમારા ડિવાઇસ પર અન્ય ઍપમાં કરી શકો છો. તેને માત્ર આ ડિવાઇસના Google પાસવર્ડ મેનેજરમાં સાચવવામાં આવે છે.</translation> +<translation id="2677128368066534822">તમારા પાસવર્ડ સુધી ઝડપથી પહોંચવા માટે, iCloud keychain નાપસંદ કરો</translation> <translation id="2712586044587587728">Chrome માટેના તમારા પાસવર્ડ અન્ય ઍપમાં ઉપયોગ માટે ઉપલબ્ધ રહેશે. તમે આને કોઈપણ સમયે Settings ઍપમાં જઈને બંધ કરી શકો છો.</translation> <translation id="2747003861858887689">પાછલી ફીલ્ડ</translation> <translation id="3280734926621805458">ઉપયોગ કરો</translation> <translation id="3580107423202590938">Chromeમાં કોઈ પાસવર્ડ નથી</translation> <translation id="368844171100841558">બદલો</translation> +<translation id="3739920431472254679">પાસવર્ડ Google પાસવર્ડ મેનેજરમાં સાચવવામાં આવે છે અને તમે કોઈપણ ડિવાઇસમાં તેનો ઉપયોગ કરી શકો છો.</translation> <translation id="3753678329684433031">Chromeનો પાસવર્ડ ઑટોમૅટિક રીતે ભરાય</translation> <translation id="3789385946721385622">વપરાશકર્તાનું નામ</translation> <translation id="4064278913989596727">સહાય</translation> @@ -26,6 +30,7 @@ <translation id="5366190986669335938">તમે Chromeમાં સાચવેલા પાસવર્ડ કોઈ પણ ઍપમાંથી ઍક્સેસ કરો.</translation> <translation id="579113627088729016">ઑટોમૅટિક રીતે ભરવાનું ચાલુ કરો</translation> <translation id="5824290706342306555">શરૂ કરવા માટે અમુક પાસવર્ડ Chromeમાં સાચવો અથવા તમારા Google એકાઉન્ટ વડે સાઇન ઇન કરો.</translation> +<translation id="6002340317268558779">તમે સાચવેલા પાસવર્ડનો ઉપયોગ તમારા ડિવાઇસ પર અન્ય ઍપમાં કરી શકો છો. તેને <ph name="EMAIL" />ના Google પાસવર્ડ મેનેજરમાં સાચવવામાં આવે છે.</translation> <translation id="6159839020698489198">વૈકલ્પિક</translation> <translation id="6216401132953873625">નવો પાસવર્ડ ઉમેરો</translation> <translation id="6539092367496845964">કંઈક ખોટું થયું હતું. થોડીવાર પછી ફરી પ્રયાસ કરો.</translation> @@ -53,4 +58,5 @@ <translation id="8730621377337864115">થઈ ગયું</translation> <translation id="8877181643142698531">URL</translation> <translation id="9069288651897538648"><ph name="URL" /> માટે</translation> +<translation id="9168839987494597225">પાસવર્ડ માત્ર આ ડિવાઇસના Google પાસવર્ડ મેનેજરમાં સાચવવામાં આવે છે.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb index e06022f4..5b706b2 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb
@@ -9,12 +9,16 @@ <translation id="1706288056912586527">Wachtwoord bekijken</translation> <translation id="1870148520156231997">Wachtwoord bekijken</translation> <translation id="1977167321677356409">Wachtwoord</translation> +<translation id="2211969839027957773">Google Wachtwoordmanager</translation> <translation id="2320166752086256636">Toetsenbord verbergen</translation> +<translation id="2489483078139081050">Je kunt opgeslagen wachtwoorden gebruiken in andere apps op je apparaat. Ze worden alleen opgeslagen in Google Wachtwoordmanager op dit apparaat.</translation> +<translation id="2677128368066534822">Deselecteer de iCloud-sleutelhanger om sneller bij je wachtwoorden te komen</translation> <translation id="2712586044587587728">Je Chrome-wachtwoorden zijn beschikbaar voor gebruik in andere apps. Je kunt dit op elk moment uitzetten in de app Instellingen.</translation> <translation id="2747003861858887689">Vorig veld</translation> <translation id="3280734926621805458">Gebruiken</translation> <translation id="3580107423202590938">Geen Chrome-wachtwoorden</translation> <translation id="368844171100841558">Vervangen</translation> +<translation id="3739920431472254679">Wachtwoorden worden opgeslagen in Google Wachtwoordmanager zodat je ze op elk apparaat kunt gebruiken.</translation> <translation id="3753678329684433031">Chrome-wachtwoord automatisch invullen</translation> <translation id="3789385946721385622">Gebruikersnaam</translation> <translation id="4064278913989596727">Help</translation> @@ -26,6 +30,7 @@ <translation id="5366190986669335938">Krijg vanuit elke app toegang tot de wachtwoorden die je opslaat in Chrome.</translation> <translation id="579113627088729016">Automatisch invullen aanzetten</translation> <translation id="5824290706342306555">Als je aan de slag wilt gaan, sla je een aantal wachtwoorden op in Chrome of log je in met je Google-account.</translation> +<translation id="6002340317268558779">Je kunt opgeslagen wachtwoorden gebruiken in andere apps op je apparaat. Ze worden opgeslagen in Google Wachtwoordmanager voor <ph name="EMAIL" />.</translation> <translation id="6159839020698489198">optioneel</translation> <translation id="6216401132953873625">Nieuw wachtwoord toevoegen</translation> <translation id="6539092367496845964">Er is iets misgegaan. Probeer het later opnieuw.</translation> @@ -53,4 +58,5 @@ <translation id="8730621377337864115">Klaar</translation> <translation id="8877181643142698531">URL</translation> <translation id="9069288651897538648">Voor <ph name="URL" /></translation> +<translation id="9168839987494597225">Wachtwoorden worden alleen opgeslagen in Google Wachtwoordmanager op dit apparaat.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sl.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sl.xtb index 31105ba24..dfa16cd 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sl.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sl.xtb
@@ -9,12 +9,16 @@ <translation id="1706288056912586527">Pokaži geslo</translation> <translation id="1870148520156231997">Razkrijte geslo</translation> <translation id="1977167321677356409">Geslo</translation> +<translation id="2211969839027957773">Google Upravitelj gesel</translation> <translation id="2320166752086256636">Skrij tipkovnico</translation> +<translation id="2489483078139081050">Shranjena gesla lahko uporabljate v drugih aplikacijah v napravi. V Google Upravitelju gesel so shranjena samo v tej napravi.</translation> +<translation id="2677128368066534822">Če želite hitreje do gesel, počistite izbiro shrambe poverilnic v storitvi iCloud.</translation> <translation id="2712586044587587728">Gesla v Chromu bodo na voljo za uporabo v drugih aplikacijah. To lahko kadar koli izklopite v aplikaciji Nastavitve.</translation> <translation id="2747003861858887689">Prejšnje polje</translation> <translation id="3280734926621805458">Uporabi</translation> <translation id="3580107423202590938">Ni gesel v Chromu</translation> <translation id="368844171100841558">Zamenjaj</translation> +<translation id="3739920431472254679">Gesla so shranjena v Google Upravitelju gesel, kar pomeni, da jih lahko uporabljate v poljubni napravi.</translation> <translation id="3753678329684433031">Samodejno izpolnjevanje gesla v Chromu</translation> <translation id="3789385946721385622">Uporabniško ime</translation> <translation id="4064278913989596727">Pomoč</translation> @@ -26,6 +30,7 @@ <translation id="5366190986669335938">Dostopajte do gesel, ki jih shranite v Chromu, v kateri koli aplikaciji.</translation> <translation id="579113627088729016">Vklopi samodejno izpolnjevanje</translation> <translation id="5824290706342306555">Če želite začeti, shranite nekaj gesel v Chromu ali se prijavite z računom Google.</translation> +<translation id="6002340317268558779">Shranjena gesla lahko uporabljate v drugih aplikacijah v napravi. V Google Upravitelju gesel so shranjena za račun <ph name="EMAIL" />.</translation> <translation id="6159839020698489198">izbirno</translation> <translation id="6216401132953873625">Dodajanje novega gesla</translation> <translation id="6539092367496845964">Prišlo je do napake. Poskusite znova pozneje.</translation> @@ -53,4 +58,5 @@ <translation id="8730621377337864115">Končano</translation> <translation id="8877181643142698531">URL</translation> <translation id="9069288651897538648">Za <ph name="URL" /></translation> +<translation id="9168839987494597225">Gesla so shranjena v Google Upravitelju gesel samo v tej napravi.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb index d0660eb..6e7e4af9 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb
@@ -9,12 +9,16 @@ <translation id="1706288056912586527">పాస్వర్డ్ను చూపించు</translation> <translation id="1870148520156231997">పాస్వర్డ్ను చూపండి</translation> <translation id="1977167321677356409">పాస్వర్డ్</translation> +<translation id="2211969839027957773">Google పాస్వర్డ్ మేనేజర్</translation> <translation id="2320166752086256636">కీబోర్డ్ను దాచు</translation> +<translation id="2489483078139081050">మీరు మీ పరికరంలోని ఇతర యాప్లలో సేవ్ చేసిన పాస్వర్డ్లను ఉపయోగించవచ్చు. అవి ఈ పరికరంలోని Google పాస్వర్డ్ మేనేజర్లో మాత్రమే సేవ్ చేయబడతాయి.</translation> +<translation id="2677128368066534822">మీ పాస్వర్డ్లను వేగంగా పొందడానికి, iCloud కీచెయిన్ ఎంపికను తొలగించండి</translation> <translation id="2712586044587587728">మీ Chrome పాస్వర్డ్లు ఇతర యాప్లలో ఉపయోగించడానికి అందుబాటులో ఉంటాయి. దీనిని మీరు ఎప్పుడైనా సెట్టింగ్ల యాప్లో ఆఫ్ చేయవచ్చు.</translation> <translation id="2747003861858887689">మునుపటి ఫీల్డ్</translation> <translation id="3280734926621805458">వాడండి</translation> <translation id="3580107423202590938">Chrome పాస్వర్డ్లు ఏవీ లేవు</translation> <translation id="368844171100841558">రీప్లేస్ చేయండి</translation> +<translation id="3739920431472254679">పాస్వర్డ్లు Google పాస్వర్డ్ మేనేజర్లో సేవ్ చేయబడతాయి, కాబట్టి మీరు వాటిని ఏ పరికరంలో అయినా ఉపయోగించవచ్చు.</translation> <translation id="3753678329684433031">Chrome పాస్వర్డ్ను ఆటోఫిల్ చేయండి</translation> <translation id="3789385946721385622">యూజర్నేమ్</translation> <translation id="4064278913989596727">సహాయం</translation> @@ -26,6 +30,7 @@ <translation id="5366190986669335938">మీరు Chromeలో సేవ్ చేసే పాస్వర్డ్లను ఏ యాప్ నుండి అయినా యాక్సెస్ చేయండి.</translation> <translation id="579113627088729016">ఆటోఫిల్ను ఆన్ చేయి</translation> <translation id="5824290706342306555">ప్రారంభించడానికి కొన్ని పాస్వర్డ్లను Chromeలో సేవ్ చేయండి లేదా మీ Google ఖాతాతో సైన్ ఇన్ చేయండి.</translation> +<translation id="6002340317268558779">మీరు మీ పరికరంలోని ఇతర యాప్లలో సేవ్ చేసిన పాస్వర్డ్లను ఉపయోగించవచ్చు. <ph name="EMAIL" /> కోసం అవి Google పాస్వర్డ్ మేనేజర్లో సేవ్ చేయబడతాయి.</translation> <translation id="6159839020698489198">ఆప్షనల్</translation> <translation id="6216401132953873625">కొత్త పాస్వర్డ్ను జోడించండి</translation> <translation id="6539092367496845964">ఏదో తప్పు జరిగింది. తర్వాత మళ్లీ ప్రయత్నించండి.</translation> @@ -53,4 +58,5 @@ <translation id="8730621377337864115">పూర్తయింది</translation> <translation id="8877181643142698531">URL</translation> <translation id="9069288651897538648"><ph name="URL" /> కోసం</translation> +<translation id="9168839987494597225">పాస్వర్డ్లు ఈ పరికరంలోని Google పాస్వర్డ్ మేనేజర్లో మాత్రమే సేవ్ చేయబడతాయి.</translation> </translationbundle> \ No newline at end of file
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 6c39acc0..ab51dae 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
@@ -9,12 +9,16 @@ <translation id="1706288056912586527">پاس ورڈ دکھائیں</translation> <translation id="1870148520156231997">پاس ورڈ ظاہر کریں</translation> <translation id="1977167321677356409">پاس ورڈ</translation> +<translation id="2211969839027957773">Google پاس ورڈ مینیجر</translation> <translation id="2320166752086256636">کی بورڈ چھپائیں</translation> +<translation id="2489483078139081050">آپ اپنے آلے پر دیگر ایپس میں محفوظ کردہ پاس ورڈز استعمال کر سکتے ہیں۔ وہ صرف اس آلے پر Google پاس ورڈ مینیجر میں محفوظ ہوتے ہیں۔</translation> +<translation id="2677128368066534822">اپنے پاس وردز تیزی سے حاصل کرنے کے لیے، iCloud کی چین کو غیر منتخب کریں</translation> <translation id="2712586044587587728">آپ کے Chrome پاس ورڈ دیگر ایپس میں استعمال کرنے کے لئے دستیاب ہوں گے۔ آپ اسے کسی بھی وقت ترتیبات ایپ میں آف کر سکتے ہیں۔</translation> <translation id="2747003861858887689">پچھلا فیلڈ</translation> <translation id="3280734926621805458">استعمال کریں</translation> <translation id="3580107423202590938">کوئی Chrome پاس ورڈز نہیں</translation> <translation id="368844171100841558">بدلیں</translation> +<translation id="3739920431472254679">پاس ورڈز کو Google پاس ورڈ مینیجر میں محفوظ کیا جاتا ہے اور آپ انہیں کسی بھی آلے پر استعمال کر سکتے ہیں۔</translation> <translation id="3753678329684433031">آٹو فل Chrome پاس ورڈ</translation> <translation id="3789385946721385622">صارف نام</translation> <translation id="4064278913989596727">مدد</translation> @@ -26,6 +30,7 @@ <translation id="5366190986669335938">Chrome میں آپ کے ذریعے محفوظ کردہ پاس ورڈ تک کسی بھی ایپ سے رسائی حاصل کریں۔</translation> <translation id="579113627088729016">آٹو فل آن کریں</translation> <translation id="5824290706342306555">شروع کرنے کے لیے، کچھ پاس ورڈز کو Chrome میں محفوظ کریں یا اپنے Google اکاؤنٹ کے ساتھ سائن ان کریں۔</translation> +<translation id="6002340317268558779">آپ اپنے آلے پر دیگر ایپس میں محفوظ کردہ پاس ورڈز استعمال کر سکتے ہیں۔ وہ <ph name="EMAIL" /> کے لیے Google پاس ورڈ مینیجر میں محفوظ ہوتے ہیں۔</translation> <translation id="6159839020698489198">اختیاری</translation> <translation id="6216401132953873625">نیا پاس ورڈ شامل کریں</translation> <translation id="6539092367496845964">کچھ غلط ہو گیا۔ بعد میں دوبارہ کوشش کریں۔</translation> @@ -53,4 +58,5 @@ <translation id="8730621377337864115">ہوگیا</translation> <translation id="8877181643142698531">URL</translation> <translation id="9069288651897538648"><ph name="URL" /> کیلئے</translation> +<translation id="9168839987494597225">پاس ورڈز صرف اس آلے پر Google پاس ورڈ مینیجر میں محفوظ ہوتے ہیں۔</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zu.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zu.xtb index c70ec312..17bfc0cc 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zu.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zu.xtb
@@ -9,12 +9,16 @@ <translation id="1706288056912586527">Bonisa iphasiwedi</translation> <translation id="1870148520156231997">Bonisa iphasiwedi</translation> <translation id="1977167321677356409">Iphasiwedi</translation> +<translation id="2211969839027957773">I-Google Password Manager</translation> <translation id="2320166752086256636">Fihla ikhibhodi</translation> +<translation id="2489483078139081050">Ungasebenzisa amaphasiwedi alondoloziwe kwamanye ama-app kudivayisi yakho. Alondolozwe ku-Google Password Manager kule divayisi kuphela.</translation> +<translation id="2677128368066534822">Ukuze ufike kumaphasiwedi wakho ngokushesha, yeka ukukhetha i-iCloud keychain</translation> <translation id="2712586044587587728">Amaphasiwedi wakho we-Chrome azotholakala ukusetshenziswa kwezinye izinhlelo zokusebenza. Ungavala lokhu kuhlelo lokusebenza Lamasethingi nganoma yisiphi isikhathi.</translation> <translation id="2747003861858887689">Inkambu edlule</translation> <translation id="3280734926621805458">Sebenzisa</translation> <translation id="3580107423202590938">Awekho amaphasiwedi we-Chrome</translation> <translation id="368844171100841558">Susa</translation> +<translation id="3739920431472254679">Amaphasiwedi alondolozwa ku-Google Password Manager futhi ungawasebenzisa kunoma iyiphi idivayisi.</translation> <translation id="3753678329684433031">Gcwalisa Ngokuzenzakalelayo Iphasiwedi ye-Chrome</translation> <translation id="3789385946721385622">Igama lomsebenzisi</translation> <translation id="4064278913989596727">Usizo</translation> @@ -26,6 +30,7 @@ <translation id="5366190986669335938">Finyelela amaphasiwedi owalandoloza ku-Chrome kusuka kunoma yiluphi uhlelo lokusebenza.</translation> <translation id="579113627088729016">Vula Ukugcwalisa okuzenzakalelayo</translation> <translation id="5824290706342306555">Ukuze uqalise, londoloza amaphasiwedi athile ku-Chrome noma ngena ngemvume nge-akhawunti yakho ye-Google.</translation> +<translation id="6002340317268558779">Ungasebenzisa amaphasiwedi alondoloziwe kwamanye ama-app kudivayisi yakho. Alondolozwe ku-Google Password Manager ye-<ph name="EMAIL" />.</translation> <translation id="6159839020698489198">ongakukhetha</translation> <translation id="6216401132953873625">Engeza Iphasiwedi Entsha</translation> <translation id="6539092367496845964">Okuthile akuhambanga kahle. Zama futhi emuva kwesikhathi.</translation> @@ -53,4 +58,5 @@ <translation id="8730621377337864115">Kwenziwe</translation> <translation id="8877181643142698531">I-URL</translation> <translation id="9069288651897538648">Ka-<ph name="URL" /></translation> +<translation id="9168839987494597225">Amaphasiwedi alondolozwa ku-Google Password Manager kule divayisi kuphela.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.h b/ios/chrome/test/earl_grey/chrome_earl_grey.h index 1ead32f9..d56854ea 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey.h +++ b/ios/chrome/test/earl_grey/chrome_earl_grey.h
@@ -643,9 +643,6 @@ // Returns whether the ContextMenuActionsRefresh feature is enabled. - (BOOL)isContextMenuActionsRefreshEnabled; -// Returns whether the TabGridBulkActions feature is enabled. -- (BOOL)isTabGridBulkActionsEnabled; - #pragma mark - Popup Blocking // Gets the current value of the popup content setting preference for the
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.mm b/ios/chrome/test/earl_grey/chrome_earl_grey.mm index 0d0e984..3713de59 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey.mm +++ b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
@@ -681,16 +681,11 @@ - (void)triggerRestoreViaTabGridRemoveAllUndo { [ChromeEarlGrey showTabSwitcher]; GREYWaitForAppToIdle(@"App failed to idle"); - if ([self isTabGridBulkActionsEnabled]) { - [ChromeEarlGrey - waitForAndTapButton:grey_allOf(chrome_test_util::TabGridEditButton(), - grey_sufficientlyVisible(), nil)]; - [ChromeEarlGrey - waitForAndTapButton:chrome_test_util::TabGridEditMenuCloseAllButton()]; - } else { - [ChromeEarlGrey - waitForAndTapButton:chrome_test_util::TabGridCloseAllButton()]; - } + [ChromeEarlGrey + waitForAndTapButton:grey_allOf(chrome_test_util::TabGridEditButton(), + grey_sufficientlyVisible(), nil)]; + [ChromeEarlGrey + waitForAndTapButton:chrome_test_util::TabGridEditMenuCloseAllButton()]; [ChromeEarlGrey waitForAndTapButton:chrome_test_util::TabGridUndoCloseAllButton()]; [ChromeEarlGrey waitForAndTapButton:chrome_test_util::TabGridDoneButton()]; @@ -1221,10 +1216,6 @@ return [ChromeEarlGreyAppInterface isContextMenuActionsRefreshEnabled]; } -- (BOOL)isTabGridBulkActionsEnabled { - return [ChromeEarlGreyAppInterface isTabGridBulkActionsEnabled]; -} - #pragma mark - ScopedBlockPopupsPref - (ContentSetting)popupPrefValue {
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h index eeb3f92..ef0872e 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h +++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
@@ -512,9 +512,6 @@ // Returns whether the ContextMenuActionsRefresh feature is enabled. + (BOOL)isContextMenuActionsRefreshEnabled; -// Returns whether the TabGridBulkActions feature is enabled. -+ (BOOL)isTabGridBulkActionsEnabled; - #pragma mark - Popup Blocking // Gets the current value of the popup content setting preference for the
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm index 89b0768..d0ff8ac 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm +++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
@@ -30,7 +30,6 @@ #import "ios/chrome/browser/ui/commands/application_commands.h" #import "ios/chrome/browser/ui/default_promo/default_browser_utils.h" #import "ios/chrome/browser/ui/main/scene_state.h" -#import "ios/chrome/browser/ui/tab_switcher/tab_grid/features.h" #import "ios/chrome/browser/ui/ui_feature_flags.h" #import "ios/chrome/browser/ui/util/named_guide.h" #import "ios/chrome/browser/ui/util/rtl_geometry.h" @@ -1008,10 +1007,6 @@ return IsContextMenuActionsRefreshEnabled(); } -+ (BOOL)isTabGridBulkActionsEnabled { - return IsTabsBulkActionsEnabled(); -} - #pragma mark - ScopedBlockPopupsPref + (ContentSetting)popupPrefValue {
diff --git a/media/cdm/BUILD.gn b/media/cdm/BUILD.gn index 5f6c035..e67c655 100644 --- a/media/cdm/BUILD.gn +++ b/media/cdm/BUILD.gn
@@ -67,6 +67,8 @@ "supported_audio_codecs.h", ] + public_deps = [ ":cdm_type" ] + deps = [ "//crypto", "//media/base", @@ -151,12 +153,20 @@ "cdm_paths.cc", "cdm_paths.h", ] + + public_deps = [ ":cdm_type" ] + deps = [ "//base", "//media:media_buildflags", ] } +source_set("cdm_type") { + sources = [ "cdm_type.h" ] + deps = [ "//base" ] +} + source_set("unit_tests") { testonly = true sources = [
diff --git a/media/cdm/cdm_paths.cc b/media/cdm/cdm_paths.cc index 2bb2fc8..ffa5b3f 100644 --- a/media/cdm/cdm_paths.cc +++ b/media/cdm/cdm_paths.cc
@@ -6,6 +6,7 @@ #include <string> +#include "media/cdm/cdm_type.h" #include "media/media_buildflags.h" namespace media { @@ -15,14 +16,18 @@ const char kClearKeyCdmBaseDirectory[] = "ClearKeyCdm"; const char kClearKeyCdmDisplayName[] = "Clear Key CDM"; -const base::Token kClearKeyCdmType{0x3a2e0fadde4bd1b7ull, - 0xcb90df3e240d1694ull}; -const base::Token kClearKeyCdmDifferentCdmType{0xc3914773474bdb02ull, - 0x8e8de4d84d3ca030ull}; -// As the file system was initially used by the CDM running as a pepper plugin, -// this ID is based on the pepper plugin MIME type. +// TODO(crbug.com/1231162): Remove this after migrating CDM off of the Plugin +// Private File System. +// As the file system was initially used by the CDM running +// as a pepper plugin, this ID is based on the pepper plugin MIME type. const char kClearKeyCdmFileSystemId[] = "application_x-ppapi-clearkey-cdm"; +const CdmType kClearKeyCdmType{ + base::Token{0x3a2e0fadde4bd1b7ull, 0xcb90df3e240d1694ull}, + kClearKeyCdmFileSystemId}; +const CdmType kClearKeyCdmDifferentCdmType{ + base::Token{0xc3914773474bdb02ull, 0x8e8de4d84d3ca030ull}, + kClearKeyCdmFileSystemId}; base::FilePath GetPlatformSpecificDirectory( const base::FilePath& cdm_base_path) {
diff --git a/media/cdm/cdm_paths.h b/media/cdm/cdm_paths.h index eb97687..451f8e4 100644 --- a/media/cdm/cdm_paths.h +++ b/media/cdm/cdm_paths.h
@@ -11,6 +11,7 @@ #include "base/token.h" #include "base/unguessable_token.h" #include "build/build_config.h" +#include "media/cdm/cdm_type.h" namespace media { @@ -23,15 +24,11 @@ extern const char kClearKeyCdmDisplayName[]; // The default GUID for Clear Key Cdm. -extern const base::Token kClearKeyCdmType; +extern const CdmType kClearKeyCdmType; // A different GUID for Clear Key Cdm for testing running different types of // CDMs in the system. -extern const base::Token kClearKeyCdmDifferentCdmType; - -// Identifier used by the PluginPrivateFileSystem to identify the files stored -// for the Clear Key CDM. -extern const char kClearKeyCdmFileSystemId[]; +extern const CdmType kClearKeyCdmDifferentCdmType; // Returns the path of a CDM relative to DIR_COMPONENTS. // On platforms where a platform specific path is used, returns
diff --git a/media/cdm/cdm_type.h b/media/cdm/cdm_type.h new file mode 100644 index 0000000..daf0127 --- /dev/null +++ b/media/cdm/cdm_type.h
@@ -0,0 +1,44 @@ +// 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 MEDIA_CDM_CDM_TYPE_H_ +#define MEDIA_CDM_CDM_TYPE_H_ + +#include "base/token.h" + +#include "media/base/media_export.h" // nogncheck + +namespace media { + +// TODO(crbug.com/1231162): Remove the `legacy_file_system_id` field and make +// this a base::Token alias once CDM data has been migrated off of the +// PluginPrivateFileSystem. Then we can remove this file and resolve the +// dependency issues associated with this file ("nogncheck" comments in +// third_party/widevine/cdm/widevine_cdm_common.h and media/cdm/cdm_type.h) +struct MEDIA_EXPORT CdmType { + // A token to uniquely identify the type of the CDM. Used for per-CDM-type + // isolation, e.g. for running different CDMs in different child processes, + // and per-CDM-type storage. A zero token indicates that this CdmType should + // not have a corresponding CdmStorage. + base::Token id; + + // Identifier used by the PluginPrivateFileSystem to identify the files stored + // by this CDM. Valid identifiers only contain letters (A-Za-z), digits(0-9), + // or "._-". + const char* legacy_file_system_id = ""; + + bool operator==(const CdmType& other) const { + return (this->id == other.id) && (strcmp(this->legacy_file_system_id, + other.legacy_file_system_id) == 0); + } + + bool operator<(const CdmType& other) const { + return (this->id < other.id) || (strcmp(this->legacy_file_system_id, + other.legacy_file_system_id) < 0); + } +}; + +} // namespace media + +#endif // MEDIA_CDM_CDM_TYPE_H_
diff --git a/net/base/url_util.cc b/net/base/url_util.cc index 3398220..7880bb4 100644 --- a/net/base/url_util.cc +++ b/net/base/url_util.cc
@@ -125,18 +125,18 @@ QueryIterator::~QueryIterator() = default; -std::string QueryIterator::GetKey() const { +base::StringPiece QueryIterator::GetKey() const { DCHECK(!at_end_); if (key_.is_nonempty()) - return url_.spec().substr(key_.begin, key_.len); - return std::string(); + return base::StringPiece(&url_.spec()[key_.begin], key_.len); + return base::StringPiece(); } -std::string QueryIterator::GetValue() const { +base::StringPiece QueryIterator::GetValue() const { DCHECK(!at_end_); if (value_.is_nonempty()) - return url_.spec().substr(value_.begin, value_.len); - return std::string(); + return base::StringPiece(&url_.spec()[value_.begin], value_.len); + return base::StringPiece(); } const std::string& QueryIterator::GetUnescapedValue() {
diff --git a/net/base/url_util.h b/net/base/url_util.h index c941957..962777d 100644 --- a/net/base/url_util.h +++ b/net/base/url_util.h
@@ -56,6 +56,10 @@ const std::string& value); // Iterates over the key-value pairs in the query portion of |url|. +// NOTE: QueryIterator stores reference to |url| and creates base::StringPiece +// instances which refer to the data inside |url| query. Therefore |url| must +// outlive QueryIterator and all base::StringPiece objects returned from GetKey +// and GetValue methods. class NET_EXPORT QueryIterator { public: explicit QueryIterator(const GURL& url); @@ -63,8 +67,8 @@ QueryIterator& operator=(const QueryIterator&) = delete; ~QueryIterator(); - std::string GetKey() const; - std::string GetValue() const; + base::StringPiece GetKey() const; + base::StringPiece GetValue() const; const std::string& GetUnescapedValue(); bool IsAtEnd() const;
diff --git a/net/dns/address_sorter_posix_unittest.cc b/net/dns/address_sorter_posix_unittest.cc index 7b248a46..d4a2cb5 100644 --- a/net/dns/address_sorter_posix_unittest.cc +++ b/net/dns/address_sorter_posix_unittest.cc
@@ -174,20 +174,6 @@ NOTIMPLEMENTED(); return nullptr; } - std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket( - std::unique_ptr<StreamSocket> stream_socket, - const std::string& user_agent, - const HostPortPair& endpoint, - const ProxyServer& proxy_server, - HttpAuthController* http_auth_controller, - bool tunnel, - bool using_spdy, - NextProto negotiated_protocol, - ProxyDelegate* proxy_delegate, - const NetworkTrafficAnnotationTag& traffic_annotation) override { - NOTIMPLEMENTED(); - return nullptr; - } void AddMapping(const IPAddress& dst, const IPAddress& src) { mapping_[dst] = src; }
diff --git a/net/http/http_proxy_connect_job.cc b/net/http/http_proxy_connect_job.cc index e1ecdd7..cdbc4da 100644 --- a/net/http/http_proxy_connect_job.cc +++ b/net/http/http_proxy_connect_job.cc
@@ -18,6 +18,7 @@ #include "base/threading/thread_task_runner_handle.h" #include "base/values.h" #include "build/build_config.h" +#include "http_proxy_client_socket.h" #include "net/base/host_port_pair.h" #include "net/base/http_user_agent_settings.h" #include "net/base/net_errors.h" @@ -27,7 +28,6 @@ #include "net/quic/quic_http_utils.h" #include "net/quic/quic_proxy_client_socket.h" #include "net/quic/quic_stream_factory.h" -#include "net/socket/client_socket_factory.h" #include "net/socket/client_socket_handle.h" #include "net/socket/ssl_client_socket.h" #include "net/socket/ssl_connect_job.h" @@ -561,7 +561,7 @@ } // Add a HttpProxy connection on top of the tcp socket. - transport_socket_ = client_socket_factory()->CreateProxyClientSocket( + transport_socket_ = std::make_unique<HttpProxyClientSocket>( nested_connect_job_->PassSocket(), GetUserAgent(), params_->endpoint(), ProxyServer(GetProxyServerScheme(), GetDestination()), http_auth_controller_.get(), params_->tunnel(), using_spdy_,
diff --git a/net/http/http_stream_factory_job_controller_unittest.cc b/net/http/http_stream_factory_job_controller_unittest.cc index 5fa34f64f..ecb04564 100644 --- a/net/http/http_stream_factory_job_controller_unittest.cc +++ b/net/http/http_stream_factory_job_controller_unittest.cc
@@ -79,18 +79,19 @@ const char kServerHostname[] = "www.example.com"; // List of errors for which fallback is expected on an HTTPS proxy. +// +// We omit `ERR_CONNECTION_CLOSED` because it is largely unreachable. The +// HTTP/1.1 parser maps it to `ERR_EMPTY_RESPONSE` or +// `ERR_RESPONSE_HEADERS_TRUNCATED` in most cases. +// +// TODO(davidben): Is omitting `ERR_EMPTY_RESPONSE` a bug in proxy error +// handling? const int proxy_test_mock_errors[] = { - ERR_PROXY_CONNECTION_FAILED, - ERR_NAME_NOT_RESOLVED, - ERR_ADDRESS_UNREACHABLE, - ERR_CONNECTION_CLOSED, - ERR_CONNECTION_TIMED_OUT, - ERR_CONNECTION_RESET, - ERR_CONNECTION_REFUSED, - ERR_CONNECTION_ABORTED, - ERR_TIMED_OUT, - ERR_SOCKS_CONNECTION_FAILED, - ERR_PROXY_CERTIFICATE_INVALID, + ERR_PROXY_CONNECTION_FAILED, ERR_NAME_NOT_RESOLVED, + ERR_ADDRESS_UNREACHABLE, ERR_CONNECTION_TIMED_OUT, + ERR_CONNECTION_RESET, ERR_CONNECTION_REFUSED, + ERR_CONNECTION_ABORTED, ERR_TIMED_OUT, + ERR_SOCKS_CONNECTION_FAILED, ERR_PROXY_CERTIFICATE_INVALID, ERR_SSL_PROTOCOL_ERROR, }; @@ -510,11 +511,6 @@ // fallback is NOT supposed to occur, and also vary across all of // the proxy types. TEST_P(JobControllerReconsiderProxyAfterErrorTest, ReconsiderProxyAfterError) { - // Use mock proxy client sockets to test the fallback behavior of error codes - // returned by HttpProxyClientSocketWrapper. Errors returned by transport - // sockets usually get re-written by the wrapper class. crbug.com/826570. - session_deps_.socket_factory->UseMockProxyClientSockets(); - const int mock_error = GetParam(); std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service = ConfiguredProxyResolutionService::CreateFixedFromPacResult( @@ -526,42 +522,54 @@ ASSERT_TRUE(proxy_resolution_service->proxy_retry_info().empty()) << mock_error; + // Configure the HTTP CONNECT to fail with `mock_error`. + // + // TODO(crbug.com/1279685): Test this more accurately. Errors like + // `ERR_PROXY_CONNECTION_FAILED` or `ERR_PROXY_CERTIFICATE_INVALID` are + // surfaced in response to other errors in TCP or TLS connection setup. SSLSocketDataProvider ssl_data(ASYNC, OK); - ProxyClientSocketDataProvider proxy_data(ASYNC, mock_error); + static constexpr char kHttpConnect[] = + "CONNECT www.example.com:443 HTTP/1.1\r\n" + "Host: www.example.com:443\r\n" + "Proxy-Connection: keep-alive\r\n\r\n"; + const MockWrite kWrites[] = {{ASYNC, kHttpConnect}}; + const MockRead kReads[] = {{ASYNC, mock_error}}; - StaticSocketDataProvider socket_data_proxy_main_job; + StaticSocketDataProvider socket_data_proxy_main_job(kReads, kWrites); socket_data_proxy_main_job.set_connect_data(MockConnect(ASYNC, OK)); session_deps_.socket_factory->AddSocketDataProvider( &socket_data_proxy_main_job); session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data); - session_deps_.socket_factory->AddProxyClientSocketDataProvider(&proxy_data); // When retrying the job using the second proxy (badfallback:98), // alternative job must not be created. So, socket data for only the // main job is needed. - StaticSocketDataProvider socket_data_proxy_main_job_2; + StaticSocketDataProvider socket_data_proxy_main_job_2(kReads, kWrites); socket_data_proxy_main_job_2.set_connect_data(MockConnect(ASYNC, OK)); session_deps_.socket_factory->AddSocketDataProvider( &socket_data_proxy_main_job_2); session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data); - session_deps_.socket_factory->AddProxyClientSocketDataProvider(&proxy_data); - // First request would use DIRECT, and succeed. + // First request would use DIRECT, and succeed. For this and the second + // request, `ssl_data` is a connection to the HTTPS origin. For the first two, + // it is a connection to the HTTPS proxy. StaticSocketDataProvider socket_data_direct_first_request; socket_data_direct_first_request.set_connect_data(MockConnect(ASYNC, OK)); session_deps_.socket_factory->AddSocketDataProvider( &socket_data_direct_first_request); + session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data); // Second request would use DIRECT, and succeed. StaticSocketDataProvider socket_data_direct_second_request; socket_data_direct_second_request.set_connect_data(MockConnect(ASYNC, OK)); session_deps_.socket_factory->AddSocketDataProvider( &socket_data_direct_second_request); + session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data); // Now request a stream. It should succeed using the DIRECT. HttpRequestInfo request_info; request_info.method = "GET"; - request_info.url = GURL("http://www.example.com"); + request_info.url = GURL("https://www.example.com"); proxy_resolution_service->SetProxyDelegate(test_proxy_delegate.get()); Initialize(std::move(proxy_resolution_service)); @@ -597,7 +605,6 @@ // Tests that ERR_MSG_TOO_BIG is retryable for QUIC proxy. TEST_F(JobControllerReconsiderProxyAfterErrorTest, ReconsiderErrMsgTooBig) { - session_deps_.socket_factory->UseMockProxyClientSockets(); std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service = ConfiguredProxyResolutionService::CreateFixedFromPacResult( "QUIC badproxy:99; DIRECT", TRAFFIC_ANNOTATION_FOR_TESTS); @@ -645,7 +652,6 @@ // non-QUIC proxy on ERR_MSG_TOO_BIG. TEST_F(JobControllerReconsiderProxyAfterErrorTest, DoNotReconsiderErrMsgTooBig) { - session_deps_.socket_factory->UseMockProxyClientSockets(); std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service = ConfiguredProxyResolutionService::CreateFixedFromPacResult( "HTTPS badproxy:99; DIRECT", TRAFFIC_ANNOTATION_FOR_TESTS); @@ -654,18 +660,22 @@ ASSERT_TRUE(proxy_resolution_service->proxy_retry_info().empty()); // Mock data for the HTTPS proxy socket. + static constexpr char kHttpConnect[] = + "CONNECT www.example.com:443 HTTP/1.1\r\n" + "Host: www.example.com:443\r\n" + "Proxy-Connection: keep-alive\r\n\r\n"; + const MockWrite kWrites[] = {{ASYNC, kHttpConnect}}; + const MockRead kReads[] = {{ASYNC, ERR_MSG_TOO_BIG}}; SSLSocketDataProvider ssl_data(ASYNC, OK); - ProxyClientSocketDataProvider proxy_data(ASYNC, ERR_MSG_TOO_BIG); - StaticSocketDataProvider https_proxy_socket; + StaticSocketDataProvider https_proxy_socket(kReads, kWrites); https_proxy_socket.set_connect_data(MockConnect(ASYNC, OK)); session_deps_.socket_factory->AddSocketDataProvider(&https_proxy_socket); session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data); - session_deps_.socket_factory->AddProxyClientSocketDataProvider(&proxy_data); // Now request a stream. It should not fallback to DIRECT on ERR_MSG_TOO_BIG. HttpRequestInfo request_info; request_info.method = "GET"; - request_info.url = GURL("http://www.example.com"); + request_info.url = GURL("https://www.example.com"); Initialize(std::move(proxy_resolution_service));
diff --git a/net/socket/client_socket_factory.cc b/net/socket/client_socket_factory.cc index 875861af..b4947b9f 100644 --- a/net/socket/client_socket_factory.cc +++ b/net/socket/client_socket_factory.cc
@@ -8,7 +8,6 @@ #include "base/lazy_instance.h" #include "build/build_config.h" -#include "net/http/http_proxy_client_socket.h" #include "net/socket/ssl_client_socket.h" #include "net/socket/tcp_client_socket.h" #include "net/socket/udp_client_socket.h" @@ -53,23 +52,6 @@ return context->CreateSSLClientSocket(std::move(stream_socket), host_and_port, ssl_config); } - - std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket( - std::unique_ptr<StreamSocket> stream_socket, - const std::string& user_agent, - const HostPortPair& endpoint, - const ProxyServer& proxy_server, - HttpAuthController* http_auth_controller, - bool tunnel, - bool using_spdy, - NextProto negotiated_protocol, - ProxyDelegate* proxy_delegate, - const NetworkTrafficAnnotationTag& traffic_annotation) override { - return std::make_unique<HttpProxyClientSocket>( - std::move(stream_socket), user_agent, endpoint, proxy_server, - http_auth_controller, tunnel, using_spdy, negotiated_protocol, - proxy_delegate, traffic_annotation); - } }; static base::LazyInstance<DefaultClientSocketFactory>::Leaky
diff --git a/net/socket/client_socket_factory.h b/net/socket/client_socket_factory.h index 6965261a4..b4fffce 100644 --- a/net/socket/client_socket_factory.h +++ b/net/socket/client_socket_factory.h
@@ -25,10 +25,6 @@ class SSLClientContext; class SSLClientSocket; struct SSLConfig; -class ProxyClientSocket; -class ProxyDelegate; -class ProxyServer; -class HttpAuthController; class NetworkQualityEstimator; // An interface used to instantiate StreamSocket objects. Used to facilitate @@ -62,18 +58,6 @@ const HostPortPair& host_and_port, const SSLConfig& ssl_config) = 0; - virtual std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket( - std::unique_ptr<StreamSocket> stream_socket, - const std::string& user_agent, - const HostPortPair& endpoint, - const ProxyServer& proxy_server, - HttpAuthController* http_auth_controller, - bool tunnel, - bool using_spdy, - NextProto negotiated_protocol, - ProxyDelegate* proxy_delegate, - const NetworkTrafficAnnotationTag& traffic_annotation) = 0; - // Returns the default ClientSocketFactory. static ClientSocketFactory* GetDefaultFactory(); };
diff --git a/net/socket/client_socket_pool_base_unittest.cc b/net/socket/client_socket_pool_base_unittest.cc index e70d2ee..548c1ca84 100644 --- a/net/socket/client_socket_pool_base_unittest.cc +++ b/net/socket/client_socket_pool_base_unittest.cc
@@ -263,21 +263,6 @@ return nullptr; } - std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket( - std::unique_ptr<StreamSocket> stream_socket, - const std::string& user_agent, - const HostPortPair& endpoint, - const ProxyServer& proxy_server, - HttpAuthController* http_auth_controller, - bool tunnel, - bool using_spdy, - NextProto negotiated_protocol, - ProxyDelegate* proxy_delegate, - const NetworkTrafficAnnotationTag& traffic_annotation) override { - NOTIMPLEMENTED(); - return nullptr; - } - void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); } void SignalJobs();
diff --git a/net/socket/fuzzed_socket_factory.cc b/net/socket/fuzzed_socket_factory.cc index d116dde..a66133d 100644 --- a/net/socket/fuzzed_socket_factory.cc +++ b/net/socket/fuzzed_socket_factory.cc
@@ -150,19 +150,4 @@ return std::make_unique<FailingSSLClientSocket>(); } -std::unique_ptr<ProxyClientSocket> FuzzedSocketFactory::CreateProxyClientSocket( - std::unique_ptr<StreamSocket> stream_socket, - const std::string& user_agent, - const HostPortPair& endpoint, - const ProxyServer& proxy_server, - HttpAuthController* http_auth_controller, - bool tunnel, - bool using_spdy, - NextProto negotiated_protocol, - ProxyDelegate* proxy_delegate, - const NetworkTrafficAnnotationTag& traffic_annotation) { - NOTIMPLEMENTED(); - return nullptr; -} - } // namespace net
diff --git a/net/socket/fuzzed_socket_factory.h b/net/socket/fuzzed_socket_factory.h index 09254c2d..2dd91c5 100644 --- a/net/socket/fuzzed_socket_factory.h +++ b/net/socket/fuzzed_socket_factory.h
@@ -55,18 +55,6 @@ const HostPortPair& host_and_port, const SSLConfig& ssl_config) override; - std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket( - std::unique_ptr<StreamSocket> stream_socket, - const std::string& user_agent, - const HostPortPair& endpoint, - const ProxyServer& proxy_server, - HttpAuthController* http_auth_controller, - bool tunnel, - bool using_spdy, - NextProto negotiated_protocol, - ProxyDelegate* proxy_delegate, - const NetworkTrafficAnnotationTag& traffic_annotation) override; - // Sets whether Connect()ions on returned sockets can be asynchronously // delayed or outright fail. Defaults to true. void set_fuzz_connect_result(bool v) { fuzz_connect_result_ = v; }
diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc index 19b92d2..37a8974f 100644 --- a/net/socket/socket_test_util.cc +++ b/net/socket/socket_test_util.cc
@@ -336,15 +336,6 @@ helper_.Reset(); } -ProxyClientSocketDataProvider::ProxyClientSocketDataProvider(IoMode mode, - int result) - : connect(mode, result) {} - -ProxyClientSocketDataProvider::ProxyClientSocketDataProvider( - const ProxyClientSocketDataProvider& other) = default; - -ProxyClientSocketDataProvider::~ProxyClientSocketDataProvider() = default; - SSLSocketDataProvider::SSLSocketDataProvider(IoMode mode, int result) : connect(mode, result), next_proto(kProtoUnknown), @@ -769,11 +760,6 @@ mock_ssl_data_.Add(data); } -void MockClientSocketFactory::AddProxyClientSocketDataProvider( - ProxyClientSocketDataProvider* data) { - mock_proxy_data_.Add(data); -} - void MockClientSocketFactory::ResetNextMockIndexes() { mock_data_.ResetNextIndex(); mock_ssl_data_.ResetNextIndex(); @@ -866,30 +852,6 @@ std::move(stream_socket), host_and_port, ssl_config, next_ssl_data)); } -std::unique_ptr<ProxyClientSocket> -MockClientSocketFactory::CreateProxyClientSocket( - std::unique_ptr<StreamSocket> stream_socket, - const std::string& user_agent, - const HostPortPair& endpoint, - const ProxyServer& proxy_server, - HttpAuthController* http_auth_controller, - bool tunnel, - bool using_spdy, - NextProto negotiated_protocol, - ProxyDelegate* proxy_delegate, - const NetworkTrafficAnnotationTag& traffic_annotation) { - if (use_mock_proxy_client_sockets_) { - ProxyClientSocketDataProvider* next_proxy_data = mock_proxy_data_.GetNext(); - return std::make_unique<MockProxyClientSocket>( - std::move(stream_socket), http_auth_controller, next_proxy_data); - } else { - return GetDefaultFactory()->CreateProxyClientSocket( - std::move(stream_socket), user_agent, endpoint, proxy_server, - http_auth_controller, tunnel, using_spdy, negotiated_protocol, - proxy_delegate, traffic_annotation); - } -} - MockClientSocket::MockClientSocket(const NetLogWithSource& net_log) : connected_(false), net_log_(net_log) { local_addr_ = IPEndPoint(IPAddress(192, 0, 2, 33), 123); @@ -1329,162 +1291,6 @@ std::move(pending_read_if_ready_callback_).Run(result); } -MockProxyClientSocket::MockProxyClientSocket( - std::unique_ptr<StreamSocket> socket, - HttpAuthController* auth_controller, - ProxyClientSocketDataProvider* data) - : net_log_(socket->NetLog()), - socket_(std::move(socket)), - data_(data), - auth_controller_(auth_controller) { - DCHECK(data_); -} - -MockProxyClientSocket::~MockProxyClientSocket() { - Disconnect(); -} - -const HttpResponseInfo* MockProxyClientSocket::GetConnectResponseInfo() const { - return nullptr; -} - -const scoped_refptr<HttpAuthController>& -MockProxyClientSocket::GetAuthController() const { - return auth_controller_; -} - -int MockProxyClientSocket::RestartWithAuth(CompletionOnceCallback callback) { - return net::ERR_NOT_IMPLEMENTED; -} -bool MockProxyClientSocket::IsUsingSpdy() const { - return false; -} - -NextProto MockProxyClientSocket::GetProxyNegotiatedProtocol() const { - return kProtoUnknown; -} - -int MockProxyClientSocket::Read(IOBuffer* buf, - int buf_len, - CompletionOnceCallback callback) { - return socket_->Read(buf, buf_len, std::move(callback)); -} - -int MockProxyClientSocket::ReadIfReady(IOBuffer* buf, - int buf_len, - CompletionOnceCallback callback) { - return socket_->ReadIfReady(buf, buf_len, std::move(callback)); -} - -int MockProxyClientSocket::Write( - IOBuffer* buf, - int buf_len, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) { - return socket_->Write(buf, buf_len, std::move(callback), traffic_annotation); -} - -int MockProxyClientSocket::Connect(CompletionOnceCallback callback) { - DCHECK(socket_->IsConnected()); - if (data_->connect.mode == ASYNC) { - RunCallbackAsync(std::move(callback), data_->connect.result); - return ERR_IO_PENDING; - } - return data_->connect.result; -} - -void MockProxyClientSocket::Disconnect() { - if (socket_) - socket_->Disconnect(); -} - -bool MockProxyClientSocket::IsConnected() const { - return socket_->IsConnected(); -} - -bool MockProxyClientSocket::IsConnectedAndIdle() const { - return socket_->IsConnectedAndIdle(); -} - -bool MockProxyClientSocket::WasEverUsed() const { - return socket_->WasEverUsed(); -} - -int MockProxyClientSocket::GetLocalAddress(IPEndPoint* address) const { - *address = IPEndPoint(IPAddress(192, 0, 2, 33), 123); - return OK; -} - -int MockProxyClientSocket::GetPeerAddress(IPEndPoint* address) const { - return socket_->GetPeerAddress(address); -} - -bool MockProxyClientSocket::WasAlpnNegotiated() const { - return false; -} - -NextProto MockProxyClientSocket::GetNegotiatedProtocol() const { - NOTIMPLEMENTED(); - return kProtoUnknown; -} - -bool MockProxyClientSocket::GetSSLInfo(SSLInfo* requested_ssl_info) { - NOTIMPLEMENTED(); - return false; -} - -void MockProxyClientSocket::ApplySocketTag(const SocketTag& tag) { - return socket_->ApplySocketTag(tag); -} - -const NetLogWithSource& MockProxyClientSocket::NetLog() const { - return net_log_; -} - -void MockProxyClientSocket::GetConnectionAttempts( - ConnectionAttempts* out) const { - NOTIMPLEMENTED(); - out->clear(); -} - -int64_t MockProxyClientSocket::GetTotalReceivedBytes() const { - NOTIMPLEMENTED(); - return 0; -} - -int MockProxyClientSocket::SetReceiveBufferSize(int32_t size) { - return OK; -} - -int MockProxyClientSocket::SetSendBufferSize(int32_t size) { - return OK; -} - -void MockProxyClientSocket::OnReadComplete(const MockRead& data) { - NOTIMPLEMENTED(); -} - -void MockProxyClientSocket::OnWriteComplete(int rv) { - NOTIMPLEMENTED(); -} - -void MockProxyClientSocket::OnConnectComplete(const MockConnect& data) { - NOTIMPLEMENTED(); -} - -void MockProxyClientSocket::RunCallbackAsync(CompletionOnceCallback callback, - int result) { - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(&MockProxyClientSocket::RunCallback, - weak_factory_.GetWeakPtr(), std::move(callback), result)); -} - -void MockProxyClientSocket::RunCallback(CompletionOnceCallback callback, - int result) { - std::move(callback).Run(result); -} - // static void MockSSLClientSocket::ConnectCallback( MockSSLClientSocket* ssl_client_socket,
diff --git a/net/socket/socket_test_util.h b/net/socket/socket_test_util.h index 82a6f75c..8996773 100644 --- a/net/socket/socket_test_util.h +++ b/net/socket/socket_test_util.h
@@ -29,7 +29,6 @@ #include "net/base/net_errors.h" #include "net/base/test_completion_callback.h" #include "net/http/http_auth_controller.h" -#include "net/http/proxy_client_socket.h" #include "net/log/net_log_with_source.h" #include "net/socket/client_socket_factory.h" #include "net/socket/client_socket_handle.h" @@ -451,17 +450,6 @@ bool paused_ = false; }; -// ProxyClientSocketDataProvider only need to keep track of the return code from -// calls to Connect(). -struct ProxyClientSocketDataProvider { - ProxyClientSocketDataProvider(IoMode mode, int result); - ProxyClientSocketDataProvider(const ProxyClientSocketDataProvider& other); - ~ProxyClientSocketDataProvider(); - - // Result for Connect(). - MockConnect connect; -}; - // SSLSocketDataProviders only need to keep track of the return code from calls // to Connect(). struct SSLSocketDataProvider { @@ -653,12 +641,12 @@ class MockUDPClientSocket; class MockTCPClientSocket; class MockSSLClientSocket; -class MockProxyClientSocket; // ClientSocketFactory which contains arrays of sockets of each type. -// You should first fill the arrays using Add{SSL,ProxyClient,}SocketDataProvider(). When the -// factory is asked to create a socket, it takes next entry from appropriate array. You can use -// ResetNextMockIndexes to reset that next entry index for all mock socket types. +// You should first fill the arrays using Add{SSL,}SocketDataProvider(). When +// the factory is asked to create a socket, it takes next entry from appropriate +// array. You can use ResetNextMockIndexes to reset that next entry index for +// all mock socket types. class MockClientSocketFactory : public ClientSocketFactory { public: MockClientSocketFactory(); @@ -680,7 +668,6 @@ void AddTcpSocketDataProvider(SocketDataProvider* socket); void AddSSLSocketDataProvider(SSLSocketDataProvider* socket); - void AddProxyClientSocketDataProvider(ProxyClientSocketDataProvider* socket); void ResetNextMockIndexes(); SocketDataProviderArray<SocketDataProvider>& mock_data() { @@ -691,9 +678,6 @@ enable_read_if_ready_ = enable_read_if_ready; } - // Uses mock ProxyClientSocket instead of the default ProxyClientSocket. - void UseMockProxyClientSockets() { use_mock_proxy_client_sockets_ = true; } - // ClientSocketFactory std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket( DatagramSocket::BindType bind_type, @@ -710,17 +694,6 @@ std::unique_ptr<StreamSocket> stream_socket, const HostPortPair& host_and_port, const SSLConfig& ssl_config) override; - std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket( - std::unique_ptr<StreamSocket> stream_socket, - const std::string& user_agent, - const HostPortPair& endpoint, - const ProxyServer& proxy_server, - HttpAuthController* http_auth_controller, - bool tunnel, - bool using_spdy, - NextProto negotiated_protocol, - ProxyDelegate* proxy_delegate, - const NetworkTrafficAnnotationTag& traffic_annotation) override; const std::vector<uint16_t>& udp_client_socket_ports() const { return udp_client_socket_ports_; } @@ -729,13 +702,11 @@ SocketDataProviderArray<SocketDataProvider> mock_data_; SocketDataProviderArray<SocketDataProvider> mock_tcp_data_; SocketDataProviderArray<SSLSocketDataProvider> mock_ssl_data_; - SocketDataProviderArray<ProxyClientSocketDataProvider> mock_proxy_data_; std::vector<uint16_t> udp_client_socket_ports_; // If true, ReadIfReady() is enabled; otherwise ReadIfReady() returns // ERR_READ_IF_READY_NOT_IMPLEMENTED. bool enable_read_if_ready_; - bool use_mock_proxy_client_sockets_ = false; }; class MockClientSocket : public TransportClientSocket { @@ -895,73 +866,6 @@ ConnectionAttempts connection_attempts_; }; -class MockProxyClientSocket : public AsyncSocket, public ProxyClientSocket { - public: - MockProxyClientSocket(std::unique_ptr<StreamSocket> socket, - HttpAuthController* auth_controller, - ProxyClientSocketDataProvider* data); - - MockProxyClientSocket(const MockProxyClientSocket&) = delete; - MockProxyClientSocket& operator=(const MockProxyClientSocket&) = delete; - - ~MockProxyClientSocket() override; - // ProxyClientSocket implementation. - const HttpResponseInfo* GetConnectResponseInfo() const override; - const scoped_refptr<HttpAuthController>& GetAuthController() const override; - int RestartWithAuth(CompletionOnceCallback callback) override; - bool IsUsingSpdy() const override; - NextProto GetProxyNegotiatedProtocol() const override; - - // Socket implementation. - int Read(IOBuffer* buf, - int buf_len, - CompletionOnceCallback callback) override; - int ReadIfReady(IOBuffer* buf, - int buf_len, - CompletionOnceCallback callback) override; - int Write(IOBuffer* buf, - int buf_len, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) override; - - // StreamSocket implementation. - int Connect(CompletionOnceCallback callback) override; - void Disconnect() override; - bool IsConnected() const override; - bool IsConnectedAndIdle() const override; - bool WasEverUsed() const override; - int GetPeerAddress(IPEndPoint* address) const override; - int GetLocalAddress(IPEndPoint* address) const override; - bool WasAlpnNegotiated() const override; - NextProto GetNegotiatedProtocol() const override; - bool GetSSLInfo(SSLInfo* ssl_info) override; - void ApplySocketTag(const SocketTag& tag) override; - const NetLogWithSource& NetLog() const override; - void GetConnectionAttempts(ConnectionAttempts* out) const override; - void ClearConnectionAttempts() override {} - void AddConnectionAttempts(const ConnectionAttempts& attempts) override {} - int64_t GetTotalReceivedBytes() const override; - int SetReceiveBufferSize(int32_t size) override; - int SetSendBufferSize(int32_t size) override; - - // This MockSocket does not implement the manual async IO feature. - void OnReadComplete(const MockRead& data) override; - void OnWriteComplete(int rv) override; - void OnConnectComplete(const MockConnect& data) override; - void OnDataProviderDestroyed() override {} - - private: - void RunCallback(CompletionOnceCallback callback, int result); - void RunCallbackAsync(CompletionOnceCallback callback, int result); - - NetLogWithSource net_log_; - std::unique_ptr<StreamSocket> socket_; - raw_ptr<ProxyClientSocketDataProvider> data_; - scoped_refptr<HttpAuthController> auth_controller_; - - base::WeakPtrFactory<MockProxyClientSocket> weak_factory_{this}; -}; - class MockSSLClientSocket : public AsyncSocket, public SSLClientSocket { public: MockSSLClientSocket(std::unique_ptr<StreamSocket> stream_socket,
diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc index aa18ad9..2aaadea 100644 --- a/net/socket/ssl_client_socket_unittest.cc +++ b/net/socket/ssl_client_socket_unittest.cc
@@ -979,23 +979,6 @@ host_and_port, ssl_config); } - std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket( - std::unique_ptr<StreamSocket> stream_socket, - const std::string& user_agent, - const HostPortPair& endpoint, - const ProxyServer& proxy_server, - HttpAuthController* http_auth_controller, - bool tunnel, - bool using_spdy, - NextProto negotiated_protocol, - ProxyDelegate* proxy_delegate, - const NetworkTrafficAnnotationTag& traffic_annotation) override { - return factory_->CreateProxyClientSocket( - std::move(stream_socket), user_agent, endpoint, proxy_server, - http_auth_controller, tunnel, using_spdy, negotiated_protocol, - proxy_delegate, traffic_annotation); - } - private: const raw_ptr<ClientSocketFactory> factory_; };
diff --git a/net/socket/transport_client_socket_pool_test_util.cc b/net/socket/transport_client_socket_pool_test_util.cc index 986823ee..ed95b666 100644 --- a/net/socket/transport_client_socket_pool_test_util.cc +++ b/net/socket/transport_client_socket_pool_test_util.cc
@@ -456,22 +456,6 @@ return nullptr; } -std::unique_ptr<ProxyClientSocket> -MockTransportClientSocketFactory::CreateProxyClientSocket( - std::unique_ptr<StreamSocket> stream_socket, - const std::string& user_agent, - const HostPortPair& endpoint, - const ProxyServer& proxy_server, - HttpAuthController* http_auth_controller, - bool tunnel, - bool using_spdy, - NextProto negotiated_protocol, - ProxyDelegate* proxy_delegate, - const NetworkTrafficAnnotationTag& traffic_annotation) { - NOTIMPLEMENTED(); - return nullptr; -} - void MockTransportClientSocketFactory::set_client_socket_types( ClientSocketType* type_list, int num_types) {
diff --git a/net/socket/transport_client_socket_pool_test_util.h b/net/socket/transport_client_socket_pool_test_util.h index 6e915bbd..5f78a60 100644 --- a/net/socket/transport_client_socket_pool_test_util.h +++ b/net/socket/transport_client_socket_pool_test_util.h
@@ -99,18 +99,6 @@ const HostPortPair& host_and_port, const SSLConfig& ssl_config) override; - std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket( - std::unique_ptr<StreamSocket> stream_socket, - const std::string& user_agent, - const HostPortPair& endpoint, - const ProxyServer& proxy_server, - HttpAuthController* http_auth_controller, - bool tunnel, - bool using_spdy, - NextProto negotiated_protocol, - ProxyDelegate* proxy_delegate, - const NetworkTrafficAnnotationTag& traffic_annotation) override; - int allocation_count() const { return allocation_count_; } // Set the default ClientSocketType.
diff --git a/services/device/generic_sensor/fake_platform_sensor_and_provider.cc b/services/device/generic_sensor/fake_platform_sensor_and_provider.cc index 4d25d66..9f218c19 100644 --- a/services/device/generic_sensor/fake_platform_sensor_and_provider.cc +++ b/services/device/generic_sensor/fake_platform_sensor_and_provider.cc
@@ -21,12 +21,20 @@ .WillByDefault( Invoke([this](const PlatformSensorConfiguration& configuration) { SensorReading reading; - // Only mocking the shared memory update for AMBIENT_LIGHT type is - // enough. - if (GetType() == mojom::SensorType::AMBIENT_LIGHT) { - // Set the shared buffer value as frequency for testing purpose. - reading.als.value = configuration.frequency(); - AddNewReading(reading); + // Only mocking the shared memory update for AMBIENT_LIGHT and + // PRESSURE type is enough. + // Set the shared buffer value as frequency for testing purpose. + switch (GetType()) { + case mojom::SensorType::AMBIENT_LIGHT: + reading.als.value = configuration.frequency(); + AddNewReading(reading); + break; + case mojom::SensorType::PRESSURE: + reading.pressure.value = configuration.frequency(); + AddNewReading(reading); + break; + default: + break; } return true; }));
diff --git a/services/device/generic_sensor/generic_sensor_service_unittest.cc b/services/device/generic_sensor/generic_sensor_service_unittest.cc index a7cdc02..4adf004 100644 --- a/services/device/generic_sensor/generic_sensor_service_unittest.cc +++ b/services/device/generic_sensor/generic_sensor_service_unittest.cc
@@ -265,17 +265,17 @@ // Tests adding more than one clients. Sensor should send notification to all // its clients. TEST_F(GenericSensorServiceTest, MultipleClientsTest) { - auto client_1 = std::make_unique<TestSensorClient>(SensorType::AMBIENT_LIGHT); - auto client_2 = std::make_unique<TestSensorClient>(SensorType::AMBIENT_LIGHT); + auto client_1 = std::make_unique<TestSensorClient>(SensorType::PRESSURE); + auto client_2 = std::make_unique<TestSensorClient>(SensorType::PRESSURE); { base::RunLoop run_loop; auto barrier_closure = base::BarrierClosure(2, run_loop.QuitClosure()); sensor_provider_->GetSensor( - SensorType::AMBIENT_LIGHT, + SensorType::PRESSURE, base::BindOnce(&TestSensorClient::OnSensorCreated, base::Unretained(client_1.get()), barrier_closure)); sensor_provider_->GetSensor( - SensorType::AMBIENT_LIGHT, + SensorType::PRESSURE, base::BindOnce(&TestSensorClient::OnSensorCreated, base::Unretained(client_2.get()), barrier_closure)); run_loop.Run(); @@ -308,17 +308,17 @@ // Tests adding more than one clients. If mojo connection is broken on one // client, other clients should not be affected. TEST_F(GenericSensorServiceTest, ClientMojoConnectionBrokenTest) { - auto client_1 = std::make_unique<TestSensorClient>(SensorType::AMBIENT_LIGHT); - auto client_2 = std::make_unique<TestSensorClient>(SensorType::AMBIENT_LIGHT); + auto client_1 = std::make_unique<TestSensorClient>(SensorType::PRESSURE); + auto client_2 = std::make_unique<TestSensorClient>(SensorType::PRESSURE); { base::RunLoop run_loop; auto barrier_closure = base::BarrierClosure(2, run_loop.QuitClosure()); sensor_provider_->GetSensor( - SensorType::AMBIENT_LIGHT, + SensorType::PRESSURE, base::BindOnce(&TestSensorClient::OnSensorCreated, base::Unretained(client_1.get()), barrier_closure)); sensor_provider_->GetSensor( - SensorType::AMBIENT_LIGHT, + SensorType::PRESSURE, base::BindOnce(&TestSensorClient::OnSensorCreated, base::Unretained(client_2.get()), barrier_closure)); run_loop.Run(); @@ -350,11 +350,11 @@ // Test add and remove configuration operations. TEST_F(GenericSensorServiceTest, AddAndRemoveConfigurationTest) { - auto client = std::make_unique<TestSensorClient>(SensorType::AMBIENT_LIGHT); + auto client = std::make_unique<TestSensorClient>(SensorType::PRESSURE); { base::RunLoop run_loop; sensor_provider_->GetSensor( - SensorType::AMBIENT_LIGHT, + SensorType::PRESSURE, base::BindOnce(&TestSensorClient::OnSensorCreated, base::Unretained(client.get()), run_loop.QuitClosure())); run_loop.Run(); @@ -445,11 +445,11 @@ // Test suspend and resume. After resuming, client can add configuration and // be notified by SensorReadingChanged() as usual. TEST_F(GenericSensorServiceTest, SuspendThenResumeTest) { - auto client = std::make_unique<TestSensorClient>(SensorType::AMBIENT_LIGHT); + auto client = std::make_unique<TestSensorClient>(SensorType::PRESSURE); { base::RunLoop run_loop; sensor_provider_->GetSensor( - SensorType::AMBIENT_LIGHT, + SensorType::PRESSURE, base::BindOnce(&TestSensorClient::OnSensorCreated, base::Unretained(client.get()), run_loop.QuitClosure())); run_loop.Run(); @@ -492,17 +492,17 @@ // Test suspend when there are more than one client. The suspended client won't // receive SensorReadingChanged() notification. TEST_F(GenericSensorServiceTest, MultipleClientsSuspendAndResumeTest) { - auto client_1 = std::make_unique<TestSensorClient>(SensorType::AMBIENT_LIGHT); - auto client_2 = std::make_unique<TestSensorClient>(SensorType::AMBIENT_LIGHT); + auto client_1 = std::make_unique<TestSensorClient>(SensorType::PRESSURE); + auto client_2 = std::make_unique<TestSensorClient>(SensorType::PRESSURE); { base::RunLoop run_loop; auto barrier_closure = base::BarrierClosure(2, run_loop.QuitClosure()); sensor_provider_->GetSensor( - SensorType::AMBIENT_LIGHT, + SensorType::PRESSURE, base::BindOnce(&TestSensorClient::OnSensorCreated, base::Unretained(client_1.get()), barrier_closure)); sensor_provider_->GetSensor( - SensorType::AMBIENT_LIGHT, + SensorType::PRESSURE, base::BindOnce(&TestSensorClient::OnSensorCreated, base::Unretained(client_2.get()), barrier_closure)); run_loop.Run();
diff --git a/services/device/generic_sensor/platform_sensor_and_provider_unittest.cc b/services/device/generic_sensor/platform_sensor_and_provider_unittest.cc index ef85521..157fb79a 100644 --- a/services/device/generic_sensor/platform_sensor_and_provider_unittest.cc +++ b/services/device/generic_sensor/platform_sensor_and_provider_unittest.cc
@@ -127,12 +127,12 @@ base::BindOnce([](scoped_refptr<PlatformSensor> sensor) { auto client = std::make_unique<NiceMock<MockPlatformSensorClient>>(sensor); - auto config = PlatformSensorConfiguration(10); + auto config = PlatformSensorConfiguration(50); EXPECT_TRUE(sensor->StartListening(client.get(), config)); SensorReading reading; EXPECT_TRUE(sensor->GetLatestReading(&reading)); - EXPECT_THAT(reading.als.value, 10); + EXPECT_THAT(reading.als.value, 50); EXPECT_TRUE(sensor->StopListening(client.get(), config)); EXPECT_TRUE(sensor->GetLatestReading(&reading)); @@ -160,26 +160,29 @@ // This checks that illuminance significance check causes the following // to happen: - // 1. Initial value is set to 24. And test checks it can be read back. + // 1. Initial value is set to 24. And test checks it is correctly rounded + // to 0. // 2. New reading is attempted to set to 35. // 3. Value is read from sensor and compared new reading. But as new // reading was not significantly different compared to initial, for // privacy reasons, service returns the initial value. - // 4. New value is set to 49. And test checks it can be read back. New - // value is allowed as it is significantly different compared to old + // 4. New value is set to 49. And test checks it is correctly rounded to 50. + // New value is allowed as it is significantly different compared to old // value (24). // 5. New reading is attempted to set to 35. // 6. Value is read from sensor and compared new reading. But as new // reading was not significantly different compared to initial, for // privacy reasons, service returns the initial value. - // 7. New value is set to 24. And test checks it can be read back. New - // value is allowed as it is significantly different compared to old + // 7. New value is set to 24. And test checks it is correctly rounded to 0. + // New value is allowed as it is significantly different compared to old // value (49). const struct { const double attempted_als_value; const double expected_als_value; + const bool expect_reading_changed_event; } kTestCases[] = { - {24, 24}, {35, 24}, {49, 49}, {35, 49}, {24, 24}, + {24, 0, true}, {35, 0, false}, {49, 50, true}, + {35, 50, false}, {24, 0, true}, }; for (const auto& test_case : kTestCases) { @@ -187,7 +190,7 @@ reading.raw.timestamp = 1.0; reading.als.value = test_case.attempted_als_value; - if (reading.als.value == test_case.expected_als_value) + if (test_case.expect_reading_changed_event) AddNewReadingAndExpectReadingChangedEvent(client.get(), reading); else AddNewReadingAndExpectNoReadingChangedEvent(client.get(), reading);
diff --git a/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc b/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc index 7345269..44c2b26d 100644 --- a/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc +++ b/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc
@@ -530,7 +530,7 @@ sizeof(SensorReadingSharedBuffer), SensorReadingSharedBuffer::GetOffset(SensorType::AMBIENT_LIGHT)); - double sensor_value[kSensorValuesSize] = {22}; + double sensor_value[kSensorValuesSize] = {50}; InitializeSupportedSensor(SensorType::AMBIENT_LIGHT, kZero, kZero, kZero, sensor_value); @@ -549,7 +549,7 @@ SensorReadingSharedBuffer* buffer = static_cast<SensorReadingSharedBuffer*>(mapping.get()); - EXPECT_THAT(buffer->reading.als.value, sensor_value[0]); + EXPECT_THAT(buffer->reading.als.value, 50); EXPECT_TRUE(sensor->StopListening(client.get(), configuration)); } @@ -755,7 +755,7 @@ sizeof(SensorReadingSharedBuffer), SensorReadingSharedBuffer::GetOffset(SensorType::AMBIENT_LIGHT)); - double sensor_value[kSensorValuesSize] = {22}; + double sensor_value[kSensorValuesSize] = {50}; // Set a non-zero frequency here and sensor's reporting mode will be // mojom::ReportingMode::CONTINUOUS. InitializeSupportedSensor(SensorType::AMBIENT_LIGHT, @@ -779,7 +779,7 @@ SensorReadingSharedBuffer* buffer = static_cast<SensorReadingSharedBuffer*>(mapping.get()); - EXPECT_THAT(buffer->reading.als.value, sensor_value[0]); + EXPECT_THAT(buffer->reading.als.value, 50); EXPECT_TRUE(sensor->StopListening(client.get(), configuration)); }
diff --git a/services/device/generic_sensor/platform_sensor_util.cc b/services/device/generic_sensor/platform_sensor_util.cc index 97fd95f..8c5bd59 100644 --- a/services/device/generic_sensor/platform_sensor_util.cc +++ b/services/device/generic_sensor/platform_sensor_util.cc
@@ -55,6 +55,10 @@ reading->z = RoundToMultiple(reading->z, kGyroscopeRoundingMultiple); } +void RoundIlluminanceReading(SensorReadingSingle* reading) { + reading->value = RoundToMultiple(reading->value, kAlsRoundingMultiple); +} + void RoundOrientationQuaternionReading(SensorReadingQuat* reading) { double original_angle_div_2 = std::acos(reading->w); double rounded_angle_div_2 = @@ -123,6 +127,9 @@ break; case mojom::SensorType::AMBIENT_LIGHT: + RoundIlluminanceReading(&reading->als); + break; + case mojom::SensorType::MAGNETOMETER: case mojom::SensorType::PRESSURE: case mojom::SensorType::PROXIMITY: @@ -136,7 +143,7 @@ switch (sensor_type) { case mojom::SensorType::AMBIENT_LIGHT: return std::fabs(lhs.als.value - rhs.als.value) >= - kAlsSignificanceThreshold / 2; + kAlsSignificanceThreshold; case mojom::SensorType::ACCELEROMETER: case mojom::SensorType::GRAVITY:
diff --git a/services/device/generic_sensor/platform_sensor_util.h b/services/device/generic_sensor/platform_sensor_util.h index 0e19b27..b599373 100644 --- a/services/device/generic_sensor/platform_sensor_util.h +++ b/services/device/generic_sensor/platform_sensor_util.h
@@ -24,6 +24,9 @@ // Units are SI meters per second squared (m/s^2). constexpr double kAccelerometerRoundingMultiple = 0.1; +// Units are luxes (lx). +constexpr int kAlsRoundingMultiple = 50; + // Units are radians/second. This value corresponds to 0.1 deg./sec. constexpr double kGyroscopeRoundingMultiple = 0.00174532925199432963; @@ -36,7 +39,7 @@ // Some sensor types also ignore value changes below a certain threshold to // avoid exposing whether a value is too close to the limit between one // rounded value and the next. -constexpr int kAlsSignificanceThreshold = 50; +constexpr int kAlsSignificanceThreshold = kAlsRoundingMultiple / 2; // Round |value| to be a multiple of |multiple|. // @@ -56,6 +59,9 @@ // Round gyroscope sensor reading to guard user privacy. void RoundGyroscopeReading(SensorReadingXYZ* reading); +// Round ambient light sensor reading to guard user privacy. +void RoundIlluminanceReading(SensorReadingSingle* reading); + // Round orientation Euler angle sensor reading to guard user privacy. void RoundOrientationEulerReading(SensorReadingXYZ* reading);
diff --git a/services/device/generic_sensor/platform_sensor_util_unittest.cc b/services/device/generic_sensor/platform_sensor_util_unittest.cc index 88cd4bd..4dc7baa 100644 --- a/services/device/generic_sensor/platform_sensor_util_unittest.cc +++ b/services/device/generic_sensor/platform_sensor_util_unittest.cc
@@ -123,13 +123,13 @@ const bool expectation; const double new_reading; } kTestCases[] = { - {true, kTestValue - kAlsSignificanceThreshold / 2 - 1}, - {true, kTestValue - kAlsSignificanceThreshold / 2}, - {false, kTestValue - kAlsSignificanceThreshold / 2 + 1}, + {true, kTestValue - kAlsSignificanceThreshold - 1}, + {true, kTestValue - kAlsSignificanceThreshold}, + {false, kTestValue - kAlsSignificanceThreshold + 1}, {false, kTestValue}, - {false, kTestValue + kAlsSignificanceThreshold / 2 - 1}, - {true, kTestValue + kAlsSignificanceThreshold / 2}, - {true, kTestValue + kAlsSignificanceThreshold / 2 + 1}, + {false, kTestValue + kAlsSignificanceThreshold - 1}, + {true, kTestValue + kAlsSignificanceThreshold}, + {true, kTestValue + kAlsSignificanceThreshold + 1}, }; SensorReading initial_reading;
diff --git a/services/network/proxy_auto_config_library_unittest.cc b/services/network/proxy_auto_config_library_unittest.cc index dbc8d18..65cb827 100644 --- a/services/network/proxy_auto_config_library_unittest.cc +++ b/services/network/proxy_auto_config_library_unittest.cc
@@ -268,20 +268,6 @@ ADD_FAILURE() << "Called CreateSSLClientSocket()"; return nullptr; } - std::unique_ptr<net::ProxyClientSocket> CreateProxyClientSocket( - std::unique_ptr<net::StreamSocket> stream_socket, - const std::string& user_agent, - const net::HostPortPair& endpoint, - const net::ProxyServer& proxy_server, - net::HttpAuthController* http_auth_controller, - bool tunnel, - bool using_spdy, - net::NextProto negotiated_protocol, - net::ProxyDelegate* proxy_delegate, - const net::NetworkTrafficAnnotationTag& traffic_annotation) override { - ADD_FAILURE() << "Called CreateProxyClientSocket()"; - return nullptr; - } private: std::vector<std::unique_ptr<MockUDPSocket>> udp_sockets_;
diff --git a/services/network/proxy_resolving_client_socket_unittest.cc b/services/network/proxy_resolving_client_socket_unittest.cc index 2112c1c..310ca65 100644 --- a/services/network/proxy_resolving_client_socket_unittest.cc +++ b/services/network/proxy_resolving_client_socket_unittest.cc
@@ -1011,18 +1011,13 @@ // Note: ProxyResolvingClientSocket currently removes // net::ProxyServer::SCHEME_QUIC, so this list excludes errors that are // retryable only for QUIC proxies. -const int kProxyTestMockErrors[] = {net::ERR_PROXY_CONNECTION_FAILED, - net::ERR_NAME_NOT_RESOLVED, - net::ERR_ADDRESS_UNREACHABLE, - net::ERR_CONNECTION_CLOSED, - net::ERR_CONNECTION_RESET, - net::ERR_CONNECTION_REFUSED, - net::ERR_CONNECTION_ABORTED, - net::ERR_SOCKS_CONNECTION_FAILED, - net::ERR_TIMED_OUT, - net::ERR_CONNECTION_TIMED_OUT, - net::ERR_PROXY_CERTIFICATE_INVALID, - net::ERR_SSL_PROTOCOL_ERROR}; +const int kProxyTestMockErrors[] = { + net::ERR_PROXY_CONNECTION_FAILED, net::ERR_NAME_NOT_RESOLVED, + net::ERR_ADDRESS_UNREACHABLE, net::ERR_CONNECTION_RESET, + net::ERR_CONNECTION_REFUSED, net::ERR_CONNECTION_ABORTED, + net::ERR_SOCKS_CONNECTION_FAILED, net::ERR_TIMED_OUT, + net::ERR_CONNECTION_TIMED_OUT, net::ERR_PROXY_CERTIFICATE_INVALID, + net::ERR_SSL_PROTOCOL_ERROR}; INSTANTIATE_TEST_SUITE_P( All, @@ -1042,25 +1037,31 @@ .empty()) << mock_error; - mock_client_socket_factory_.UseMockProxyClientSockets(); - - net::ProxyClientSocketDataProvider proxy_data(io_mode, mock_error); + // Configure the HTTP CONNECT to fail with `mock_error`. + // + // TODO(crbug.com/1279685): Test this more accurately. Errors like + // `ERR_PROXY_CONNECTION_FAILED` or `ERR_PROXY_CERTIFICATE_INVALID` are + // surfaced in response to other errors in TCP or TLS connection setup. + static const char kHttpConnect[] = + "CONNECT example.com:443 HTTP/1.1\r\n" + "Host: example.com:443\r\n" + "Proxy-Connection: keep-alive\r\n\r\n"; + const net::MockWrite kWrites[] = {{net::ASYNC, kHttpConnect}}; + const net::MockRead kReads[] = {{net::ASYNC, mock_error}}; // Connect to first broken proxy. - net::StaticSocketDataProvider data1; + net::StaticSocketDataProvider data1(kReads, kWrites); net::SSLSocketDataProvider ssl_data1(io_mode, net::OK); data1.set_connect_data(net::MockConnect(io_mode, net::OK)); mock_client_socket_factory_.AddSocketDataProvider(&data1); mock_client_socket_factory_.AddSSLSocketDataProvider(&ssl_data1); - mock_client_socket_factory_.AddProxyClientSocketDataProvider(&proxy_data); // Connect to second broken proxy. - net::StaticSocketDataProvider data2; + net::StaticSocketDataProvider data2(kReads, kWrites); net::SSLSocketDataProvider ssl_data2(io_mode, net::OK); data2.set_connect_data(net::MockConnect(io_mode, net::OK)); mock_client_socket_factory_.AddSocketDataProvider(&data2); mock_client_socket_factory_.AddSSLSocketDataProvider(&ssl_data2); - mock_client_socket_factory_.AddProxyClientSocketDataProvider(&proxy_data); // Connect using direct. net::StaticSocketDataProvider data3;
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc index 4aaf592..f129162 100644 --- a/services/network/public/cpp/features.cc +++ b/services/network/public/cpp/features.cc
@@ -195,41 +195,44 @@ // This feature is used for tuning several loading-related data pipe // parameters. See crbug.com/1041006. const base::Feature kLoaderDataPipeTuningFeature{ - "LoaderDataPipeTuning", base::FEATURE_DISABLED_BY_DEFAULT}; + "LoaderDataPipeTuning", base::FEATURE_ENABLED_BY_DEFAULT}; namespace { -// The default buffer size of DataPipe which is used to send the content body. -static constexpr uint32_t kDataPipeDefaultAllocationSize = 512 * 1024; -constexpr base::FeatureParam<int> kDataPipeAllocationSize{ - &kLoaderDataPipeTuningFeature, "allocation_size_bytes", - base::saturated_cast<int>(kDataPipeDefaultAllocationSize)}; +// The default Mojo ring buffer size, used to send the content body. +static constexpr uint32_t kDefaultDataPipeAllocationSize = 512 * 1024; +// The larger ring buffer size, used primarily for network::URLLoader loads. +// This value was optimized via Finch: see crbug.com/1041006. +static constexpr uint32_t kLargerDataPipeAllocationSize = 2 * 1024 * 1024; // The maximal number of bytes consumed in a loading task. When there are more // bytes in the data pipe, they will be consumed in following tasks. Setting too // small of a number will generate many tasks but setting a too large of a -// number will lead to thread janks. -static constexpr uint32_t kMaxNumConsumedBytesInTask = 64 * 1024; -constexpr base::FeatureParam<int> kLoaderChunkSize{ - &kLoaderDataPipeTuningFeature, "loader_chunk_size", - base::saturated_cast<int>(kMaxNumConsumedBytesInTask)}; +// number will lead to thread janks. This value was optimized via Finch: +// see crbug.com/1041006. +static constexpr uint32_t kDefaultMaxNumConsumedBytesInTask = 64 * 1024; +static constexpr uint32_t kLargerMaxNumConsumedBytesInTask = 1024 * 1024; } // namespace // static uint32_t GetDataPipeDefaultAllocationSize(DataPipeAllocationSize option) { // For low-memory devices, always use the (smaller) default buffer size. if (base::SysInfo::AmountOfPhysicalMemoryMB() <= 512) - return kDataPipeDefaultAllocationSize; + return kDefaultDataPipeAllocationSize; + if (!base::FeatureList::IsEnabled(features::kLoaderDataPipeTuningFeature)) + return kDefaultDataPipeAllocationSize; switch (option) { case DataPipeAllocationSize::kDefaultSizeOnly: - return kDataPipeDefaultAllocationSize; + return kDefaultDataPipeAllocationSize; case DataPipeAllocationSize::kLargerSizeIfPossible: - return base::saturated_cast<uint32_t>(kDataPipeAllocationSize.Get()); + return kLargerDataPipeAllocationSize; } } // static uint32_t GetLoaderChunkSize() { - return base::saturated_cast<uint32_t>(kLoaderChunkSize.Get()); + if (!base::FeatureList::IsEnabled(features::kLoaderDataPipeTuningFeature)) + return kDefaultMaxNumConsumedBytesInTask; + return kLargerMaxNumConsumedBytesInTask; } // Check disk cache to see if the queued requests (especially those don't need
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json index 3835d6af..6facfeb6 100644 --- a/testing/buildbot/chrome.json +++ b/testing/buildbot/chrome.json
@@ -1728,7 +1728,7 @@ { "args": [], "cros_board": "atlas", - "cros_img": "atlas-release/R98-14382.0.0", + "cros_img": "atlas-release/R98-14388.1.0", "name": "lacros_all_tast_tests_ATLAS_DEV", "resultdb": { "enable": true, @@ -1758,7 +1758,7 @@ { "args": [], "cros_board": "atlas", - "cros_img": "atlas-release/R94-14150.87.0", + "cros_img": "atlas-release/R96-14268.67.0", "name": "lacros_all_tast_tests_ATLAS_STABLE", "resultdb": { "enable": true, @@ -1788,7 +1788,7 @@ { "args": [], "cros_board": "eve", - "cros_img": "eve-release/R98-14382.0.0", + "cros_img": "eve-release/R98-14388.1.0", "name": "lacros_all_tast_tests_EVE_DEV", "resultdb": { "enable": true, @@ -1818,7 +1818,7 @@ { "args": [], "cros_board": "eve", - "cros_img": "eve-release/R94-14150.87.0", + "cros_img": "eve-release/R96-14268.67.0", "name": "lacros_all_tast_tests_EVE_STABLE", "resultdb": { "enable": true,
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index cb7f17c..33dde372 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -24588,6 +24588,7 @@ "name": "shard #${SHARD_INDEX} logcats" } ], + "quickrun_shards": 2, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "android_browsertests", @@ -28437,6 +28438,7 @@ "name": "shard #${SHARD_INDEX} logcats" } ], + "quickrun_shards": 4, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 2 }, @@ -37219,6 +37221,7 @@ "name": "shard #${SHARD_INDEX} logcats" } ], + "quickrun_shards": 4, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 2 }, @@ -37643,6 +37646,7 @@ "name": "shard #${SHARD_INDEX} logcats" } ], + "quickrun_shards": 30, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 15 },
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index f54d4aa..acb9a55 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -3525,6 +3525,7 @@ "os": "Ubuntu-18.04" } ], + "quickrun_shards": 40, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 20 }, @@ -5169,6 +5170,7 @@ "os": "Ubuntu-18.04" } ], + "quickrun_shards": 20, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 10 },
diff --git a/testing/buildbot/chromium.gpu.json b/testing/buildbot/chromium.gpu.json index 791f3da09..b7d498e 100644 --- a/testing/buildbot/chromium.gpu.json +++ b/testing/buildbot/chromium.gpu.json
@@ -3422,6 +3422,7 @@ } ], "idempotent": false, + "quickrun_shards": 2, "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index cce3bea..e832b67 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -6810,6 +6810,7 @@ "os": "Ubuntu-18.04" } ], + "quickrun_shards": 24, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 10 },
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json index c31d5b5..d714912 100644 --- a/testing/buildbot/chromium.mac.json +++ b/testing/buildbot/chromium.mac.json
@@ -9569,6 +9569,7 @@ "os": "Mac-11|Mac-10.16" } ], + "quickrun_shards": 6, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 },
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index bc4e01e..17d1e0b 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -282,6 +282,7 @@ "os": "Ubuntu-18.04" } ], + "quickrun_shards": 80, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 40 }, @@ -485,6 +486,7 @@ "os": "Ubuntu-18.04" } ], + "quickrun_shards": 24, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, @@ -934,6 +936,7 @@ "os": "Ubuntu-18.04" } ], + "quickrun_shards": 12, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 6 }, @@ -1396,6 +1399,7 @@ "os": "Ubuntu-18.04" } ], + "quickrun_shards": 2, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "services_unittests",
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json index 23aa586..3170bad 100644 --- a/testing/buildbot/chromium.perf.json +++ b/testing/buildbot/chromium.perf.json
@@ -725,7 +725,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "device_os": "R", + "device_os": "RP1A.201105.002", "device_os_flavor": "google", "device_type": "flame", "os": "Android", @@ -774,7 +774,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "device_os": "R", + "device_os": "RP1A.201105.002", "device_os_flavor": "google", "device_type": "flame", "os": "Android", @@ -823,7 +823,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "device_os": "R", + "device_os": "RP1A.201105.002", "device_os_flavor": "google", "device_type": "flame", "os": "Android",
diff --git a/testing/buildbot/internal.chromeos.fyi.json b/testing/buildbot/internal.chromeos.fyi.json index 02d79274..c0490d7 100644 --- a/testing/buildbot/internal.chromeos.fyi.json +++ b/testing/buildbot/internal.chromeos.fyi.json
@@ -1107,7 +1107,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R98-14382.0.0", + "cros_img": "octopus-release/R98-14388.1.0", "name": "lacros_fyi_tast_tests_OCTOPUS_DEV", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1129,7 +1129,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R94-14150.87.0", + "cros_img": "octopus-release/R96-14268.67.0", "name": "lacros_fyi_tast_tests_OCTOPUS_STABLE", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1150,7 +1150,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R98-14382.0.0", + "cros_img": "octopus-release/R98-14388.1.0", "name": "ozone_unittests_OCTOPUS_DEV", "swarming": {}, "test": "ozone_unittests", @@ -1170,7 +1170,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R94-14150.87.0", + "cros_img": "octopus-release/R96-14268.67.0", "name": "ozone_unittests_OCTOPUS_STABLE", "swarming": {}, "test": "ozone_unittests",
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index a515996..6410b5ca 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -30,6 +30,11 @@ 'shards': 2, }, }, + 'android-marshmallow-arm64-rel': { + 'swarming': { + 'quickrun_shards': 2, + }, + }, 'android-marshmallow-arm64-rel-rts': { 'swarming': { 'shards': 2, @@ -38,6 +43,7 @@ 'android-marshmallow-x86-rel': { 'swarming': { 'shards': 2, + 'quickrun_shards': 4, }, }, 'android-pie-arm64-rel': { @@ -53,6 +59,7 @@ }, ], 'shards': 2, + 'quickrun_shards': 4, }, }, 'android-pie-x86-rel': { @@ -565,6 +572,7 @@ # crbug.com/794372 'swarming': { 'shards': 40, + 'quickrun_shards': 80 }, }, 'Linux ASan Tests (sandboxed)': { @@ -594,6 +602,9 @@ 'args': [ '--test-launcher-filter-file=../../testing/buildbot/filters/ozone-linux.wayland_browser_tests.filter', ], + 'swarming': { + 'quickrun_shards': 24, + }, }, 'Linux Tests (dbg)(1)': { # crbug.com/1066161 @@ -714,6 +725,7 @@ 'linux-chromeos-rel': { 'swarming': { 'shards': 20, + 'quickrun_shards': 40, 'dimension_sets': [ { 'kvm': '1', @@ -743,6 +755,9 @@ 'args': [ '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.browser_tests.filter', ], + 'swarming': { + 'quickrun_shards': 20, + }, }, 'linux-trusty-rel': { 'args': [ @@ -1194,6 +1209,7 @@ 'Linux ASan LSan Tests (1)': { 'swarming': { 'shards': 12, + 'quickrun_shards': 24, }, }, 'Linux ASan Tests (sandboxed)': { @@ -1286,6 +1302,11 @@ 'shards': 20, }, }, + 'android-pie-arm64-rel': { + 'swarming': { + 'quickrun_shards': 30 + } + }, 'android-pie-x86-rel': { 'args': [ '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_p.content_browsertests.filter', @@ -1815,6 +1836,7 @@ # These are slow on the ASan trybot for some reason, crbug.com/794372 'swarming': { 'shards': 6, + 'quickrun_shards': 12, }, }, 'Linux ChromiumOS MSan Tests': { @@ -1839,6 +1861,11 @@ 'Mac ASan 64 Tests (1)': { # https://crbug.com/1251656 'experiment_percentage': 100, }, + 'Mac11 Tests': { + 'swarming': { + 'quickrun_shards': 6, + }, + }, 'Mac11 Tests (dbg)': { # https://crbug.com/1265051 'experiment_percentage': 100, }, @@ -2469,6 +2496,11 @@ '--extra-browser-args=--disable-wcg-for-test', ], }, + 'Mac Retina Release (AMD)': { + 'swarming': { + 'quickrun_shards': 2, + }, + }, 'Optional Android Release (Pixel 4)': { 'args': [ # See above. @@ -2657,6 +2689,11 @@ }, }, 'modifications': { + 'Linux ASan LSan Tests (1)': { + 'swarming': { + 'quickrun_shards': 2, + }, + }, 'android-11-x86-rel': { 'args': [ # TODO(crbug.com/1264654): Fix the failed tests
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index aad980f..59b5a55 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -572,8 +572,8 @@ 'CROS_ATLAS_DEV': { 'skylab': { 'cros_board': 'atlas', - 'cros_chrome_version': '98.0.4723.0', - 'cros_img': 'atlas-release/R98-14382.0.0', + 'cros_chrome_version': '98.0.4758.0', + 'cros_img': 'atlas-release/R98-14388.1.0', }, 'enabled': True, 'identifier': 'ATLAS_DEV', @@ -590,8 +590,8 @@ 'CROS_ATLAS_STABLE': { 'skylab': { 'cros_board': 'atlas', - 'cros_chrome_version': '94.0.4606.124', - 'cros_img': 'atlas-release/R94-14150.87.0', + 'cros_chrome_version': '96.0.4664.111', + 'cros_img': 'atlas-release/R96-14268.67.0', }, 'enabled': True, 'identifier': 'ATLAS_STABLE', @@ -608,8 +608,8 @@ 'CROS_EVE_DEV': { 'skylab': { 'cros_board': 'eve', - 'cros_chrome_version': '98.0.4723.0', - 'cros_img': 'eve-release/R98-14382.0.0', + 'cros_chrome_version': '98.0.4758.0', + 'cros_img': 'eve-release/R98-14388.1.0', }, 'enabled': True, 'identifier': 'EVE_DEV', @@ -626,8 +626,8 @@ 'CROS_EVE_STABLE': { 'skylab': { 'cros_board': 'eve', - 'cros_chrome_version': '94.0.4606.124', - 'cros_img': 'eve-release/R94-14150.87.0', + 'cros_chrome_version': '96.0.4664.111', + 'cros_img': 'eve-release/R96-14268.67.0', }, 'enabled': True, 'identifier': 'EVE_STABLE', @@ -653,8 +653,8 @@ 'CROS_OCTOPUS_DEV': { 'skylab': { 'cros_board': 'octopus', - 'cros_chrome_version': '98.0.4723.0', - 'cros_img': 'octopus-release/R98-14382.0.0', + 'cros_chrome_version': '98.0.4758.0', + 'cros_img': 'octopus-release/R98-14388.1.0', }, 'enabled': True, 'identifier': 'OCTOPUS_DEV', @@ -671,8 +671,8 @@ 'CROS_OCTOPUS_STABLE': { 'skylab': { 'cros_board': 'octopus', - 'cros_chrome_version': '94.0.4606.124', - 'cros_img': 'octopus-release/R94-14150.87.0', + 'cros_chrome_version': '96.0.4664.111', + 'cros_img': 'octopus-release/R96-14268.67.0', }, 'enabled': True, 'identifier': 'OCTOPUS_STABLE',
diff --git a/testing/unexpected_passes_common/queries.py b/testing/unexpected_passes_common/queries.py index b27269e5..eb1e5c4 100644 --- a/testing/unexpected_passes_common/queries.py +++ b/testing/unexpected_passes_common/queries.py
@@ -95,7 +95,7 @@ """ logging.info('Filling test expectation map with try results') return self._FillExpectationMapForBuilders(expectation_map, builders, - constants.BuilderTypes.CI) + constants.BuilderTypes.TRY) def _FillExpectationMapForBuilders(self, expectation_map, builders, builder_type):
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 46b7d1c..10a4413 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -1888,6 +1888,22 @@ ] } ], + "CertificateTransparencyAndroid": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "CertificateTransparencyAndroid", + "CertificateTransparencyComponentUpdater" + ] + } + ] + } + ], "CertificateTransparencyComponentUpdater": [ { "platforms": [ @@ -7684,21 +7700,6 @@ ] } ], - "TabsBulkActions": [ - { - "platforms": [ - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "TabsBulkActions" - ] - } - ] - } - ], "ToolbarMicIphAndroid": [ { "platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index ca187e79..5ede382 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -123,7 +123,7 @@ base::FEATURE_ENABLED_BY_DEFAULT}; const base::Feature kForceSynchronousHTMLParsing{ - "ForceSynchronousHTMLParsing", base::FEATURE_DISABLED_BY_DEFAULT}; + "ForceSynchronousHTMLParsing", base::FEATURE_ENABLED_BY_DEFAULT}; // Enable EditingNG by default. This feature is for a kill switch. const base::Feature kEditingNG{"EditingNG", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/third_party/blink/public/web/web_performance.h b/third_party/blink/public/web/web_performance.h index 75004b7..1c04c05e 100644 --- a/third_party/blink/public/web/web_performance.h +++ b/third_party/blink/public/web/web_performance.h
@@ -112,6 +112,8 @@ BLINK_EXPORT double FirstImagePaint() const; BLINK_EXPORT double FirstContentfulPaint() const; BLINK_EXPORT base::TimeTicks FirstContentfulPaintAsMonotonicTime() const; + BLINK_EXPORT base::TimeTicks + FirstContentfulPaintRenderedButNotPresentedAsMonotonicTime() const; BLINK_EXPORT double FirstMeaningfulPaint() const; BLINK_EXPORT double FirstMeaningfulPaintCandidate() const; BLINK_EXPORT double LargestImagePaint() const;
diff --git a/third_party/blink/renderer/core/editing/selection_controller.cc b/third_party/blink/renderer/core/editing/selection_controller.cc index bcb68b2..7a7da8e 100644 --- a/third_party/blink/renderer/core/editing/selection_controller.cc +++ b/third_party/blink/renderer/core/editing/selection_controller.cc
@@ -1056,7 +1056,8 @@ HitTestRequest request(HitTestRequest::kReadOnly | HitTestRequest::kActive | HitTestRequest::kMove); - HitTestLocation location(last_known_mouse_position_in_root_frame); + HitTestLocation location( + view->ConvertFromRootFrame(last_known_mouse_position_in_root_frame)); HitTestResult result(request, location); layout_view->HitTest(location, result); UpdateSelectionForMouseDrag(result, drag_start_pos_in_root_frame,
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc index beb040e..a531eb8 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc +++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -2061,12 +2061,6 @@ void WebFrameWidgetImpl::BeginCommitCompositorFrame() { commit_compositor_frame_start_time_.emplace(base::TimeTicks::Now()); probe::LayerTreePainted(LocalRootImpl()->GetFrame()); -} - -void WebFrameWidgetImpl::EndCommitCompositorFrame( - base::TimeTicks commit_start_time, - base::TimeTicks commit_finish_time) { - DCHECK(commit_compositor_frame_start_time_.has_value()); if (ForTopMostMainFrame()) { Document* doc = local_root_->GetFrame()->GetDocument(); if (doc->GetSettings()->GetViewportMetaEnabled() && @@ -2087,7 +2081,12 @@ base::debug::DumpWithoutCrashing(); } } +} +void WebFrameWidgetImpl::EndCommitCompositorFrame( + base::TimeTicks commit_start_time, + base::TimeTicks commit_finish_time) { + DCHECK(commit_compositor_frame_start_time_.has_value()); LocalRootImpl() ->GetFrame() ->View()
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h index 02b5de9..ad009f10 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h +++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
@@ -623,6 +623,8 @@ // overridden by tests to disable this. virtual bool ShouldAutoDetermineCompositingToLCDTextSetting(); + WidgetBase* widget_base_for_testing() const { return widget_base_.get(); } + // WebFrameWidget overrides. cc::LayerTreeHost* LayerTreeHost() override;
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_test.cc b/third_party/blink/renderer/core/frame/web_frame_widget_test.cc index 5d60b48..8b49326 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_test.cc +++ b/third_party/blink/renderer/core/frame/web_frame_widget_test.cc
@@ -20,6 +20,9 @@ #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" #include "third_party/blink/renderer/core/testing/sim/sim_request.h" #include "third_party/blink/renderer/core/testing/sim/sim_test.h" +#include "third_party/blink/renderer/platform/scheduler/test/fake_task_runner.h" +#include "third_party/blink/renderer/platform/widget/input/widget_input_handler_manager.h" +#include "third_party/blink/renderer/platform/widget/widget_base.h" namespace blink { @@ -756,4 +759,261 @@ WebView().MainFrame()->FirstChild()->FirstChild()->Detach(); } +class EventHandlingWebFrameWidgetSimTest : public SimTest { + public: + void SetUp() override { + SimTest::SetUp(); + + WebView().StopDeferringMainFrameUpdate(); + GetWebFrameWidget().UpdateCompositorViewportRect(gfx::Rect(200, 100)); + Compositor().BeginFrame(); + } + + SimWebFrameWidget* CreateSimWebFrameWidget( + base::PassKey<WebLocalFrame> pass_key, + CrossVariantMojoAssociatedRemote< + mojom::blink::FrameWidgetHostInterfaceBase> frame_widget_host, + CrossVariantMojoAssociatedReceiver<mojom::blink::FrameWidgetInterfaceBase> + frame_widget, + CrossVariantMojoAssociatedRemote<mojom::blink::WidgetHostInterfaceBase> + widget_host, + CrossVariantMojoAssociatedReceiver<mojom::blink::WidgetInterfaceBase> + widget, + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + const viz::FrameSinkId& frame_sink_id, + bool hidden, + bool never_composited, + bool is_for_child_local_root, + bool is_for_nested_main_frame, + SimCompositor* compositor) override { + return MakeGarbageCollected<TestWebFrameWidget>( + compositor, pass_key, std::move(frame_widget_host), + std::move(frame_widget), std::move(widget_host), std::move(widget), + std::move(task_runner), frame_sink_id, hidden, never_composited, + is_for_child_local_root, is_for_nested_main_frame); + } + + protected: + // A test `cc::SwapPromise` implementation that can be used to track the state + // of the swap promise. + class TestSwapPromise : public cc::SwapPromise { + public: + enum class State { + kPending, + kResolved, + kBroken, + kMaxValue = kBroken, + }; + + explicit TestSwapPromise(State* state) : state_(state) { + DCHECK(state_); + *state_ = State::kPending; + } + + void DidActivate() override {} + + void WillSwap(viz::CompositorFrameMetadata* metadata) override {} + + void DidSwap() override { + DCHECK_EQ(State::kPending, *state_); + *state_ = State::kResolved; + } + + DidNotSwapAction DidNotSwap(DidNotSwapReason reason) override { + DCHECK_EQ(State::kPending, *state_); + *state_ = State::kBroken; + return DidNotSwapAction::BREAK_PROMISE; + } + + int64_t GetTraceId() const override { return 0; } + + private: + State* const state_; + }; + + // A test `WebFrameWidget` implementation that fakes handling of an event. + class TestWebFrameWidget : public SimWebFrameWidget { + public: + template <typename... Args> + explicit TestWebFrameWidget(Args&&... args) + : SimWebFrameWidget(std::forward<Args>(args)...) {} + + WebInputEventResult HandleInputEvent( + const WebCoalescedInputEvent& coalesced_event) override { + if (event_causes_update_) + RequestUpdateIfNecessary(); + return WebInputEventResult::kHandledApplication; + } + + void set_event_causes_update(bool event_causes_update) { + event_causes_update_ = event_causes_update; + } + + void RequestUpdateIfNecessary() { + if (update_requested_) + return; + + LayerTreeHost()->SetNeedsCommit(); + update_requested_ = true; + } + + void QueueSwapPromise(TestSwapPromise::State* state) { + LayerTreeHost()->GetSwapPromiseManager()->QueueSwapPromise( + std::make_unique<TestSwapPromise>(state)); + } + + void SendInputEventAndWaitForDispatch( + std::unique_ptr<WebInputEvent> event) { + MainThreadEventQueue* input_event_queue = + widget_base_for_testing() + ->widget_input_handler_manager() + ->input_event_queue(); + input_event_queue->HandleEvent( + std::make_unique<WebCoalescedInputEvent>(std::move(event), + ui::LatencyInfo()), + MainThreadEventQueue::DispatchType::kNonBlocking, + mojom::blink::InputEventResultState::kSetNonBlocking, + WebInputEventAttribution(), nullptr, base::DoNothing()); + auto* main_task_runner = static_cast<scheduler::FakeTaskRunner*>( + input_event_queue->main_task_runner_for_testing()); + main_task_runner->RunUntilIdle(); + } + + void CompositeAndWaitForPresentation(SimCompositor& compositor) { + base::RunLoop swap_run_loop; + base::RunLoop presentation_run_loop; + + // Register callbacks for swap and presentation times. + base::TimeTicks swap_time; + NotifySwapAndPresentationTimeForTesting( + base::BindOnce( + [](base::OnceClosure swap_quit_closure, + base::TimeTicks* swap_time, base::TimeTicks timestamp) { + DCHECK(!timestamp.is_null()); + *swap_time = timestamp; + std::move(swap_quit_closure).Run(); + }, + swap_run_loop.QuitClosure(), &swap_time), + base::BindOnce( + [](base::OnceClosure presentation_quit_closure, + base::TimeTicks timestamp) { + DCHECK(!timestamp.is_null()); + std::move(presentation_quit_closure).Run(); + }, + presentation_run_loop.QuitClosure())); + + // Composite and wait for the swap to complete. + compositor.BeginFrame(/*time_delta_in_seconds=*/0.016, /*raster=*/true); + swap_run_loop.Run(); + + // Present and wait for it to complete. + viz::FrameTimingDetails timing_details; + timing_details.presentation_feedback = gfx::PresentationFeedback( + swap_time + base::Milliseconds(2), base::Milliseconds(16), 0); + LastCreatedFrameSink()->NotifyDidPresentCompositorFrame(1, + timing_details); + presentation_run_loop.Run(); + } + + private: + // Whether an update is already requested. Used to avoid calling + // `LayerTreeHost::SetNeedsCommit()` multiple times. + bool update_requested_ = false; + + // Whether handling of the event should end up in an update or not. + bool event_causes_update_ = false; + }; + + TestWebFrameWidget& GetTestWebFrameWidget() { + return static_cast<TestWebFrameWidget&>(GetWebFrameWidget()); + } +}; + +// Verifies that when a non-rAF-aligned event is handled without causing an +// update, swap promises will be broken. +TEST_F(EventHandlingWebFrameWidgetSimTest, NonRafAlignedEventWithoutUpdate) { + TestSwapPromise::State swap_promise_state; + GetTestWebFrameWidget().QueueSwapPromise(&swap_promise_state); + EXPECT_EQ(TestSwapPromise::State::kPending, swap_promise_state); + + GetTestWebFrameWidget().set_event_causes_update(false); + + GetTestWebFrameWidget().SendInputEventAndWaitForDispatch( + std::make_unique<WebKeyboardEvent>()); + EXPECT_EQ(TestSwapPromise::State::kBroken, swap_promise_state); +} + +// Verifies that when a non-rAF-aligned event is handled without causing an +// update while an update is already requested, swap promises won't be broken. +TEST_F(EventHandlingWebFrameWidgetSimTest, + NonRafAlignedEventWithoutUpdateAfterUpdate) { + GetTestWebFrameWidget().RequestUpdateIfNecessary(); + + TestSwapPromise::State swap_promise_state; + GetTestWebFrameWidget().QueueSwapPromise(&swap_promise_state); + EXPECT_EQ(TestSwapPromise::State::kPending, swap_promise_state); + + GetTestWebFrameWidget().set_event_causes_update(false); + + GetTestWebFrameWidget().SendInputEventAndWaitForDispatch( + std::make_unique<WebKeyboardEvent>()); + EXPECT_EQ(TestSwapPromise::State::kPending, swap_promise_state); + + GetTestWebFrameWidget().CompositeAndWaitForPresentation(Compositor()); + EXPECT_EQ(TestSwapPromise::State::kResolved, swap_promise_state); +} + +// Verifies that when a non-rAF-aligned event is handled and causes an update, +// swap promises won't be broken. +TEST_F(EventHandlingWebFrameWidgetSimTest, NonRafAlignedEventWithUpdate) { + TestSwapPromise::State swap_promise_state; + GetTestWebFrameWidget().QueueSwapPromise(&swap_promise_state); + EXPECT_EQ(TestSwapPromise::State::kPending, swap_promise_state); + + GetTestWebFrameWidget().set_event_causes_update(true); + + GetTestWebFrameWidget().SendInputEventAndWaitForDispatch( + std::make_unique<WebKeyboardEvent>()); + EXPECT_EQ(TestSwapPromise::State::kPending, swap_promise_state); + + GetTestWebFrameWidget().CompositeAndWaitForPresentation(Compositor()); + EXPECT_EQ(TestSwapPromise::State::kResolved, swap_promise_state); +} + +// Verifies that when a rAF-aligned event is handled without causing an update, +// swap promises won't be broken. +TEST_F(EventHandlingWebFrameWidgetSimTest, RafAlignedEventWithoutUpdate) { + TestSwapPromise::State swap_promise_state; + GetTestWebFrameWidget().QueueSwapPromise(&swap_promise_state); + EXPECT_EQ(TestSwapPromise::State::kPending, swap_promise_state); + + GetTestWebFrameWidget().set_event_causes_update(false); + + GetTestWebFrameWidget().SendInputEventAndWaitForDispatch( + std::make_unique<WebMouseEvent>(WebInputEvent::Type::kMouseMove, 0, + base::TimeTicks::Now())); + EXPECT_EQ(TestSwapPromise::State::kPending, swap_promise_state); + + GetTestWebFrameWidget().CompositeAndWaitForPresentation(Compositor()); + EXPECT_EQ(TestSwapPromise::State::kResolved, swap_promise_state); +} + +// Verifies that when a rAF-aligned event is handled and causes an update, swap +// promises won't be broken. +TEST_F(EventHandlingWebFrameWidgetSimTest, RafAlignedEventWithUpdate) { + TestSwapPromise::State swap_promise_state; + GetTestWebFrameWidget().QueueSwapPromise(&swap_promise_state); + EXPECT_EQ(TestSwapPromise::State::kPending, swap_promise_state); + + GetTestWebFrameWidget().set_event_causes_update(true); + + GetTestWebFrameWidget().SendInputEventAndWaitForDispatch( + std::make_unique<WebMouseEvent>(WebInputEvent::Type::kMouseMove, 0, + base::TimeTicks::Now())); + EXPECT_EQ(TestSwapPromise::State::kPending, swap_promise_state); + + GetTestWebFrameWidget().CompositeAndWaitForPresentation(Compositor()); + EXPECT_EQ(TestSwapPromise::State::kResolved, swap_promise_state); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc index a97abd67..43c280e 100644 --- a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc +++ b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc
@@ -90,10 +90,10 @@ result = layout_view->OverflowClipRect(PhysicalOffset()); } else if (root->IsBox() && root->IsScrollContainer()) { result = To<LayoutBox>(root)->PhysicalContentBoxRect(); + } else if (root->IsBox()) { + result = To<LayoutBox>(root)->PhysicalBorderBoxRect(); } else { - // TODO(pdr, crbug.com/1020466): BorderBoundingBox is snapped. Should this - // use an unsnapped value such as PhysicalBorderBoxRect? - result = PhysicalRect(To<LayoutBoxModelObject>(root)->BorderBoundingBox()); + result = To<LayoutInline>(root)->PhysicalLinesBoundingBox(); } ApplyMargin(result, margin, root->StyleRef().EffectiveZoom()); return result;
diff --git a/third_party/blink/renderer/core/layout/layout_tree_as_text.cc b/third_party/blink/renderer/core/layout/layout_tree_as_text.cc index 6693529..751d5d5 100644 --- a/third_party/blink/renderer/core/layout/layout_tree_as_text.cc +++ b/third_party/blink/renderer/core/layout/layout_tree_as_text.cc
@@ -669,8 +669,14 @@ layer.GetLayoutObject().StyleRef().GetBlendMode()); } - if ((behavior & kLayoutAsTextShowPaintProperties) && layer.SelfNeedsRepaint()) - ts << " needsRepaint"; + if (behavior & kLayoutAsTextShowPaintProperties) { + if (layer.SelfOrDescendantNeedsRepaint()) + ts << " needsRepaint"; + if (layer.NeedsCullRectUpdate()) + ts << " needsCullRectUpdate"; + if (layer.DescendantNeedsCullRectUpdate()) + ts << " descendantNeedsCullRectUpdate"; + } ts << "\n";
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 68285c59..e160232 100644 --- a/third_party/blink/renderer/core/paint/cull_rect_updater.cc +++ b/third_party/blink/renderer/core/paint/cull_rect_updater.cc
@@ -178,7 +178,8 @@ // different from PaintLayerPaintOrderIterator(kAllChildren) which iterates // children in paint order. for (auto* child = layer.FirstChild(); child; child = child->NextSibling()) { - if (child->GetLayoutObject().IsStacked()) { + if (!child->IsReplacedNormalFlowStacking() && + child->GetLayoutObject().IsStacked()) { // In the above example, during UpdateForDescendants(child), this // forces cull rect update of |stacked-child| which will be updated in // the next loop during UpdateForDescendants(layer). @@ -191,8 +192,10 @@ // Then stacked children (which may not be direct children in PaintLayer // hierarchy) in paint order. PaintLayerPaintOrderIterator iterator(&layer, kStackedChildren); - while (PaintLayer* child = iterator.Next()) - UpdateRecursively(*child, layer, force_update_children); + while (PaintLayer* child = iterator.Next()) { + if (!child->IsReplacedNormalFlowStacking()) + UpdateRecursively(*child, layer, force_update_children); + } } bool CullRectUpdater::UpdateForSelf(PaintLayer& layer,
diff --git a/third_party/blink/renderer/core/paint/cull_rect_updater_test.cc b/third_party/blink/renderer/core/paint/cull_rect_updater_test.cc index 6f3c856..b80f78c 100644 --- a/third_party/blink/renderer/core/paint/cull_rect_updater_test.cc +++ b/third_party/blink/renderer/core/paint/cull_rect_updater_test.cc
@@ -142,4 +142,40 @@ EXPECT_EQ(gfx::Rect(0, 2800, 200, 4200), GetCullRect("child").Rect()); } +TEST_F(CullRectUpdaterTest, SVGForeignObject) { + GetDocument().GetSettings()->SetPreferCompositingToLCDTextEnabled(false); + SetBodyInnerHTML(R"HTML( + <div id="scroller" style="width: 100px; height: 100px; overflow: scroll"> + <svg id="svg" style="width: 100px; height: 4000px"> + <foreignObject id="foreign" style="width: 500px; height: 1000px"> + <div id="child" style="position: relative">Child</div> + </foreignObject> + </svg> + </div> + )HTML"); + + auto* child = GetPaintLayerByElementId("child"); + auto* foreign = GetPaintLayerByElementId("foreign"); + auto* svg = GetPaintLayerByElementId("svg"); + EXPECT_FALSE(child->NeedsCullRectUpdate()); + EXPECT_FALSE(foreign->DescendantNeedsCullRectUpdate()); + EXPECT_FALSE(svg->DescendantNeedsCullRectUpdate()); + + GetDocument().getElementById("scroller")->scrollTo(0, 500); + UpdateAllLifecyclePhasesForTest(); + EXPECT_FALSE(child->NeedsCullRectUpdate()); + EXPECT_FALSE(foreign->DescendantNeedsCullRectUpdate()); + EXPECT_FALSE(svg->DescendantNeedsCullRectUpdate()); + + child->SetNeedsCullRectUpdate(); + EXPECT_TRUE(child->NeedsCullRectUpdate()); + EXPECT_TRUE(foreign->DescendantNeedsCullRectUpdate()); + EXPECT_TRUE(svg->DescendantNeedsCullRectUpdate()); + + UpdateAllLifecyclePhasesForTest(); + EXPECT_FALSE(child->NeedsCullRectUpdate()); + EXPECT_FALSE(foreign->DescendantNeedsCullRectUpdate()); + EXPECT_FALSE(svg->DescendantNeedsCullRectUpdate()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/first_meaningful_paint_detector.cc b/third_party/blink/renderer/core/paint/first_meaningful_paint_detector.cc index c3094bdfed..596672f4 100644 --- a/third_party/blink/renderer/core/paint/first_meaningful_paint_detector.cc +++ b/third_party/blink/renderer/core/paint/first_meaningful_paint_detector.cc
@@ -110,7 +110,9 @@ void FirstMeaningfulPaintDetector::OnNetwork2Quiet() { if (!GetDocument() || network_quiet_reached_ || - paint_timing_->FirstContentfulPaintRendered().is_null()) + paint_timing_ + ->FirstContentfulPaintRenderedButNotPresentedAsMonotonicTime() + .is_null()) return; network_quiet_reached_ = true; @@ -118,8 +120,11 @@ base::TimeTicks first_meaningful_paint_presentation; // Enforce FirstContentfulPaint <= FirstMeaningfulPaint. if (provisional_first_meaningful_paint_ < - paint_timing_->FirstContentfulPaintRendered()) { - first_meaningful_paint_ = paint_timing_->FirstContentfulPaintRendered(); + paint_timing_ + ->FirstContentfulPaintRenderedButNotPresentedAsMonotonicTime()) { + first_meaningful_paint_ = + paint_timing_ + ->FirstContentfulPaintRenderedButNotPresentedAsMonotonicTime(); first_meaningful_paint_presentation = paint_timing_->FirstContentfulPaint(); // It's possible that this timer fires between when the first contentful
diff --git a/third_party/blink/renderer/core/paint/paint_timing.cc b/third_party/blink/renderer/core/paint/paint_timing.cc index b3cf2ab..6c8089f8 100644 --- a/third_party/blink/renderer/core/paint/paint_timing.cc +++ b/third_party/blink/renderer/core/paint/paint_timing.cc
@@ -255,6 +255,8 @@ if (frame->GetFrameScheduler()) frame->GetFrameScheduler()->OnFirstContentfulPaintInMainFrame(); + + NotifyPaintTimingChanged(); } void PaintTiming::RegisterNotifyPresentationTime(PaintEvent event) {
diff --git a/third_party/blink/renderer/core/paint/paint_timing.h b/third_party/blink/renderer/core/paint/paint_timing.h index 5c16cb1..645d8bb 100644 --- a/third_party/blink/renderer/core/paint/paint_timing.h +++ b/third_party/blink/renderer/core/paint/paint_timing.h
@@ -107,6 +107,11 @@ return first_contentful_paint_presentation_; } + base::TimeTicks FirstContentfulPaintRenderedButNotPresentedAsMonotonicTime() + const { + return first_contentful_paint_; + } + // FirstImagePaint returns the first time that image content was painted. base::TimeTicks FirstImagePaint() const { return first_image_paint_presentation_; @@ -197,10 +202,6 @@ base::TimeTicks FirstPaintRendered() const { return first_paint_; } - base::TimeTicks FirstContentfulPaintRendered() const { - return first_contentful_paint_; - } - // TODO(crbug/738235): Non first_*_presentation_ variables are only being // tracked to compute deltas for reporting histograms and should be removed // once we confirm the deltas and discrepancies look reasonable.
diff --git a/third_party/blink/renderer/core/timing/performance_timing.cc b/third_party/blink/renderer/core/timing/performance_timing.cc index ea570453..26dea98 100644 --- a/third_party/blink/renderer/core/timing/performance_timing.cc +++ b/third_party/blink/renderer/core/timing/performance_timing.cc
@@ -393,6 +393,16 @@ return MonotonicTimeToIntegerMilliseconds(timing->FirstContentfulPaint()); } +base::TimeTicks +PerformanceTiming::FirstContentfulPaintRenderedButNotPresentedAsMonotonicTime() + const { + const PaintTiming* timing = GetPaintTiming(); + if (!timing) + return base::TimeTicks(); + + return timing->FirstContentfulPaintRenderedButNotPresentedAsMonotonicTime(); +} + base::TimeTicks PerformanceTiming::FirstContentfulPaintAsMonotonicTime() const { const PaintTiming* timing = GetPaintTiming(); if (!timing)
diff --git a/third_party/blink/renderer/core/timing/performance_timing.h b/third_party/blink/renderer/core/timing/performance_timing.h index 36dda29..9fa74348 100644 --- a/third_party/blink/renderer/core/timing/performance_timing.h +++ b/third_party/blink/renderer/core/timing/performance_timing.h
@@ -112,6 +112,13 @@ uint64_t FirstPaint() const; // The time the first paint operation for image was performed. uint64_t FirstImagePaint() const; + // The first 'contentful' paint as full-resolution monotonic time. This is + // the point at which blink painted the content for FCP; actual FCP is + // recorded as the time the generated content makes it to the screen (also + // known as presentation time). Intended to be used for correlation with other + // events internal to blink. + base::TimeTicks FirstContentfulPaintRenderedButNotPresentedAsMonotonicTime() + const; // The time of the first 'contentful' paint. A contentful paint is a paint // that includes content of some kind (for example, text or image content). uint64_t FirstContentfulPaint() const;
diff --git a/third_party/blink/renderer/modules/sensor/ambient_light_sensor.cc b/third_party/blink/renderer/modules/sensor/ambient_light_sensor.cc index 222488c..92e793d 100644 --- a/third_party/blink/renderer/modules/sensor/ambient_light_sensor.cc +++ b/third_party/blink/renderer/modules/sensor/ambient_light_sensor.cc
@@ -10,20 +10,6 @@ namespace blink { -namespace { - -// Even though the underlying value has changed, for ALS we provide readouts to -// JS to the nearest 50 Lux. -constexpr int kAlsRoundingThreshold = 50; - -// Decrease precision of ALS readouts. -// Round off to the nearest kAlsRoundingThreshold. -double RoundIlluminance(double value) { - return kAlsRoundingThreshold * std::round(value / kAlsRoundingThreshold); -} - -} // namespace - // static AmbientLightSensor* AmbientLightSensor::Create( ExecutionContext* execution_context, @@ -51,7 +37,7 @@ absl::optional<double> AmbientLightSensor::illuminance() const { if (hasReading()) - return RoundIlluminance(GetReading().als.value); + return GetReading().als.value; return absl::nullopt; }
diff --git a/third_party/blink/renderer/platform/loader/fetch/response_body_loader_test.cc b/third_party/blink/renderer/platform/loader/fetch/response_body_loader_test.cc index 621ad4ce..73f09c3 100644 --- a/third_party/blink/renderer/platform/loader/fetch/response_body_loader_test.cc +++ b/third_party/blink/renderer/platform/loader/fetch/response_body_loader_test.cc
@@ -43,15 +43,6 @@ using PublicState = BytesConsumer::PublicState; using Result = BytesConsumer::Result; - static constexpr uint32_t kMaxNumConsumedBytesInTaskForTesting = 512 * 1024; - ResponseBodyLoaderTest() { - base::FieldTrialParams params; - params["loader_chunk_size"] = - base::NumberToString(kMaxNumConsumedBytesInTaskForTesting); - scoped_feature_list_.InitAndEnableFeatureWithParameters( - network::features::kLoaderDataPipeTuningFeature, params); - } - class TestClient final : public GarbageCollected<TestClient>, public ResponseBodyLoaderClient { public: @@ -357,7 +348,7 @@ TEST_F(ResponseBodyLoaderTest, ReadTooBigBuffer) { auto task_runner = base::MakeRefCounted<scheduler::FakeTaskRunner>(); auto* consumer = MakeGarbageCollected<ReplayingBytesConsumer>(task_runner); - constexpr auto kMax = kMaxNumConsumedBytesInTaskForTesting; + const uint32_t kMax = network::features::GetLoaderChunkSize(); consumer->Add(Command(Command::kData, std::string(kMax - 1, 'a').data())); consumer->Add(Command(Command::kData, std::string(2, 'b').data()));
diff --git a/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc b/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc index ed4af127..ff31541 100644 --- a/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc +++ b/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc
@@ -24,6 +24,7 @@ #include "base/values.h" #include "cc/animation/animation_host.h" #include "cc/animation/animation_timeline.h" +#include "cc/base/features.h" #include "cc/base/region.h" #include "cc/benchmarks/micro_benchmark.h" #include "cc/debug/layer_tree_debug_state.h" @@ -279,6 +280,10 @@ if (!delegate_) return; delegate_->WillCommitCompositorFrame(); + if (base::FeatureList::IsEnabled(features::kNonBlockingCommit)) { + if (web_main_thread_scheduler_) + web_main_thread_scheduler_->DidCommitFrameToCompositor(); + } } void LayerTreeView::DidCommit(base::TimeTicks commit_start_time, @@ -286,8 +291,10 @@ if (!delegate_) return; delegate_->DidCommitCompositorFrame(commit_start_time, commit_finish_time); - if (web_main_thread_scheduler_) - web_main_thread_scheduler_->DidCommitFrameToCompositor(); + if (!base::FeatureList::IsEnabled(features::kNonBlockingCommit)) { + if (web_main_thread_scheduler_) + web_main_thread_scheduler_->DidCommitFrameToCompositor(); + } } void LayerTreeView::DidCommitAndDrawFrame() {
diff --git a/third_party/blink/renderer/platform/widget/input/main_thread_event_queue.h b/third_party/blink/renderer/platform/widget/input/main_thread_event_queue.h index 36d36b8..e6309de 100644 --- a/third_party/blink/renderer/platform/widget/input/main_thread_event_queue.h +++ b/third_party/blink/renderer/platform/widget/input/main_thread_event_queue.h
@@ -138,6 +138,10 @@ mojom::blink::InputEventResultState::kSetNonBlockingDueToFling; } + base::SingleThreadTaskRunner* main_task_runner_for_testing() const { + return main_task_runner_.get(); + } + protected: friend class base::RefCountedThreadSafe<MainThreadEventQueue>; virtual ~MainThreadEventQueue();
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests index 82249b13..3f310bd 100644 --- a/third_party/blink/web_tests/NeverFixTests +++ b/third_party/blink/web_tests/NeverFixTests
@@ -1756,11 +1756,6 @@ # Windows doesn't have native overlay scrollbar [ Win ] virtual/overlay-scrollbar/* [ Skip ] -# Blink implements additional privacy measures that cause the regular test in -# WPT to time out. -# There is a version in wpt_internal that performs the same checks but works -# as expected. -external/wpt/ambient-light/AmbientLightSensor.https.html [ Skip ] crbug.com/626703 [ Linux ] external/wpt/payment-method-basic-card/billing-address-is-null-manual.https.html [ Skip ] crbug.com/626703 [ Mac ] external/wpt/payment-method-basic-card/billing-address-is-null-manual.https.html [ Skip ] crbug.com/626703 [ Win ] external/wpt/payment-method-basic-card/billing-address-is-null-manual.https.html [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 9275f08a..8ee428c7 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -127,7 +127,7 @@ # Fails flakily or times out crbug.com/1255285 virtual/threaded/transitions/transition-currentcolor.html [ Failure Pass ] crbug.com/1255285 virtual/threaded/transitions/transition-ends-before-animation-frame.html [ Timeout ] -crbug.com/1269536 svg/animations/dynamic-modify-transform-without-baseval.html [ Failure Pass ] +crbug.com/1269536 svg/animations/dynamic-modify-transform-without-baseval.html [ Failure Pass Timeout ] # Unknown media state flakiness (likely due to layout occuring earlier than expected): crbug.com/1254945 external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-candidate-insert-before.html [ Failure Pass ] @@ -2817,8 +2817,408 @@ crbug.com/626703 [ Mac ] external/wpt/css/css-ruby/ruby-autohide-004.html [ Failure ] crbug.com/626703 [ Mac ] external/wpt/css/css-text/line-breaking/segment-break-transformation-rules-009.html [ Failure ] crbug.com/626703 [ Mac ] external/wpt/css/css-text/line-breaking/segment-break-transformation-rules-015.html [ Failure ] +crbug.com/626703 [ Fuchsia ] external/wpt/dom/historical.html [ Skip ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 [ Linux ] external/wpt/css/css-color/color-contrast-001.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-color/color-contrast-001.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-color/color-contrast-001.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-color/color-contrast-001.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-color/color-contrast-001.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-color/color-contrast-001.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-color/color-contrast-001.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-color/color-mix-non-srgb-001.html [ Crash Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-color/color-mix-non-srgb-001.html [ Crash Failure ] +crbug.com/626703 [ Mac11-arm64 ] external/wpt/css/css-color/parsing/relative-color-computed.html [ Crash Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-color-property-001.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-color-property-001a.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-color-property-001a.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-color-property-001a.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-color-property-001a.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-color-property-001a.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-color-property-001a.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-color-property-001a.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-color-property-001b.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-color-property-002.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-color-property-002.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-color-property-002.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-color-property-002.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-color-property-002.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-color-property-002.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-color-property-002.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-line-height-001a.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-line-height-001a.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-line-height-001a.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-line-height-001a.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-line-height-001a.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-line-height-001a.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-line-height-001a.html [ Failure ] +crbug.com/626703 [ Mac11-arm64 ] external/wpt/css/css-text-decor/text-emphasis-line-height-001a.html [ Crash Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-line-height-001b.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-line-height-001b.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-line-height-001b.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-line-height-001b.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-line-height-001b.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-line-height-001b.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-line-height-001b.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-line-height-001z.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-line-height-002a.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-line-height-002b.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-line-height-003a.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-line-height-003a.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-line-height-003a.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-line-height-003a.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-line-height-003a.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-line-height-003a.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-line-height-003a.html [ Timeout Failure ] +crbug.com/626703 [ Mac11-arm64 ] external/wpt/css/css-text-decor/text-emphasis-line-height-003a.html [ Crash Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-line-height-003b.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-line-height-003c.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-line-height-003c.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-line-height-003c.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-line-height-003c.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-line-height-003c.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-line-height-003c.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-line-height-003c.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-line-height-003d.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-line-height-004a.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-line-height-004b.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-line-height-004c.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-line-height-004d.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-line-height-004d.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-line-height-004d.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-line-height-004d.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-line-height-004d.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-line-height-004d.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-line-height-004d.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-position-property-001.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-position-property-001.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-position-property-001.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-position-property-001.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-position-property-001.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-position-property-001.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-position-property-001.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-001a.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-position-property-001b.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-position-property-001b.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-position-property-001b.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-position-property-001b.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-position-property-001b.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-position-property-001b.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-position-property-001b.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-001c.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-position-property-002.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-position-property-002.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-position-property-002.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-position-property-002.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-position-property-002.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-position-property-002.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-position-property-002.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-position-property-002a.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-position-property-002a.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-position-property-002a.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-position-property-002a.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-position-property-002a.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-position-property-002a.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-position-property-002a.html [ Failure ] +crbug.com/626703 [ Mac11-arm64 ] external/wpt/css/css-text-decor/text-emphasis-position-property-002a.html [ Crash Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-002b.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-002c.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-position-property-003.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-position-property-003.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-position-property-003.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-position-property-003.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-position-property-003.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-position-property-003.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-position-property-003.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-003a.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-003b.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-position-property-003c.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-position-property-003c.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-position-property-003c.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-position-property-003c.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-position-property-003c.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-position-property-003c.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-position-property-003c.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-003d.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-003e.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-003f.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-003g.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-004.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-004a.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-004b.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-004c.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-004d.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-004e.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-004f.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-004g.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-position-property-005.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-position-property-005.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-005a.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-position-property-005b.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005b.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005b.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005b.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005b.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005b.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-position-property-005b.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-005c.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-position-property-005d.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005d.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005d.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005d.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005d.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005d.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-position-property-005d.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-position-property-005e.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005e.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005e.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005e.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005e.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005e.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-position-property-005e.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-position-property-005f.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005f.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005f.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005f.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005f.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005f.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-position-property-005f.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-position-property-005g.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005g.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005g.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005g.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005g.html [ Failure ] +crbug.com/626703 [ Mac11-arm64 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005g.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-position-property-005g.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-position-property-005g.html [ Crash Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-006.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-position-property-006a.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006a.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006a.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006a.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006a.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006a.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-position-property-006a.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-position-property-006b.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006b.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006b.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006b.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006b.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006b.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-position-property-006b.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-position-property-006c.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006c.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006c.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006c.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006c.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006c.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-position-property-006c.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-006d.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-position-property-006e.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-position-property-006f.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006f.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006f.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006f.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006f.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006f.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-position-property-006f.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-position-property-006g.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006g.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006g.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006g.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006g.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-position-property-006g.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-position-property-006g.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-property-002.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-property-003.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-property-003.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-property-003.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-property-003.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-property-003.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-property-003.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-property-003.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-property-003a.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-property-003a.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-property-003a.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-property-003a.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-property-003a.html [ Failure ] +crbug.com/626703 [ Mac11-arm64 ] external/wpt/css/css-text-decor/text-emphasis-property-003a.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-property-003a.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-property-003a.html [ Crash Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-property-003b.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-property-004.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-property-004a.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-property-004a.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-property-004a.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-property-004a.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-property-004a.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-property-004a.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-property-004a.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-ruby-001.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-ruby-002.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-ruby-003.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-ruby-003a.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-ruby-004.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-ruby-004a.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-style-property-002.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-style-property-002.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-style-property-002.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-style-property-002.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-style-property-002.html [ Failure ] +crbug.com/626703 [ Mac11-arm64 ] external/wpt/css/css-text-decor/text-emphasis-style-property-002.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-style-property-002.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-style-property-002.html [ Crash Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-003.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-004.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-style-property-005.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-style-property-005.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-style-property-005.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-style-property-005.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-style-property-005.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-style-property-005.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-style-property-005.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-005a.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-011.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-style-property-011a.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-style-property-011a.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-style-property-011a.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-style-property-011a.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-style-property-011a.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-style-property-011a.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-style-property-011a.html [ Failure ] +crbug.com/626703 [ Mac11-arm64 ] external/wpt/css/css-text-decor/text-emphasis-style-property-011a.html [ Crash Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-011b.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-012.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-style-property-012a.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-style-property-012a.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-style-property-012a.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-style-property-012a.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-style-property-012a.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-style-property-012a.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-style-property-012a.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-012b.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-012c.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-style-property-013.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-style-property-013.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-style-property-013.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-style-property-013.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-style-property-013.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-style-property-013.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-style-property-013.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-style-property-013a.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-style-property-013a.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-style-property-013a.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-style-property-013a.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-style-property-013a.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-style-property-013a.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-style-property-013a.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-style-property-013b.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-style-property-013b.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-style-property-013b.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-style-property-013b.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-style-property-013b.html [ Failure ] +crbug.com/626703 [ Mac11-arm64 ] external/wpt/css/css-text-decor/text-emphasis-style-property-013b.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-style-property-013b.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-style-property-013b.html [ Crash Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-014.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-style-property-014a.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-style-property-014a.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-style-property-014a.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-style-property-014a.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-style-property-014a.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-style-property-014a.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-style-property-014a.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-style-property-014b.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-style-property-014b.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-style-property-014b.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-style-property-014b.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-style-property-014b.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-style-property-014b.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-style-property-014b.html [ Failure ] +crbug.com/626703 [ Mac11-arm64 ] external/wpt/css/css-text-decor/text-emphasis-style-property-014b.html [ Crash Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-015.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-style-property-015a.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-style-property-015a.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-style-property-015a.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-style-property-015a.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-style-property-015a.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-style-property-015a.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-style-property-015a.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-015b.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-style-property-016.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-style-property-016.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-style-property-016.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-style-property-016.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-style-property-016.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-style-property-016.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-style-property-016.html [ Failure ] +crbug.com/626703 [ Mac11-arm64 ] external/wpt/css/css-text-decor/text-emphasis-style-property-016.html [ Crash Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-style-property-016a.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-style-property-016a.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-style-property-016a.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-style-property-016a.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-style-property-016a.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-style-property-016a.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-style-property-016a.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-017.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-style-property-017a.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-style-property-017a.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-style-property-017a.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-style-property-017a.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-style-property-017a.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-style-property-017a.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-style-property-017a.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-017b.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-018.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-018a.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-emphasis-style-property-019.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-emphasis-style-property-019.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-emphasis-style-property-019.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-emphasis-style-property-019.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-emphasis-style-property-019.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-emphasis-style-property-019.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-emphasis-style-property-019.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-019a.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-020.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-emphasis-style-property-020a.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-shadow/decorations-multiple-zorder.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-shadow/decorations-multiple-zorder.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-shadow/decorations-multiple-zorder.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-shadow/decorations-multiple-zorder.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-shadow/decorations-multiple-zorder.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-shadow/decorations-multiple-zorder.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-shadow/decorations-multiple-zorder.html [ Failure ] +crbug.com/626703 [ Mac11-arm64 ] external/wpt/css/css-text-decor/text-shadow/decorations-multiple-zorder.html [ Crash Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/css-text-decor/text-shadow/quirks-decor-noblur.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-text-decor/text-shadow/quirks-decor-noblur.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-text-decor/text-shadow/quirks-decor-noblur.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-text-decor/text-shadow/quirks-decor-noblur.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-text-decor/text-shadow/quirks-decor-noblur.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/css/css-text-decor/text-shadow/quirks-decor-noblur.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-shadow/quirks-decor-noblur.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text-decor/text-shadow/standards-decor-noblur.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-007.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-007.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-007.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-007.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-007.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-007.html [ Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-007.html [ Crash Failure ] +crbug.com/626703 [ Mac11 ] external/wpt/web-locks/signal.tentative.https.any.html [ Crash Failure ] +crbug.com/626703 [ Linux ] virtual/system-color-compute/external/wpt/css/css-color/color-contrast-001.html [ Failure ] +crbug.com/626703 [ Mac10.12 ] virtual/system-color-compute/external/wpt/css/css-color/color-contrast-001.html [ Failure ] +crbug.com/626703 [ Mac10.13 ] virtual/system-color-compute/external/wpt/css/css-color/color-contrast-001.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] virtual/system-color-compute/external/wpt/css/css-color/color-contrast-001.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] virtual/system-color-compute/external/wpt/css/css-color/color-contrast-001.html [ Failure ] +crbug.com/626703 [ Mac11 ] virtual/system-color-compute/external/wpt/css/css-color/color-contrast-001.html [ Failure ] +crbug.com/626703 [ Win ] virtual/system-color-compute/external/wpt/css/css-color/color-contrast-001.html [ Failure ] +crbug.com/626703 [ Mac11-arm64 ] virtual/system-color-compute/external/wpt/css/css-color/parsing/relative-color-valid.html [ Crash Failure ] crbug.com/626703 [ Mac11-arm64 ] external/wpt/css/css-color/oklab-001.html [ Failure ] crbug.com/626703 [ Mac11-arm64 ] external/wpt/css/css-color/oklab-006.html [ Failure ] crbug.com/626703 [ Mac11-arm64 ] external/wpt/css/css-color/oklab-007.html [ Failure ]
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 452fd866..2a1bac83 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
@@ -13499,6 +13499,13 @@ ] }, "web-nfc": { + "NDEFReader-make-read-only-document-hidden-manual.https.html": [ + "25cefcbca725ce97cd3ac374b9d1c7c757c2f6b9", + [ + null, + {} + ] + ], "NDEFReader-read-document-hidden-manual.https.html": [ "47c1332713eef2069820a2149a79dd667e6a62ad", [ @@ -79777,6 +79784,32 @@ ], {} ] + ], + "grid-item-fragmentation-037.html": [ + "d5d97394c574b092a5672dc4fa8c1c9013ee0493", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "grid-item-fragmentation-038.html": [ + "40008b5dcd645035f207a95b9a71c1c852193ecf", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] ] }, "ink-overflow-002.html": [ @@ -82448,6 +82481,19 @@ {} ] ], + "color-contrast-001.html": [ + "d2fd196a33a338c08cba1445a4e44a8809dad9ad", + [ + null, + [ + [ + "/css/css-color/greensquare-ref.html", + "==" + ] + ], + {} + ] + ], "composited-filters-under-opacity.html": [ "f613748af3ac5bb59c9fa207937ae6207d71062e", [ @@ -83047,7 +83093,7 @@ ] ], "oklab-001.html": [ - "295c24c88c1648e1d997f4d551ae63d52e0dfe67", + "835a8ca4a91d52322af1d51bf6dae0d6a8968009", [ null, [ @@ -83060,7 +83106,7 @@ ] ], "oklab-002.html": [ - "049e403c1d5ca1efe0c87dac1963983f755bf8fc", + "4ddf4d9e7e6e07b41a162846d65127a54ec5e0d2", [ null, [ @@ -83073,7 +83119,7 @@ ] ], "oklab-003.html": [ - "9da9bbc7f9cdf45eccf9cbd5117868f2072b3dcd", + "38c921e31ac0893c14892fc57906e1120653cac0", [ null, [ @@ -83086,7 +83132,7 @@ ] ], "oklab-004.html": [ - "d9456d720e967a596523c85c19d3801a674c1c7d", + "c403f244f94495543f82899018bdbb89481a2464", [ null, [ @@ -83099,7 +83145,7 @@ ] ], "oklab-005.html": [ - "f3d39dfe2466b541947ea7c9ae7ff2bdbd728c8d", + "0738d21017b2007bfa7e64cdf22573c2ae5f4974", [ null, [ @@ -83112,7 +83158,7 @@ ] ], "oklab-006.html": [ - "9e8845c47db473682141b36a215cb3d4a1d1b003", + "2a918ecbda58cf2ee05664a4e53da7809b3ef754", [ null, [ @@ -83125,7 +83171,7 @@ ] ], "oklab-007.html": [ - "5580ede5b4a87981b9798bbcf28e75b935a5acf1", + "5fdf0ab15b4edadf3abd0e778c04fb8bff0e9b29", [ null, [ @@ -83138,7 +83184,7 @@ ] ], "oklab-008.html": [ - "19a165da200b83a391b75f16efc97aa57c1451af", + "be8b4ae596c584ba0f17d07962387f40c72d5f1e", [ null, [ @@ -83151,7 +83197,7 @@ ] ], "oklch-001.html": [ - "81d187c784ab6732bc4c0e3452504c9089129946", + "f32b7fe888b304576790175a0f7e6b5bbe45b354", [ null, [ @@ -83164,7 +83210,7 @@ ] ], "oklch-002.html": [ - "64b09b559810282d82455055e1e174491b86801a", + "5c456319db6e3ee1c19f0d7db7a579853c65428b", [ null, [ @@ -83177,7 +83223,7 @@ ] ], "oklch-003.html": [ - "8d8396309c9f23658a4114a80fb31990f7ad100b", + "abfaff1d793fe203fd61f22e9041151b3fb44b0f", [ null, [ @@ -83190,7 +83236,7 @@ ] ], "oklch-004.html": [ - "35d9e6af50700caa4216a72ac481c9e521621751", + "c5fc4d09c982a170ebc175ad8df778f1824f6641", [ null, [ @@ -83203,7 +83249,7 @@ ] ], "oklch-005.html": [ - "4f935bbb9e92ae76d9c087643df92cf3ac640fa0", + "0c7623315ce0ff5dc7b2549f042eb50d91a4b895", [ null, [ @@ -83216,7 +83262,7 @@ ] ], "oklch-006.html": [ - "95aea6fdbc2ac8b2ef0447509ea1a2c25c1313ff", + "dc0193e52d5ee6ea086d3b659290298e2d319149", [ null, [ @@ -83229,7 +83275,7 @@ ] ], "oklch-007.html": [ - "1cd9b97ceef99205803513a959231edcadead656", + "3ff21b25e51c78abe9c60de3e8c1260c1b4e49fe", [ null, [ @@ -83242,7 +83288,7 @@ ] ], "oklch-008.html": [ - "fef6ffa31d81b4137fce7ddeaecd0cc9c513ab5e", + "baa7c5c372540977d536abffa29fc8086a4e2f57", [ null, [ @@ -83268,7 +83314,7 @@ ] ], "predefined-001.html": [ - "ea8bd693f22dcb80323681da1eebcf936c6ceae5", + "dff6bd9a11130b4972d5d283d96fb6bc793f5dd2", [ null, [ @@ -83281,7 +83327,7 @@ ] ], "predefined-002.html": [ - "a6f9a1b013421582e0ac4b6a15166c5321316510", + "9ed4b392d1ee7a92cb0afea734d741382e8763f4", [ null, [ @@ -83294,7 +83340,7 @@ ] ], "predefined-005.html": [ - "99b611c063eb878aadaa1adfa788fc506a52a46c", + "02eb39ffffb69a6626492aa8df1be7e72b5db175", [ null, [ @@ -83307,7 +83353,7 @@ ] ], "predefined-006.html": [ - "998865e13a7f732933063915a4efb06675a6e497", + "bfbccbcb14b6d2c2d0e7b7f7f0b34489e9c374bb", [ null, [ @@ -148341,6 +148387,19 @@ {} ] ], + "block-aspect-ratio-036.html": [ + "e264646c107822a14794c22ef30de378fcd8f37b", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "block-aspect-ratio-with-margin-collapsing-001.html": [ "78a0418fe285da58030cdd863460add0533e6af5", [ @@ -169861,6 +169920,227 @@ {} ] ], + "text-emphasis-color-property-001.html": [ + "347d2df95c4f06a8e10e40509d6710122def6f76", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-color-property-001-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-color-property-001a.html": [ + "f4984d9a286dd63e226ef74c41cec55c04490a29", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-color-property-001-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-color-property-001b.html": [ + "a2bf1ca7ec2ae1c37cdfd7a582b4f5bd192ad4da", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-color-property-001-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-color-property-002.html": [ + "9d6419b3bbd256da41ea97d66187d70b5812f311", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-color-property-002-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-line-height-001a.html": [ + "ea9589516dc4888f6746e614811c69cafb724d0b", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-line-height-001-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-line-height-001b.html": [ + "d6468cb6c9cd39189b277d344c02e1a6e32be27c", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-line-height-001-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-line-height-001z.html": [ + "dded6094e35b8b793d648a55be09b44e0bb60b61", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-line-height-001-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-line-height-002a.html": [ + "f4a47467a155de18f2124008ddf52ce305d4a851", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-line-height-002-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-line-height-002b.html": [ + "28a14cf4792bbe9aae67438980773da481430df2", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-line-height-002-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-line-height-003a.html": [ + "2b0684a78d10cbc002d75c392f89fea995205521", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-line-height-003-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-line-height-003b.html": [ + "a8a6e1f6c1d1c92d8062327be7edf410abf4a010", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-line-height-003-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-line-height-003c.html": [ + "35589cb8d7b2b3ce4fb4840da19a3fc00f0076e0", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-line-height-003-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-line-height-003d.html": [ + "b02990774e23f3d0f0d95c10ddc5a35d088353b3", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-line-height-003-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-line-height-004a.html": [ + "e8922e97d2a3ecf55ce752774ef1140b61c4a985", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-line-height-004-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-line-height-004b.html": [ + "f6ad46dec4261566ee2bb19f501e6dc217a40fc4", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-line-height-004-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-line-height-004c.html": [ + "d572de3f18b9ba0fe2f4dc49c895304d909e0f66", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-line-height-004-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-line-height-004d.html": [ + "3010b9510eb5442c71eb7176a254bf7d8fee12e7", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-line-height-004-ref.html", + "==" + ] + ], + {} + ] + ], "text-emphasis-position-over-left-001.xht": [ "94a2a8c3db16072b4d9c1de0de6b1a1807c774b9", [ @@ -169913,6 +170193,526 @@ {} ] ], + "text-emphasis-position-property-001.html": [ + "c6d6c94b4467be165e883344ff1755d28ae9de1f", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-001-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-001a.html": [ + "8f7f4025d76022ccc15b711863ab54fa33d197c2", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-001-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-001b.html": [ + "de111ddd1677d0235a0e8f9c45a933967b51418d", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-001-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-001c.html": [ + "2b15c1602c4c7034d56f6023a4de0aaafcbf8ee5", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-001-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-002.html": [ + "3b4bba33c87dfb80f2e3c959a9d133f735a4ddae", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-002-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-002a.html": [ + "705830656477727dc68c508be9fcd68c0c0de6e0", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-002-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-002b.html": [ + "d444e50fc02ae98359457bee80d0a871c53cdaad", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-002-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-002c.html": [ + "ef23120d897d6ed6dd1e1275d3af37fa248846e0", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-002-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-003.html": [ + "ea43b14eb7216aed9db91bfba78460c8bf6a020b", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-003-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-003a.html": [ + "5ab81b99eba8e7b6810cb5fb0534ec5155f9d926", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-003-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-003b.html": [ + "7737205212e528554b3eadfcb40c19a4a456ade5", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-003-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-003c.html": [ + "0420d8fe0bc71591b118a5b59b2e77042e6a2985", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-003-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-003d.html": [ + "a87b6e83a2227a55fbdf083e32bf58a14045b272", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-003-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-003e.html": [ + "69c2ba26a6540414008a7616412ca2f10b74bc64", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-003-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-003f.html": [ + "85124d7810b64ad77580ff7d92ce9912a8476591", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-003-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-003g.html": [ + "8de092468aaad3701987d6ff17a55e6278d0ebf3", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-003-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-004.html": [ + "dcde40b1e01f5ff65562d0d6fbc10435985933cc", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-004-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-004a.html": [ + "cdee90a84b70dba9e1aed57b8dfd20ba863d9600", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-004-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-004b.html": [ + "fe6685e2aa6096d0b79c1d1e2597502a161e10f9", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-004-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-004c.html": [ + "6771741ca7e3510206eeb113ecbc0b2eea6bc1f4", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-004-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-004d.html": [ + "60b326030368784eab83dd734fd4fc97068462d0", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-004-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-004e.html": [ + "f1c22571f7290bbdd6b773f70de38297945ab2ef", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-004-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-004f.html": [ + "0d808df8317c181dd2f4506d5b748a7f05d05041", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-004-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-004g.html": [ + "607455d497c14dfa3a2a5fab4e1b4536cf91d974", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-004-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-005.html": [ + "c6578def6cd9f4408ebe8e3332fdf686658ab3ad", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-005-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-005a.html": [ + "b67216ff796a6c68074cb4f26498480643b4ac55", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-005-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-005b.html": [ + "87f3c674609a3b6c29f647a4e182dcc52bd57313", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-005-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-005c.html": [ + "9572d0ef2f71bb58ae6cd8fc8298a316baaed2a7", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-005-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-005d.html": [ + "730ffafe41ca21aad7c606bd3f1894047d479d1b", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-005-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-005e.html": [ + "a359c24be5f6eb902e3edd05fd24318bd8a5a1f7", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-005-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-005f.html": [ + "d9cb51a48e1dab3b61d08ac684fc5bf47ec13a84", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-005-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-005g.html": [ + "f6698110d50736a4b44298acd9df6dae68c4f2f6", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-005-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-006.html": [ + "d0f018b73fc75b9a209ebae9522191d5d3f67c91", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-006-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-006a.html": [ + "c1907197551f588db454303d7f3077092b575712", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-006-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-006b.html": [ + "769f8be30e14109ef29a79b9cb510b563b87a218", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-006-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-006c.html": [ + "be9a4f0d29efdc88912709f779ee0df306999807", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-006-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-006d.html": [ + "c60768aa35868bbd841cffc6ad13f847fc9ad7cc", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-006-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-006e.html": [ + "cdc57bad01ef9d4f8fe2ba9ea1c0a3bdb3b12acc", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-006-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-006f.html": [ + "103926cb3bb09edae2446cc8c4caa7e84cd241ac", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-006-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-position-property-006g.html": [ + "1660104a256d11aadbba48b446351d8c1e17ed27", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-position-property-006-ref.html", + "==" + ] + ], + {} + ] + ], "text-emphasis-position-under-left-001.xht": [ "84b779b9fcce512961183373e622324257554893", [ @@ -169965,6 +170765,175 @@ {} ] ], + "text-emphasis-property-001.html": [ + "e208adc8242ddb52a2d816bb57f4e3b14be409a9", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-001-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-property-002.html": [ + "0048f4fd141815584d11c3c2f4dc2a24011181e5", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-002-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-property-003.html": [ + "cc564df57cea28feeedc82a1b1a9f21c22e5867f", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-012-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-property-003a.html": [ + "313cf0ee17668ab456b57b1393279ea158ae9b30", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-012-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-property-003b.html": [ + "c90d455126d591bbd5b12b956cd32e6b61d13152", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-012-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-property-004.html": [ + "6af2210d22d35e7a785e2543577837a25e4d8c1b", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-color-property-002-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-property-004a.html": [ + "23039ae6ced526c64ac14edcf2e62d13f87c241f", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-color-property-002-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-ruby-001.html": [ + "03f562bc8db13c7a6ade9724878c937cded47837", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-ruby-001-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-ruby-002.html": [ + "c43a2a6d11206781c1f6cd1c01eae93786d685e0", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-ruby-002-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-ruby-003.html": [ + "2ac104077d19fda1c12fd616668b7477fce5eb7d", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-ruby-003-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-ruby-003a.html": [ + "6d49877fddf1dd952933cca15feea753b23684de", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-ruby-003-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-ruby-004.html": [ + "d32dcb55cefc1c605b9d45b5c6823d24d842d500", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-ruby-004-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-ruby-004a.html": [ + "75146654054430e2c9921f58211d21895d0bbf0f", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-ruby-004-ref.html", + "==" + ] + ], + {} + ] + ], "text-emphasis-style-001.html": [ "d2a7b0f97eb23f95ef8200c7967e6e0c3e506555", [ @@ -170108,6 +171077,513 @@ {} ] ], + "text-emphasis-style-property-001.html": [ + "e2bc386afd6b94f5d3732d8093d21d8ab391cee6", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-001-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-002.html": [ + "20162842a84304a4f4c892d94d2ec6f657ba70e5", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-002-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-003.html": [ + "4bfcffffa2e0d739c3040593e9d035f041c5474e", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-003-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-004.html": [ + "360b0357c2445905c383c22ce5721634b2ee4961", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-004-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-005.html": [ + "fc8ae4e46135af345f4fc4aef5d8b37733be8046", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-005-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-005a.html": [ + "3ea24ba611a408c05a3a8bfa896bff097dc3ac45", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-005-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-010Cc.html": [ + "0cb335773140701956d50ec88f7a20a7bea19ed1", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-010-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-010Cf.html": [ + "9bc696adeb67efec7e108c9594134a60c24668bf", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-010-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-010Cn.html": [ + "90f583df33a9cd5e0bc258dd91b316c561a3e3a0", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-010-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-010Zl.html": [ + "6884553d26893146b4653487cfdd34be5a95bf86", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-010-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-010Zp.html": [ + "e46f3f80ef78061682ba63317b4a13c5716c434a", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-010-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-010Zs.html": [ + "f00874cecd25baf6e8a28128c4e0856fbfc34c4b", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-010-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-011.html": [ + "91be2c00168969f7dc987d0ef4a374bd63c328f6", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-011-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-011a.html": [ + "1d7b6e31c0f937be232ab9a679b623348e0e47d9", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-011-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-011b.html": [ + "bec775b77349953346ffbe4b902fb2a128513532", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-011-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-012.html": [ + "5e1362f7595521f156e073367749577d579c57d2", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-012-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-012a.html": [ + "83e8d79c8f217d5c6fec6fa40f25ae33c1e43ac6", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-012-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-012b.html": [ + "df71056457be0d642697780c8aa381dedfd64cbc", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-012-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-012c.html": [ + "552b62bf7f37ab9e12e3038eea337d41bbad5a04", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-012-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-013.html": [ + "39d2c6325f8a49afc9d9a147adac2525d83bf94f", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-013-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-013a.html": [ + "0ac4b83537066855d5134355d9812e146e3bcc96", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-013-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-013b.html": [ + "25768be05d64e5878cab8e733a6b52c3fa821564", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-013-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-014.html": [ + "2e3c69dd09c7c9efc6237a3f94f291fbc8ed1ba0", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-014-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-014a.html": [ + "9fa3f14a40e72c1d8cdae8478506705db23c7754", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-014-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-014b.html": [ + "fd5db557166bb9b3ca0ebf48cc7e92e83cc02a65", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-014-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-015.html": [ + "9b11e53e8d838bf7fbb36f5d173cd0db048b652b", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-015-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-015a.html": [ + "e8b3c73bba3f2ef4efed129a203cb8766134adc6", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-015-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-015b.html": [ + "dcc30c0cf9aefd222704ead2cc4e381115dcf780", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-015-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-016.html": [ + "e8303756753af2e625be614d044ffdab6dc39a32", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-016-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-016a.html": [ + "eb7be9a602cda6d937e148b10c7cca7df25c86b3", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-016-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-017.html": [ + "1d778a8af5e7f9ec4b0c5c42274f37b76dbb92e5", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-017-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-017a.html": [ + "8e1b0b2859fc39fbe8db37f61fe442c69f3a53d3", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-017-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-017b.html": [ + "e6b75fdc883923a2f4e8b24b733577a0ea12aa5d", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-017-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-018.html": [ + "6fe162d67a9ef36092fa9076c1a104a475c76ab8", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-018-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-018a.html": [ + "44c0cb7bb6fa4b89e532cb0a3ba1abe7152fd4b5", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-018-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-019.html": [ + "8014ceccb2dc7e0a073229cbb15ada20a894e842", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-019-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-019a.html": [ + "7e79b41d82266b0a3725c8baf18cb79f9203851f", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-019-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-020.html": [ + "e77c3173d2cd63cac32015ed0be97a3b493b8686", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-020-ref.html", + "==" + ] + ], + {} + ] + ], + "text-emphasis-style-property-020a.html": [ + "19a9059e2fa69ef8a61597d633a364fcb3b8f203", + [ + null, + [ + [ + "/css/css-text-decor/text-emphasis-style-property-020-ref.html", + "==" + ] + ], + {} + ] + ], "text-emphasis-style-shape-001.xht": [ "dd9b71edc595248209a30dc102a6b998b7953c18", [ @@ -170134,19 +171610,233 @@ {} ] ], - "text-shadow-currentcolor.html": [ - "6e8bb20df961a7ab1e9dac48757402e1133e67e5", - [ - null, + "text-shadow": { + "basic-negcoord.html": [ + "1e29b42f733ff7b2f76f4dd20a34d9a3528cb84d", [ + null, [ - "/css/css-text-decor/reference/text-shadow-currentcolor-ref.html", - "==" - ] - ], - {} + [ + "/css/css-text-decor/text-shadow/basic-negcoord-ref.html", + "==" + ] + ], + {} + ] + ], + "basic-opacity.html": [ + "a8cea6ad0e64d4e2e185d45c9a49262d33e59da0", + [ + null, + [ + [ + "/css/css-text-decor/text-shadow/basic-opacity-ref.html", + "==" + ] + ], + {} + ] + ], + "basic.html": [ + "fc470ea6d0356702f593699cf7019be11bff11d7", + [ + null, + [ + [ + "/css/css-text-decor/text-shadow/basic-ref.html", + "==" + ] + ], + {} + ] + ], + "blur.html": [ + "f6dd3cff8b6678b5aab74281d95272269adfd857", + [ + null, + [ + [ + "/css/css-text-decor/text-shadow/blur-notref.html", + "!=" + ] + ], + {} + ] + ], + "color-inherit.html": [ + "abb2cffd0ac24796c06b7225dc94528f7d6efd72", + [ + null, + [ + [ + "/css/css-text-decor/text-shadow/color-inherit-ref.html", + "==" + ] + ], + {} + ] + ], + "color-parserorder.html": [ + "829383bf9cbd0411478fdcbe108bc83b4b6e14ee", + [ + null, + [ + [ + "/css/css-text-decor/text-shadow/color-parserorder-ref.html", + "==" + ] + ], + {} + ] + ], + "currentcolor.html": [ + "0bed94895521c0bdc6ae92cbc234c21806200238", + [ + null, + [ + [ + "/css/css-text-decor/text-shadow/currentcolor-ref.html", + "==" + ] + ], + {} + ] + ], + "decorations-multiple-zorder.html": [ + "22406534b689e1ee810a4ad3eb5e41a86f93e088", + [ + null, + [ + [ + "/css/css-text-decor/text-shadow/decorations-multiple-zorder-ref.html", + "==" + ] + ], + {} + ] + ], + "dynamic-blur.html": [ + "3f1f02b37b6476ad16a9e75f1757465b7fc3d7f5", + [ + null, + [ + [ + "/css/css-text-decor/text-shadow/dynamic-blur-ref.html", + "==" + ] + ], + {} + ] + ], + "lineoverflow.html": [ + "050ee6583aaf4343fa57bed63464cb16a5edffae", + [ + null, + [ + [ + "/css/css-text-decor/text-shadow/lineoverflow-ref.html", + "==" + ] + ], + {} + ] + ], + "multiple-noblur.html": [ + "cf86e4bb71e8e7a730e8aa95df8d1be3022a7fe6", + [ + null, + [ + [ + "/css/css-text-decor/text-shadow/multiple-noblur-ref.html", + "==" + ] + ], + {} + ] + ], + "overflow-not-scrollable-1.html": [ + "ca9fc8c4aed0b9bba1e61487397681a1051854ff", + [ + null, + [ + [ + "/css/css-text-decor/text-shadow/overflow-not-scrollable-1-ref.html", + "==" + ], + [ + "/css/css-text-decor/text-shadow/overflow-not-scrollable-1-ref2.html", + "==" + ] + ], + {} + ] + ], + "overflow-not-scrollable-2.html": [ + "b53278900cba84585b0302ebf963c4d47647c5a5", + [ + null, + [ + [ + "/css/css-text-decor/text-shadow/overflow-not-scrollable-2-ref.html", + "==" + ] + ], + {} + ] + ], + "padding-decoration.html": [ + "7512f28931db80d070a798e23dbdd519d4d2ce28", + [ + null, + [ + [ + "/css/css-text-decor/text-shadow/padding-decoration-ref.html", + "==" + ] + ], + {} + ] + ], + "quirks-decor-noblur.html": [ + "e5de43d67bab8fc838a02bd6c2215164efc52fb6", + [ + null, + [ + [ + "/css/css-text-decor/text-shadow/quirks-decor-noblur-ref.html", + "==" + ] + ], + {} + ] + ], + "standards-decor-noblur.html": [ + "d5a2f4e0eea6d12e82612684d512240af3b7ea82", + [ + null, + [ + [ + "/css/css-text-decor/text-shadow/standards-decor-noblur-ref.html", + "==" + ] + ], + {} + ] + ], + "textindent.html": [ + "4b66f9dcb8916a125bced71bec37d757a5521af5", + [ + null, + [ + [ + "/css/css-text-decor/text-shadow/textindent-ref.html", + "==" + ] + ], + {} + ] ] - ], + }, "text-underline-offset-001.html": [ "88de83a0cfc60b66c09cafb8e4d3dcf1cdcdacb3", [ @@ -212214,6 +213904,32 @@ {} ] ], + "grouping-li-reftest-006.html": [ + "d6a260bbc055093b4faf3ce09a7bcd444c592de1", + [ + null, + [ + [ + "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-004-ref.html", + "==" + ] + ], + {} + ] + ], + "grouping-li-reftest-007.html": [ + "8eda7057da08b60ee3b6ddf1aad05adcaa64642a", + [ + null, + [ + [ + "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-004-ref.html", + "==" + ] + ], + {} + ] + ], "grouping-li-reftest-display-list-item.html": [ "ce63cf7c7c043ef80b53a7c1beaade4a15d4a2b0", [ @@ -229090,7 +230806,7 @@ [] ], "fedcm-mock.js": [ - "318419792c2986c16d805bb8ed68c68192c19d1c", + "2fa351446c2601580c525f4ef75b01f2ba2a19c8", [] ], "federatedcredential-get.html": [ @@ -238782,7 +240498,7 @@ [] ], "META.yml": [ - "287f1f32a77a69afee10c5f548b078f9a8ef0610", + "f5030db7cb57a09012f740fe54ae26d466bcef24", [] ], "a98rgb-003-ref.html": [ @@ -238837,10 +240553,18 @@ "048d1730015ba9948cb19040fad877cd0effa459", [] ], + "color-mix-basic-001-expected.txt": [ + "3ec831c4d314ef9ba6df43839779a35784210359", + [] + ], "color-mix-basic-001.tentative-expected.txt": [ "3ec831c4d314ef9ba6df43839779a35784210359", [] ], + "color-mix-non-srgb-001-expected.txt": [ + "77ccec0d3adfc6bb9840f529ad5e574792c96cef", + [] + ], "color-mix-non-srgb-001.tentative-expected.txt": [ "77ccec0d3adfc6bb9840f529ad5e574792c96cef", [] @@ -238982,6 +240706,14 @@ "36e511b3edc2a053f51abfe75da15d6095644022", [] ], + "relative-color-computed-expected.txt": [ + "6b9f5f94de3d30775647a10d97273a6246cc7daf", + [] + ], + "relative-color-valid-expected.txt": [ + "feb3805b2a6b0c47c5a2fdc30296d0dbf09c0e9e", + [] + ], "system-color-valid-expected.txt": [ "5194a9465974f66b1965d80e3ad4307797608c1e", [] @@ -261924,7 +263656,7 @@ "a01122900982ce9b7aa2cd71094a1c2a0ba2c976", [] ], - "support": { + "tools": { "generate-segment-break-transformation-rules-tests.py": [ "fc894161bda1b4e3f5b643b6e668a6d1d0bcc614", [] @@ -264208,10 +265940,6 @@ "e24c86abeb1e3aa8da4d5c69e36d6395b0a6c469", [] ], - "text-shadow-currentcolor-ref.html": [ - "943c750f6f2319729c32514de82089b49ff4140b", - [] - ], "text-underline-offset-001-notref.html": [ "c9aea5de2f0da6a75f6ed89f9475dafdc89f17af", [] @@ -264326,7 +266054,231 @@ "text-decoration-width-initial-expected.txt": [ "cd582e81b24d0c96c7213f01d9f77df284a2b2b0", [] - ] + ], + "text-emphasis-color-property-001-ref.html": [ + "43257f99e9c4c1ba1b2e8984900a30f4d06601fe", + [] + ], + "text-emphasis-color-property-002-ref.html": [ + "345d287395460754bce4b3a750b8ef68e3ced969", + [] + ], + "text-emphasis-line-height-001-ref.html": [ + "6f02e05bdd986c5e064060d9685f93acb5fe8b81", + [] + ], + "text-emphasis-line-height-002-ref.html": [ + "abff3e9e55347e4a476405727fae34e8cb3f2585", + [] + ], + "text-emphasis-line-height-003-ref.html": [ + "d427c76c969714631b89f67c55b57763aa52b5d4", + [] + ], + "text-emphasis-line-height-004-ref.html": [ + "b88ca7c3a35a8e6d2e12e38ef8eef4dccbdf5b9d", + [] + ], + "text-emphasis-position-property-001-ref.html": [ + "1121e1602f4a3973d1fd1d2a6348be90d8d53492", + [] + ], + "text-emphasis-position-property-002-ref.html": [ + "a0371c1f0313fda52d289267cce27c4636c8cd37", + [] + ], + "text-emphasis-position-property-003-ref.html": [ + "9b0ad4d1e98765abd8f632a1104878e4a098987f", + [] + ], + "text-emphasis-position-property-004-ref.html": [ + "b82a758f830632122aefa3eef0d4d3dc0d7364c4", + [] + ], + "text-emphasis-position-property-005-ref.html": [ + "c6a6df1e03e19c886cdb326f1ca9eaf52c022b11", + [] + ], + "text-emphasis-position-property-006-ref.html": [ + "b19d776410cd1ea443a912974bcfdf671a7269fc", + [] + ], + "text-emphasis-ruby-001-ref.html": [ + "6b1d6bd2f0e11f74b0065f39ef4ad0a73a434755", + [] + ], + "text-emphasis-ruby-002-ref.html": [ + "a3ecaf6c69e5bb49b05a49b647f982a90c8644d6", + [] + ], + "text-emphasis-ruby-003-ref.html": [ + "31cb1e6a0d08b9b0eb6c44c922657bd654ad7fa5", + [] + ], + "text-emphasis-ruby-004-ref.html": [ + "22b628d964145295d533013a908454e24862603c", + [] + ], + "text-emphasis-style-property-001-ref.html": [ + "9dc6c897cf4b3c1777c0332dff3ceebfed24346a", + [] + ], + "text-emphasis-style-property-002-ref.html": [ + "10504677c72c2a15a1d5f6c5ac93720d296aa46b", + [] + ], + "text-emphasis-style-property-003-ref.html": [ + "fadc7d2773eaa9979e6b7d732659da7e40ad1ec3", + [] + ], + "text-emphasis-style-property-004-ref.html": [ + "d89ae5a5c8718cf5857bb1e842f782fb31585e53", + [] + ], + "text-emphasis-style-property-005-ref.html": [ + "361591860adc0977f63f823585cb7c6712f8295d", + [] + ], + "text-emphasis-style-property-010-ref.html": [ + "93028d6e7c9e54cb0c0b0ae1ca748dc46839e113", + [] + ], + "text-emphasis-style-property-011-ref.html": [ + "4d601378ede4a9879079b61b52b57dffc797d82e", + [] + ], + "text-emphasis-style-property-012-ref.html": [ + "ba6d4c2e56c4d97ef34b753b257d3f9a20b10a8d", + [] + ], + "text-emphasis-style-property-013-ref.html": [ + "c22aecee515b8136bbb245cb07e092f6166ee42d", + [] + ], + "text-emphasis-style-property-014-ref.html": [ + "c816fd524cad165fac398effd5b8c6d86cef592c", + [] + ], + "text-emphasis-style-property-015-ref.html": [ + "0b0cc8da3740e0f8178cdc452ca41d7a05248c7b", + [] + ], + "text-emphasis-style-property-016-ref.html": [ + "47a6377ca2b465b1b9ecdb2492044431077368d6", + [] + ], + "text-emphasis-style-property-017-ref.html": [ + "b033567cc62bdac679ce7d3214df3fa81e84f4d8", + [] + ], + "text-emphasis-style-property-018-ref.html": [ + "e1a6039701771ddb48d049115688903454e16ba9", + [] + ], + "text-emphasis-style-property-019-ref.html": [ + "ec50cc8b4cce6c75684acd54b2724760b172741a", + [] + ], + "text-emphasis-style-property-020-ref.html": [ + "81a2aedd3539d2994858da0b17ff5f419ae858a5", + [] + ], + "text-shadow": { + "basic-negcoord-ref.html": [ + "79c3d996cff4f212d9f9c8ec5818bece45734805", + [] + ], + "basic-opacity-ref.html": [ + "11aa6d5176b8715280447fc107c6a2cf07f3df15", + [] + ], + "basic-ref.html": [ + "26b07d2e290668d252f6088b22d9cc8bc5e1c88e", + [] + ], + "blur-notref.html": [ + "28404095aca46899b30a5bb98c54ed9020b4f954", + [] + ], + "color-inherit-ref.html": [ + "8fa2dafa5e6824fc8e5bb910d9b84a84b2ed33dc", + [] + ], + "color-parserorder-ref.html": [ + "16d53ce0b68d26d9dcf9825c3abda4f1edc6470e", + [] + ], + "currentcolor-ref.html": [ + "943c750f6f2319729c32514de82089b49ff4140b", + [] + ], + "decorations-multiple-zorder-ref.html": [ + "563867391df1310e1a2905a86083d245ccc86e83", + [] + ], + "dynamic-blur-ref.html": [ + "779f4adcf4498d87d677ab26bf6006b0c3889625", + [] + ], + "lineoverflow-ref.html": [ + "07fad32ce7313338b1989d21f5f2c7547ef62d4a", + [] + ], + "multiple-noblur-ref.html": [ + "a5f125e475c4376f42c86fe1ad2b6e252f34df5b", + [] + ], + "overflow-not-scrollable-1-ref.html": [ + "642d10181f25a1d577359567ef7486e5eb44462d", + [] + ], + "overflow-not-scrollable-1-ref2.html": [ + "4ed3a46ec2fe6501648b78fb7b413bebd7d0ae51", + [] + ], + "overflow-not-scrollable-2-ref.html": [ + "4d0e7457f697c3848f4438b5255ffbd03fcec4d0", + [] + ], + "padding-decoration-ref.html": [ + "1cc1f5ec4e34604fe974096c77f6a548551bc263", + [] + ], + "quirks-decor-noblur-ref.html": [ + "9644146226609884b89148be28b35cf6d964e8b1", + [] + ], + "standards-decor-noblur-ref.html": [ + "8a962a41e923c50a6d891bc3f1b9c7bff3bbd180", + [] + ], + "textindent-ref.html": [ + "c3e3315e9b2795a5a5fb8a7e367bb133d6e442fe", + [] + ] + }, + "tools": { + "generate-text-emphasis-line-height-tests.py": [ + "12fb6a3ad850b357808c47a90a818dd73be2de5b", + [] + ], + "generate-text-emphasis-position-property-tests.py": [ + "527959068762f5a7185bf11bdc2536054d2db258", + [] + ], + "generate-text-emphasis-ruby-tests.py": [ + "fdbaec052e4e4bdfdcad1e9fc9731bf26a518509", + [] + ], + "generate-text-emphasis-style-property-010-tests.sh": [ + "0cf60db1b0daff62cc30ab390d0f4cbe6e70edf9", + [] + ], + "generate-text-emphasis-style-property-tests.py": [ + "1b1d6fc16f24b91eef28cd99c428f426cc61c349", + [] + ] + } }, "css-transforms": { "3dtransform-and-filter-no-perspective-001-ref.html": [ @@ -268224,11 +270176,7 @@ [] ], "variable-definition-expected.txt": [ - "38da73a2dbf4d27f39be1573d0b88caf6ba7a978", - [] - ], - "variable-empty-name-reserved-expected.txt": [ - "687535526d578b09eecbc64c3035ca5017390a57", + "3cccbb476ae7375e6a089eb8d8d4ebc043745e16", [] ], "variable-external-font-face-01-ref.html": [ @@ -272904,10 +274852,6 @@ }, "vendor-imports": { "mozilla": { - "META.yml": [ - "427ab62baa011151f797d537e646961d7df78630", - [] - ], "mozilla-central-reftests": { "DIR_METADATA": [ "97e2659bf8cff713dc731eec03ac942794cc5fd2", @@ -273839,7 +275783,7 @@ } }, "historical-expected.txt": [ - "66cad48a780d6f7db671131c5bb4fe31124d8e78", + "e31ca4f3c12693d4faa4a336b46edb3df545a09f", [] ], "idlharness.window_exclude=Node-expected.txt": [ @@ -276670,7 +278614,7 @@ [] ], "event-timing-test-utils.js": [ - "70fd66abfbcb22a62c699dba4466f76a539729ed", + "32ff2b23c02f9faa4e90b65b5ef4b473a5ecc691", [] ], "slow-image.py": [ @@ -295903,11 +297847,7 @@ ] } } - }, - "reporterror-cross-realm-method-expected.txt": [ - "0f9f13adf56a1490fff2995d2c9fa586239b2867", - [] - ] + } }, "structured-clone": { "structured-clone-battery-of-tests-harness.js": [ @@ -295922,10 +297862,6 @@ "301cda5e38f3c678f79b60269df2fab22d3c382c", [] ], - "structured-clone-cross-realm-method-expected.txt": [ - "3422f26d41ee1fe5a6daf42d2a2e923c6c1aba8a", - [] - ], "structured-clone-expected.txt": [ "a85baeb2bba8f2f6954334a721ea10f6ad4ef066", [] @@ -305106,7 +307042,7 @@ [] ], "nfc-mock.js": [ - "6a0437a7975420bc802b2715a8707bf518092349", + "a7ce560a9f9a7c0cc3f725dc9d352c3c76d17c55", [] ], "web-bluetooth-test.js": [ @@ -312905,7 +314841,23 @@ "cc71631ba6fa22b126bf39d399f8db991d74a267", [] ] - } + }, + "signal.tentative.https.any-expected.txt": [ + "47df25ed030045327256f3aceef891c2194fa7b0", + [] + ], + "signal.tentative.https.any.serviceworker-expected.txt": [ + "47df25ed030045327256f3aceef891c2194fa7b0", + [] + ], + "signal.tentative.https.any.sharedworker-expected.txt": [ + "47df25ed030045327256f3aceef891c2194fa7b0", + [] + ], + "signal.tentative.https.any.worker-expected.txt": [ + "47df25ed030045327256f3aceef891c2194fa7b0", + [] + ] }, "web-nfc": { "DIR_METADATA": [ @@ -312921,7 +314873,7 @@ [] ], "README.md": [ - "15c6534a7be35c478993836d54d451a791619cea", + "b51018d68f1fbc91249d2f07ecbbfd2e8f5e0e1c", [] ], "resources": { @@ -338594,77 +340546,277 @@ }, "server": { "connect": { - "connection-succeeds.https.html": [ - "1326b073879e554e141390dd9c42c12f64681165", + "connection-succeeds.https.window.js": [ + "d78d261338c526bf6e6af44e053321dc8055a01f", [ - null, + "bluetooth/server/connect/connection-succeeds.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" + ] + ] } ] ], - "garbage-collection-ran-during-success.https.html": [ - "d9c07b64bc05512ca9e45a69aeba6c8b65c73f0c", + "garbage-collection-ran-during-success.https.window.js": [ + "1a4ad4711edc550038e01ddc942e0f69756d0165", [ - null, + "bluetooth/server/connect/garbage-collection-ran-during-success.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" + ] + ] } ] ], - "get-same-gatt-server.https.html": [ - "5e9383851f39a316582d2e672cb5afa0c11b27ab", + "get-same-gatt-server.https.window.js": [ + "a962d9d28afc4fb3623afa63a34c4b0e30cdeae1", [ - null, + "bluetooth/server/connect/get-same-gatt-server.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" + ] + ] } ] ] }, - "device-same-object.https.html": [ - "b861040b2366aa98aca067b80218f030cb9c94d0", + "device-same-object.https.window.js": [ + "1c10a34488bfa1a785cc957c95ae9e452b0c16ae", [ - null, + "bluetooth/server/device-same-object.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" + ] + ] } ] ], "disconnect": { - "connect-disconnect-twice.https.html": [ - "7ed2cb946035c7a8a828b2830c60ded5eca0290f", + "connect-disconnect-twice.https.window.js": [ + "4d832f2ecd84921a79623b519da292ed403b4eff", [ - null, + "bluetooth/server/disconnect/connect-disconnect-twice.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" + ] + ] } ] ], - "detach-gc.https.html": [ - "c1863e923227a6f80763e5c374d480a6169b6bf0", + "detach-gc.https.window.js": [ + "7495c9deae62473f1f3ff14bf1f46518b39cfaf5", [ - null, + "bluetooth/server/disconnect/detach-gc.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" + ] + ] } ] ], - "disconnect-twice-in-a-row.https.html": [ - "d4d6e2fca782eb4a23c92d9966d6235b19632440", + "disconnect-twice-in-a-row.https.window.js": [ + "6f40bf3bc4eb44950bda2191e80d8de37d0214f5", [ - null, + "bluetooth/server/disconnect/disconnect-twice-in-a-row.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" + ] + ] } ] ], - "gc-detach.https.html": [ - "41d2b151d33c6535241299b2cb3e55ffa40cafec", + "gc-detach.https.window.js": [ + "cb0899bbe2f3f07b59f7de00d56cc7f42baeb95b", [ - null, + "bluetooth/server/disconnect/gc-detach.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" + ] + ] } ] ] @@ -339086,50 +341238,175 @@ } ] ], - "service-found.https.html": [ - "6484b8227d27bc474bdfa7d156d7d3acedd30f3e", + "service-found.https.window.js": [ + "fe700d6ef61021075b81a81a8389591448587998", [ - null, + "bluetooth/server/getPrimaryService/service-found.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" + ] + ] } ] ], - "two-iframes-from-same-origin.https.html": [ - "064d8d2e3b4ca216179f912327f019f3f61d02df", + "two-iframes-from-same-origin.https.window.js": [ + "cbb3c19a049337ae17752576ebf420b8595b799b", [ - null, + "bluetooth/server/getPrimaryService/two-iframes-from-same-origin.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" + ] + ] } ] ] }, "getPrimaryServices": { - "blocklisted-services-with-uuid.https.html": [ - "90d776c77ee3ccc8c265ec82fff80423b9f392ba", + "blocklisted-services-with-uuid.https.window.js": [ + "5d57e9dc9570c4b63b0ebdfe8b621c22c3f3761e", [ - null, + "bluetooth/server/getPrimaryServices/blocklisted-services-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" + ] + ] } ] ], - "blocklisted-services.https.html": [ - "df83dfe193fe40b55f37aa0c1e1b4e204c7b340f", + "blocklisted-services.https.window.js": [ + "4dc78bfdd7bf3a015ed777a258ece7d9fc11e9b5", [ - null, + "bluetooth/server/getPrimaryServices/blocklisted-services.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" + ] + ] } ] ], - "correct-services.https.html": [ - "9672d50a2bc2291003823c2da1cdcde77f6edbae", + "correct-services.https.window.js": [ + "4debf5dea4ed3cb274c15e8ffde46c5498d27ab4", [ - null, + "bluetooth/server/getPrimaryServices/correct-services.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" + ] + ] } ] ], @@ -339809,30 +342086,105 @@ } ] ], - "services-found-with-uuid.https.html": [ - "92ca4ea6a6e583d236381bbaaa97470d40e4be10", + "services-found-with-uuid.https.window.js": [ + "b18bda8247a327ea3bd4c695460fa109e491fa31", [ - null, + "bluetooth/server/getPrimaryServices/services-found-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" + ] + ] } ] ], - "services-found.https.html": [ - "d39c69fc7f1fd1d8213367bcfb1f4b7e11e65a4f", + "services-found.https.window.js": [ + "8098e8e8bebb95703b38d437d4eda8b8d2cdad58", [ - null, + "bluetooth/server/getPrimaryServices/services-found.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" + ] + ] } ] ], - "services-not-found.https.html": [ - "4c78ad19d0ea8a8a3f2b38dc75e0a15f5ed3d083", + "services-not-found.https.window.js": [ + "6dda95ed4307048c2ec9278ffefa89fc39ffa25d", [ - null, + "bluetooth/server/getPrimaryServices/services-not-found.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-test.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-fake-devices.js" + ] + ] } ] ] @@ -350739,7 +353091,7 @@ ] ], "fedcm.https.html": [ - "655bff8c2360dfe9a0ccb4e3b77cfdf352ca8e97", + "71ff0ab70f49258f5e6d701b8e7034933ae1ae42", [ null, {} @@ -354095,15 +356447,15 @@ {} ] ], - "color-mix-basic-001.tentative.html": [ - "9e3b8146a3272900a0f2571f036ad460d19c0be4", + "color-mix-basic-001.html": [ + "38e3504d5e2fced107c3c67f1587ffa26c92f67a", [ null, {} ] ], - "color-mix-non-srgb-001.tentative.html": [ - "045dee02fb678d64c7b3a013b4f81ca69cbb92f3", + "color-mix-non-srgb-001.html": [ + "b38923fe23ee7ec5ba1c6877a15fa6faf74fc3d3", [ null, {} @@ -354233,6 +356585,27 @@ {} ] ], + "relative-color-computed.html": [ + "b7eccdba9f45ae0b8d8abb0e242c20be1873187f", + [ + null, + {} + ] + ], + "relative-color-invalid.html": [ + "c6f19e1e8b911dec234aeb10f3b3f41b38cd12fb", + [ + null, + {} + ] + ], + "relative-color-valid.html": [ + "257939633b2ef8ba530baec37ec45e03f459e9b4", + [ + null, + {} + ] + ], "system-color-valid.html": [ "77c6d214fbce92e33df6829f09a2d9fd7fcfbf83", [ @@ -356120,7 +358493,14 @@ ] ], "flexbox-justify-content-wmvert-002.html": [ - "6dd287e31d362873807126df8702a3e960868f3b", + "2aaee48596bbb0a17e0dd9e022d7a60e10670979", + [ + null, + {} + ] + ], + "flexbox-justify-content-wmvert-003.html": [ + "5e5036c5816094fc6e4567ca90fd9b9182865191", [ null, {} @@ -371013,27 +373393,6 @@ {} ] ], - "text-shadow-computed.html": [ - "a90738d825f2132bd6236f550f7525157b18e102", - [ - null, - {} - ] - ], - "text-shadow-invalid.html": [ - "dfaa4a5b48b9e6b6c668bc1833083b1b2f453ced", - [ - null, - {} - ] - ], - "text-shadow-valid.html": [ - "cbf9df547906aaa5095359ad3847123d3756205e", - [ - null, - {} - ] - ], "text-underline-position-computed.html": [ "a1bf54b068bc848a9e253500f692eeff692f4e61", [ @@ -371105,6 +373464,31 @@ {} ] ], + "text-shadow": { + "parsing": { + "text-shadow-computed.html": [ + "a90738d825f2132bd6236f550f7525157b18e102", + [ + null, + {} + ] + ], + "text-shadow-invalid.html": [ + "dfaa4a5b48b9e6b6c668bc1833083b1b2f453ced", + [ + null, + {} + ] + ], + "text-shadow-valid.html": [ + "cbf9df547906aaa5095359ad3847123d3756205e", + [ + null, + {} + ] + ] + } + }, "text-underline-offset-computed.html": [ "26861c1565bcada9d14bb6f045bfcddf39cbdaab", [ @@ -382674,7 +385058,7 @@ ] }, "historical.html": [ - "0e337c12af78e82b5bf9b3997719636b2105ed25", + "155dc89556078e629bfb8392ca49c04536dc3c27", [ null, {} @@ -398716,7 +401100,7 @@ ] ], "buffered-and-duration-threshold.html": [ - "dbc9d92bf04e0a5b40033073b88bad1fc533836a", + "4a7a63f59afccf79e14fce3d543078938e7c6dab", [ null, { @@ -398743,7 +401127,7 @@ ] ], "click-timing.html": [ - "84943f9590a9f2df83ee841503878f1e455107aa", + "24bad0aedca88c029e0fb1b4be7cb54d65cd7ba2", [ null, { @@ -398770,7 +401154,7 @@ ] ], "crossiframe.html": [ - "7a9ede0f9ae78d6ea28add6fcafc8497d8789b8d", + "df4d94f09aef1d569be608546941d1e6b7c874ae", [ null, { @@ -398789,7 +401173,7 @@ ] ], "disconnect-target.html": [ - "6d6770d3188dcb5b23806d1ab03d77e76e4e137f", + "04c7c290b67afa6bf3600274553b26cabdc676cc", [ null, { @@ -398816,7 +401200,7 @@ ] ], "event-retarget.html": [ - "29c114f356b51b869b9550830815cb6e68b3c7a5", + "2ddc85d566c78b14ba8f1bfa0235a15df35b4e37", [ null, { @@ -398825,7 +401209,7 @@ ] ], "first-input-shadow-dom.html": [ - "66eb6597552fb9ec48a0a733a4d67f22b427f760", + "5911dabd54e65f34b04eb40f2e99dd0089047e66", [ null, { @@ -398995,7 +401379,7 @@ ] ], "only-observe-firstInput.html": [ - "54a6036f91adb89c7b6528e40850937d70520b77", + "53f96416720332dd821bd803140ecfa06853f92e", [ null, { @@ -399059,7 +401443,7 @@ ] ], "programmatic-click-not-observed.html": [ - "4060d2d00dc1c0210854317bce5bbc5bc25fff57", + "049607e04e1b0bcf8c7c982edbe20f6fc9014aed", [ null, { @@ -399078,7 +401462,7 @@ ] ], "retrieve-firstInput.html": [ - "27b17cd18165f975fbbd98e7de07dad71251c1fa", + "c4536cb4468dda8e5eff97b34a761e6ef45cb442", [ null, { @@ -504517,6 +506901,13 @@ null, {} ] + ], + "test_style_flush_on_dom_api_with_d_property.html": [ + "248118443b597f6d84d4e84bd3ba73c114c2fc45", + [ + null, + {} + ] ] } }, @@ -515492,7 +517883,7 @@ ] ], "signal.tentative.https.any.js": [ - "c4509de637b81f55a3bc29a75f4b381b93f11b7b", + "cbb23df8a0567fcdb4c86ffeea0579fb5f8acb23", [ "web-locks/signal.tentative.https.any.html", { @@ -515679,8 +518070,30 @@ {} ] ], + "NDEFReader_make-read-only.https.window.js": [ + "244dd6369fd1bd7088682907dd10968ca827e0f5", + [ + "web-nfc/NDEFReader_make-read-only.https.window.html", + { + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "resources/nfc-helpers.js" + ] + ] + } + ] + ], "NDEFReader_scan.https.html": [ - "281f3db5b7bd56a48ac6eb2cccea814912e07006", + "cb35aba20faa63d30ac3b2d95947a4069b4b9733", [ null, {} @@ -515694,7 +518107,7 @@ ] ], "NDEFReader_write.https.html": [ - "35e6dd37299485d914df3e9f0c36d5aed4f10e8b", + "8f6cd81de5547c4e1a0d37b746bf6addde983e64", [ null, {}
diff --git a/third_party/blink/web_tests/external/wpt/ambient-light/AmbientLightSensor.https.html b/third_party/blink/web_tests/external/wpt/ambient-light/AmbientLightSensor.https.html index 7d23896..0ccb899 100644 --- a/third_party/blink/web_tests/external/wpt/ambient-light/AmbientLightSensor.https.html +++ b/third_party/blink/web_tests/external/wpt/ambient-light/AmbientLightSensor.https.html
@@ -27,4 +27,41 @@ verifyAlsSensorReading, ['ambient-light-sensor']); +sensor_test(async (t, sensorProvider) => { + const sensor1 = new AmbientLightSensor(); + const sensor2 = new AmbientLightSensor(); + + return new Promise((resolve, reject) => { + sensor1.addEventListener('reading', () => { + sensor2.addEventListener('activate', () => { + try { + assert_true(sensor1.activated); + assert_true(sensor1.hasReading); + assert_not_equals(sensor1.illuminance, null); + assert_not_equals(sensor1.timestamp, null); + + assert_true(sensor2.activated); + assert_not_equals(sensor2.illuminance, null); + assert_not_equals(sensor2.timestamp, null); + } catch (e) { + reject(e); + } + }, { once: true }); + sensor2.addEventListener('reading', () => { + try { + assert_true(sensor2.activated); + assert_true(sensor2.hasReading); + assert_equals(sensor1.illuminance, sensor2.illuminance); + assert_equals(sensor1.timestamp, sensor2.timestamp); + resolve(); + } catch (e) { + reject(e); + } + }, { once: true }); + sensor2.start(); + }, { once: true }); + sensor1.start(); + }); +}, "Readings delivered by shared platform sensor are immediately accessible to all sensors."); + </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/META.yml b/third_party/blink/web_tests/external/wpt/css/css-color/META.yml index 287f1f32..f5030db 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/META.yml +++ b/third_party/blink/web_tests/external/wpt/css/css-color/META.yml
@@ -4,4 +4,5 @@ - svgeesus - tabatkins - weinig + - leaverou
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/color-contrast-001.html b/third_party/blink/web_tests/external/wpt/css/css-color/color-contrast-001.html new file mode 100644 index 0000000..d2fd196 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color/color-contrast-001.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Color 5: color-contrast()</title> +<link rel="author" title="Adam Argyle" href="mailto:argyle@google.com"> +<link rel="help" href="https://www.w3.org/TR/css-color-5/#colorcontrast"> +<link rel="match" href="greensquare-ref.html"> +<meta name="assert" content="green has higher contrast with red than deeppink"> +<style> + .test { background-color: red; width: 12em; height: 6em; margin-top:0} + .ref { background-color: #008000; width: 12em; height: 6em; margin-bottom: 0} + .test { background-color: color-contrast(red vs deeppink, #008000)} +</style> +<body> + <p>Test passes if you see a green square, and no red.</p> + <p class="ref"> </p> + <p class="test"> </p> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/color-mix-basic-001-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-color/color-mix-basic-001-expected.txt new file mode 100644 index 0000000..3ec831c4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color/color-mix-basic-001-expected.txt
@@ -0,0 +1,10 @@ +This is a testharness.js-based test. +FAIL From blue to red at 0.5 assert_not_equals: Should parse color-mix(in srgb, blue, red 50%) got disallowed value "" +FAIL From blue to green at 0.5 assert_not_equals: Should parse color-mix(in srgb, blue, green 50%) got disallowed value "" +FAIL From rgb(255, 0, 0, .2) to red at 0.5 assert_not_equals: Should parse color-mix(in srgb, rgb(255, 0, 0, .2), red 50%) got disallowed value "" +FAIL From blue to red at 0.9 assert_not_equals: Should parse color-mix(in srgb, blue, red 90%) got disallowed value "" +FAIL From blue to red at 0 assert_not_equals: Should parse color-mix(in srgb, blue, red 0%) got disallowed value "" +FAIL From currentColor to white at 0.5 assert_not_equals: Should parse color-mix(in srgb, currentColor, white 50%) got disallowed value "" +FAIL From currentColor to rgba(0, 0, 0, .5) at 0.5 assert_not_equals: Should parse color-mix(in srgb, currentColor, rgba(0, 0, 0, .5) 50%) got disallowed value "" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/color-mix-basic-001.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-color/color-mix-basic-001.html similarity index 95% rename from third_party/blink/web_tests/external/wpt/css/css-color/color-mix-basic-001.tentative.html rename to third_party/blink/web_tests/external/wpt/css/css-color/color-mix-basic-001.html index 9e3b8146..38e3504 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/color-mix-basic-001.tentative.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/color-mix-basic-001.html
@@ -1,5 +1,4 @@ <!doctype html> -<!-- Tentative pending potential syntax changes in https://github.com/w3c/csswg-drafts/issues/6066 --> <link rel="help" href="https://drafts.csswg.org/css-color-5/#color-mix"> <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1695376"> <link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/color-mix-non-srgb-001-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-color/color-mix-non-srgb-001-expected.txt new file mode 100644 index 0000000..77ccec0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color/color-mix-non-srgb-001-expected.txt
@@ -0,0 +1,12 @@ +This is a testharness.js-based test. +FAIL From red to green in xyz color space assert_not_equals: Should parse color-mix(in xyz, red, green) got disallowed value "" +FAIL From red to green in lab color space assert_not_equals: Should parse color-mix(in lab, red, green) got disallowed value "" +FAIL From red to green in lch color space assert_not_equals: Should parse color-mix(in lch, red, green) got disallowed value "" +FAIL From red to green 90% in xyz color space assert_not_equals: Should parse color-mix(in xyz, red, green 90%) got disallowed value "" +FAIL From red to green 90% in lab color space assert_not_equals: Should parse color-mix(in lab, red, green 90%) got disallowed value "" +FAIL From red to green 90% in lch color space assert_not_equals: Should parse color-mix(in lch, red, green 90%) got disallowed value "" +FAIL From red 90% to green in xyz color space assert_not_equals: Should parse color-mix(in xyz, red 90%, green) got disallowed value "" +FAIL From red 90% to green in lab color space assert_not_equals: Should parse color-mix(in lab, red 90%, green) got disallowed value "" +FAIL From red 90% to green in lch color space assert_not_equals: Should parse color-mix(in lch, red 90%, green) got disallowed value "" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/color-mix-non-srgb-001.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-color/color-mix-non-srgb-001.html similarity index 94% rename from third_party/blink/web_tests/external/wpt/css/css-color/color-mix-non-srgb-001.tentative.html rename to third_party/blink/web_tests/external/wpt/css/css-color/color-mix-non-srgb-001.html index 045dee0..b38923f 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/color-mix-non-srgb-001.tentative.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/color-mix-non-srgb-001.html
@@ -1,6 +1,5 @@ <!DOCTYPE html> <meta charset="utf-8"> -<!-- Tentative pending potential syntax changes in https://github.com/w3c/csswg-drafts/issues/6066 --> <link rel="help" href="https://drafts.csswg.org/css-color-5/#color-mix"> <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1703356"> <link rel="author" href="mailto:barret@brennie.ca" title="Barret Rennie">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/oklab-001.html b/third_party/blink/web_tests/external/wpt/css/css-color/oklab-001.html index 295c24c..835a8ca4 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/oklab-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/oklab-001.html
@@ -2,7 +2,8 @@ <meta charset="utf-8"> <title>CSS Color 4: OKLab and OKLCH</title> <link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> -<link rel="help" href="https://drafts.csswg.org/css-color/#ok-lab"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#specifying-oklab-oklch"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined-to-lab-oklab"> <link rel="match" href="greensquare-ref.html"> <meta name="assert" content="oklab() with no alpha"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/oklab-002.html b/third_party/blink/web_tests/external/wpt/css/css-color/oklab-002.html index 049e403..4ddf4d9 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/oklab-002.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/oklab-002.html
@@ -2,7 +2,8 @@ <meta charset="utf-8"> <title>CSS Color 4: OKLab and OKLCH</title> <link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> -<link rel="help" href="https://drafts.csswg.org/css-color/#ok-lab"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#specifying-oklab-oklch"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined-to-lab-oklab"> <link rel="match" href="blacksquare-ref.html"> <meta name="assert" content="oklab() with no alpha"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/oklab-003.html b/third_party/blink/web_tests/external/wpt/css/css-color/oklab-003.html index 9da9bbc7f..38c921e3 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/oklab-003.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/oklab-003.html
@@ -2,7 +2,8 @@ <meta charset="utf-8"> <title>CSS Color 4: OKLab and OKLCH</title> <link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> -<link rel="help" href="https://drafts.csswg.org/css-color/#ok-lab"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#specifying-oklab-oklch"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined-to-lab-oklab"> <link rel="match" href="whitesquare-ref.html"> <meta name="assert" content="oklab() with no alpha"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/oklab-004.html b/third_party/blink/web_tests/external/wpt/css/css-color/oklab-004.html index d9456d7..c403f24 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/oklab-004.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/oklab-004.html
@@ -2,7 +2,8 @@ <meta charset="utf-8"> <title>CSS Color 4: OKLab and OKLCH</title> <link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> -<link rel="help" href="https://drafts.csswg.org/css-color/#ok-lab"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#specifying-oklab-oklch"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#oklab-lab-to-predefined"> <link rel="match" href="oklab-004-ref.html"> <meta name="assert" content="oklab() with no alpha"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/oklab-005.html b/third_party/blink/web_tests/external/wpt/css/css-color/oklab-005.html index f3d39dfe..0738d21 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/oklab-005.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/oklab-005.html
@@ -2,7 +2,8 @@ <meta charset="utf-8"> <title>CSS Color 4: OKLab and OKLCH</title> <link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> -<link rel="help" href="https://drafts.csswg.org/css-color/#ok-lab"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#specifying-oklab-oklch"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#oklab-lab-to-predefined"> <link rel="match" href="oklab-005-ref.html"> <meta name="assert" content="oklab() with no alpha, negative a axis"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/oklab-006.html b/third_party/blink/web_tests/external/wpt/css/css-color/oklab-006.html index 9e8845c..2a918ecb 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/oklab-006.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/oklab-006.html
@@ -2,7 +2,8 @@ <meta charset="utf-8"> <title>CSS Color 4: OKLab and OKLCH</title> <link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> -<link rel="help" href="https://drafts.csswg.org/css-color/#ok-lab"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#specifying-oklab-oklch"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#oklab-lab-to-predefined"> <link rel="match" href="oklab-006-ref.html"> <meta name="assert" content="oklab() with no alpha, positive b axis"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/oklab-007.html b/third_party/blink/web_tests/external/wpt/css/css-color/oklab-007.html index 5580ede..5fdf0ab1 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/oklab-007.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/oklab-007.html
@@ -2,7 +2,8 @@ <meta charset="utf-8"> <title>CSS Color 4: OKLab and OKLCH</title> <link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> -<link rel="help" href="https://drafts.csswg.org/css-color/#ok-lab"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#specifying-oklab-oklch"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#oklab-lab-to-predefined"> <link rel="match" href="oklab-007-ref.html"> <meta name="assert" content="oklab() with no alpha, negative b axis"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/oklab-008.html b/third_party/blink/web_tests/external/wpt/css/css-color/oklab-008.html index 19a165da..be8b4ae5 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/oklab-008.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/oklab-008.html
@@ -2,7 +2,8 @@ <meta charset="utf-8"> <title>CSS Color 4: OKLab and OKLCH</title> <link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> -<link rel="help" href="https://drafts.csswg.org/css-color/#ok-lab"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#specifying-oklab-oklch"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined-to-lab-oklab"> <link rel="match" href="greensquare-display-p3-ref.html"> <meta name="assert" content="oklab() outside the sRGB gamut"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/oklch-001.html b/third_party/blink/web_tests/external/wpt/css/css-color/oklch-001.html index 81d187c..f32b7fe8 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/oklch-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/oklch-001.html
@@ -2,7 +2,8 @@ <meta charset="utf-8"> <title>CSS Color 4: OKLab and OKLCH</title> <link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> -<link rel="help" href="https://drafts.csswg.org/css-color/#ok-lab"> +<link rel="help" href="https://drafts.csswg.org/css-color/#specifying-oklab-oklch"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined-to-lab-oklab"> <link rel="match" href="greensquare-ref.html"> <meta name="assert" content="oklch() with no alpha"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/oklch-002.html b/third_party/blink/web_tests/external/wpt/css/css-color/oklch-002.html index 64b09b55..5c456319 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/oklch-002.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/oklch-002.html
@@ -2,7 +2,8 @@ <meta charset="utf-8"> <title>CSS Color 4: OKLab and OKLCH</title> <link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> -<link rel="help" href="https://drafts.csswg.org/css-color/#ok-lab"> +<link rel="help" href="https://drafts.csswg.org/css-color/#specifying-oklab-oklch"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined-to-lab-oklab"> <link rel="match" href="blacksquare-ref.html"> <meta name="assert" content="oklch() with no alpha"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/oklch-003.html b/third_party/blink/web_tests/external/wpt/css/css-color/oklch-003.html index 8d83963..abfaff1 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/oklch-003.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/oklch-003.html
@@ -2,7 +2,8 @@ <meta charset="utf-8"> <title>CSS Color 4: OKLab and OKLCH</title> <link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> -<link rel="help" href="https://drafts.csswg.org/css-color/#ok-lab"> +<link rel="help" href="https://drafts.csswg.org/css-color/#specifying-oklab-oklch"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined-to-lab-oklab"> <link rel="match" href="whitesquare-ref.html"> <meta name="assert" content="oklch() with no alpha"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/oklch-004.html b/third_party/blink/web_tests/external/wpt/css/css-color/oklch-004.html index 35d9e6af..c5fc4d0 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/oklch-004.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/oklch-004.html
@@ -2,7 +2,8 @@ <meta charset="utf-8"> <title>CSS Color 4: OKLab and OKLCH</title> <link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> -<link rel="help" href="https://drafts.csswg.org/css-color/#ok-lab"> +<link rel="help" href="https://drafts.csswg.org/css-color/#specifying-oklab-oklch"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#oklab-lab-to-predefined"> <link rel="match" href="oklch-004-ref.html"> <meta name="assert" content="oklch() with no alpha"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/oklch-005.html b/third_party/blink/web_tests/external/wpt/css/css-color/oklch-005.html index 4f935bb..0c76233 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/oklch-005.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/oklch-005.html
@@ -2,7 +2,8 @@ <meta charset="utf-8"> <title>CSS Color 4: OKLab and OKLCH</title> <link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> -<link rel="help" href="https://drafts.csswg.org/css-color/#ok-lab"> +<link rel="help" href="https://drafts.csswg.org/css-color/#specifying-oklab-oklch"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#oklab-lab-to-predefined"> <link rel="match" href="oklch-005-ref.html"> <meta name="assert" content="oklch() with no alpha"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/oklch-006.html b/third_party/blink/web_tests/external/wpt/css/css-color/oklch-006.html index 95aea6fd..dc0193e5 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/oklch-006.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/oklch-006.html
@@ -2,7 +2,8 @@ <meta charset="utf-8"> <title>CSS Color 4: OKLab and OKLCH</title> <link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> -<link rel="help" href="https://drafts.csswg.org/css-color/#ok-lab"> +<link rel="help" href="https://drafts.csswg.org/css-color/#specifying-oklab-oklch"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#oklab-lab-to-predefined"> <link rel="match" href="oklch-006-ref.html"> <meta name="assert" content="oklch() with no alpha, positive b axis (when converted to Lab)"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/oklch-007.html b/third_party/blink/web_tests/external/wpt/css/css-color/oklch-007.html index 1cd9b97..3ff21b25 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/oklch-007.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/oklch-007.html
@@ -2,7 +2,8 @@ <meta charset="utf-8"> <title>CSS Color 4: OKLab and OKLCH</title> <link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> -<link rel="help" href="https://drafts.csswg.org/css-color/#ok-lab"> +<link rel="help" href="https://drafts.csswg.org/css-color/#specifying-oklab-oklch"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#oklab-lab-to-predefined"> <link rel="match" href="oklch-007-ref.html"> <meta name="assert" content="oklch() with no alpha"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/oklch-008.html b/third_party/blink/web_tests/external/wpt/css/css-color/oklch-008.html index fef6ffa..baa7c5c3 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/oklch-008.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/oklch-008.html
@@ -2,7 +2,8 @@ <meta charset="utf-8"> <title>CSS Color 4: OKLab and OKLCH</title> <link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> -<link rel="help" href="https://drafts.csswg.org/css-color-4/#specifying-lab-lch"> +<link rel="help" href="https://drafts.csswg.org/css-color/#specifying-oklab-oklch"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined-to-lab-oklab"> <link rel="match" href="greensquare-display-p3-ref.html"> <meta name="assert" content="oklch() outside the sRGB gamut"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-computed-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-computed-expected.txt new file mode 100644 index 0000000..6b9f5f9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-computed-expected.txt
@@ -0,0 +1,590 @@ +This is a testharness.js-based test. +Found 586 tests; 0 PASS, 586 FAIL, 0 TIMEOUT, 0 NOTRUN. +FAIL Property color value 'rgb(from rebeccapurple r g b)' assert_true: 'rgb(from rebeccapurple r g b)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r g b / alpha)' assert_true: 'rgb(from rebeccapurple r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from hsl(120deg 20% 50% / .5) r g b / alpha)' assert_true: 'rgb(from hsl(120deg 20% 50% / .5) r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(from rebeccapurple r g b) r g b)' assert_true: 'rgb(from rgb(from rebeccapurple r g b) r g b)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from color(display-p3 0 1 0) r g b / alpha)' assert_true: 'rgb(from color(display-p3 0 1 0) r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple 0 0 0)' assert_true: 'rgb(from rebeccapurple 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple 0 0 0 / 0)' assert_true: 'rgb(from rebeccapurple 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple 0 g b / alpha)' assert_true: 'rgb(from rebeccapurple 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r 0 b / alpha)' assert_true: 'rgb(from rebeccapurple r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r g 0 / alpha)' assert_true: 'rgb(from rebeccapurple r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r g b / 0)' assert_true: 'rgb(from rebeccapurple r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 0 g b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 0 b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g 0 / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / 0)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple 25 g b / alpha)' assert_true: 'rgb(from rebeccapurple 25 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r 25 b / alpha)' assert_true: 'rgb(from rebeccapurple r 25 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r g 25 / alpha)' assert_true: 'rgb(from rebeccapurple r g 25 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r g b / .25)' assert_true: 'rgb(from rebeccapurple r g b / .25)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / .20)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / .20)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple 20% g b / alpha)' assert_true: 'rgb(from rebeccapurple 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r 20% b / alpha)' assert_true: 'rgb(from rebeccapurple r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r g 20% / alpha)' assert_true: 'rgb(from rebeccapurple r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r g b / 20%)' assert_true: 'rgb(from rebeccapurple r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 20% g b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 20% b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g 20% / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / 20%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple 25 g b / 25%)' assert_true: 'rgb(from rebeccapurple 25 g b / 25%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r 25 b / 25%)' assert_true: 'rgb(from rebeccapurple r 25 b / 25%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r g 25 / 25%)' assert_true: 'rgb(from rebeccapurple r g 25 / 25%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / 25%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / 25%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / 25%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / 25%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / 25%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / 25%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple g b r)' assert_true: 'rgb(from rebeccapurple g b r)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple b alpha r / g)' assert_true: 'rgb(from rebeccapurple b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r r r / r)' assert_true: 'rgb(from rebeccapurple r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple alpha alpha alpha / alpha)' assert_true: 'rgb(from rebeccapurple alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) g b r)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) g b r)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) b alpha r / g)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r r r / r)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) alpha alpha alpha / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r 20% 10)' assert_true: 'rgb(from rebeccapurple r 20% 10)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r 10 20%)' assert_true: 'rgb(from rebeccapurple r 10 20%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple 0% 10 10)' assert_true: 'rgb(from rebeccapurple 0% 10 10)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 20% 10)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 20% 10)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 10 20%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 10 20%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 0% 10 10)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 0% 10 10)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple calc(r) calc(g) calc(b))' assert_true: 'rgb(from rebeccapurple calc(r) calc(g) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r calc(g * 2) 10)' assert_true: 'rgb(from rebeccapurple r calc(g * 2) 10)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple b calc(r * .5) 10)' assert_true: 'rgb(from rebeccapurple b calc(r * .5) 10)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r calc(g * .5 + g * .5) 10)' assert_true: 'rgb(from rebeccapurple r calc(g * .5 + g * .5) 10)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r calc(b * .5 - g * .5) 10)' assert_true: 'rgb(from rebeccapurple r calc(b * .5 - g * .5) 10)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h s l)' assert_true: 'hsl(from rebeccapurple h s l)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h s l / alpha)' assert_true: 'hsl(from rebeccapurple h s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from hsl(120deg 20% 50% / .5) h s l / alpha)' assert_true: 'hsl(from hsl(120deg 20% 50% / .5) h s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from hsl(from rebeccapurple h s l) h s l)' assert_true: 'hsl(from hsl(from rebeccapurple h s l) h s l)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from color(display-p3 0 1 0) h s l / alpha)' assert_true: 'hsl(from color(display-p3 0 1 0) h s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple 0 0% 0%)' assert_true: 'hsl(from rebeccapurple 0 0% 0%)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple 0deg 0% 0%)' assert_true: 'hsl(from rebeccapurple 0deg 0% 0%)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple 0 0% 0% / 0)' assert_true: 'hsl(from rebeccapurple 0 0% 0% / 0)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple 0deg 0% 0% / 0)' assert_true: 'hsl(from rebeccapurple 0deg 0% 0% / 0)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple 0 s l / alpha)' assert_true: 'hsl(from rebeccapurple 0 s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple 0deg s l / alpha)' assert_true: 'hsl(from rebeccapurple 0deg s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h 0% l / alpha)' assert_true: 'hsl(from rebeccapurple h 0% l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h s 0% / alpha)' assert_true: 'hsl(from rebeccapurple h s 0% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h s l / 0)' assert_true: 'hsl(from rebeccapurple h s l / 0)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) 0 s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) 0 s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) 0deg s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) 0deg s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h 0% l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h 0% l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s 0% / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s 0% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / 0)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / 0)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple 25 s l / alpha)' assert_true: 'hsl(from rebeccapurple 25 s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple 25deg s l / alpha)' assert_true: 'hsl(from rebeccapurple 25deg s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h 20% l / alpha)' assert_true: 'hsl(from rebeccapurple h 20% l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h s 20% / alpha)' assert_true: 'hsl(from rebeccapurple h s 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h s l / .25)' assert_true: 'hsl(from rebeccapurple h s l / .25)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) 25 s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) 25 s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) 25deg s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) 25deg s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h 20% l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h 20% l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s 20% / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / .2)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / .2)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h l s)' assert_true: 'hsl(from rebeccapurple h l s)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h alpha l / s)' assert_true: 'hsl(from rebeccapurple h alpha l / s)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h l l / l)' assert_true: 'hsl(from rebeccapurple h l l / l)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h alpha alpha / alpha)' assert_true: 'hsl(from rebeccapurple h alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h l s)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h l s)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h alpha l / s)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h alpha l / s)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h l l / l)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h l l / l)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple calc(h) calc(s) calc(l))' assert_true: 'hsl(from rebeccapurple calc(h) calc(s) calc(l))' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) calc(h) calc(s) calc(l) / calc(alpha))' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) calc(h) calc(s) calc(l) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h w b)' assert_true: 'hwb(from rebeccapurple h w b)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h w b / alpha)' assert_true: 'hwb(from rebeccapurple h w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from hsl(120deg 20% 50% / .5) h w b / alpha)' assert_true: 'hwb(from hsl(120deg 20% 50% / .5) h w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from hwb(from rebeccapurple h w b) h w b)' assert_true: 'hwb(from hwb(from rebeccapurple h w b) h w b)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from color(display-p3 0 1 0) h w b / alpha)' assert_true: 'hwb(from color(display-p3 0 1 0) h w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple 0 0% 0%)' assert_true: 'hwb(from rebeccapurple 0 0% 0%)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple 0deg 0% 0%)' assert_true: 'hwb(from rebeccapurple 0deg 0% 0%)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple 0 0% 0% / 0)' assert_true: 'hwb(from rebeccapurple 0 0% 0% / 0)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple 0deg 0% 0% / 0)' assert_true: 'hwb(from rebeccapurple 0deg 0% 0% / 0)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple 0 w b / alpha)' assert_true: 'hwb(from rebeccapurple 0 w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple 0deg w b / alpha)' assert_true: 'hwb(from rebeccapurple 0deg w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h 0% b / alpha)' assert_true: 'hwb(from rebeccapurple h 0% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h w 0% / alpha)' assert_true: 'hwb(from rebeccapurple h w 0% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h w b / 0)' assert_true: 'hwb(from rebeccapurple h w b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) 0 w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) 0 w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) 0deg w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) 0deg w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h 0% b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h 0% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w 0% / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w 0% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / 0)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple 25 w b / alpha)' assert_true: 'hwb(from rebeccapurple 25 w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple 25deg w b / alpha)' assert_true: 'hwb(from rebeccapurple 25deg w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h 20% b / alpha)' assert_true: 'hwb(from rebeccapurple h 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h w 20% / alpha)' assert_true: 'hwb(from rebeccapurple h w 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h w b / .2)' assert_true: 'hwb(from rebeccapurple h w b / .2)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) 25 w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) 25 w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) 25deg w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) 25deg w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h 20% b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w 20% / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / .2)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / .2)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h b w)' assert_true: 'hwb(from rebeccapurple h b w)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h alpha w / b)' assert_true: 'hwb(from rebeccapurple h alpha w / b)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h w w / w)' assert_true: 'hwb(from rebeccapurple h w w / w)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h alpha alpha / alpha)' assert_true: 'hwb(from rebeccapurple h alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h b w)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h b w)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h alpha w / b)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h alpha w / b)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w w / w)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w w / w)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple calc(h) calc(w) calc(b))' assert_true: 'hwb(from rebeccapurple calc(h) calc(w) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) calc(h) calc(w) calc(b) / calc(alpha))' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) calc(h) calc(w) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l a b)' assert_true: 'lab(from lab(25% 20 50) l a b)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l a b / alpha)' assert_true: 'lab(from lab(25% 20 50) l a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a b / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(from lab(25% 20 50) l a b) l a b)' assert_true: 'lab(from lab(from lab(25% 20 50) l a b) l a b)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from color(display-p3 0 0 0) l a b / alpha)' assert_true: 'lab(from color(display-p3 0 0 0) l a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) 0% 0 0)' assert_true: 'lab(from lab(25% 20 50) 0% 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) 0% 0 0 / 0)' assert_true: 'lab(from lab(25% 20 50) 0% 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) 0% a b / alpha)' assert_true: 'lab(from lab(25% 20 50) 0% a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l 0 b / alpha)' assert_true: 'lab(from lab(25% 20 50) l 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l a 0 / alpha)' assert_true: 'lab(from lab(25% 20 50) l a 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l a b / 0)' assert_true: 'lab(from lab(25% 20 50) l a b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) 0% a b / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) 0% a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l 0 b / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) l 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a 0 / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a b / 0)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) 35% a b / alpha)' assert_true: 'lab(from lab(25% 20 50) 35% a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l 35 b / alpha)' assert_true: 'lab(from lab(25% 20 50) l 35 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l a 35 / alpha)' assert_true: 'lab(from lab(25% 20 50) l a 35 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l a b / .35)' assert_true: 'lab(from lab(25% 20 50) l a b / .35)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) 35% a b / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) 35% a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l 35 b / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) l 35 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a 35 / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a 35 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a b / .35)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a b / .35)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l b a)' assert_true: 'lab(from lab(25% 20 50) l b a)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l a a / a)' assert_true: 'lab(from lab(25% 20 50) l a a / a)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l b a)' assert_true: 'lab(from lab(25% 20 50 / 40%) l b a)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a a / a)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a a / a)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) calc(l) calc(a) calc(b))' assert_true: 'lab(from lab(25% 20 50) calc(l) calc(a) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))' assert_true: 'lab(from lab(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l a b)' assert_true: 'oklab(from oklab(25% 20 50) l a b)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50) l a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(from oklab(25% 20 50) l a b) l a b)' assert_true: 'oklab(from oklab(from oklab(25% 20 50) l a b) l a b)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from color(display-p3 0 0 0) l a b / alpha)' assert_true: 'oklab(from color(display-p3 0 0 0) l a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) 0% 0 0)' assert_true: 'oklab(from oklab(25% 20 50) 0% 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) 0% 0 0 / 0)' assert_true: 'oklab(from oklab(25% 20 50) 0% 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) 0% a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50) 0% a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l 0 b / alpha)' assert_true: 'oklab(from oklab(25% 20 50) l 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l a 0 / alpha)' assert_true: 'oklab(from oklab(25% 20 50) l a 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l a b / 0)' assert_true: 'oklab(from oklab(25% 20 50) l a b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) 0% a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) 0% a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l 0 b / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a 0 / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a b / 0)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) 35% a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50) 35% a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l 35 b / alpha)' assert_true: 'oklab(from oklab(25% 20 50) l 35 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l a 35 / alpha)' assert_true: 'oklab(from oklab(25% 20 50) l a 35 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l a b / .35)' assert_true: 'oklab(from oklab(25% 20 50) l a b / .35)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) 35% a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) 35% a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l 35 b / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l 35 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a 35 / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a 35 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a b / .35)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a b / .35)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l b a)' assert_true: 'oklab(from oklab(25% 20 50) l b a)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l a a / a)' assert_true: 'oklab(from oklab(25% 20 50) l a a / a)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l b a)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l b a)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a a / a)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a a / a)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) calc(l) calc(a) calc(b))' assert_true: 'oklab(from oklab(25% 20 50) calc(l) calc(a) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))' assert_true: 'oklab(from oklab(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c h)' assert_true: 'lch(from lch(70% 45 30) l c h)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c h / alpha)' assert_true: 'lch(from lch(70% 45 30) l c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c h/ alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c h/ alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(from lch(70% 45 30) l c h) l c h)' assert_true: 'lch(from lch(from lch(70% 45 30) l c h) l c h)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from color(display-p3 0 0 0) l c h / alpha)' assert_true: 'lch(from color(display-p3 0 0 0) l c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lab(70% 45 30) l c h / alpha)' assert_true: 'lch(from lab(70% 45 30) l c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) 0% 0 0)' assert_true: 'lch(from lch(70% 45 30) 0% 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) 0% 0 0deg)' assert_true: 'lch(from lch(70% 45 30) 0% 0 0deg)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) 0% 0 0 / 0)' assert_true: 'lch(from lch(70% 45 30) 0% 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) 0% 0 0deg / 0)' assert_true: 'lch(from lch(70% 45 30) 0% 0 0deg / 0)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) 0% c h / alpha)' assert_true: 'lch(from lch(70% 45 30) 0% c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l 0 h / alpha)' assert_true: 'lch(from lch(70% 45 30) l 0 h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c 0 / alpha)' assert_true: 'lch(from lch(70% 45 30) l c 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c 0deg / alpha)' assert_true: 'lch(from lch(70% 45 30) l c 0deg / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c h / 0)' assert_true: 'lch(from lch(70% 45 30) l c h / 0)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) 0% c h / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) 0% c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l 0 h / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l 0 h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c 0 / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c 0deg / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c 0deg / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c h / 0)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c h / 0)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) 25% c h / alpha)' assert_true: 'lch(from lch(70% 45 30) 25% c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l 25 h / alpha)' assert_true: 'lch(from lch(70% 45 30) l 25 h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c 25 / alpha)' assert_true: 'lch(from lch(70% 45 30) l c 25 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c 25deg / alpha)' assert_true: 'lch(from lch(70% 45 30) l c 25deg / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c h / .25)' assert_true: 'lch(from lch(70% 45 30) l c h / .25)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) 25% c h / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) 25% c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l 25 h / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l 25 h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c 25 / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c 25 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c 25deg / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c 25deg / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c h / .25)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c h / .25)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) alpha c h / l)' assert_true: 'lch(from lch(70% 45 30) alpha c h / l)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c c / alpha)' assert_true: 'lch(from lch(70% 45 30) l c c / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) alpha c h / alpha)' assert_true: 'lch(from lch(70% 45 30) alpha c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) alpha c c / alpha)' assert_true: 'lch(from lch(70% 45 30) alpha c c / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) alpha c h / l)' assert_true: 'lch(from lch(70% 45 30 / 40%) alpha c h / l)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c c / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c c / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) alpha c h / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) alpha c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) alpha c c / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) alpha c c / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) calc(l) calc(c) calc(h))' assert_true: 'lch(from lch(70% 45 30) calc(l) calc(c) calc(h))' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))' assert_true: 'lch(from lch(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c h)' assert_true: 'oklch(from oklch(70% 45 30) l c h)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c h/ alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c h/ alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(from oklch(70% 45 30) l c h) l c h)' assert_true: 'oklch(from oklch(from oklch(70% 45 30) l c h) l c h)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from color(display-p3 0 0 0) l c h / alpha)' assert_true: 'oklch(from color(display-p3 0 0 0) l c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklab(70% 45 30) l c h / alpha)' assert_true: 'oklch(from oklab(70% 45 30) l c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) 0% 0 0)' assert_true: 'oklch(from oklch(70% 45 30) 0% 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) 0% 0 0deg)' assert_true: 'oklch(from oklch(70% 45 30) 0% 0 0deg)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) 0% 0 0 / 0)' assert_true: 'oklch(from oklch(70% 45 30) 0% 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) 0% 0 0deg / 0)' assert_true: 'oklch(from oklch(70% 45 30) 0% 0 0deg / 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) 0% c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) 0% c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l 0 h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l 0 h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c 0 / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c 0deg / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c 0deg / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c h / 0)' assert_true: 'oklch(from oklch(70% 45 30) l c h / 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) 0% c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) 0% c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l 0 h / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l 0 h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c 0 / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c 0deg / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c 0deg / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c h / 0)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c h / 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) 25% c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) 25% c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l 25 h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l 25 h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c 25 / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c 25 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c 25deg / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c 25deg / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c h / .25)' assert_true: 'oklch(from oklch(70% 45 30) l c h / .25)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) 25% c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) 25% c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l 25 h / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l 25 h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c 25 / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c 25 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c 25deg / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c 25deg / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c h / .25)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c h / .25)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) alpha c h / l)' assert_true: 'oklch(from oklch(70% 45 30) alpha c h / l)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c c / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c c / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) alpha c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) alpha c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) alpha c c / alpha)' assert_true: 'oklch(from oklch(70% 45 30) alpha c c / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) alpha c h / l)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) alpha c h / l)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c c / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c c / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) alpha c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) alpha c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) alpha c c / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) alpha c c / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) calc(l) calc(c) calc(h))' assert_true: 'oklch(from oklch(70% 45 30) calc(l) calc(c) calc(h))' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))' assert_true: 'oklch(from oklch(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(from color(srgb 0.7 0.5 0.3) srgb r g b) srgb r g b)' assert_true: 'color(from color(from color(srgb 0.7 0.5 0.3) srgb r g b) srgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0 / 0)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 0 g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r 0 b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g 0 / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0 g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0 b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0 / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 0.2 g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 20% g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r 0.2 b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r 20% b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g 0.2 / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g 20% / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0.2)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 20%)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0.2 g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 20% g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0.2 b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 20% b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0.2 / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 20% / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0.2)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 20%)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb g b r)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb b alpha r / g)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r r r / r)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb alpha alpha alpha / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb g b r)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb b alpha r / g)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r r r / r)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb alpha alpha alpha / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb calc(r) calc(g) calc(b))' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb calc(r) calc(g) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b) srgb-linear r g b)' assert_true: 'color(from color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b) srgb-linear r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0 / 0)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0 b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0 / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0 g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0 b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0 / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0.2 g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 20% g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0.2 b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 20% b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0.2 / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 20% / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0.2)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 20%)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0.2 g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 20% g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0.2 b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 20% b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0.2 / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 20% / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0.2)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 20%)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear g b r)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear b alpha r / g)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r r r / r)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear alpha alpha alpha / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear g b r)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear b alpha r / g)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r r r / r)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear alpha alpha alpha / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear calc(r) calc(g) calc(b))' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear calc(r) calc(g) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b) a98-rgb r g b)' assert_true: 'color(from color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b) a98-rgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0 / 0)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0 b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0 / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0 g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0 b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0 / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0.2 g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 20% g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0.2 b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 20% b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0.2 / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 20% / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0.2)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 20%)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0.2 g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 20% g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0.2 b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 20% b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0.2 / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 20% / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0.2)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 20%)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb g b r)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb b alpha r / g)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r r r / r)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb alpha alpha alpha / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb g b r)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb b alpha r / g)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r r r / r)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb alpha alpha alpha / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb calc(r) calc(g) calc(b))' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb calc(r) calc(g) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b) rec2020 r g b)' assert_true: 'color(from color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b) rec2020 r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0 / 0)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0 b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0 / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0 g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0 b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0 / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0.2 g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 20% g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0.2 b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 20% b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0.2 / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 20% / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0.2)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 20%)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0.2 g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 20% g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0.2 b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 20% b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0.2 / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 20% / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0.2)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 20%)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 g b r)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 b alpha r / g)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r r r / r)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 alpha alpha alpha / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 g b r)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 b alpha r / g)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r r r / r)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 alpha alpha alpha / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 calc(r) calc(g) calc(b))' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 calc(r) calc(g) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b) prophoto-rgb r g b)' assert_true: 'color(from color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b) prophoto-rgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0 / 0)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0 b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0 / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0 g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0 b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0 / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0.2 g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 20% g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0.2 b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 20% b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0.2 / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 20% / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0.2)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 20%)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0.2 g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 20% g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0.2 b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 20% b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0.2 / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 20% / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0.2)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 20%)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb g b r)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb b alpha r / g)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r r r / r)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb alpha alpha alpha / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb g b r)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb b alpha r / g)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r r r / r)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb alpha alpha alpha / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb calc(r) calc(g) calc(b))' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb calc(r) calc(g) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(from color(xyz 7 -20.5 100) xyz x y z) xyz x y z)' assert_true: 'color(from color(from color(xyz 7 -20.5 100) xyz x y z) xyz x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz 0 0 0)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz 0 0 0 / 0)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz 0 y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz 0 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x 0 z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x 0 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y 0 / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / 0)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz 0 y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz 0 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x 0 z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x 0 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0 / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz 0.2 y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz 0.2 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x 0.2 z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x 0.2 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y 0.2 / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / 0.2)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / 20%)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz 0.2 y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz 0.2 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x 0.2 z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x 0.2 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0.2 / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0.2)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz y z x)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz y z x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x x x / x)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x x x / x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz y z x)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz y z x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x x x / x)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x x x / x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz calc(x) calc(y) calc(z))' assert_true: 'color(from color(xyz 7 -20.5 100) xyz calc(x) calc(y) calc(z))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz calc(x) calc(y) calc(z) / calc(alpha))' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz calc(x) calc(y) calc(z) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z) xyz-d50 x y z)' assert_true: 'color(from color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z) xyz-d50 x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0 / 0)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0 z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0 / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0 y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0 z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0 / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0.2 y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0.2 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0.2 z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0.2 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0.2 / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0.2)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 20%)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0.2 y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0.2 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0.2 z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0.2 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0.2 / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0.2)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 y z x)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 y z x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x x x / x)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x x x / x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 y z x)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 y z x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x x x / x)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x x x / x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 calc(x) calc(y) calc(z))' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 calc(x) calc(y) calc(z))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 calc(x) calc(y) calc(z) / calc(alpha))' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 calc(x) calc(y) calc(z) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z) xyz-d65 x y z)' assert_true: 'color(from color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z) xyz-d65 x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0 / 0)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0 z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0 / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0 y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0 z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0 / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0.2 y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0.2 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0.2 z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0.2 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0.2 / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0.2)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 20%)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0.2 y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0.2 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0.2 z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0.2 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0.2 / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0.2)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 y z x)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 y z x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x x x / x)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x x x / x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 y z x)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 y z x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x x x / x)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x x x / x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 calc(x) calc(y) calc(z))' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 calc(x) calc(y) calc(z))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 calc(x) calc(y) calc(z) / calc(alpha))' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 calc(x) calc(y) calc(z) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from var(--bg-color) r g b / 80%)' assert_equals: expected "rgba(0, 0, 255, 0.8)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lch(from var(--color) calc(l / 2) c h)' assert_equals: expected "lch(23.138971% 67.989716 134.39125)" but got "rgb(0, 0, 0)" +FAIL Property color value 'rgb(from var(--color) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11))' assert_equals: expected "rgb(76, 76, 76)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lch(from var(--color) l 0 h)' assert_equals: expected "lch(46.277943% 0 134.39125)" but got "rgb(0, 0, 0)" +FAIL Property color value 'rgb(from indianred 255 g b)' assert_true: 'rgb(from indianred 255 g b)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from var(--accent) calc(h + 180deg) s l)' assert_equals: expected "rgb(178, 32, 40)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lab(from var(--mycolor) l a b / 100%)' assert_equals: expected "lab(62.751923% 52.45802 -34.117283)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lab(from var(--mycolor) l a b / calc(alpha * 0.8))' assert_equals: expected "lab(62.751923% 52.45802 -34.117283 / 0.8)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lab(from var(--mycolor) l a b / calc(alpha - 20%))' assert_equals: expected "lab(62.751923% 52.45802 -34.117283 / 0.8)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lab(from var(--mycolor) l 0 0)' assert_equals: expected "lab(62.751923% 0 0)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lch(from peru calc(l * 0.8) c h)' assert_true: 'lch(from peru calc(l * 0.8) c h)' is a supported value for color. expected true got false +FAIL Property color value 'LCH(from var(--accent) l c calc(h + 180deg))' assert_equals: expected "lch(65.49473% 39.446903 10.114471)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lch(from var(--mycolor) l 0 h)' assert_equals: expected "lch(62.751923% 0 326.96112)" but got "rgb(0, 0, 0)" +FAIL Property color value 'var(--mygray)' assert_equals: expected "lch(62.751923% 0 326.96112)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lch(from var(--mygray) l 30 h)' assert_equals: expected "lch(62.751923% 30 326.96112)" but got "rgb(0, 0, 0)" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-computed.html b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-computed.html new file mode 100644 index 0000000..b7eccdb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-computed.html
@@ -0,0 +1,465 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Color 5: Computed value of color using relative color syntax</title> +<link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> +<link rel="help" href="https://drafts.csswg.org/css-color-5/#relative-colors"> +<meta name="assert" content="computed value of color using relative color syntax matches expected values"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +<style> + html { + --bg-color: blue; + --color: green; + --accent: lightseagreen; + --mycolor: orchid; + --mygray: lch(from var(--mycolor) l 0 h); + } +</style> +</head> +<body> +<div id="target"></div> +<script> + // rgb(from ...) + + // Testing no modifications. + test_computed_value(`color`, `rgb(from rebeccapurple r g b)`, `rgb(102, 51, 153)`); + test_computed_value(`color`, `rgb(from rebeccapurple r g b / alpha)`, `rgb(102, 51, 153)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r g b / alpha)`, `rgba(51, 102, 153, 0.8)`); + test_computed_value(`color`, `rgb(from hsl(120deg 20% 50% / .5) r g b / alpha)`, `rgba(102, 153, 102, 0.5)`); + + // Test nesting relative colors. + test_computed_value(`color`, `rgb(from rgb(from rebeccapurple r g b) r g b)`, `rgb(102, 51, 153)`); + + // Testing non-sRGB origin colors to see gamut clipping. + test_computed_value(`color`, `rgb(from color(display-p3 0 1 0) r g b / alpha)`, `rgb(0, 255, 0)`); + + // Testing replacement with 0. + test_computed_value(`color`, `rgb(from rebeccapurple 0 0 0)`, `rgb(0, 0, 0)`); + test_computed_value(`color`, `rgb(from rebeccapurple 0 0 0 / 0)`, `rgba(0, 0, 0, 0)`); + test_computed_value(`color`, `rgb(from rebeccapurple 0 g b / alpha)`, `rgb(0, 51, 153)`); + test_computed_value(`color`, `rgb(from rebeccapurple r 0 b / alpha)`, `rgb(102, 0, 153)`); + test_computed_value(`color`, `rgb(from rebeccapurple r g 0 / alpha)`, `rgb(102, 51, 0)`); + test_computed_value(`color`, `rgb(from rebeccapurple r g b / 0)`, `rgba(102, 51, 153, 0)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) 0 g b / alpha)`, `rgba(0, 102, 153, 0.8)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r 0 b / alpha)`, `rgba(51, 0, 153, 0.8)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r g 0 / alpha)`, `rgba(51, 102, 0, 0.8)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r g b / 0)`, `rgba(51, 102, 153, 0)`); + + // Testing replacement with a number. + test_computed_value(`color`, `rgb(from rebeccapurple 25 g b / alpha)`, `rgb(25, 51, 153)`); + test_computed_value(`color`, `rgb(from rebeccapurple r 25 b / alpha)`, `rgb(102, 25, 153)`); + test_computed_value(`color`, `rgb(from rebeccapurple r g 25 / alpha)`, `rgb(102, 51, 25)`); + test_computed_value(`color`, `rgb(from rebeccapurple r g b / .25)`, `rgba(102, 51, 153, 0.25)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / alpha)`, `rgba(25, 102, 153, 0.8)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / alpha)`, `rgba(51, 25, 153, 0.8)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / alpha)`, `rgba(51, 102, 25, 0.8)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r g b / .20)`, `rgba(51, 102, 153, 0.2)`); + + // Testing replacement with a percentage. + test_computed_value(`color`, `rgb(from rebeccapurple 20% g b / alpha)`, `rgb(51, 51, 153)`); + test_computed_value(`color`, `rgb(from rebeccapurple r 20% b / alpha)`, `rgb(102, 51, 153)`); + test_computed_value(`color`, `rgb(from rebeccapurple r g 20% / alpha)`, `rgb(102, 51, 51)`); + test_computed_value(`color`, `rgb(from rebeccapurple r g b / 20%)`, `rgba(102, 51, 153, 0.2)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) 20% g b / alpha)`, `rgba(51, 102, 153, 0.8)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r 20% b / alpha)`, `rgba(51, 51, 153, 0.8)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r g 20% / alpha)`, `rgba(51, 102, 51, 0.8)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r g b / 20%)`, `rgba(51, 102, 153, 0.2)`); + + // Testing replacement with a number for r, g, b but percent for alpha. + test_computed_value(`color`, `rgb(from rebeccapurple 25 g b / 25%)`, `rgba(25, 51, 153, 0.25)`); + test_computed_value(`color`, `rgb(from rebeccapurple r 25 b / 25%)`, `rgba(102, 25, 153, 0.25)`); + test_computed_value(`color`, `rgb(from rebeccapurple r g 25 / 25%)`, `rgba(102, 51, 25, 0.25)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / 25%)`, `rgba(25, 102, 153, 0.25)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / 25%)`, `rgba(51, 25, 153, 0.25)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / 25%)`, `rgba(51, 102, 25, 0.25)`); + + // Testing permutation. + test_computed_value(`color`, `rgb(from rebeccapurple g b r)`, `rgb(51, 153, 102)`); + test_computed_value(`color`, `rgb(from rebeccapurple b alpha r / g)`, `rgba(153, 255, 102, 0.2)`); + test_computed_value(`color`, `rgb(from rebeccapurple r r r / r)`, `rgba(102, 102, 102, 0.4)`); + test_computed_value(`color`, `rgb(from rebeccapurple alpha alpha alpha / alpha)`, `rgb(255, 255, 255)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) g b r)`, `rgb(102, 153, 51)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) b alpha r / g)`, `rgba(153, 204, 51, 0.4)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r r r / r)`, `rgba(51, 51, 51, 0.2)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) alpha alpha alpha / alpha)`, `rgba(204, 204, 204, 0.8)`); + + // Testing mixes of number and percentage. (These would not be allowed in the non-relative syntax). + test_computed_value(`color`, `rgb(from rebeccapurple r 20% 10)`, `rgb(102, 51, 10)`); + test_computed_value(`color`, `rgb(from rebeccapurple r 10 20%)`, `rgb(102, 10, 51)`); + test_computed_value(`color`, `rgb(from rebeccapurple 0% 10 10)`, `rgb(0, 10, 10)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r 20% 10)`, `rgb(51, 51, 10)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r 10 20%)`, `rgb(51, 10, 51)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) 0% 10 10)`, `rgb(0, 10, 10)`); + + // r g b + // 102 51 153 + // 40% 20% 60%) + // Testing with calc(). + test_computed_value(`color`, `rgb(from rebeccapurple calc(r) calc(g) calc(b))`, `rgb(102, 51, 153)`); + test_computed_value(`color`, `rgb(from rebeccapurple r calc(g * 2) 10)`, `rgb(102, 102, 10)`); + test_computed_value(`color`, `rgb(from rebeccapurple b calc(r * .5) 10)`, `rgb(153, 51, 10)`); + test_computed_value(`color`, `rgb(from rebeccapurple r calc(g * .5 + g * .5) 10)`, `rgb(102, 51, 10)`); + test_computed_value(`color`, `rgb(from rebeccapurple r calc(b * .5 - g * .5) 10)`, `rgb(102, 51, 10)`); + test_computed_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) calc(r) calc(g) calc(b) / calc(alpha))`, `rgba(51, 102, 153, 0.8)`); + + + // hsl(from ...) + + // Testing no modifications. + test_computed_value(`color`, `hsl(from rebeccapurple h s l)`, `rgb(102, 51, 153)`); + test_computed_value(`color`, `hsl(from rebeccapurple h s l / alpha)`, `rgb(102, 51, 153)`); + test_computed_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h s l / alpha)`, `rgba(51, 102, 153, 0.8)`); + test_computed_value(`color`, `hsl(from hsl(120deg 20% 50% / .5) h s l / alpha)`, `rgba(102, 153, 102, 0.5)`); + + // Test nesting relative colors. + test_computed_value(`color`, `hsl(from hsl(from rebeccapurple h s l) h s l)`, `rgb(102, 51, 153)`); + + // Testing non-sRGB origin colors to see gamut clipping. + test_computed_value(`color`, `hsl(from color(display-p3 0 1 0) h s l / alpha)`, `rgb(0, 255, 0)`); + + // Testing replacement with 0. + test_computed_value(`color`, `hsl(from rebeccapurple 0 0% 0%)`, `rgb(0, 0, 0)`); + test_computed_value(`color`, `hsl(from rebeccapurple 0deg 0% 0%)`, `rgb(0, 0, 0)`); + test_computed_value(`color`, `hsl(from rebeccapurple 0 0% 0% / 0)`, `rgba(0, 0, 0, 0)`); + test_computed_value(`color`, `hsl(from rebeccapurple 0deg 0% 0% / 0)`, `rgba(0, 0, 0, 0)`); + test_computed_value(`color`, `hsl(from rebeccapurple 0 s l / alpha)`, `rgb(153, 51, 51)`); + test_computed_value(`color`, `hsl(from rebeccapurple 0deg s l / alpha)`, `rgb(153, 51, 51)`); + test_computed_value(`color`, `hsl(from rebeccapurple h 0% l / alpha)`, `rgb(102, 102, 102)`); + test_computed_value(`color`, `hsl(from rebeccapurple h s 0% / alpha)`, `rgb(0, 0, 0)`); + test_computed_value(`color`, `hsl(from rebeccapurple h s l / 0)`, `rgba(102, 51, 153, 0)`); + test_computed_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) 0 s l / alpha)`, `rgba(153, 51, 51, 0.8)`); + test_computed_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) 0deg s l / alpha)`, `rgba(153, 51, 51, 0.8)`); + test_computed_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h 0% l / alpha)`, `rgba(102, 102, 102, 0.8)`); + test_computed_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h s 0% / alpha)`, `rgba(0, 0, 0, 0.8)`); + test_computed_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h s l / 0)`, `rgba(51, 102, 153, 0)`); + + // Testing replacement with a constant. + test_computed_value(`color`, `hsl(from rebeccapurple 25 s l / alpha)`, `rgb(153, 94, 51)`); + test_computed_value(`color`, `hsl(from rebeccapurple 25deg s l / alpha)`, `rgb(153, 94, 51)`); + test_computed_value(`color`, `hsl(from rebeccapurple h 20% l / alpha)`, `rgb(102, 82, 122)`); + test_computed_value(`color`, `hsl(from rebeccapurple h s 20% / alpha)`, `rgb(51, 25, 77)`); + test_computed_value(`color`, `hsl(from rebeccapurple h s l / .25)`, `rgba(102, 51, 153, 0.25)`); + test_computed_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) 25 s l / alpha)`, `rgba(153, 94, 51, 0.8)`); + test_computed_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) 25deg s l / alpha)`, `rgba(153, 94, 51, 0.8)`); + test_computed_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h 20% l / alpha)`, `rgba(82, 102, 122, 0.8)`); + test_computed_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h s 20% / alpha)`, `rgba(25, 51, 77, 0.8)`); + test_computed_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h s l / .2)`, `rgba(51, 102, 153, 0.2)`); + + // Testing valid permutation (types match). + test_computed_value(`color`, `hsl(from rebeccapurple h l s)`, `rgb(128, 77, 179)`); + test_computed_value(`color`, `hsl(from rebeccapurple h alpha l / s)`, `rgba(102, 0, 204, 0.5)`); + test_computed_value(`color`, `hsl(from rebeccapurple h l l / l)`, `rgba(102, 61, 143, 0.4)`); + test_computed_value(`color`, `hsl(from rebeccapurple h alpha alpha / alpha)`, `rgb(255, 255, 255)`); + test_computed_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h l s)`, `rgb(77, 128, 179)`); + test_computed_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h alpha l / s)`, `rgba(20, 102, 184, 0.5)`); + test_computed_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h l l / l)`, `rgba(61, 102, 143, 0.4)`); + test_computed_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)`, `rgba(163, 204, 245, 0.8)`); + + // Testing with calc(). + test_computed_value(`color`, `hsl(from rebeccapurple calc(h) calc(s) calc(l))`, `rgb(102, 51, 153)`); + test_computed_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) calc(h) calc(s) calc(l) / calc(alpha))`, `rgba(51, 102, 153, 0.8)`); + + + // hwb(from ...) + + // Testing no modifications. + test_computed_value(`color`, `hwb(from rebeccapurple h w b)`, `rgb(102, 51, 153)`); + test_computed_value(`color`, `hwb(from rebeccapurple h w b / alpha)`, `rgb(102, 51, 153)`); + test_computed_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h w b / alpha)`, `rgba(51, 102, 153, 0.8)`); + test_computed_value(`color`, `hwb(from hsl(120deg 20% 50% / .5) h w b / alpha)`, `rgba(102, 153, 102, 0.5)`); + + // Test nesting relative colors. + test_computed_value(`color`, `hwb(from hwb(from rebeccapurple h w b) h w b)`, `rgb(102, 51, 153)`); + + // Testing non-sRGB origin colors to see gamut clipping. + test_computed_value(`color`, `hwb(from color(display-p3 0 1 0) h w b / alpha)`, `rgb(0, 255, 0)`); + + // Testing replacement with 0. + test_computed_value(`color`, `hwb(from rebeccapurple 0 0% 0%)`, `rgb(255, 0, 0)`); + test_computed_value(`color`, `hwb(from rebeccapurple 0deg 0% 0%)`, `rgb(255, 0, 0)`); + test_computed_value(`color`, `hwb(from rebeccapurple 0 0% 0% / 0)`, `rgba(255, 0, 0, 0)`); + test_computed_value(`color`, `hwb(from rebeccapurple 0deg 0% 0% / 0)`, `rgba(255, 0, 0, 0)`); + test_computed_value(`color`, `hwb(from rebeccapurple 0 w b / alpha)`, `rgb(153, 51, 51)`); + test_computed_value(`color`, `hwb(from rebeccapurple 0deg w b / alpha)`, `rgb(153, 51, 51)`); + test_computed_value(`color`, `hwb(from rebeccapurple h 0% b / alpha)`, `rgb(77, 0, 153)`); + test_computed_value(`color`, `hwb(from rebeccapurple h w 0% / alpha)`, `rgb(153, 51, 255)`); + test_computed_value(`color`, `hwb(from rebeccapurple h w b / 0)`, `rgba(102, 51, 153, 0)`); + test_computed_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) 0 w b / alpha)`, `rgba(153, 51, 51, 0.8)`); + test_computed_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) 0deg w b / alpha)`, `rgba(153, 51, 51, 0.8)`); + test_computed_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h 0% b / alpha)`, `rgba(0, 77, 153, 0.8)`); + test_computed_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h w 0% / alpha)`, `rgba(51, 153, 255, 0.8)`); + test_computed_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h w b / 0)`, `rgba(51, 102, 153, 0)`); + + // Testing replacement with a constant. + test_computed_value(`color`, `hwb(from rebeccapurple 25 w b / alpha)`, `rgb(153, 94, 51)`); + test_computed_value(`color`, `hwb(from rebeccapurple 25deg w b / alpha)`, `rgb(153, 94, 51)`); + test_computed_value(`color`, `hwb(from rebeccapurple h 20% b / alpha)`, `rgb(102, 51, 153)`); + test_computed_value(`color`, `hwb(from rebeccapurple h w 20% / alpha)`, `rgb(128, 51, 204)`); + test_computed_value(`color`, `hwb(from rebeccapurple h w b / .2)`, `rgba(102, 51, 153, 0.2)`); + test_computed_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) 25 w b / alpha)`, `rgba(153, 94, 51, 0.8)`); + test_computed_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) 25deg w b / alpha)`, `rgba(153, 94, 51, 0.8)`); + test_computed_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h 20% b / alpha)`, `rgba(51, 102, 153, 0.8)`); + test_computed_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h w 20% / alpha)`, `rgba(51, 128, 204, 0.8)`); + test_computed_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h w b / .2)`, `rgba(51, 102, 153, 0.2)`); + + // Testing valid permutation (types match). + test_computed_value(`color`, `hwb(from rebeccapurple h b w)`, `rgb(153, 102, 204)`); + test_computed_value(`color`, `hwb(from rebeccapurple h alpha w / b)`, `rgba(213, 213, 213, 0.4)`); + test_computed_value(`color`, `hwb(from rebeccapurple h w w / w)`, `rgba(128, 51, 204, 0.2)`); + test_computed_value(`color`, `hwb(from rebeccapurple h alpha alpha / alpha)`, `rgb(128, 128, 128)`); + test_computed_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h b w)`, `rgb(102, 153, 204)`); + test_computed_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h alpha w / b)`, `rgba(204, 204, 204, 0.4)`); + test_computed_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h w w / w)`, `rgba(51, 128, 204, 0.2)`); + test_computed_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)`, `rgba(128, 128, 128, 0.8)`); + + // Testing with calc(). + test_computed_value(`color`, `hwb(from rebeccapurple calc(h) calc(w) calc(b))`, `rgb(102, 51, 153)`); + test_computed_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) calc(h) calc(w) calc(b) / calc(alpha))`, `rgba(51, 102, 153, 0.8)`); + + for (const colorSpace of [ "lab", "oklab" ]) { + // Testing no modifications. + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l a b)`, `${colorSpace}(25% 20 50)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l a b / alpha)`, `${colorSpace}(25% 20 50)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l a b / alpha)`, `${colorSpace}(25% 20 50 / 0.4)`); + + // Test nesting relative colors. + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(from ${colorSpace}(25% 20 50) l a b) l a b)`, `${colorSpace}(25% 20 50)`); + + // Testing non-${colorSpace} origin to see conversion. + test_computed_value(`color`, `${colorSpace}(from color(display-p3 0 0 0) l a b / alpha)`, `${colorSpace}(0% 0 0)`); + + // Testing replacement with 0. + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) 0% 0 0)`, `${colorSpace}(0% 0 0)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) 0% 0 0 / 0)`, `${colorSpace}(0% 0 0 / 0)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) 0% a b / alpha)`, `${colorSpace}(0% 20 50)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l 0 b / alpha)`, `${colorSpace}(25% 0 50)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l a 0 / alpha)`, `${colorSpace}(25% 20 0)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l a b / 0)`, `${colorSpace}(25% 20 50 / 0)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) 0% a b / alpha)`, `${colorSpace}(0% 20 50 / 0.4)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l 0 b / alpha)`, `${colorSpace}(25% 0 50 / 0.4)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l a 0 / alpha)`, `${colorSpace}(25% 20 0 / 0.4)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l a b / 0)`, `${colorSpace}(25% 20 50 / 0)`); + + // Testing replacement with a constant. + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) 35% a b / alpha)`, `${colorSpace}(35% 20 50)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l 35 b / alpha)`, `${colorSpace}(25% 35 50)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l a 35 / alpha)`, `${colorSpace}(25% 20 35)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l a b / .35)`, `${colorSpace}(25% 20 50 / 0.35)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) 35% a b / alpha)`, `${colorSpace}(35% 20 50 / 0.4)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l 35 b / alpha)`, `${colorSpace}(25% 35 50 / 0.4)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l a 35 / alpha)`, `${colorSpace}(25% 20 35 / 0.4)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l a b / .35)`, `${colorSpace}(25% 20 50 / 0.35)`); + + // Testing valid permutation (types match). + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l b a)`, `${colorSpace}(25% 50 20)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l a a / a)`, `${colorSpace}(25% 20 20)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l b a)`, `${colorSpace}(25% 50 20)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l a a / a)`, `${colorSpace}(25% 20 20)`); + + // Testing with calc(). + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) calc(l) calc(a) calc(b))`, `${colorSpace}(25% 20 50)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))`, `${colorSpace}(25% 20 50 / 0.4)`); + } + + for (const colorSpace of [ "lch", "oklch" ]) { + const rectangularForm = colorSpace == "lch" ? "lab" : "oklab"; + + // Testing no modifications. + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c h)`, `${colorSpace}(70% 45 30)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c h / alpha)`, `${colorSpace}(70% 45 30)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l c h/ alpha)`, `${colorSpace}(70% 45 30 / 0.4)`); + + // Test nesting relative colors. + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(from ${colorSpace}(70% 45 30) l c h) l c h)`, `${colorSpace}(70% 45 30)`); + + // Testing non-sRGB origin colors to see gamut clipping. + test_computed_value(`color`, `${colorSpace}(from color(display-p3 0 0 0) l c h / alpha)`, `${colorSpace}(0% 0 0)`); + test_computed_value(`color`, `${colorSpace}(from ${rectangularForm}(70% 45 30) l c h / alpha)`, `${colorSpace}(70% 54.08327 33.690067)`); + + // Testing replacement with 0. + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) 0% 0 0)`, `${colorSpace}(0% 0 0)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) 0% 0 0deg)`, `${colorSpace}(0% 0 0)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) 0% 0 0 / 0)`, `${colorSpace}(0% 0 0 / 0)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) 0% 0 0deg / 0)`, `${colorSpace}(0% 0 0 / 0)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) 0% c h / alpha)`, `${colorSpace}(0% 45 30)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l 0 h / alpha)`, `${colorSpace}(70% 0 30)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c 0 / alpha)`, `${colorSpace}(70% 45 0)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c 0deg / alpha)`, `${colorSpace}(70% 45 0)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c h / 0)`, `${colorSpace}(70% 45 30 / 0)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) 0% c h / alpha)`, `${colorSpace}(0% 45 30 / 0.4)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l 0 h / alpha)`, `${colorSpace}(70% 0 30 / 0.4)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l c 0 / alpha)`, `${colorSpace}(70% 45 0 / 0.4)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l c 0deg / alpha)`, `${colorSpace}(70% 45 0 / 0.4)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l c h / 0)`, `${colorSpace}(70% 45 30 / 0)`); + + // Testing replacement with a constant. + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) 25% c h / alpha)`, `${colorSpace}(25% 45 30)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l 25 h / alpha)`, `${colorSpace}(70% 25 30)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c 25 / alpha)`, `${colorSpace}(70% 45 25)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c 25deg / alpha)`, `${colorSpace}(70% 45 25)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c h / .25)`, `${colorSpace}(70% 45 30 / 0.25)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) 25% c h / alpha)`, `${colorSpace}(25% 45 30 / 0.4)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l 25 h / alpha)`, `${colorSpace}(70% 25 30 / 0.4)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l c 25 / alpha)`, `${colorSpace}(70% 45 25 / 0.4)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l c 25deg / alpha)`, `${colorSpace}(70% 45 25 / 0.4)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l c h / .25)`, `${colorSpace}(70% 45 30 / 0.25)`); + + // Testing valid permutation (types match). + // NOTE: 'c' is a vaild hue, as hue is <angle>|<number>. + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) alpha c h / l)`, `${colorSpace}(100% 45 30 / 0.7)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c c / alpha)`, `${colorSpace}(70% 45 45)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) alpha c h / alpha)`, `${colorSpace}(100% 45 30)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) alpha c c / alpha)`, `${colorSpace}(100% 45 45)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) alpha c h / l)`, `${colorSpace}(40% 45 30 / 0.7)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l c c / alpha)`, `${colorSpace}(70% 45 45 / 0.4)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) alpha c h / alpha)`, `${colorSpace}(40% 45 30 / 0.4)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) alpha c c / alpha)`, `${colorSpace}(40% 45 45 / 0.4)`); + + // Testing with calc(). + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) calc(l) calc(c) calc(h))`, `${colorSpace}(70% 45 30)`); + test_computed_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))`, `${colorSpace}(70% 45 30 / 0.4)`); + } + + for (const colorSpace of [ "srgb", "srgb-linear", "a98-rgb", "rec2020", "prophoto-rgb" ]) { + // Testing no modifications. + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g b)`, `color(${colorSpace} 0.7 0.5 0.3)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g b / alpha)`, `color(${colorSpace} 0.7 0.5 0.3)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r g b)`, `color(${colorSpace} 0.7 0.5 0.3)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r g b / alpha)`, `color(${colorSpace} 0.7 0.5 0.3 / 0.4)`); + + // Test nesting relative colors. + test_computed_value(`color`, `color(from color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g b) ${colorSpace} r g b)`, `color(${colorSpace} 0.7 0.5 0.3)`); + + // Testing replacement with 0. + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} 0 0 0)`, `color(${colorSpace} 0 0 0)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} 0 0 0 / 0)`, `color(${colorSpace} 0 0 0 / 0)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} 0 g b / alpha)`, `color(${colorSpace} 0 0.5 0.3)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r 0 b / alpha)`, `color(${colorSpace} 0.7 0 0.3)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g 0 / alpha)`, `color(${colorSpace} 0.7 0.5 0)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g b / 0)`, `color(${colorSpace} 0.7 0.5 0.3 / 0)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} 0 g b / alpha)`, `color(${colorSpace} 0 0.5 0.3 / 0.4)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r 0 b / alpha)`, `color(${colorSpace} 0.7 0 0.3 / 0.4)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r g 0 / alpha)`, `color(${colorSpace} 0.7 0.5 0 / 0.4)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r g b / 0)`, `color(${colorSpace} 0.7 0.5 0.3 / 0)`); + + // Testing replacement with a constant. + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} 0.2 g b / alpha)`, `color(${colorSpace} 0.2 0.5 0.3)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} 20% g b / alpha)`, `color(${colorSpace} 0.2 0.5 0.3)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r 0.2 b / alpha)`, `color(${colorSpace} 0.7 0.2 0.3)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r 20% b / alpha)`, `color(${colorSpace} 0.7 0.2 0.3)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g 0.2 / alpha)`, `color(${colorSpace} 0.7 0.5 0.2)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g 20% / alpha)`, `color(${colorSpace} 0.7 0.5 0.2)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g b / 0.2)`, `color(${colorSpace} 0.7 0.5 0.3 / 0.2)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g b / 20%)`, `color(${colorSpace} 0.7 0.5 0.3 / 0.2)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} 0.2 g b / alpha)`, `color(${colorSpace} 0.2 0.5 0.3 / 0.4)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} 20% g b / alpha)`, `color(${colorSpace} 0.2 0.5 0.3 / 0.4)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r 0.2 b / alpha)`, `color(${colorSpace} 0.7 0.2 0.3 / 0.4)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r 20% b / alpha)`, `color(${colorSpace} 0.7 0.2 0.3 / 0.4)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r g 0.2 / alpha)`, `color(${colorSpace} 0.7 0.5 0.2 / 0.4)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r g 20% / alpha)`, `color(${colorSpace} 0.7 0.5 0.2 / 0.4)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r g b / 0.2)`, `color(${colorSpace} 0.7 0.5 0.3 / 0.2)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r g b / 20%)`, `color(${colorSpace} 0.7 0.5 0.3 / 0.2)`); + + // Testing valid permutation (types match). + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} g b r)`, `color(${colorSpace} 0.5 0.3 0.7)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} b alpha r / g)`, `color(${colorSpace} 0.3 1 0.7 / 0.5)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r r r / r)`, `color(${colorSpace} 0.7 0.7 0.7 / 0.7)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} alpha alpha alpha / alpha)`, `color(${colorSpace} 1 1 1)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} g b r)`, `color(${colorSpace} 0.5 0.3 0.7)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} b alpha r / g)`, `color(${colorSpace} 0.3 0.4 0.7 / 0.5)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r r r / r)`, `color(${colorSpace} 0.7 0.7 0.7 / 0.7)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} alpha alpha alpha / alpha)`, `color(${colorSpace} 0.4 0.4 0.4 / 0.4)`); + + // Testing with calc(). + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} calc(r) calc(g) calc(b))`, `color(${colorSpace} 0.7 0.5 0.3)`); + test_computed_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} calc(r) calc(g) calc(b) / calc(alpha))`, `color(${colorSpace} 0.7 0.5 0.3 / 0.4)`); + } + + for (const colorSpace of [ "xyz", "xyz-d50", "xyz-d65" ]) { + const resultColorSpace = colorSpace == "xyz" ? "xyz-d65" : colorSpace; + + // Testing no modifications. + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y z)`, `color(${resultColorSpace} 7 -20.5 100)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y z / alpha)`, `color(${resultColorSpace} 7 -20.5 100)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x y z)`, `color(${resultColorSpace} 7 -20.5 100)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x y z / alpha)`, `color(${resultColorSpace} 7 -20.5 100 / 0.4)`); + + // Test nesting relative colors. + test_computed_value(`color`, `color(from color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y z) ${colorSpace} x y z)`, `color(${resultColorSpace} 7 -20.5 100)`); + + // Testing replacement with 0. + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} 0 0 0)`, `color(${resultColorSpace} 0 0 0)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} 0 0 0 / 0)`, `color(${resultColorSpace} 0 0 0 / 0)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} 0 y z / alpha)`, `color(${resultColorSpace} 0 -20.5 100)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x 0 z / alpha)`, `color(${resultColorSpace} 7 0 100)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y 0 / alpha)`, `color(${resultColorSpace} 7 -20.5 0)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y z / 0)`, `color(${resultColorSpace} 7 -20.5 100 / 0)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} 0 y z / alpha)`, `color(${resultColorSpace} 0 -20.5 100 / 0.4)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x 0 z / alpha)`, `color(${resultColorSpace} 7 0 100 / 0.4)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x y 0 / alpha)`, `color(${resultColorSpace} 7 -20.5 0 / 0.4)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x y z / 0)`, `color(${resultColorSpace} 7 -20.5 100 / 0)`); + + // Testing replacement with a constant. + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} 0.2 y z / alpha)`, `color(${resultColorSpace} 0.2 -20.5 100)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x 0.2 z / alpha)`, `color(${resultColorSpace} 7 0.2 100)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y 0.2 / alpha)`, `color(${resultColorSpace} 7 -20.5 0.2)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y z / 0.2)`, `color(${resultColorSpace} 7 -20.5 100 / 0.2)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y z / 20%)`, `color(${resultColorSpace} 7 -20.5 100 / 0.2)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} 0.2 y z / alpha)`, `color(${resultColorSpace} 0.2 -20.5 100 / 0.4)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x 0.2 z / alpha)`, `color(${resultColorSpace} 7 0.2 100 / 0.4)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x y 0.2 / alpha)`, `color(${resultColorSpace} 7 -20.5 0.2 / 0.4)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x y z / 0.2)`, `color(${resultColorSpace} 7 -20.5 100 / 0.2)`); + + // Testing valid permutation (types match). + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} y z x)`, `color(${resultColorSpace} -20.5 100 7)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x x x / x)`, `color(${resultColorSpace} 7 7 7)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} y z x)`, `color(${resultColorSpace} -20.5 100 7)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x x x / x)`, `color(${resultColorSpace} 7 7 7)`); + + // Testing with calc(). + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} calc(x) calc(y) calc(z))`, `color(${resultColorSpace} 7 -20.5 100)`); + test_computed_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} calc(x) calc(y) calc(z) / calc(alpha))`, `color(${resultColorSpace} 7 -20.5 100 / 0.4)`); + } + + // Spec Examples + + // Example 11. + test_computed_value(`color`, `rgb(from var(--bg-color) r g b / 80%)`, `rgba(0, 0, 255, 0.8)`); + + // Example 12. + test_computed_value(`color`, `lch(from var(--color) calc(l / 2) c h)`, `lch(23.138971% 67.989716 134.39125)`); + + // Example 13. + test_computed_value(`color`, `rgb(from var(--color) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11))`, `rgb(76, 76, 76)`) + test_computed_value(`color`, `lch(from var(--color) l 0 h)`, `lch(46.277943% 0 134.39125)`) + + // Example 14. + test_computed_value(`color`, `rgb(from indianred 255 g b)`, `rgb(255, 92, 92)`); + + // Example 15. + test_computed_value(`color`, `hsl(from var(--accent) calc(h + 180deg) s l)`, `rgb(178, 32, 40)`); + + // Example 16. + test_computed_value(`color`, `lab(from var(--mycolor) l a b / 100%)`, `lab(62.751923% 52.45802 -34.117283)`); + test_computed_value(`color`, `lab(from var(--mycolor) l a b / calc(alpha * 0.8))`, `lab(62.751923% 52.45802 -34.117283 / 0.8)`); + test_computed_value(`color`, `lab(from var(--mycolor) l a b / calc(alpha - 20%))`, `lab(62.751923% 52.45802 -34.117283 / 0.8)`); + + // Example 17. + test_computed_value(`color`, `lab(from var(--mycolor) l 0 0)`, `lab(62.751923% 0 0)`); + + // Example 18. + test_computed_value(`color`, `lch(from peru calc(l * 0.8) c h)`, `lch(49.80138% 54.003296 63.680317)`); + + // Example 19. + test_computed_value(`color`, `LCH(from var(--accent) l c calc(h + 180deg))`, `lch(65.49473% 39.446903 10.114471)`); + + // Example 20. + test_computed_value(`color`, `lch(from var(--mycolor) l 0 h)`, `lch(62.751923% 0 326.96112)`); + test_computed_value(`color`, `var(--mygray)`, `lch(62.751923% 0 326.96112)`); + test_computed_value(`color`, `lch(from var(--mygray) l 30 h)`, `lch(62.751923% 30 326.96112)`); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-invalid.html new file mode 100644 index 0000000..c6f19e1e8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-invalid.html
@@ -0,0 +1,159 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Color 5: Invalid relative syntax colors</title> +<link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> +<link rel="help" href="https://drafts.csswg.org/css-color-5/#relative-colors"> +<meta name="assert" content="invalid colors using relative color syntax fail to parse"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> + // rgb(from ...) + + // Testing invalid values + test_invalid_value(`color`, `rgb(from rebeccapurple r 10deg 10)`); + test_invalid_value(`color`, `rgb(from rebeccapurple r 10 10deg)`); + test_invalid_value(`color`, `rgb(from rebeccapurple 10deg g b)`); + test_invalid_value(`color`, `rgb(from rgb(10%, 20%, 30%, 40%) r 10deg 10)`); + test_invalid_value(`color`, `rgb(from rgb(10%, 20%, 30%, 40%) r 10 10deg)`); + test_invalid_value(`color`, `rgb(from rgb(10%, 20%, 30%, 40%) 10deg g b)`); + + // Testing invalid component names + test_invalid_value(`color`, `rgb(from rebeccapurple red g b)`); + test_invalid_value(`color`, `rgb(from rebeccapurple l g b)`); + test_invalid_value(`color`, `rgb(from rebeccapurple h g b)`); + + + // hsl(from ...) + + // Testing invalid permutation (types don't match). + test_invalid_value(`color`, `hsl(from rebeccapurple s h l)`); + test_invalid_value(`color`, `hsl(from rebeccapurple s s s / s)`); + test_invalid_value(`color`, `hsl(from rebeccapurple h h h / h)`); + test_invalid_value(`color`, `hsl(from rebeccapurple alpha alpha alpha / alpha)`); + test_invalid_value(`color`, `hsl(from rgb(10%, 20%, 30%, 40%) s h l)`); + test_invalid_value(`color`, `hsl(from rgb(10%, 20%, 30%, 40%) s s s / s)`); + test_invalid_value(`color`, `hsl(from rgb(10%, 20%, 30%, 40%) h h h / h)`); + test_invalid_value(`color`, `hsl(from rgb(10%, 20%, 30%, 40%) alpha alpha alpha / alpha)`); + + // Testing invalid values. + test_invalid_value(`color`, `hsl(from rebeccapurple h 10% 10)`); + test_invalid_value(`color`, `hsl(from rebeccapurple h 10 10%)`); + test_invalid_value(`color`, `hsl(from rebeccapurple 10% s l)`); + test_invalid_value(`color`, `hsl(from rgb(10%, 20%, 30%, 40%) h 10% 10)`); + test_invalid_value(`color`, `hsl(from rgb(10%, 20%, 30%, 40%) h 10 10%)`); + test_invalid_value(`color`, `hsl(from rgb(10%, 20%, 30%, 40%) 10% s l)`); + + // Testing invalid component names + test_invalid_value(`color`, `hsl(from rebeccapurple hue s l)`); + test_invalid_value(`color`, `hsl(from rebeccapurple x s l)`); + test_invalid_value(`color`, `hsl(from rebeccapurple h g b)`); + + + // hwb(from ...) + + // Testing invalid permutation (types don't match). + test_invalid_value(`color`, `hwb(from rebeccapurple w h b)`); + test_invalid_value(`color`, `hwb(from rebeccapurple b b b / b)`); + test_invalid_value(`color`, `hwb(from rebeccapurple h h h / h)`); + test_invalid_value(`color`, `hwb(from rebeccapurple alpha alpha alpha / alpha)`); + test_invalid_value(`color`, `hwb(from rgb(10%, 20%, 30%, 40%) w b h)`); + test_invalid_value(`color`, `hwb(from rgb(10%, 20%, 30%, 40%) b b b / b)`); + test_invalid_value(`color`, `hwb(from rgb(10%, 20%, 30%, 40%) h h h / h)`); + test_invalid_value(`color`, `hwb(from rgb(10%, 20%, 30%, 40%) alpha alpha alpha / alpha)`); + + // Testing invalid values. + test_invalid_value(`color`, `hwb(from rebeccapurple h 10% 10)`); + test_invalid_value(`color`, `hwb(from rebeccapurple h 10 10%)`); + test_invalid_value(`color`, `hwb(from rebeccapurple 10% w b)`); + test_invalid_value(`color`, `hwb(from rgb(10%, 20%, 30%, 40%) h 10% 10)`); + test_invalid_value(`color`, `hwb(from rgb(10%, 20%, 30%, 40%) h 10 10%)`); + test_invalid_value(`color`, `hwb(from rgb(10%, 20%, 30%, 40%) 10% w b)`); + + // Testing invalid component names + test_invalid_value(`color`, `hwb(from rebeccapurple hue w b)`); + test_invalid_value(`color`, `hwb(from rebeccapurple x w b)`); + test_invalid_value(`color`, `hwb(from rebeccapurple h g b)`); + + for (const colorSpace of [ "lab", "oklab" ]) { + // Testing invalid permutation (types don't match). + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l alpha a / b)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l alpha alpha / alpha)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l alpha a / b)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l alpha alpha / alpha)`); + + // Testing invalid values. + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l 10% 10)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l 10 10%)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) 10 a b)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l 10% 10)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l 10 10%)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) 10 a b)`); + + // Testing invalid component names + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) lightness a b)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) x a b)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) h g b)`); + } + + for (const colorSpace of [ "lch", "oklch" ]) { + // Testing invalid permutation (types don't match). + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) h l c / alpha)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) c c c / c)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) alpha alpha alpha / alpha)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) h l c / alpha)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) c c c / c)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) alpha alpha alpha / alpha)`); + + // Testing invalid values. + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l 10% h)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c 10%)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) 10 c h)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l 10% h)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l c 10%)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) 10 c h)`); + + // Testing invalid component names + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) lightness c h)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) x c h)`); + test_invalid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l g b)`); + } + + for (const colorSpace of [ "srgb", "srgb-linear", "a98-rgb", "rec2020", "prophoto-rgb" ]) { + // Testing invalid values. + test_invalid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} 10deg g b)`, `rgba(0, 0, 0, 0)`); + test_invalid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r 10deg b)`, `rgba(0, 0, 0, 0)`); + test_invalid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g 10deg)`, `rgba(0, 0, 0, 0)`); + test_invalid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g b / 10deg)`, `rgba(0, 0, 0, 0)`); + + // Testing invalid component names + test_invalid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} red g b)`, `rgba(0, 0, 0, 0)`); + test_invalid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} x g b)`, `rgba(0, 0, 0, 0)`); + test_invalid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} l g b)`, `rgba(0, 0, 0, 0)`); + } + + for (const colorSpace of [ "xyz", "xyz-d50", "xyz-d65" ]) { + // Testing invalid permutation (types don't match). + test_invalid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} z alpha x / y)`, `rgba(0, 0, 0, 0)`); + test_invalid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} alpha alpha alpha / alpha)`, `rgba(0, 0, 0, 0)`); + test_invalid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} z alpha x / y)`, `rgba(0, 0, 0, 0)`); + test_invalid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} alpha alpha alpha / alpha)`, `rgba(0, 0, 0, 0)`); + + // Testing invalid values. + test_invalid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} 10deg y z)`, `rgba(0, 0, 0, 0)`); + test_invalid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x 10deg z)`, `rgba(0, 0, 0, 0)`); + test_invalid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y 10deg)`, `rgba(0, 0, 0, 0)`); + test_invalid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y z / 10deg)`, `rgba(0, 0, 0, 0)`); + + // Testing invalid component names + test_invalid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} red y)`, `rgba(0, 0, 0, 0)`); + test_invalid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} r y z)`, `rgba(0, 0, 0, 0)`); + test_invalid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} l y z)`, `rgba(0, 0, 0, 0)`); + } +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-valid-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-valid-expected.txt new file mode 100644 index 0000000..feb3805 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-valid-expected.txt
@@ -0,0 +1,590 @@ +This is a testharness.js-based test. +Found 586 tests; 13 PASS, 573 FAIL, 0 TIMEOUT, 0 NOTRUN. +FAIL e.style['color'] = "rgb(from rebeccapurple r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from hsl(120deg 20% 50% / .5) r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(from rebeccapurple r g b) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from color(display-p3 0 1 0) r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple 25 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r 25 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r g 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r g b / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g b / .20)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple 25 g b / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r 25 b / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r g 25 / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r 20% 10)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r 10 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple 0% 10 10)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 20% 10)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 10 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) 0% 10 10)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r calc(g * 2) 10)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple b calc(r * .5) 10)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r calc(g * .5 + g * .5) 10)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rebeccapurple r calc(b * .5 - g * .5) 10)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from hsl(120deg 20% 50% / .5) h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from hsl(from rebeccapurple h s l) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from color(display-p3 0 1 0) h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple 0 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple 0deg 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple 0 0% 0% / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple 0deg 0% 0% / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple 0 s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple 0deg s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple h 0% l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple h s 0% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple h s l / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) 0 s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) 0deg s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h 0% l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h s 0% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h s l / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple 25 s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple 25deg s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple h 20% l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple h s 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple h s l / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) 25 s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) 25deg s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h 20% l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h s 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h s l / .2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple h l s)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple h alpha l / s)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple h l l / l)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple h alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h l s)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h alpha l / s)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h l l / l)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rebeccapurple calc(h) calc(s) calc(l))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) calc(h) calc(s) calc(l) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from hsl(120deg 20% 50% / .5) h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from hwb(from rebeccapurple h w b) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from color(display-p3 0 1 0) h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple 0 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple 0deg 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple 0 0% 0% / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple 0deg 0% 0% / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple 0 w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple 0deg w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple h 0% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple h w 0% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple h w b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) 0 w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) 0deg w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h 0% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w 0% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple 25 w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple 25deg w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple h 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple h w 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple h w b / .2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) 25 w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) 25deg w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w b / .2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple h b w)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple h alpha w / b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple h w w / w)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple h alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h b w)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h alpha w / b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w w / w)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rebeccapurple calc(h) calc(w) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) calc(h) calc(w) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(from lab(25% 20 50) l a b) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from color(display-p3 0 0 0) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50) 0% 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50) 0% 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50) 0% a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50) l 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50) l a 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50) l a b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) 0% a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l a 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l a b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50) 35% a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50) l 35 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50) l a 35 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50) l a b / .35)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) 35% a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l 35 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l a 35 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l a b / .35)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50) l b a)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50) l a a / a)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l b a)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l a a / a)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50) calc(l) calc(a) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(from oklab(25% 20 50) l a b) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from color(display-p3 0 0 0) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50) 0% 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50) 0% 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50) 0% a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l a 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l a b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) 0% a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l a 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l a b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50) 35% a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l 35 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l a 35 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l a b / .35)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) 35% a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l 35 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l a 35 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l a b / .35)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l b a)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l a a / a)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l b a)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l a a / a)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50) calc(l) calc(a) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c h/ alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(from lch(70% 45 30) l c h) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from color(display-p3 0 0 0) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lab(70% 45 30) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) 0% 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) 0% 0 0deg)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) 0% 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) 0% 0 0deg / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) 0% c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) l 0 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) l c 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) l c 0deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) l c h / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) 0% c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l 0 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c 0deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c h / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) 25% c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) l 25 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) l c 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) l c 25deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) l c h / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) 25% c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l 25 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c 25deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c h / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) alpha c h / l)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) l c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) alpha c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) alpha c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) alpha c h / l)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) alpha c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) alpha c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30) calc(l) calc(c) calc(h))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c h/ alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(from oklch(70% 45 30) l c h) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from color(display-p3 0 0 0) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklab(70% 45 30) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) 0% 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) 0% 0 0deg)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) 0% 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) 0% 0 0deg / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) 0% c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l 0 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c 0deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c h / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) 0% c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l 0 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c 0deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c h / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) 25% c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l 25 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c 25deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c h / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) 25% c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l 25 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c 25deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c h / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) alpha c h / l)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) alpha c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) alpha c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) alpha c h / l)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) alpha c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) alpha c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30) calc(l) calc(c) calc(h))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(from color(srgb 0.7 0.5 0.3) srgb r g b) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(from color(xyz 7 -20.5 100) xyz x y z) xyz x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y z / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz calc(x) calc(y) calc(z))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz calc(x) calc(y) calc(z) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z) xyz-d50 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 calc(x) calc(y) calc(z))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 calc(x) calc(y) calc(z) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z) xyz-d65 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 calc(x) calc(y) calc(z))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 calc(x) calc(y) calc(z) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" +PASS e.style['color'] = "rgb(from var(--bg-color) r g b / 80%)" should set the property value +PASS e.style['color'] = "lch(from var(--color) calc(l / 2) c h)" should set the property value +PASS e.style['color'] = "rgb(from var(--color) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11))" should set the property value +PASS e.style['color'] = "lch(from var(--color) l 0 h)" should set the property value +FAIL e.style['color'] = "rgb(from indianred 255 g b)" should set the property value assert_not_equals: property should be set got disallowed value "" +PASS e.style['color'] = "hsl(from var(--accent) calc(h + 180deg) s l)" should set the property value +PASS e.style['color'] = "lab(from var(--mycolor) l a b / 100%)" should set the property value +PASS e.style['color'] = "lab(from var(--mycolor) l a b / calc(alpha * 0.8))" should set the property value +PASS e.style['color'] = "lab(from var(--mycolor) l a b / calc(alpha - 20%))" should set the property value +PASS e.style['color'] = "lab(from var(--mycolor) l 0 0)" should set the property value +FAIL e.style['color'] = "lch(from peru calc(l * 0.8) c h)" should set the property value assert_not_equals: property should be set got disallowed value "" +PASS e.style['color'] = "LCH(from var(--accent) l c calc(h + 180deg))" should set the property value +PASS e.style['color'] = "lch(from var(--mycolor) l 0 h)" should set the property value +PASS e.style['color'] = "var(--mygray)" should set the property value +PASS e.style['color'] = "lch(from var(--mygray) l 30 h)" should set the property value +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-valid.html b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-valid.html new file mode 100644 index 0000000..25793963 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/relative-color-valid.html
@@ -0,0 +1,464 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Color 5: Parsing and serialization of colors using relative color syntax</title> +<link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com"> +<link rel="help" href="https://drafts.csswg.org/css-color-5/#relative-colors"> +<meta name="assert" content="colors using relative color syntax parse and serialize as expected"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +<style> + html { + --bg-color: blue; + --color: green; + --accent: lightseagreen; + --mycolor: orchid; + --mygray: lch(from var(--mycolor) l 0 h); + } +</style> +</head> +<body> +<script> + // rgb(from ...) + + // Testing no modifications. + test_valid_value(`color`, `rgb(from rebeccapurple r g b)`, `rgb(102, 51, 153)`); + test_valid_value(`color`, `rgb(from rebeccapurple r g b / alpha)`, `rgb(102, 51, 153)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r g b / alpha)`, `rgba(51, 102, 153, 0.8)`); + test_valid_value(`color`, `rgb(from hsl(120deg 20% 50% / .5) r g b / alpha)`, `rgba(102, 153, 102, 0.5)`); + + // Test nesting relative colors. + test_valid_value(`color`, `rgb(from rgb(from rebeccapurple r g b) r g b)`, `rgb(102, 51, 153)`); + + // Testing non-sRGB origin colors to see gamut clipping. + test_valid_value(`color`, `rgb(from color(display-p3 0 1 0) r g b / alpha)`, `rgb(0, 255, 0)`); + + // Testing replacement with 0. + test_valid_value(`color`, `rgb(from rebeccapurple 0 0 0)`, `rgb(0, 0, 0)`); + test_valid_value(`color`, `rgb(from rebeccapurple 0 0 0 / 0)`, `rgba(0, 0, 0, 0)`); + test_valid_value(`color`, `rgb(from rebeccapurple 0 g b / alpha)`, `rgb(0, 51, 153)`); + test_valid_value(`color`, `rgb(from rebeccapurple r 0 b / alpha)`, `rgb(102, 0, 153)`); + test_valid_value(`color`, `rgb(from rebeccapurple r g 0 / alpha)`, `rgb(102, 51, 0)`); + test_valid_value(`color`, `rgb(from rebeccapurple r g b / 0)`, `rgba(102, 51, 153, 0)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) 0 g b / alpha)`, `rgba(0, 102, 153, 0.8)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r 0 b / alpha)`, `rgba(51, 0, 153, 0.8)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r g 0 / alpha)`, `rgba(51, 102, 0, 0.8)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r g b / 0)`, `rgba(51, 102, 153, 0)`); + + // Testing replacement with a number. + test_valid_value(`color`, `rgb(from rebeccapurple 25 g b / alpha)`, `rgb(25, 51, 153)`); + test_valid_value(`color`, `rgb(from rebeccapurple r 25 b / alpha)`, `rgb(102, 25, 153)`); + test_valid_value(`color`, `rgb(from rebeccapurple r g 25 / alpha)`, `rgb(102, 51, 25)`); + test_valid_value(`color`, `rgb(from rebeccapurple r g b / .25)`, `rgba(102, 51, 153, 0.25)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / alpha)`, `rgba(25, 102, 153, 0.8)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / alpha)`, `rgba(51, 25, 153, 0.8)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / alpha)`, `rgba(51, 102, 25, 0.8)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r g b / .20)`, `rgba(51, 102, 153, 0.2)`); + + // Testing replacement with a percentage. + test_valid_value(`color`, `rgb(from rebeccapurple 20% g b / alpha)`, `rgb(51, 51, 153)`); + test_valid_value(`color`, `rgb(from rebeccapurple r 20% b / alpha)`, `rgb(102, 51, 153)`); + test_valid_value(`color`, `rgb(from rebeccapurple r g 20% / alpha)`, `rgb(102, 51, 51)`); + test_valid_value(`color`, `rgb(from rebeccapurple r g b / 20%)`, `rgba(102, 51, 153, 0.2)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) 20% g b / alpha)`, `rgba(51, 102, 153, 0.8)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r 20% b / alpha)`, `rgba(51, 51, 153, 0.8)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r g 20% / alpha)`, `rgba(51, 102, 51, 0.8)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r g b / 20%)`, `rgba(51, 102, 153, 0.2)`); + + // Testing replacement with a number for r, g, b but percent for alpha. + test_valid_value(`color`, `rgb(from rebeccapurple 25 g b / 25%)`, `rgba(25, 51, 153, 0.25)`); + test_valid_value(`color`, `rgb(from rebeccapurple r 25 b / 25%)`, `rgba(102, 25, 153, 0.25)`); + test_valid_value(`color`, `rgb(from rebeccapurple r g 25 / 25%)`, `rgba(102, 51, 25, 0.25)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / 25%)`, `rgba(25, 102, 153, 0.25)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / 25%)`, `rgba(51, 25, 153, 0.25)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / 25%)`, `rgba(51, 102, 25, 0.25)`); + + // Testing permutation. + test_valid_value(`color`, `rgb(from rebeccapurple g b r)`, `rgb(51, 153, 102)`); + test_valid_value(`color`, `rgb(from rebeccapurple b alpha r / g)`, `rgba(153, 255, 102, 0.2)`); + test_valid_value(`color`, `rgb(from rebeccapurple r r r / r)`, `rgba(102, 102, 102, 0.4)`); + test_valid_value(`color`, `rgb(from rebeccapurple alpha alpha alpha / alpha)`, `rgb(255, 255, 255)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) g b r)`, `rgb(102, 153, 51)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) b alpha r / g)`, `rgba(153, 204, 51, 0.4)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r r r / r)`, `rgba(51, 51, 51, 0.2)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) alpha alpha alpha / alpha)`, `rgba(204, 204, 204, 0.8)`); + + // Testing mixes of number and percentage. (These would not be allowed in the non-relative syntax). + test_valid_value(`color`, `rgb(from rebeccapurple r 20% 10)`, `rgb(102, 51, 10)`); + test_valid_value(`color`, `rgb(from rebeccapurple r 10 20%)`, `rgb(102, 10, 51)`); + test_valid_value(`color`, `rgb(from rebeccapurple 0% 10 10)`, `rgb(0, 10, 10)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r 20% 10)`, `rgb(51, 51, 10)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) r 10 20%)`, `rgb(51, 10, 51)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) 0% 10 10)`, `rgb(0, 10, 10)`); + + // r g b + // 102 51 153 + // 40% 20% 60%) + // Testing with calc(). + test_valid_value(`color`, `rgb(from rebeccapurple calc(r) calc(g) calc(b))`, `rgb(102, 51, 153)`); + test_valid_value(`color`, `rgb(from rebeccapurple r calc(g * 2) 10)`, `rgb(102, 102, 10)`); + test_valid_value(`color`, `rgb(from rebeccapurple b calc(r * .5) 10)`, `rgb(153, 51, 10)`); + test_valid_value(`color`, `rgb(from rebeccapurple r calc(g * .5 + g * .5) 10)`, `rgb(102, 51, 10)`); + test_valid_value(`color`, `rgb(from rebeccapurple r calc(b * .5 - g * .5) 10)`, `rgb(102, 51, 10)`); + test_valid_value(`color`, `rgb(from rgb(20%, 40%, 60%, 80%) calc(r) calc(g) calc(b) / calc(alpha))`, `rgba(51, 102, 153, 0.8)`); + + + // hsl(from ...) + + // Testing no modifications. + test_valid_value(`color`, `hsl(from rebeccapurple h s l)`, `rgb(102, 51, 153)`); + test_valid_value(`color`, `hsl(from rebeccapurple h s l / alpha)`, `rgb(102, 51, 153)`); + test_valid_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h s l / alpha)`, `rgba(51, 102, 153, 0.8)`); + test_valid_value(`color`, `hsl(from hsl(120deg 20% 50% / .5) h s l / alpha)`, `rgba(102, 153, 102, 0.5)`); + + // Test nesting relative colors. + test_valid_value(`color`, `hsl(from hsl(from rebeccapurple h s l) h s l)`, `rgb(102, 51, 153)`); + + // Testing non-sRGB origin colors to see gamut clipping. + test_valid_value(`color`, `hsl(from color(display-p3 0 1 0) h s l / alpha)`, `rgb(0, 255, 0)`); + + // Testing replacement with 0. + test_valid_value(`color`, `hsl(from rebeccapurple 0 0% 0%)`, `rgb(0, 0, 0)`); + test_valid_value(`color`, `hsl(from rebeccapurple 0deg 0% 0%)`, `rgb(0, 0, 0)`); + test_valid_value(`color`, `hsl(from rebeccapurple 0 0% 0% / 0)`, `rgba(0, 0, 0, 0)`); + test_valid_value(`color`, `hsl(from rebeccapurple 0deg 0% 0% / 0)`, `rgba(0, 0, 0, 0)`); + test_valid_value(`color`, `hsl(from rebeccapurple 0 s l / alpha)`, `rgb(153, 51, 51)`); + test_valid_value(`color`, `hsl(from rebeccapurple 0deg s l / alpha)`, `rgb(153, 51, 51)`); + test_valid_value(`color`, `hsl(from rebeccapurple h 0% l / alpha)`, `rgb(102, 102, 102)`); + test_valid_value(`color`, `hsl(from rebeccapurple h s 0% / alpha)`, `rgb(0, 0, 0)`); + test_valid_value(`color`, `hsl(from rebeccapurple h s l / 0)`, `rgba(102, 51, 153, 0)`); + test_valid_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) 0 s l / alpha)`, `rgba(153, 51, 51, 0.8)`); + test_valid_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) 0deg s l / alpha)`, `rgba(153, 51, 51, 0.8)`); + test_valid_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h 0% l / alpha)`, `rgba(102, 102, 102, 0.8)`); + test_valid_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h s 0% / alpha)`, `rgba(0, 0, 0, 0.8)`); + test_valid_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h s l / 0)`, `rgba(51, 102, 153, 0)`); + + // Testing replacement with a constant. + test_valid_value(`color`, `hsl(from rebeccapurple 25 s l / alpha)`, `rgb(153, 94, 51)`); + test_valid_value(`color`, `hsl(from rebeccapurple 25deg s l / alpha)`, `rgb(153, 94, 51)`); + test_valid_value(`color`, `hsl(from rebeccapurple h 20% l / alpha)`, `rgb(102, 82, 122)`); + test_valid_value(`color`, `hsl(from rebeccapurple h s 20% / alpha)`, `rgb(51, 25, 77)`); + test_valid_value(`color`, `hsl(from rebeccapurple h s l / .25)`, `rgba(102, 51, 153, 0.25)`); + test_valid_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) 25 s l / alpha)`, `rgba(153, 94, 51, 0.8)`); + test_valid_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) 25deg s l / alpha)`, `rgba(153, 94, 51, 0.8)`); + test_valid_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h 20% l / alpha)`, `rgba(82, 102, 122, 0.8)`); + test_valid_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h s 20% / alpha)`, `rgba(25, 51, 77, 0.8)`); + test_valid_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h s l / .2)`, `rgba(51, 102, 153, 0.2)`); + + // Testing valid permutation (types match). + test_valid_value(`color`, `hsl(from rebeccapurple h l s)`, `rgb(128, 77, 179)`); + test_valid_value(`color`, `hsl(from rebeccapurple h alpha l / s)`, `rgba(102, 0, 204, 0.5)`); + test_valid_value(`color`, `hsl(from rebeccapurple h l l / l)`, `rgba(102, 61, 143, 0.4)`); + test_valid_value(`color`, `hsl(from rebeccapurple h alpha alpha / alpha)`, `rgb(255, 255, 255)`); + test_valid_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h l s)`, `rgb(77, 128, 179)`); + test_valid_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h alpha l / s)`, `rgba(20, 102, 184, 0.5)`); + test_valid_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h l l / l)`, `rgba(61, 102, 143, 0.4)`); + test_valid_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)`, `rgba(163, 204, 245, 0.8)`); + + // Testing with calc(). + test_valid_value(`color`, `hsl(from rebeccapurple calc(h) calc(s) calc(l))`, `rgb(102, 51, 153)`); + test_valid_value(`color`, `hsl(from rgb(20%, 40%, 60%, 80%) calc(h) calc(s) calc(l) / calc(alpha))`, `rgba(51, 102, 153, 0.8)`); + + + // hwb(from ...) + + // Testing no modifications. + test_valid_value(`color`, `hwb(from rebeccapurple h w b)`, `rgb(102, 51, 153)`); + test_valid_value(`color`, `hwb(from rebeccapurple h w b / alpha)`, `rgb(102, 51, 153)`); + test_valid_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h w b / alpha)`, `rgba(51, 102, 153, 0.8)`); + test_valid_value(`color`, `hwb(from hsl(120deg 20% 50% / .5) h w b / alpha)`, `rgba(102, 153, 102, 0.5)`); + + // Test nesting relative colors. + test_valid_value(`color`, `hwb(from hwb(from rebeccapurple h w b) h w b)`, `rgb(102, 51, 153)`); + + // Testing non-sRGB origin colors to see gamut clipping. + test_valid_value(`color`, `hwb(from color(display-p3 0 1 0) h w b / alpha)`, `rgb(0, 255, 0)`); + + // Testing replacement with 0. + test_valid_value(`color`, `hwb(from rebeccapurple 0 0% 0%)`, `rgb(255, 0, 0)`); + test_valid_value(`color`, `hwb(from rebeccapurple 0deg 0% 0%)`, `rgb(255, 0, 0)`); + test_valid_value(`color`, `hwb(from rebeccapurple 0 0% 0% / 0)`, `rgba(255, 0, 0, 0)`); + test_valid_value(`color`, `hwb(from rebeccapurple 0deg 0% 0% / 0)`, `rgba(255, 0, 0, 0)`); + test_valid_value(`color`, `hwb(from rebeccapurple 0 w b / alpha)`, `rgb(153, 51, 51)`); + test_valid_value(`color`, `hwb(from rebeccapurple 0deg w b / alpha)`, `rgb(153, 51, 51)`); + test_valid_value(`color`, `hwb(from rebeccapurple h 0% b / alpha)`, `rgb(77, 0, 153)`); + test_valid_value(`color`, `hwb(from rebeccapurple h w 0% / alpha)`, `rgb(153, 51, 255)`); + test_valid_value(`color`, `hwb(from rebeccapurple h w b / 0)`, `rgba(102, 51, 153, 0)`); + test_valid_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) 0 w b / alpha)`, `rgba(153, 51, 51, 0.8)`); + test_valid_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) 0deg w b / alpha)`, `rgba(153, 51, 51, 0.8)`); + test_valid_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h 0% b / alpha)`, `rgba(0, 77, 153, 0.8)`); + test_valid_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h w 0% / alpha)`, `rgba(51, 153, 255, 0.8)`); + test_valid_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h w b / 0)`, `rgba(51, 102, 153, 0)`); + + // Testing replacement with a constant. + test_valid_value(`color`, `hwb(from rebeccapurple 25 w b / alpha)`, `rgb(153, 94, 51)`); + test_valid_value(`color`, `hwb(from rebeccapurple 25deg w b / alpha)`, `rgb(153, 94, 51)`); + test_valid_value(`color`, `hwb(from rebeccapurple h 20% b / alpha)`, `rgb(102, 51, 153)`); + test_valid_value(`color`, `hwb(from rebeccapurple h w 20% / alpha)`, `rgb(128, 51, 204)`); + test_valid_value(`color`, `hwb(from rebeccapurple h w b / .2)`, `rgba(102, 51, 153, 0.2)`); + test_valid_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) 25 w b / alpha)`, `rgba(153, 94, 51, 0.8)`); + test_valid_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) 25deg w b / alpha)`, `rgba(153, 94, 51, 0.8)`); + test_valid_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h 20% b / alpha)`, `rgba(51, 102, 153, 0.8)`); + test_valid_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h w 20% / alpha)`, `rgba(51, 128, 204, 0.8)`); + test_valid_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h w b / .2)`, `rgba(51, 102, 153, 0.2)`); + + // Testing valid permutation (types match). + test_valid_value(`color`, `hwb(from rebeccapurple h b w)`, `rgb(153, 102, 204)`); + test_valid_value(`color`, `hwb(from rebeccapurple h alpha w / b)`, `rgba(213, 213, 213, 0.4)`); + test_valid_value(`color`, `hwb(from rebeccapurple h w w / w)`, `rgba(128, 51, 204, 0.2)`); + test_valid_value(`color`, `hwb(from rebeccapurple h alpha alpha / alpha)`, `rgb(128, 128, 128)`); + test_valid_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h b w)`, `rgb(102, 153, 204)`); + test_valid_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h alpha w / b)`, `rgba(204, 204, 204, 0.4)`); + test_valid_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h w w / w)`, `rgba(51, 128, 204, 0.2)`); + test_valid_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)`, `rgba(128, 128, 128, 0.8)`); + + // Testing with calc(). + test_valid_value(`color`, `hwb(from rebeccapurple calc(h) calc(w) calc(b))`, `rgb(102, 51, 153)`); + test_valid_value(`color`, `hwb(from rgb(20%, 40%, 60%, 80%) calc(h) calc(w) calc(b) / calc(alpha))`, `rgba(51, 102, 153, 0.8)`); + + for (const colorSpace of [ "lab", "oklab" ]) { + // Testing no modifications. + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l a b)`, `${colorSpace}(25% 20 50)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l a b / alpha)`, `${colorSpace}(25% 20 50)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l a b / alpha)`, `${colorSpace}(25% 20 50 / 0.4)`); + + // Test nesting relative colors. + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(from ${colorSpace}(25% 20 50) l a b) l a b)`, `${colorSpace}(25% 20 50)`); + + // Testing non-${colorSpace} origin to see conversion. + test_valid_value(`color`, `${colorSpace}(from color(display-p3 0 0 0) l a b / alpha)`, `${colorSpace}(0% 0 0)`); + + // Testing replacement with 0. + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) 0% 0 0)`, `${colorSpace}(0% 0 0)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) 0% 0 0 / 0)`, `${colorSpace}(0% 0 0 / 0)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) 0% a b / alpha)`, `${colorSpace}(0% 20 50)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l 0 b / alpha)`, `${colorSpace}(25% 0 50)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l a 0 / alpha)`, `${colorSpace}(25% 20 0)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l a b / 0)`, `${colorSpace}(25% 20 50 / 0)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) 0% a b / alpha)`, `${colorSpace}(0% 20 50 / 0.4)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l 0 b / alpha)`, `${colorSpace}(25% 0 50 / 0.4)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l a 0 / alpha)`, `${colorSpace}(25% 20 0 / 0.4)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l a b / 0)`, `${colorSpace}(25% 20 50 / 0)`); + + // Testing replacement with a constant. + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) 35% a b / alpha)`, `${colorSpace}(35% 20 50)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l 35 b / alpha)`, `${colorSpace}(25% 35 50)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l a 35 / alpha)`, `${colorSpace}(25% 20 35)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l a b / .35)`, `${colorSpace}(25% 20 50 / 0.35)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) 35% a b / alpha)`, `${colorSpace}(35% 20 50 / 0.4)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l 35 b / alpha)`, `${colorSpace}(25% 35 50 / 0.4)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l a 35 / alpha)`, `${colorSpace}(25% 20 35 / 0.4)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l a b / .35)`, `${colorSpace}(25% 20 50 / 0.35)`); + + // Testing valid permutation (types match). + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l b a)`, `${colorSpace}(25% 50 20)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) l a a / a)`, `${colorSpace}(25% 20 20)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l b a)`, `${colorSpace}(25% 50 20)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) l a a / a)`, `${colorSpace}(25% 20 20)`); + + // Testing with calc(). + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50) calc(l) calc(a) calc(b))`, `${colorSpace}(25% 20 50)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))`, `${colorSpace}(25% 20 50 / 0.4)`); + } + + for (const colorSpace of [ "lch", "oklch" ]) { + const rectangularForm = colorSpace == "lch" ? "lab" : "oklab"; + + // Testing no modifications. + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c h)`, `${colorSpace}(70% 45 30)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c h / alpha)`, `${colorSpace}(70% 45 30)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l c h/ alpha)`, `${colorSpace}(70% 45 30 / 0.4)`); + + // Test nesting relative colors. + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(from ${colorSpace}(70% 45 30) l c h) l c h)`, `${colorSpace}(70% 45 30)`); + + // Testing non-sRGB origin colors to see gamut clipping. + test_valid_value(`color`, `${colorSpace}(from color(display-p3 0 0 0) l c h / alpha)`, `${colorSpace}(0% 0 0)`); + test_valid_value(`color`, `${colorSpace}(from ${rectangularForm}(70% 45 30) l c h / alpha)`, `${colorSpace}(70% 54.08327 33.690067)`); + + // Testing replacement with 0. + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) 0% 0 0)`, `${colorSpace}(0% 0 0)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) 0% 0 0deg)`, `${colorSpace}(0% 0 0)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) 0% 0 0 / 0)`, `${colorSpace}(0% 0 0 / 0)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) 0% 0 0deg / 0)`, `${colorSpace}(0% 0 0 / 0)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) 0% c h / alpha)`, `${colorSpace}(0% 45 30)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l 0 h / alpha)`, `${colorSpace}(70% 0 30)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c 0 / alpha)`, `${colorSpace}(70% 45 0)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c 0deg / alpha)`, `${colorSpace}(70% 45 0)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c h / 0)`, `${colorSpace}(70% 45 30 / 0)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) 0% c h / alpha)`, `${colorSpace}(0% 45 30 / 0.4)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l 0 h / alpha)`, `${colorSpace}(70% 0 30 / 0.4)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l c 0 / alpha)`, `${colorSpace}(70% 45 0 / 0.4)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l c 0deg / alpha)`, `${colorSpace}(70% 45 0 / 0.4)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l c h / 0)`, `${colorSpace}(70% 45 30 / 0)`); + + // Testing replacement with a constant. + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) 25% c h / alpha)`, `${colorSpace}(25% 45 30)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l 25 h / alpha)`, `${colorSpace}(70% 25 30)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c 25 / alpha)`, `${colorSpace}(70% 45 25)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c 25deg / alpha)`, `${colorSpace}(70% 45 25)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c h / .25)`, `${colorSpace}(70% 45 30 / 0.25)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) 25% c h / alpha)`, `${colorSpace}(25% 45 30 / 0.4)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l 25 h / alpha)`, `${colorSpace}(70% 25 30 / 0.4)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l c 25 / alpha)`, `${colorSpace}(70% 45 25 / 0.4)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l c 25deg / alpha)`, `${colorSpace}(70% 45 25 / 0.4)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l c h / .25)`, `${colorSpace}(70% 45 30 / 0.25)`); + + // Testing valid permutation (types match). + // NOTE: 'c' is a vaild hue, as hue is <angle>|<number>. + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) alpha c h / l)`, `${colorSpace}(100% 45 30 / 0.7)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) l c c / alpha)`, `${colorSpace}(70% 45 45)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) alpha c h / alpha)`, `${colorSpace}(100% 45 30)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) alpha c c / alpha)`, `${colorSpace}(100% 45 45)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) alpha c h / l)`, `${colorSpace}(40% 45 30 / 0.7)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) l c c / alpha)`, `${colorSpace}(70% 45 45 / 0.4)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) alpha c h / alpha)`, `${colorSpace}(40% 45 30 / 0.4)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) alpha c c / alpha)`, `${colorSpace}(40% 45 45 / 0.4)`); + + // Testing with calc(). + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30) calc(l) calc(c) calc(h))`, `${colorSpace}(70% 45 30)`); + test_valid_value(`color`, `${colorSpace}(from ${colorSpace}(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))`, `${colorSpace}(70% 45 30 / 0.4)`); + } + + for (const colorSpace of [ "srgb", "srgb-linear", "a98-rgb", "rec2020", "prophoto-rgb" ]) { + // Testing no modifications. + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g b)`, `color(${colorSpace} 0.7 0.5 0.3)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g b / alpha)`, `color(${colorSpace} 0.7 0.5 0.3)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r g b)`, `color(${colorSpace} 0.7 0.5 0.3)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r g b / alpha)`, `color(${colorSpace} 0.7 0.5 0.3 / 0.4)`); + + // Test nesting relative colors. + test_valid_value(`color`, `color(from color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g b) ${colorSpace} r g b)`, `color(${colorSpace} 0.7 0.5 0.3)`); + + // Testing replacement with 0. + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} 0 0 0)`, `color(${colorSpace} 0 0 0)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} 0 0 0 / 0)`, `color(${colorSpace} 0 0 0 / 0)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} 0 g b / alpha)`, `color(${colorSpace} 0 0.5 0.3)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r 0 b / alpha)`, `color(${colorSpace} 0.7 0 0.3)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g 0 / alpha)`, `color(${colorSpace} 0.7 0.5 0)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g b / 0)`, `color(${colorSpace} 0.7 0.5 0.3 / 0)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} 0 g b / alpha)`, `color(${colorSpace} 0 0.5 0.3 / 0.4)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r 0 b / alpha)`, `color(${colorSpace} 0.7 0 0.3 / 0.4)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r g 0 / alpha)`, `color(${colorSpace} 0.7 0.5 0 / 0.4)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r g b / 0)`, `color(${colorSpace} 0.7 0.5 0.3 / 0)`); + + // Testing replacement with a constant. + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} 0.2 g b / alpha)`, `color(${colorSpace} 0.2 0.5 0.3)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} 20% g b / alpha)`, `color(${colorSpace} 0.2 0.5 0.3)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r 0.2 b / alpha)`, `color(${colorSpace} 0.7 0.2 0.3)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r 20% b / alpha)`, `color(${colorSpace} 0.7 0.2 0.3)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g 0.2 / alpha)`, `color(${colorSpace} 0.7 0.5 0.2)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g 20% / alpha)`, `color(${colorSpace} 0.7 0.5 0.2)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g b / 0.2)`, `color(${colorSpace} 0.7 0.5 0.3 / 0.2)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r g b / 20%)`, `color(${colorSpace} 0.7 0.5 0.3 / 0.2)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} 0.2 g b / alpha)`, `color(${colorSpace} 0.2 0.5 0.3 / 0.4)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} 20% g b / alpha)`, `color(${colorSpace} 0.2 0.5 0.3 / 0.4)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r 0.2 b / alpha)`, `color(${colorSpace} 0.7 0.2 0.3 / 0.4)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r 20% b / alpha)`, `color(${colorSpace} 0.7 0.2 0.3 / 0.4)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r g 0.2 / alpha)`, `color(${colorSpace} 0.7 0.5 0.2 / 0.4)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r g 20% / alpha)`, `color(${colorSpace} 0.7 0.5 0.2 / 0.4)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r g b / 0.2)`, `color(${colorSpace} 0.7 0.5 0.3 / 0.2)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r g b / 20%)`, `color(${colorSpace} 0.7 0.5 0.3 / 0.2)`); + + // Testing valid permutation (types match). + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} g b r)`, `color(${colorSpace} 0.5 0.3 0.7)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} b alpha r / g)`, `color(${colorSpace} 0.3 1 0.7 / 0.5)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} r r r / r)`, `color(${colorSpace} 0.7 0.7 0.7 / 0.7)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} alpha alpha alpha / alpha)`, `color(${colorSpace} 1 1 1)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} g b r)`, `color(${colorSpace} 0.5 0.3 0.7)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} b alpha r / g)`, `color(${colorSpace} 0.3 0.4 0.7 / 0.5)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} r r r / r)`, `color(${colorSpace} 0.7 0.7 0.7 / 0.7)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} alpha alpha alpha / alpha)`, `color(${colorSpace} 0.4 0.4 0.4 / 0.4)`); + + // Testing with calc(). + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} calc(r) calc(g) calc(b))`, `color(${colorSpace} 0.7 0.5 0.3)`); + test_valid_value(`color`, `color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} calc(r) calc(g) calc(b) / calc(alpha))`, `color(${colorSpace} 0.7 0.5 0.3 / 0.4)`); + } + + for (const colorSpace of [ "xyz", "xyz-d50", "xyz-d65" ]) { + const resultColorSpace = colorSpace == "xyz" ? "xyz-d65" : colorSpace; + + // Testing no modifications. + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y z)`, `color(${resultColorSpace} 7 -20.5 100)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y z / alpha)`, `color(${resultColorSpace} 7 -20.5 100)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x y z)`, `color(${resultColorSpace} 7 -20.5 100)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x y z / alpha)`, `color(${resultColorSpace} 7 -20.5 100 / 0.4)`); + + // Test nesting relative colors. + test_valid_value(`color`, `color(from color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y z) ${colorSpace} x y z)`, `color(${resultColorSpace} 7 -20.5 100)`); + + // Testing replacement with 0. + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} 0 0 0)`, `color(${resultColorSpace} 0 0 0)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} 0 0 0 / 0)`, `color(${resultColorSpace} 0 0 0 / 0)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} 0 y z / alpha)`, `color(${resultColorSpace} 0 -20.5 100)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x 0 z / alpha)`, `color(${resultColorSpace} 7 0 100)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y 0 / alpha)`, `color(${resultColorSpace} 7 -20.5 0)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y z / 0)`, `color(${resultColorSpace} 7 -20.5 100 / 0)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} 0 y z / alpha)`, `color(${resultColorSpace} 0 -20.5 100 / 0.4)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x 0 z / alpha)`, `color(${resultColorSpace} 7 0 100 / 0.4)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x y 0 / alpha)`, `color(${resultColorSpace} 7 -20.5 0 / 0.4)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x y z / 0)`, `color(${resultColorSpace} 7 -20.5 100 / 0)`); + + // Testing replacement with a constant. + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} 0.2 y z / alpha)`, `color(${resultColorSpace} 0.2 -20.5 100)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x 0.2 z / alpha)`, `color(${resultColorSpace} 7 0.2 100)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y 0.2 / alpha)`, `color(${resultColorSpace} 7 -20.5 0.2)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y z / 0.2)`, `color(${resultColorSpace} 7 -20.5 100 / 0.2)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x y z / 20%)`, `color(${resultColorSpace} 7 -20.5 100 / 0.2)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} 0.2 y z / alpha)`, `color(${resultColorSpace} 0.2 -20.5 100 / 0.4)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x 0.2 z / alpha)`, `color(${resultColorSpace} 7 0.2 100 / 0.4)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x y 0.2 / alpha)`, `color(${resultColorSpace} 7 -20.5 0.2 / 0.4)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x y z / 0.2)`, `color(${resultColorSpace} 7 -20.5 100 / 0.2)`); + + // Testing valid permutation (types match). + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} y z x)`, `color(${resultColorSpace} -20.5 100 7)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} x x x / x)`, `color(${resultColorSpace} 7 7 7)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} y z x)`, `color(${resultColorSpace} -20.5 100 7)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} x x x / x)`, `color(${resultColorSpace} 7 7 7)`); + + // Testing with calc(). + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} calc(x) calc(y) calc(z))`, `color(${resultColorSpace} 7 -20.5 100)`); + test_valid_value(`color`, `color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} calc(x) calc(y) calc(z) / calc(alpha))`, `color(${resultColorSpace} 7 -20.5 100 / 0.4)`); + } + + // Spec Examples + + // Example 11. + test_valid_value(`color`, `rgb(from var(--bg-color) r g b / 80%)`); + + // Example 12. + test_valid_value(`color`, `lch(from var(--color) calc(l / 2) c h)`); + + // Example 13. + test_valid_value(`color`, `rgb(from var(--color) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11))`, `rgb(from var(--color) calc(r * 0.3 + g * 0.59 + b * 0.11) calc(r * 0.3 + g * 0.59 + b * 0.11) calc(r * 0.3 + g * 0.59 + b * 0.11))`); + test_valid_value(`color`, `lch(from var(--color) l 0 h)`); + + // Example 14. + test_valid_value(`color`, `rgb(from indianred 255 g b)`, `rgb(255, 92, 92)`); + + // Example 15. + test_valid_value(`color`, `hsl(from var(--accent) calc(h + 180deg) s l)`); + + // Example 16. + test_valid_value(`color`, `lab(from var(--mycolor) l a b / 100%)`); + test_valid_value(`color`, `lab(from var(--mycolor) l a b / calc(alpha * 0.8))`); + test_valid_value(`color`, `lab(from var(--mycolor) l a b / calc(alpha - 20%))`); + + // Example 17. + test_valid_value(`color`, `lab(from var(--mycolor) l 0 0)`); + + // Example 18. + test_valid_value(`color`, `lch(from peru calc(l * 0.8) c h)`, `lch(49.80138% 54.003296 63.680317)`); + + // Example 19. + test_valid_value(`color`, `LCH(from var(--accent) l c calc(h + 180deg))`); + + // Example 20. + test_valid_value(`color`, `lch(from var(--mycolor) l 0 h)`); + test_valid_value(`color`, `var(--mygray)`); + test_valid_value(`color`, `lch(from var(--mygray) l 30 h)`); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-001.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-001.html index ea8bd69..dff6bd9a 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-001.html
@@ -2,7 +2,7 @@ <meta charset="utf-8"> <title>CSS Color 4: predefined colorspaces, srgb, decimal values</title> <link rel="author" title="Chris Lilley" href="mailto:chris@w3.org"> -<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#valdef-color-srgb"> <link rel="match" href="greensquare-090-ref.html"> <meta name="assert" content="Color function with explicit srgb value as decimal matches sRGB #009900"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-002.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-002.html index a6f9a1b..9ed4b392 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-002.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-002.html
@@ -2,7 +2,7 @@ <meta charset="utf-8"> <title>CSS Color 4: predefined colorspaces, srgb, percent values</title> <link rel="author" title="Chris Lilley" href="mailto:chris@w3.org"> -<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#valdef-color-srgb"> <link rel="match" href="greensquare-090-ref.html"> <meta name="assert" content="Color function with explicit srgb value as percent matches sRGB #009900"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-005.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-005.html index 99b611c..02eb39f 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-005.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-005.html
@@ -2,7 +2,7 @@ <meta charset="utf-8"> <title>CSS Color 4: predefined colorspaces, display-p3, decimal values</title> <link rel="author" title="Chris Lilley" href="mailto:chris@w3.org"> -<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#valdef-color-display-p3"> <link rel="match" href="greensquare-090-ref.html"> <meta name="assert" content="Color function with explicit display-p3 value as decimal matches sRGB #009900"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-006.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-006.html index 998865e..bfbccbcb 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-006.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-006.html
@@ -2,7 +2,7 @@ <meta charset="utf-8"> <title>CSS Color 4: predefined colorspaces, display-p3, percent values</title> <link rel="author" title="Chris Lilley" href="mailto:chris@w3.org"> -<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined"> +<link rel="help" href="https://drafts.csswg.org/css-color-4/#valdef-color-display-p3"> <link rel="match" href="greensquare-090-ref.html"> <meta name="assert" content="Color function with explicit display-p3 value as percent matches sRGB #009900"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-justify-content-wmvert-002.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-justify-content-wmvert-002.html index 6dd287e..2aaee48 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-justify-content-wmvert-002.html +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-justify-content-wmvert-002.html
@@ -26,11 +26,18 @@ <script src="/resources/check-layout-th.js"></script> <body onload="checkLayout('.flexitem')"> -This should be Blue to the left of Orange. +Both should be Blue to the left of Orange. <div class=flexbox style="justify-content: left; writing-mode: vertical-rl;"> <div class=flexitem data-offset-x=0></div> </div> -This should be Orange to the left of Blue. +<div class=flexbox style="justify-content: left; writing-mode: vertical-lr;"> + <div class=flexitem data-offset-x=0></div> +</div> + +Both should be Orange to the left of Blue. +<div class=flexbox style="justify-content: right; writing-mode: vertical-rl;"> + <div class=flexitem data-offset-x=50></div> +</div> <div class=flexbox style="justify-content: right; writing-mode: vertical-lr;"> <div class=flexitem data-offset-x=50></div> </div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-justify-content-wmvert-003.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-justify-content-wmvert-003.html new file mode 100644 index 0000000..5e5036c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-justify-content-wmvert-003.html
@@ -0,0 +1,43 @@ +<!doctype html> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#justify-content-property" /> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#positional-values" /> +<meta name="assert" content="Flexbox honors justify-content values when vertical row flexboxes have main axis parallel to line-left <-> line-right axis."> + +<style> +.flexbox { + display: flex; + height: 100px; + background: orange; + border: 1px solid; + margin-bottom: 20px; + position: relative; +} + +.flexitem { + width: 50px; + height: 50px; + background: blue; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> +<body onload="checkLayout('.flexitem')"> + +Both should be Blue on top of Orange. +<div class=flexbox style="justify-content: left; writing-mode: vertical-rl;"> + <div class=flexitem data-offset-y=0></div> +</div> +<div class=flexbox style="justify-content: left; writing-mode: vertical-lr;"> + <div class=flexitem data-offset-y=0></div> +</div> + +Both should be Orange on top of Blue. +<div class=flexbox style="justify-content: right; writing-mode: vertical-rl;"> + <div class=flexitem data-offset-y=50></div> +</div> +<div class=flexbox style="justify-content: right; writing-mode: vertical-lr;"> + <div class=flexitem data-offset-y=50></div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-036.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-036.html new file mode 100644 index 0000000..e264646 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-036.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<title>CSS aspect-ratio: div block size aspect ratio precision</title> +<link rel="author" title="Rob Buis" href="mailto:rbuis@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" /> +<meta name="assert" content="Verify the calculations are correct for a fractional aspect ratio."> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<div style="display: inline-block;background: green; height: 100px; aspect-ratio: 0.7;"></div><div style="display: inline-block;background: green; height: 100px; width: 30px;"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-001-ref.html new file mode 100644 index 0000000..43257f9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-001-ref.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference: text-emphasis-color: currentColor</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if there is a <strong>green</strong> '●' above every character below:</p> +<div lang="ja" style="line-height: 5; color: green"><ruby>試<rt>●</rt>験<rt>●</rt>テ<rt>●</rt>ス<rt>●</rt>ト<rt>●</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-001.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-001.html new file mode 100644 index 0000000..347d2df --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-001.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis-color: untouched</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-color-property"> +<meta name="assert" content="The color of emphasis marks should be the same as the text by default"> +<link rel="match" href="text-emphasis-color-property-001-ref.html"> +<p>Pass if there is a <strong>green</strong> '●' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: filled circle; color: green">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-001a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-001a.html new file mode 100644 index 0000000..f4984d9a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-001a.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis-color: initial</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-color-property"> +<meta name="assert" content="The color of emphasis marks should be the same as the text for initial value"> +<link rel="match" href="text-emphasis-color-property-001-ref.html"> +<p>Pass if there is a <strong>green</strong> '●' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: filled circle; text-emphasis-color: initial; color: green">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-001b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-001b.html new file mode 100644 index 0000000..a2bf1ca --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-001b.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis-color: initial from text-emphasis</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-color-property"> +<meta name="assert" content="The color of emphasis marks should be the same as the text by default"> +<link rel="match" href="text-emphasis-color-property-001-ref.html"> +<p>Pass if there is a <strong>green</strong> '●' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: filled circle; color: green">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-002-ref.html new file mode 100644 index 0000000..345d2873 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-002-ref.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference: text-emphasis-color: green</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; color: green; } </style> +<p>Pass if there is a <strong>green</strong> '●' above every character below:</p> +<div lang="ja" style="line-height: 5;"><ruby>試<rt>●</rt>験<rt>●</rt>テ<rt>●</rt>ス<rt>●</rt>ト<rt>●</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-002.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-002.html new file mode 100644 index 0000000..9d6419b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-color-property-002.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis-color: green</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-color-property"> +<meta name="assert" content="Emphasis marks should be rendered with color specified by text-emphasis-color."> +<link rel="match" href="text-emphasis-color-property-002-ref.html"> +<p>Pass if there is a <strong>green</strong> '●' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: filled circle; text-emphasis-color: green">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-001-ref.html new file mode 100644 index 0000000..6f02e05 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-001-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Reference: text-emphasis line height, top</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if the emphasis marks are below the black line:</p> +<div lang="ja" style="line-height: 1; border-top: 1px solid black; writing-mode: horizontal-tb; ruby-position: over"><ruby>試<rt>●</rt>験<rt>●</rt>テ<rt>●</rt>ス<rt>●</rt>ト<rt>●</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-001a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-001a.html new file mode 100644 index 0000000..ea95895 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-001a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Test: text-emphasis line height, top, horizontal-tb, div</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="text emphasis marks should expand the line height like ruby if necessary"> +<link rel="match" href="text-emphasis-line-height-001-ref.html"> +<p>Pass if the emphasis marks are below the black line:</p> +<div lang="ja" style="line-height: 1; border-top: 1px solid black; writing-mode: horizontal-tb; text-emphasis-position: over right;text-emphasis: circle;">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-001b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-001b.html new file mode 100644 index 0000000..d6468cb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-001b.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Test: text-emphasis line height, top, horizontal-tb, span</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="text emphasis marks should expand the line height like ruby if necessary"> +<link rel="match" href="text-emphasis-line-height-001-ref.html"> +<p>Pass if the emphasis marks are below the black line:</p> +<div lang="ja" style="line-height: 1; border-top: 1px solid black; writing-mode: horizontal-tb; text-emphasis-position: over right;"><span style="text-emphasis: circle;">試験テスト</span></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-001z.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-001z.html new file mode 100644 index 0000000..dded6094 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-001z.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis line height, top, textarea</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="text emphasis marks should expand the line height like ruby if necessary"> +<link rel="match" href="text-emphasis-line-height-001-ref.html"> +<style> +textarea { + all: inherit; + width: 100%; + height: 10em; /* ensure there's plenty of height even if the default font is quite tall, + to avoid risk of a vertical scrollbar showing up inside textarea */ + box-sizing: border-box; + border: 0 none; margin: 0; padding: 0; +} +</style> +<p>Pass if the emphasis marks are below the black line:</p> +<textarea lang="ja" style="line-height: 1; border-top: 1px solid black; text-emphasis: circle;">試験テスト</textarea>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-002-ref.html new file mode 100644 index 0000000..abff3e9e5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-002-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Reference: text-emphasis line height, bottom</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if the emphasis marks are over the black line:</p> +<div lang="ja" style="line-height: 1; border-bottom: 1px solid black; writing-mode: horizontal-tb; ruby-position: under"><ruby>試<rt>●</rt>験<rt>●</rt>テ<rt>●</rt>ス<rt>●</rt>ト<rt>●</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-002a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-002a.html new file mode 100644 index 0000000..f4a4746 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-002a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Test: text-emphasis line height, bottom, horizontal-tb, div</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="text emphasis marks should expand the line height like ruby if necessary"> +<link rel="match" href="text-emphasis-line-height-002-ref.html"> +<p>Pass if the emphasis marks are over the black line:</p> +<div lang="ja" style="line-height: 1; border-bottom: 1px solid black; writing-mode: horizontal-tb; text-emphasis-position: under right;text-emphasis: circle;">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-002b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-002b.html new file mode 100644 index 0000000..28a14cf --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-002b.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Test: text-emphasis line height, bottom, horizontal-tb, span</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="text emphasis marks should expand the line height like ruby if necessary"> +<link rel="match" href="text-emphasis-line-height-002-ref.html"> +<p>Pass if the emphasis marks are over the black line:</p> +<div lang="ja" style="line-height: 1; border-bottom: 1px solid black; writing-mode: horizontal-tb; text-emphasis-position: under right;"><span style="text-emphasis: circle;">試験テスト</span></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-003-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-003-ref.html new file mode 100644 index 0000000..d427c76c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-003-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Reference: text-emphasis line height, right</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if the emphasis marks are to the left of the black line:</p> +<div lang="ja" style="line-height: 1; border-right: 1px solid black; writing-mode: vertical-rl; ruby-position: over"><ruby>試<rt>●</rt>験<rt>●</rt>テ<rt>●</rt>ス<rt>●</rt>ト<rt>●</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-003a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-003a.html new file mode 100644 index 0000000..2b0684a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-003a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Test: text-emphasis line height, right, vertical-rl, div</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="text emphasis marks should expand the line height like ruby if necessary"> +<link rel="match" href="text-emphasis-line-height-003-ref.html"> +<p>Pass if the emphasis marks are to the left of the black line:</p> +<div lang="ja" style="line-height: 1; border-right: 1px solid black; writing-mode: vertical-rl; text-emphasis-position: over right;text-emphasis: circle;">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-003b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-003b.html new file mode 100644 index 0000000..a8a6e1f6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-003b.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Test: text-emphasis line height, right, vertical-rl, span</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="text emphasis marks should expand the line height like ruby if necessary"> +<link rel="match" href="text-emphasis-line-height-003-ref.html"> +<p>Pass if the emphasis marks are to the left of the black line:</p> +<div lang="ja" style="line-height: 1; border-right: 1px solid black; writing-mode: vertical-rl; text-emphasis-position: over right;"><span style="text-emphasis: circle;">試験テスト</span></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-003c.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-003c.html new file mode 100644 index 0000000..35589cb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-003c.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Test: text-emphasis line height, right, vertical-lr, div</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="text emphasis marks should expand the line height like ruby if necessary"> +<link rel="match" href="text-emphasis-line-height-003-ref.html"> +<p>Pass if the emphasis marks are to the left of the black line:</p> +<div lang="ja" style="line-height: 1; border-right: 1px solid black; writing-mode: vertical-lr; text-emphasis-position: over right;text-emphasis: circle;">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-003d.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-003d.html new file mode 100644 index 0000000..b029907 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-003d.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Test: text-emphasis line height, right, vertical-lr, span</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="text emphasis marks should expand the line height like ruby if necessary"> +<link rel="match" href="text-emphasis-line-height-003-ref.html"> +<p>Pass if the emphasis marks are to the left of the black line:</p> +<div lang="ja" style="line-height: 1; border-right: 1px solid black; writing-mode: vertical-lr; text-emphasis-position: over right;"><span style="text-emphasis: circle;">試験テスト</span></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-004-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-004-ref.html new file mode 100644 index 0000000..b88ca7c3a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-004-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Reference: text-emphasis line height, left</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if the emphasis marks are to the right of the black line:</p> +<div lang="ja" style="line-height: 1; border-left: 1px solid black; writing-mode: vertical-rl; ruby-position: under"><ruby>試<rt>●</rt>験<rt>●</rt>テ<rt>●</rt>ス<rt>●</rt>ト<rt>●</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-004a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-004a.html new file mode 100644 index 0000000..e8922e97 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-004a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Test: text-emphasis line height, left, vertical-rl, div</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="text emphasis marks should expand the line height like ruby if necessary"> +<link rel="match" href="text-emphasis-line-height-004-ref.html"> +<p>Pass if the emphasis marks are to the right of the black line:</p> +<div lang="ja" style="line-height: 1; border-left: 1px solid black; writing-mode: vertical-rl; text-emphasis-position: over left;text-emphasis: circle;">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-004b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-004b.html new file mode 100644 index 0000000..f6ad46d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-004b.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Test: text-emphasis line height, left, vertical-rl, span</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="text emphasis marks should expand the line height like ruby if necessary"> +<link rel="match" href="text-emphasis-line-height-004-ref.html"> +<p>Pass if the emphasis marks are to the right of the black line:</p> +<div lang="ja" style="line-height: 1; border-left: 1px solid black; writing-mode: vertical-rl; text-emphasis-position: over left;"><span style="text-emphasis: circle;">試験テスト</span></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-004c.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-004c.html new file mode 100644 index 0000000..d572de3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-004c.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Test: text-emphasis line height, left, vertical-lr, div</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="text emphasis marks should expand the line height like ruby if necessary"> +<link rel="match" href="text-emphasis-line-height-004-ref.html"> +<p>Pass if the emphasis marks are to the right of the black line:</p> +<div lang="ja" style="line-height: 1; border-left: 1px solid black; writing-mode: vertical-lr; text-emphasis-position: over left;text-emphasis: circle;">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-004d.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-004d.html new file mode 100644 index 0000000..3010b95 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-line-height-004d.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Test: text-emphasis line height, left, vertical-lr, span</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="text emphasis marks should expand the line height like ruby if necessary"> +<link rel="match" href="text-emphasis-line-height-004-ref.html"> +<p>Pass if the emphasis marks are to the right of the black line:</p> +<div lang="ja" style="line-height: 1; border-left: 1px solid black; writing-mode: vertical-lr; text-emphasis-position: over left;"><span style="text-emphasis: circle;">試験テスト</span></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-001-ref.html new file mode 100644 index 0000000..1121e160 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-001-ref.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference: text-emphasis-position: over</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if the emphasis marks are over the text below:</p> +<div lang="ja" style="line-height: 5;"><ruby>試<rt>●</rt>験<rt>●</rt>テ<rt>●</rt>ス<rt>●</rt>ト<rt>●</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-001.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-001.html new file mode 100644 index 0000000..c6d6c94b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-001.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: over right, horizontal-tb</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: over right' with 'writing-mode: horizontal-tb' puts emphasis marks over the text."> +<link rel="match" href="text-emphasis-position-property-001-ref.html"> +<p>Pass if the emphasis marks are over the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: horizontal-tb; text-orientation: mixed; text-emphasis-position: over right">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-001a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-001a.html new file mode 100644 index 0000000..8f7f402 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-001a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: right over, horizontal-tb</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: right over' with 'writing-mode: horizontal-tb' puts emphasis marks over the text."> +<link rel="match" href="text-emphasis-position-property-001-ref.html"> +<p>Pass if the emphasis marks are over the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: horizontal-tb; text-orientation: mixed; text-emphasis-position: right over">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-001b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-001b.html new file mode 100644 index 0000000..de111dd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-001b.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: over left, horizontal-tb</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: over left' with 'writing-mode: horizontal-tb' puts emphasis marks over the text."> +<link rel="match" href="text-emphasis-position-property-001-ref.html"> +<p>Pass if the emphasis marks are over the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: horizontal-tb; text-orientation: mixed; text-emphasis-position: over left">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-001c.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-001c.html new file mode 100644 index 0000000..2b15c16 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-001c.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: left over, horizontal-tb</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: left over' with 'writing-mode: horizontal-tb' puts emphasis marks over the text."> +<link rel="match" href="text-emphasis-position-property-001-ref.html"> +<p>Pass if the emphasis marks are over the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: horizontal-tb; text-orientation: mixed; text-emphasis-position: left over">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-002-ref.html new file mode 100644 index 0000000..a0371c1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-002-ref.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference: text-emphasis-position: under</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if the emphasis marks are under the text below:</p> +<div lang="ja" style="line-height: 5; ruby-position: under"><ruby>試<rt>●</rt>験<rt>●</rt>テ<rt>●</rt>ス<rt>●</rt>ト<rt>●</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-002.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-002.html new file mode 100644 index 0000000..3b4bba33 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-002.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: under right, horizontal-tb</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: under right' with 'writing-mode: horizontal-tb' puts emphasis marks under the text."> +<link rel="match" href="text-emphasis-position-property-002-ref.html"> +<p>Pass if the emphasis marks are under the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: horizontal-tb; text-orientation: mixed; text-emphasis-position: under right">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-002a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-002a.html new file mode 100644 index 0000000..7058306 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-002a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: right under, horizontal-tb</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: right under' with 'writing-mode: horizontal-tb' puts emphasis marks under the text."> +<link rel="match" href="text-emphasis-position-property-002-ref.html"> +<p>Pass if the emphasis marks are under the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: horizontal-tb; text-orientation: mixed; text-emphasis-position: right under">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-002b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-002b.html new file mode 100644 index 0000000..d444e50 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-002b.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: under left, horizontal-tb</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: under left' with 'writing-mode: horizontal-tb' puts emphasis marks under the text."> +<link rel="match" href="text-emphasis-position-property-002-ref.html"> +<p>Pass if the emphasis marks are under the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: horizontal-tb; text-orientation: mixed; text-emphasis-position: under left">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-002c.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-002c.html new file mode 100644 index 0000000..ef23120 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-002c.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: left under, horizontal-tb</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: left under' with 'writing-mode: horizontal-tb' puts emphasis marks under the text."> +<link rel="match" href="text-emphasis-position-property-002-ref.html"> +<p>Pass if the emphasis marks are under the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: horizontal-tb; text-orientation: mixed; text-emphasis-position: left under">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003-ref.html new file mode 100644 index 0000000..9b0ad4d1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003-ref.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference: text-emphasis-position: right</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; writing-mode: vertical-rl; ruby-position: over"><ruby>試<rt>●</rt>験<rt>●</rt>テ<rt>●</rt>ス<rt>●</rt>ト<rt>●</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003.html new file mode 100644 index 0000000..ea43b14e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: right over, vertical-rl</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: right over' with 'writing-mode: vertical-rl' puts emphasis marks to the right of the text."> +<link rel="match" href="text-emphasis-position-property-003-ref.html"> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-rl; text-orientation: mixed; text-emphasis-position: right over">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003a.html new file mode 100644 index 0000000..5ab81b99 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: over right, vertical-rl</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: over right' with 'writing-mode: vertical-rl' puts emphasis marks to the right of the text."> +<link rel="match" href="text-emphasis-position-property-003-ref.html"> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-rl; text-orientation: mixed; text-emphasis-position: over right">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003b.html new file mode 100644 index 0000000..7737205 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003b.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: right under, vertical-rl</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: right under' with 'writing-mode: vertical-rl' puts emphasis marks to the right of the text."> +<link rel="match" href="text-emphasis-position-property-003-ref.html"> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-rl; text-orientation: mixed; text-emphasis-position: right under">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003c.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003c.html new file mode 100644 index 0000000..0420d8fe --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003c.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: under right, vertical-rl</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: under right' with 'writing-mode: vertical-rl' puts emphasis marks to the right of the text."> +<link rel="match" href="text-emphasis-position-property-003-ref.html"> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-rl; text-orientation: mixed; text-emphasis-position: under right">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003d.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003d.html new file mode 100644 index 0000000..a87b6e83 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003d.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: right over, vertical-lr</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: right over' with 'writing-mode: vertical-lr' puts emphasis marks to the right of the text."> +<link rel="match" href="text-emphasis-position-property-003-ref.html"> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-lr; text-orientation: mixed; text-emphasis-position: right over">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003e.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003e.html new file mode 100644 index 0000000..69c2ba2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003e.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: over right, vertical-lr</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: over right' with 'writing-mode: vertical-lr' puts emphasis marks to the right of the text."> +<link rel="match" href="text-emphasis-position-property-003-ref.html"> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-lr; text-orientation: mixed; text-emphasis-position: over right">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003f.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003f.html new file mode 100644 index 0000000..85124d78 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003f.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: right under, vertical-lr</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: right under' with 'writing-mode: vertical-lr' puts emphasis marks to the right of the text."> +<link rel="match" href="text-emphasis-position-property-003-ref.html"> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-lr; text-orientation: mixed; text-emphasis-position: right under">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003g.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003g.html new file mode 100644 index 0000000..8de0924 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-003g.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: under right, vertical-lr</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: under right' with 'writing-mode: vertical-lr' puts emphasis marks to the right of the text."> +<link rel="match" href="text-emphasis-position-property-003-ref.html"> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-lr; text-orientation: mixed; text-emphasis-position: under right">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004-ref.html new file mode 100644 index 0000000..b82a758 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004-ref.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference: text-emphasis-position: left</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; writing-mode: vertical-rl; ruby-position: under"><ruby>試<rt>●</rt>験<rt>●</rt>テ<rt>●</rt>ス<rt>●</rt>ト<rt>●</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004.html new file mode 100644 index 0000000..dcde40b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: left over, vertical-rl</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: left over' with 'writing-mode: vertical-rl' puts emphasis marks to the left of the text."> +<link rel="match" href="text-emphasis-position-property-004-ref.html"> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-rl; text-orientation: mixed; text-emphasis-position: left over">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004a.html new file mode 100644 index 0000000..cdee90a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: over left, vertical-rl</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: over left' with 'writing-mode: vertical-rl' puts emphasis marks to the left of the text."> +<link rel="match" href="text-emphasis-position-property-004-ref.html"> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-rl; text-orientation: mixed; text-emphasis-position: over left">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004b.html new file mode 100644 index 0000000..fe6685e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004b.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: left under, vertical-rl</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: left under' with 'writing-mode: vertical-rl' puts emphasis marks to the left of the text."> +<link rel="match" href="text-emphasis-position-property-004-ref.html"> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-rl; text-orientation: mixed; text-emphasis-position: left under">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004c.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004c.html new file mode 100644 index 0000000..6771741c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004c.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: under left, vertical-rl</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: under left' with 'writing-mode: vertical-rl' puts emphasis marks to the left of the text."> +<link rel="match" href="text-emphasis-position-property-004-ref.html"> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-rl; text-orientation: mixed; text-emphasis-position: under left">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004d.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004d.html new file mode 100644 index 0000000..60b3260 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004d.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: left over, vertical-lr</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: left over' with 'writing-mode: vertical-lr' puts emphasis marks to the left of the text."> +<link rel="match" href="text-emphasis-position-property-004-ref.html"> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-lr; text-orientation: mixed; text-emphasis-position: left over">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004e.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004e.html new file mode 100644 index 0000000..f1c22571 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004e.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: over left, vertical-lr</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: over left' with 'writing-mode: vertical-lr' puts emphasis marks to the left of the text."> +<link rel="match" href="text-emphasis-position-property-004-ref.html"> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-lr; text-orientation: mixed; text-emphasis-position: over left">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004f.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004f.html new file mode 100644 index 0000000..0d808df8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004f.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: left under, vertical-lr</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: left under' with 'writing-mode: vertical-lr' puts emphasis marks to the left of the text."> +<link rel="match" href="text-emphasis-position-property-004-ref.html"> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-lr; text-orientation: mixed; text-emphasis-position: left under">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004g.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004g.html new file mode 100644 index 0000000..607455d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-004g.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: under left, vertical-lr</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: under left' with 'writing-mode: vertical-lr' puts emphasis marks to the left of the text."> +<link rel="match" href="text-emphasis-position-property-004-ref.html"> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-lr; text-orientation: mixed; text-emphasis-position: under left">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005-ref.html new file mode 100644 index 0000000..c6a6df1e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005-ref.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference: text-emphasis-position: right, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; writing-mode: vertical-rl; text-orientation: sideways; ruby-position: over"><ruby>試<rt>●</rt>験<rt>●</rt>テ<rt>●</rt>ス<rt>●</rt>ト<rt>●</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005.html new file mode 100644 index 0000000..c6578de --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: right over, vertical-rl, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: right over' with 'writing-mode: vertical-rl' puts emphasis marks to the right of the text."> +<link rel="match" href="text-emphasis-position-property-005-ref.html"> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-rl; text-orientation: sideways; text-emphasis-position: right over">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005a.html new file mode 100644 index 0000000..b67216f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: over right, vertical-rl, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: over right' with 'writing-mode: vertical-rl' puts emphasis marks to the right of the text."> +<link rel="match" href="text-emphasis-position-property-005-ref.html"> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-rl; text-orientation: sideways; text-emphasis-position: over right">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005b.html new file mode 100644 index 0000000..87f3c67 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005b.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: right under, vertical-rl, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: right under' with 'writing-mode: vertical-rl' puts emphasis marks to the right of the text."> +<link rel="match" href="text-emphasis-position-property-005-ref.html"> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-rl; text-orientation: sideways; text-emphasis-position: right under">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005c.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005c.html new file mode 100644 index 0000000..9572d0e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005c.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: under right, vertical-rl, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: under right' with 'writing-mode: vertical-rl' puts emphasis marks to the right of the text."> +<link rel="match" href="text-emphasis-position-property-005-ref.html"> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-rl; text-orientation: sideways; text-emphasis-position: under right">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005d.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005d.html new file mode 100644 index 0000000..730ffaf --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005d.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: right over, vertical-lr, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: right over' with 'writing-mode: vertical-lr' puts emphasis marks to the right of the text."> +<link rel="match" href="text-emphasis-position-property-005-ref.html"> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-lr; text-orientation: sideways; text-emphasis-position: right over">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005e.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005e.html new file mode 100644 index 0000000..a359c24 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005e.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: over right, vertical-lr, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: over right' with 'writing-mode: vertical-lr' puts emphasis marks to the right of the text."> +<link rel="match" href="text-emphasis-position-property-005-ref.html"> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-lr; text-orientation: sideways; text-emphasis-position: over right">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005f.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005f.html new file mode 100644 index 0000000..d9cb51a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005f.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: right under, vertical-lr, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: right under' with 'writing-mode: vertical-lr' puts emphasis marks to the right of the text."> +<link rel="match" href="text-emphasis-position-property-005-ref.html"> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-lr; text-orientation: sideways; text-emphasis-position: right under">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005g.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005g.html new file mode 100644 index 0000000..f6698110 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-005g.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: under right, vertical-lr, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: under right' with 'writing-mode: vertical-lr' puts emphasis marks to the right of the text."> +<link rel="match" href="text-emphasis-position-property-005-ref.html"> +<p>Pass if the emphasis marks are to the right of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-lr; text-orientation: sideways; text-emphasis-position: under right">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006-ref.html new file mode 100644 index 0000000..b19d776 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006-ref.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference: text-emphasis-position: left, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; writing-mode: vertical-rl; text-orientation: sideways; ruby-position: under"><ruby>試<rt>●</rt>験<rt>●</rt>テ<rt>●</rt>ス<rt>●</rt>ト<rt>●</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006.html new file mode 100644 index 0000000..d0f018b7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: left over, vertical-rl, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: left over' with 'writing-mode: vertical-rl' puts emphasis marks to the left of the text."> +<link rel="match" href="text-emphasis-position-property-006-ref.html"> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-rl; text-orientation: sideways; text-emphasis-position: left over">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006a.html new file mode 100644 index 0000000..c1907197 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: over left, vertical-rl, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: over left' with 'writing-mode: vertical-rl' puts emphasis marks to the left of the text."> +<link rel="match" href="text-emphasis-position-property-006-ref.html"> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-rl; text-orientation: sideways; text-emphasis-position: over left">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006b.html new file mode 100644 index 0000000..769f8be --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006b.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: left under, vertical-rl, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: left under' with 'writing-mode: vertical-rl' puts emphasis marks to the left of the text."> +<link rel="match" href="text-emphasis-position-property-006-ref.html"> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-rl; text-orientation: sideways; text-emphasis-position: left under">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006c.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006c.html new file mode 100644 index 0000000..be9a4f0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006c.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: under left, vertical-rl, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: under left' with 'writing-mode: vertical-rl' puts emphasis marks to the left of the text."> +<link rel="match" href="text-emphasis-position-property-006-ref.html"> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-rl; text-orientation: sideways; text-emphasis-position: under left">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006d.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006d.html new file mode 100644 index 0000000..c60768a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006d.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: left over, vertical-lr, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: left over' with 'writing-mode: vertical-lr' puts emphasis marks to the left of the text."> +<link rel="match" href="text-emphasis-position-property-006-ref.html"> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-lr; text-orientation: sideways; text-emphasis-position: left over">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006e.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006e.html new file mode 100644 index 0000000..cdc57bad --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006e.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: over left, vertical-lr, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: over left' with 'writing-mode: vertical-lr' puts emphasis marks to the left of the text."> +<link rel="match" href="text-emphasis-position-property-006-ref.html"> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-lr; text-orientation: sideways; text-emphasis-position: over left">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006f.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006f.html new file mode 100644 index 0000000..103926c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006f.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: left under, vertical-lr, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: left under' with 'writing-mode: vertical-lr' puts emphasis marks to the left of the text."> +<link rel="match" href="text-emphasis-position-property-006-ref.html"> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-lr; text-orientation: sideways; text-emphasis-position: left under">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006g.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006g.html new file mode 100644 index 0000000..1660104 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-property-006g.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: under left, vertical-lr, sideways</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: under left' with 'writing-mode: vertical-lr' puts emphasis marks to the left of the text."> +<link rel="match" href="text-emphasis-position-property-006-ref.html"> +<p>Pass if the emphasis marks are to the left of the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: vertical-lr; text-orientation: sideways; text-emphasis-position: under left">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-001.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-001.html new file mode 100644 index 0000000..e208adc --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-001.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis: none</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-property"> +<meta name="assert" content="text-emphasis: none does not produce any emphasis marks."> +<link rel="match" href="text-emphasis-style-property-001-ref.html"> +<p>Pass if there is NO emphasis marks above the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: none">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-002.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-002.html new file mode 100644 index 0000000..0048f4fd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-002.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis: string</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-property"> +<meta name="assert" content="'text-emphasis: string' uses the given string as emphasis marks"> +<link rel="match" href="text-emphasis-style-property-002-ref.html"> +<p>Pass if there is a '^' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: '^'">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-003.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-003.html new file mode 100644 index 0000000..cc564df --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-003.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis: circle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-property"> +<meta name="assert" content="'text-emphasis: circle' produces U+25CF as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-012-ref.html"> +<p>Pass if there is a '●' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-003a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-003a.html new file mode 100644 index 0000000..313cf0ee --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-003a.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis: filled</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-property"> +<meta name="assert" content="'text-emphasis: filled' produces U+25CF as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-012-ref.html"> +<p>Pass if there is a '●' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: filled">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-003b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-003b.html new file mode 100644 index 0000000..c90d4551 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-003b.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis: filled circle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-property"> +<meta name="assert" content="'text-emphasis: filled circle' produces U+25CF as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-012-ref.html"> +<p>Pass if there is a '●' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: filled circle">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-004.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-004.html new file mode 100644 index 0000000..6af2210 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-004.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis: circle green</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-property"> +<meta name="assert" content="Emphasis marks should be rendered with color specified by text-emphasis."> +<link rel="match" href="text-emphasis-color-property-002-ref.html"> +<p>Pass if there is a <strong>green</strong> '●' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle green">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-004a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-004a.html new file mode 100644 index 0000000..23039ae --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-property-004a.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis: green circle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-property"> +<meta name="assert" content="Emphasis marks should be rendered with color specified by text-emphasis."> +<link rel="match" href="text-emphasis-color-property-002-ref.html"> +<p>Pass if there is a <strong>green</strong> '●' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: green circle">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-001-ref.html new file mode 100644 index 0000000..6b1d6bd2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-001-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-ruby-tests.py --> +<title>CSS Reference: text-emphasis and ruby, horizontal-tb, top</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rtc { font-variant-east-asian: inherit; } </style> +<p>Pass if the emphasis marks are outside the ruby:</p> +<div lang="ja" style="line-height: 5; writing-mode: horizontal-tb; ruby-position: over">ルビ<ruby>と<rtc>●</rtc>圏<rt>けん</rt><rtc>●</rtc>点<rt>てん</rt><rtc>●</rtc>を<rtc>●</rtc></ruby>同時</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-001.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-001.html new file mode 100644 index 0000000..03f562b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-001.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-ruby-tests.py --> +<title>CSS Test: text-emphasis and ruby, horizontal-tb, top</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="emphasis marks are drawn outside the ruby"> +<link rel="match" href="text-emphasis-ruby-001-ref.html"> +<p>Pass if the emphasis marks are outside the ruby:</p> +<div lang="ja" style="line-height: 5; writing-mode: horizontal-tb; ruby-position: over; text-emphasis-position: over right">ルビ<span style="text-emphasis: circle">と<ruby>圏<rt>けん</rt>点<rt>てん</rt></ruby>を</span>同時</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-002-ref.html new file mode 100644 index 0000000..a3ecaf6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-002-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-ruby-tests.py --> +<title>CSS Reference: text-emphasis and ruby, horizontal-tb, bottom</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rtc { font-variant-east-asian: inherit; } </style> +<p>Pass if the emphasis marks are outside the ruby:</p> +<div lang="ja" style="line-height: 5; writing-mode: horizontal-tb; ruby-position: under">ルビ<ruby>と<rtc>●</rtc>圏<rt>けん</rt><rtc>●</rtc>点<rt>てん</rt><rtc>●</rtc>を<rtc>●</rtc></ruby>同時</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-002.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-002.html new file mode 100644 index 0000000..c43a2a6d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-002.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-ruby-tests.py --> +<title>CSS Test: text-emphasis and ruby, horizontal-tb, bottom</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="emphasis marks are drawn outside the ruby"> +<link rel="match" href="text-emphasis-ruby-002-ref.html"> +<p>Pass if the emphasis marks are outside the ruby:</p> +<div lang="ja" style="line-height: 5; writing-mode: horizontal-tb; ruby-position: under; text-emphasis-position: under right">ルビ<span style="text-emphasis: circle">と<ruby>圏<rt>けん</rt>点<rt>てん</rt></ruby>を</span>同時</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-003-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-003-ref.html new file mode 100644 index 0000000..31cb1e6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-003-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-ruby-tests.py --> +<title>CSS Reference: text-emphasis and ruby, vertical-rl, right</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rtc { font-variant-east-asian: inherit; } </style> +<p>Pass if the emphasis marks are outside the ruby:</p> +<div lang="ja" style="line-height: 5; writing-mode: vertical-rl; ruby-position: over">ルビ<ruby>と<rtc>●</rtc>圏<rt>けん</rt><rtc>●</rtc>点<rt>てん</rt><rtc>●</rtc>を<rtc>●</rtc></ruby>同時</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-003.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-003.html new file mode 100644 index 0000000..2ac1040 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-003.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-ruby-tests.py --> +<title>CSS Test: text-emphasis and ruby, vertical-rl, right</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="emphasis marks are drawn outside the ruby"> +<link rel="match" href="text-emphasis-ruby-003-ref.html"> +<p>Pass if the emphasis marks are outside the ruby:</p> +<div lang="ja" style="line-height: 5; writing-mode: vertical-rl; ruby-position: over; text-emphasis-position: over right">ルビ<span style="text-emphasis: circle">と<ruby>圏<rt>けん</rt>点<rt>てん</rt></ruby>を</span>同時</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-003a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-003a.html new file mode 100644 index 0000000..6d49877f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-003a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-ruby-tests.py --> +<title>CSS Test: text-emphasis and ruby, vertical-lr, right</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="emphasis marks are drawn outside the ruby"> +<link rel="match" href="text-emphasis-ruby-003-ref.html"> +<p>Pass if the emphasis marks are outside the ruby:</p> +<div lang="ja" style="line-height: 5; writing-mode: vertical-lr; ruby-position: over; text-emphasis-position: over right">ルビ<span style="text-emphasis: circle">と<ruby>圏<rt>けん</rt>点<rt>てん</rt></ruby>を</span>同時</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-004-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-004-ref.html new file mode 100644 index 0000000..22b628d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-004-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-ruby-tests.py --> +<title>CSS Reference: text-emphasis and ruby, vertical-rl, left</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rtc { font-variant-east-asian: inherit; } </style> +<p>Pass if the emphasis marks are outside the ruby:</p> +<div lang="ja" style="line-height: 5; writing-mode: vertical-rl; ruby-position: under">ルビ<ruby>と<rtc>●</rtc>圏<rt>けん</rt><rtc>●</rtc>点<rt>てん</rt><rtc>●</rtc>を<rtc>●</rtc></ruby>同時</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-004.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-004.html new file mode 100644 index 0000000..d32dcb5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-004.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-ruby-tests.py --> +<title>CSS Test: text-emphasis and ruby, vertical-rl, left</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="emphasis marks are drawn outside the ruby"> +<link rel="match" href="text-emphasis-ruby-004-ref.html"> +<p>Pass if the emphasis marks are outside the ruby:</p> +<div lang="ja" style="line-height: 5; writing-mode: vertical-rl; ruby-position: under; text-emphasis-position: over left">ルビ<span style="text-emphasis: circle">と<ruby>圏<rt>けん</rt>点<rt>てん</rt></ruby>を</span>同時</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-004a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-004a.html new file mode 100644 index 0000000..75146654 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-ruby-004a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-ruby-tests.py --> +<title>CSS Test: text-emphasis and ruby, vertical-lr, left</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="emphasis marks are drawn outside the ruby"> +<link rel="match" href="text-emphasis-ruby-004-ref.html"> +<p>Pass if the emphasis marks are outside the ruby:</p> +<div lang="ja" style="line-height: 5; writing-mode: vertical-lr; ruby-position: under; text-emphasis-position: over left">ルビ<span style="text-emphasis: circle">と<ruby>圏<rt>けん</rt>点<rt>てん</rt></ruby>を</span>同時</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-001-ref.html new file mode 100644 index 0000000..9dc6c89 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-001-ref.html
@@ -0,0 +1,7 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference: text-emphasis-style: none</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<p>Pass if there is NO emphasis marks above the text below:</p> +<div lang="ja" style="line-height: 5;">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-001.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-001.html new file mode 100644 index 0000000..e2bc386 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-001.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis-style: none</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="text-emphasis-style: none does not produce any emphasis marks."> +<link rel="match" href="text-emphasis-style-property-001-ref.html"> +<p>Pass if there is NO emphasis marks above the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: none">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-002-ref.html new file mode 100644 index 0000000..1050467 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-002-ref.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference: text-emphasis-style: string</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: normal; } </style> +<p>Pass if there is a '^' above every character below:</p> +<div lang="ja" style="line-height: 5"><ruby>試<rt>^</rt>験<rt>^</rt>テ<rt>^</rt>ス<rt>^</rt>ト<rt>^</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-002.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-002.html new file mode 100644 index 0000000..2016284 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-002.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis-style: string</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: string' uses the given string as emphasis marks"> +<link rel="match" href="text-emphasis-style-property-002-ref.html"> +<p>Pass if there is a '^' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: '^'">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-003-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-003-ref.html new file mode 100644 index 0000000..fadc7d27 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-003-ref.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference: text-emphasis-style: filled sesame, vertical</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: normal; } </style> +<p>Pass if there is a '﹅' to the right of every character below:</p> +<div lang="ja" style="writing-mode: vertical-rl; line-height: 5;"><ruby>試<rt>﹅</rt>験<rt>﹅</rt>テ<rt>﹅</rt>ス<rt>﹅</rt>ト<rt>﹅</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-003.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-003.html new file mode 100644 index 0000000..4bfcffff --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-003.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis-style: filled, vertical</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: filled' produces U+FE45 as emphasis marks in vertical writing modes."> +<link rel="match" href="text-emphasis-style-property-003-ref.html"> +<p>Pass if there is a '﹅' to the right of every character below:</p> +<div lang="ja" style="writing-mode: vertical-rl; line-height: 5; text-emphasis-style: filled">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-004-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-004-ref.html new file mode 100644 index 0000000..d89ae5a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-004-ref.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference: text-emphasis-style: open sesame, vertical</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: normal; } </style> +<p>Pass if there is a '﹆' to the right of every character below:</p> +<div lang="ja" style="writing-mode: vertical-rl; line-height: 5;"><ruby>試<rt>﹆</rt>験<rt>﹆</rt>テ<rt>﹆</rt>ス<rt>﹆</rt>ト<rt>﹆</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-004.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-004.html new file mode 100644 index 0000000..360b035 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-004.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis-style: open, vertical</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis: open sesame' produces U+FE46 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-004-ref.html"> +<p>Pass if there is a '﹆' to the right of every character below:</p> +<div lang="ja" style="writing-mode: vertical-rl; line-height: 5; text-emphasis-style: open">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-005-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-005-ref.html new file mode 100644 index 0000000..36159186 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-005-ref.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference: text-emphasis-style, vertical</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: normal; text-orientation: upright; } </style> +<p>Pass if the emphasis marks 'V' are upright:</p> +<div lang="ja" style="writing-mode: vertical-rl; line-height: 5;"><ruby>試<rt>V</rt>験<rt>V</rt>テ<rt>V</rt>ス<rt>V</rt>ト<rt>V</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-005.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-005.html new file mode 100644 index 0000000..fc8ae4e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-005.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis-style, vertical-rl</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="Emphasis marks must remain upright in vertical writing modes"> +<link rel="match" href="text-emphasis-style-property-005-ref.html"> +<p>Pass if the emphasis marks 'V' are upright:</p> +<div lang="ja" style="writing-mode: vertical-rl; line-height: 5; text-emphasis-style: 'V'">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-005a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-005a.html new file mode 100644 index 0000000..3ea24ba --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-005a.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis-style, vertical-lr</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="Emphasis marks must remain upright in vertical writing modes"> +<link rel="match" href="text-emphasis-style-property-005-ref.html"> +<p>Pass if the emphasis marks 'V' are upright:</p> +<div lang="ja" style="writing-mode: vertical-lr; line-height: 5; text-emphasis-style: 'V'">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010-ref.html new file mode 100644 index 0000000..93028d6e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010-ref.html
@@ -0,0 +1,7 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis on characters without emphasis mark</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<p>Pass if there is nothing rendered below:</p> +<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Cc.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Cc.html new file mode 100644 index 0000000..0cb3357 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Cc.html
@@ -0,0 +1,85 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-010-tests.sh --> +<title>CSS Test: text-emphasis, Cc</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="Emphasis marks should not be rendered for characters in general category Cc"> +<link rel="match" href="text-emphasis-style-property-010-ref.html"> +<p>Pass if there is nothing rendered below:</p> +<div style="color: white; white-space: pre-wrap; text-emphasis: filled circle red"> +<script> + var codepoints = [ + 0x0000, + 0x0001, + 0x0002, + 0x0003, + 0x0004, + 0x0005, + 0x0006, + 0x0007, + 0x0008, + 0x0009, + 0x000A, + 0x000B, + 0x000C, + 0x000D, + 0x000E, + 0x000F, + 0x0010, + 0x0011, + 0x0012, + 0x0013, + 0x0014, + 0x0015, + 0x0016, + 0x0017, + 0x0018, + 0x0019, + 0x001A, + 0x001B, + 0x001C, + 0x001D, + 0x001E, + 0x001F, + 0x007F, + 0x0080, + 0x0081, + 0x0082, + 0x0083, + 0x0084, + 0x0085, + 0x0086, + 0x0087, + 0x0088, + 0x0089, + 0x008A, + 0x008B, + 0x008C, + 0x008D, + 0x008E, + 0x008F, + 0x0090, + 0x0091, + 0x0092, + 0x0093, + 0x0094, + 0x0095, + 0x0096, + 0x0097, + 0x0098, + 0x0099, + 0x009A, + 0x009B, + 0x009C, + 0x009D, + 0x009E, + 0x009F, + ]; + document.write(codepoints.map(function (code) { + return String.fromCodePoint(code); + }).join(' ')); +</script> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Cf.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Cf.html new file mode 100644 index 0000000..9bc696a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Cf.html
@@ -0,0 +1,170 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-010-tests.sh --> +<title>CSS Test: text-emphasis, Cf</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="Emphasis marks should not be rendered for characters in general category Cf"> +<link rel="match" href="text-emphasis-style-property-010-ref.html"> +<p>Pass if there is nothing rendered below:</p> +<div style="color: white; white-space: pre-wrap; text-emphasis: filled circle red"> +<script> + var codepoints = [ + 0x00AD, + 0x0600, + 0x0601, + 0x0602, + 0x0603, + 0x0604, + 0x0605, + 0x061C, + 0x06DD, + 0x070F, + 0x180E, + 0x200B, + 0x200C, + 0x200D, + 0x200E, + 0x200F, + 0x202A, + 0x202B, + 0x202C, + 0x202D, + 0x202E, + 0x2060, + 0x2061, + 0x2062, + 0x2063, + 0x2064, + 0x2066, + 0x2067, + 0x2068, + 0x2069, + 0x206A, + 0x206B, + 0x206C, + 0x206D, + 0x206E, + 0x206F, + 0xFEFF, + 0xFFF9, + 0xFFFA, + 0xFFFB, + 0x110BD, + 0x1BCA0, + 0x1BCA1, + 0x1BCA2, + 0x1BCA3, + 0x1D173, + 0x1D174, + 0x1D175, + 0x1D176, + 0x1D177, + 0x1D178, + 0x1D179, + 0x1D17A, + 0xE0001, + 0xE0020, + 0xE0021, + 0xE0022, + 0xE0023, + 0xE0024, + 0xE0025, + 0xE0026, + 0xE0027, + 0xE0028, + 0xE0029, + 0xE002A, + 0xE002B, + 0xE002C, + 0xE002D, + 0xE002E, + 0xE002F, + 0xE0030, + 0xE0031, + 0xE0032, + 0xE0033, + 0xE0034, + 0xE0035, + 0xE0036, + 0xE0037, + 0xE0038, + 0xE0039, + 0xE003A, + 0xE003B, + 0xE003C, + 0xE003D, + 0xE003E, + 0xE003F, + 0xE0040, + 0xE0041, + 0xE0042, + 0xE0043, + 0xE0044, + 0xE0045, + 0xE0046, + 0xE0047, + 0xE0048, + 0xE0049, + 0xE004A, + 0xE004B, + 0xE004C, + 0xE004D, + 0xE004E, + 0xE004F, + 0xE0050, + 0xE0051, + 0xE0052, + 0xE0053, + 0xE0054, + 0xE0055, + 0xE0056, + 0xE0057, + 0xE0058, + 0xE0059, + 0xE005A, + 0xE005B, + 0xE005C, + 0xE005D, + 0xE005E, + 0xE005F, + 0xE0060, + 0xE0061, + 0xE0062, + 0xE0063, + 0xE0064, + 0xE0065, + 0xE0066, + 0xE0067, + 0xE0068, + 0xE0069, + 0xE006A, + 0xE006B, + 0xE006C, + 0xE006D, + 0xE006E, + 0xE006F, + 0xE0070, + 0xE0071, + 0xE0072, + 0xE0073, + 0xE0074, + 0xE0075, + 0xE0076, + 0xE0077, + 0xE0078, + 0xE0079, + 0xE007A, + 0xE007B, + 0xE007C, + 0xE007D, + 0xE007E, + 0xE007F, + ]; + document.write(codepoints.map(function (code) { + return String.fromCodePoint(code); + }).join(' ')); +</script> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Cn.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Cn.html new file mode 100644 index 0000000..90f583d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Cn.html
@@ -0,0 +1,26 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: text-emphasis, Cn</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="Emphasis marks should not be rendered for non-characters"> +<link rel="match" href="text-emphasis-style-property-010-ref.html"> +<p>Pass if there is nothing rendered below:</p> +<div style="color: white; white-space: pre-wrap; text-emphasis: filled circle red"> +<script> + // U+FDD0..U+FDEF and U+XXFFFE..U+XXFFFF are noncharacters, + // and thus guaranteed to be unassigned. + var codepoints = []; + for (var code = 0xFDD0; code <= 0xFDEF; ++code) { + codepoints.push(code); + } + for (var plane = 0; plane <= 0x10; ++plane) { + codepoints.push(plane * 0x10000 + 0xFFFE); + codepoints.push(plane * 0x10000 + 0xFFFF); + } + document.write(codepoints.map(function (code) { + return String.fromCodePoint(code); + }).join(' ')); +</script> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Zl.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Zl.html new file mode 100644 index 0000000..6884553d2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Zl.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-010-tests.sh --> +<title>CSS Test: text-emphasis, Zl</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="Emphasis marks should not be rendered for characters in general category Zl"> +<link rel="match" href="text-emphasis-style-property-010-ref.html"> +<p>Pass if there is nothing rendered below:</p> +<div style="color: white; white-space: pre-wrap; text-emphasis: filled circle red"> +<script> + var codepoints = [ + 0x2028, + ]; + document.write(codepoints.map(function (code) { + return String.fromCodePoint(code); + }).join(' ')); +</script> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Zp.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Zp.html new file mode 100644 index 0000000..e46f3f80 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Zp.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-010-tests.sh --> +<title>CSS Test: text-emphasis, Zp</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="Emphasis marks should not be rendered for characters in general category Zp"> +<link rel="match" href="text-emphasis-style-property-010-ref.html"> +<p>Pass if there is nothing rendered below:</p> +<div style="color: white; white-space: pre-wrap; text-emphasis: filled circle red"> +<script> + var codepoints = [ + 0x2029, + ]; + document.write(codepoints.map(function (code) { + return String.fromCodePoint(code); + }).join(' ')); +</script> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Zs.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Zs.html new file mode 100644 index 0000000..f00874c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-010Zs.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-010-tests.sh --> +<title>CSS Test: text-emphasis, Zs</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="Emphasis marks should not be rendered for characters in general category Zs"> +<link rel="match" href="text-emphasis-style-property-010-ref.html"> +<p>Pass if there is nothing rendered below:</p> +<div style="color: white; white-space: pre-wrap; text-emphasis: filled circle red"> +<script> + var codepoints = [ + 0x0020, + 0x00A0, + 0x1680, + 0x2000, + 0x2001, + 0x2002, + 0x2003, + 0x2004, + 0x2005, + 0x2006, + 0x2007, + 0x2008, + 0x2009, + 0x200A, + 0x202F, + 0x205F, + 0x3000, + ]; + document.write(codepoints.map(function (code) { + return String.fromCodePoint(code); + }).join(' ')); +</script> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-011-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-011-ref.html new file mode 100644 index 0000000..4d60137 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-011-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Reference: text-emphasis-style: filled dot</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if there is a '•' above every character below:</p> +<div lang="ja" style="line-height: 5;"><ruby>試<rt>•</rt>験<rt>•</rt>テ<rt>•</rt>ス<rt>•</rt>ト<rt>•</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-011.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-011.html new file mode 100644 index 0000000..91be2c00 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-011.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: filled dot</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: filled dot' produces U+2022 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-011-ref.html"> +<p>Pass if there is a '•' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: filled dot">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-011a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-011a.html new file mode 100644 index 0000000..1d7b6e31 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-011a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: dot filled</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: dot filled' produces U+2022 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-011-ref.html"> +<p>Pass if there is a '•' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: dot filled">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-011b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-011b.html new file mode 100644 index 0000000..bec775b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-011b.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: dot</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: dot' produces U+2022 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-011-ref.html"> +<p>Pass if there is a '•' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: dot">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-012-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-012-ref.html new file mode 100644 index 0000000..ba6d4c2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-012-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Reference: text-emphasis-style: filled circle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if there is a '●' above every character below:</p> +<div lang="ja" style="line-height: 5;"><ruby>試<rt>●</rt>験<rt>●</rt>テ<rt>●</rt>ス<rt>●</rt>ト<rt>●</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-012.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-012.html new file mode 100644 index 0000000..5e1362f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-012.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: filled circle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: filled circle' produces U+25CF as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-012-ref.html"> +<p>Pass if there is a '●' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: filled circle">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-012a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-012a.html new file mode 100644 index 0000000..83e8d79c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-012a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: circle filled</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: circle filled' produces U+25CF as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-012-ref.html"> +<p>Pass if there is a '●' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: circle filled">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-012b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-012b.html new file mode 100644 index 0000000..df71056 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-012b.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: circle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: circle' produces U+25CF as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-012-ref.html"> +<p>Pass if there is a '●' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: circle">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-012c.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-012c.html new file mode 100644 index 0000000..552b62b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-012c.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: filled, horizontal</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: filled' produces U+25CF as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-012-ref.html"> +<p>Pass if there is a '●' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: filled">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-013-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-013-ref.html new file mode 100644 index 0000000..c22aecee --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-013-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Reference: text-emphasis-style: filled double-circle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if there is a '◉' above every character below:</p> +<div lang="ja" style="line-height: 5;"><ruby>試<rt>◉</rt>験<rt>◉</rt>テ<rt>◉</rt>ス<rt>◉</rt>ト<rt>◉</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-013.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-013.html new file mode 100644 index 0000000..39d2c63 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-013.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: filled double-circle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: filled double-circle' produces U+25C9 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-013-ref.html"> +<p>Pass if there is a '◉' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: filled double-circle">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-013a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-013a.html new file mode 100644 index 0000000..0ac4b83 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-013a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: double-circle filled</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: double-circle filled' produces U+25C9 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-013-ref.html"> +<p>Pass if there is a '◉' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: double-circle filled">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-013b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-013b.html new file mode 100644 index 0000000..25768be --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-013b.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: double-circle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: double-circle' produces U+25C9 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-013-ref.html"> +<p>Pass if there is a '◉' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: double-circle">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-014-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-014-ref.html new file mode 100644 index 0000000..c816fd52 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-014-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Reference: text-emphasis-style: filled triangle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if there is a '▲' above every character below:</p> +<div lang="ja" style="line-height: 5;"><ruby>試<rt>▲</rt>験<rt>▲</rt>テ<rt>▲</rt>ス<rt>▲</rt>ト<rt>▲</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-014.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-014.html new file mode 100644 index 0000000..2e3c69dd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-014.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: filled triangle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: filled triangle' produces U+25B2 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-014-ref.html"> +<p>Pass if there is a '▲' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: filled triangle">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-014a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-014a.html new file mode 100644 index 0000000..9fa3f14a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-014a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: triangle filled</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: triangle filled' produces U+25B2 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-014-ref.html"> +<p>Pass if there is a '▲' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: triangle filled">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-014b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-014b.html new file mode 100644 index 0000000..fd5db557 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-014b.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: triangle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: triangle' produces U+25B2 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-014-ref.html"> +<p>Pass if there is a '▲' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: triangle">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-015-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-015-ref.html new file mode 100644 index 0000000..0b0cc8d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-015-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Reference: text-emphasis-style: filled sesame</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if there is a '﹅' above every character below:</p> +<div lang="ja" style="line-height: 5;"><ruby>試<rt>﹅</rt>験<rt>﹅</rt>テ<rt>﹅</rt>ス<rt>﹅</rt>ト<rt>﹅</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-015.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-015.html new file mode 100644 index 0000000..9b11e53e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-015.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: filled sesame</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: filled sesame' produces U+FE45 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-015-ref.html"> +<p>Pass if there is a '﹅' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: filled sesame">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-015a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-015a.html new file mode 100644 index 0000000..e8b3c73 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-015a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: sesame filled</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: sesame filled' produces U+FE45 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-015-ref.html"> +<p>Pass if there is a '﹅' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: sesame filled">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-015b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-015b.html new file mode 100644 index 0000000..dcc30c0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-015b.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: sesame</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: sesame' produces U+FE45 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-015-ref.html"> +<p>Pass if there is a '﹅' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: sesame">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-016-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-016-ref.html new file mode 100644 index 0000000..47a6377 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-016-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Reference: text-emphasis-style: open dot</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if there is a '◦' above every character below:</p> +<div lang="ja" style="line-height: 5;"><ruby>試<rt>◦</rt>験<rt>◦</rt>テ<rt>◦</rt>ス<rt>◦</rt>ト<rt>◦</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-016.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-016.html new file mode 100644 index 0000000..e830375 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-016.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: open dot</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: open dot' produces U+25E6 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-016-ref.html"> +<p>Pass if there is a '◦' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: open dot">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-016a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-016a.html new file mode 100644 index 0000000..eb7be9a6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-016a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: dot open</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: dot open' produces U+25E6 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-016-ref.html"> +<p>Pass if there is a '◦' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: dot open">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-017-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-017-ref.html new file mode 100644 index 0000000..b033567 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-017-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Reference: text-emphasis-style: open circle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if there is a '○' above every character below:</p> +<div lang="ja" style="line-height: 5;"><ruby>試<rt>○</rt>験<rt>○</rt>テ<rt>○</rt>ス<rt>○</rt>ト<rt>○</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-017.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-017.html new file mode 100644 index 0000000..1d778a8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-017.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: open circle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: open circle' produces U+25CB as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-017-ref.html"> +<p>Pass if there is a '○' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: open circle">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-017a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-017a.html new file mode 100644 index 0000000..8e1b0b2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-017a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: circle open</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: circle open' produces U+25CB as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-017-ref.html"> +<p>Pass if there is a '○' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: circle open">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-017b.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-017b.html new file mode 100644 index 0000000..e6b75fd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-017b.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: open, horizontal</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: open' produces U+25CB as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-017-ref.html"> +<p>Pass if there is a '○' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: open">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-018-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-018-ref.html new file mode 100644 index 0000000..e1a60397 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-018-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Reference: text-emphasis-style: open double-circle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if there is a '◎' above every character below:</p> +<div lang="ja" style="line-height: 5;"><ruby>試<rt>◎</rt>験<rt>◎</rt>テ<rt>◎</rt>ス<rt>◎</rt>ト<rt>◎</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-018.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-018.html new file mode 100644 index 0000000..6fe162d6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-018.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: open double-circle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: open double-circle' produces U+25CE as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-018-ref.html"> +<p>Pass if there is a '◎' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: open double-circle">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-018a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-018a.html new file mode 100644 index 0000000..44c0cb7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-018a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: double-circle open</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: double-circle open' produces U+25CE as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-018-ref.html"> +<p>Pass if there is a '◎' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: double-circle open">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-019-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-019-ref.html new file mode 100644 index 0000000..ec50cc8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-019-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Reference: text-emphasis-style: open triangle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if there is a '△' above every character below:</p> +<div lang="ja" style="line-height: 5;"><ruby>試<rt>△</rt>験<rt>△</rt>テ<rt>△</rt>ス<rt>△</rt>ト<rt>△</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-019.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-019.html new file mode 100644 index 0000000..8014cec --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-019.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: open triangle</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: open triangle' produces U+25B3 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-019-ref.html"> +<p>Pass if there is a '△' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: open triangle">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-019a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-019a.html new file mode 100644 index 0000000..7e79b41 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-019a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: triangle open</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: triangle open' produces U+25B3 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-019-ref.html"> +<p>Pass if there is a '△' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: triangle open">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-020-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-020-ref.html new file mode 100644 index 0000000..81a2aed --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-020-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Reference: text-emphasis-style: open sesame</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt { font-variant-east-asian: inherit; } </style> +<p>Pass if there is a '﹆' above every character below:</p> +<div lang="ja" style="line-height: 5;"><ruby>試<rt>﹆</rt>験<rt>﹆</rt>テ<rt>﹆</rt>ス<rt>﹆</rt>ト<rt>﹆</rt></ruby></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-020.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-020.html new file mode 100644 index 0000000..e77c317 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-020.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: open sesame</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: open sesame' produces U+FE46 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-020-ref.html"> +<p>Pass if there is a '﹆' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: open sesame">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-020a.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-020a.html new file mode 100644 index 0000000..19a9059 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-style-property-020a.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: sesame open</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: sesame open' produces U+FE46 as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-020-ref.html"> +<p>Pass if there is a '﹆' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: sesame open">試験テスト</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic-negcoord-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic-negcoord-ref.html new file mode 100644 index 0000000..79c3d99 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic-negcoord-ref.html
@@ -0,0 +1,5 @@ +<!DOCTYPE HTML> + +<div style="position: absolute; top: 20px; left: 20px; color: green; z-index: 0;">Hello</div> +<div style="position: absolute; top: 24px; left: 24px; color: black; z-index: 1;">Hello</div> +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic-negcoord.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic-negcoord.html new file mode 100644 index 0000000..1e29b42 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic-negcoord.html
@@ -0,0 +1,5 @@ +<!DOCTYPE HTML> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property"> +<link rel="match" href="basic-negcoord-ref.html"> +<div style="position: absolute; top: 24px; left: 24px; color: black; text-shadow: green -4px -4px;">Hello</div> +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic-opacity-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic-opacity-ref.html new file mode 100644 index 0000000..11aa6d5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic-opacity-ref.html
@@ -0,0 +1,2 @@ +<div style="position: absolute; top: 33px; left: 33px; color: rgba(0, 0, 255, 0.2); z-index: 0;">Hello</div> +<div style="position: absolute; top: 30px; left: 30px; color: green; z-index: 1;">Hello</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic-opacity.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic-opacity.html new file mode 100644 index 0000000..a8cea6a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic-opacity.html
@@ -0,0 +1,3 @@ +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property"> +<link rel="match" href="basic-opacity-ref.html"> +<div style="position: absolute; top: 30px; left: 30px; color: green; text-shadow: rgba(0, 0, 255, 0.2) 3px 3px;">Hello</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic-ref.html new file mode 100644 index 0000000..26b07d2e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic-ref.html
@@ -0,0 +1,2 @@ +<div style="position: absolute; top: 33px; left: 33px; color: grey; z-index: 0;">Hello</div> +<div style="position: absolute; top: 30px; left: 30px; color: green; z-index: 1;">Hello</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic.html new file mode 100644 index 0000000..fc470ea6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/basic.html
@@ -0,0 +1,3 @@ +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property"> +<link rel="match" href="basic-ref.html"> +<div style="position: absolute; top: 30px; left: 30px; color: green; text-shadow: grey 3px 3px;">Hello</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/blur-notref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/blur-notref.html new file mode 100644 index 0000000..2840409 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/blur-notref.html
@@ -0,0 +1 @@ +<div style="text-shadow: blue 4px 4px">The shadow should be blurred</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/blur.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/blur.html new file mode 100644 index 0000000..f6dd3cf --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/blur.html
@@ -0,0 +1,3 @@ +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property"> +<link rel="mismatch" href="blur-notref.html"> +<div style="text-shadow: blue 4px 4px 2px">The shadow should be blurred</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/color-inherit-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/color-inherit-ref.html new file mode 100644 index 0000000..8fa2daf --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/color-inherit-ref.html
@@ -0,0 +1,5 @@ +<!DOCTYPE HTML> + +<div style="position: absolute; top: 27px; left: 27px; color: blue; z-index: 0;">Hello</div> +<div style="position: absolute; top: 24px; left: 24px; color: blue; z-index: 1;">Hello</div> +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/color-inherit.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/color-inherit.html new file mode 100644 index 0000000..abb2cffd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/color-inherit.html
@@ -0,0 +1,5 @@ +<!DOCTYPE HTML> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property"> +<link rel="match" href="color-inherit-ref.html"> +<div style="position: absolute; top: 24px; left: 24px; color: blue; text-shadow: 3px 3px;">Hello</div> +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/color-parserorder-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/color-parserorder-ref.html new file mode 100644 index 0000000..16d53ce0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/color-parserorder-ref.html
@@ -0,0 +1 @@ +<div style="text-shadow: green 3px 3px 2px;">Parser test</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/color-parserorder.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/color-parserorder.html new file mode 100644 index 0000000..829383bf --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/color-parserorder.html
@@ -0,0 +1,3 @@ +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property"> +<link rel="match" href="color-parserorder-ref.html"> +<div style="text-shadow: 3px 3px 2px green;">Parser test</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-shadow-currentcolor-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/currentcolor-ref.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-shadow-currentcolor-ref.html rename to third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/currentcolor-ref.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow-currentcolor.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/currentcolor.html similarity index 91% rename from third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow-currentcolor.html rename to third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/currentcolor.html index 6e8bb20..0bed948 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow-currentcolor.html +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/currentcolor.html
@@ -10,7 +10,7 @@ <link rel="author" title="Dan Glastonbury" href="mailto:dglastonbury@mozilla.com" /> <link rel="help" href="https://www.w3.org/TR/css-text-decor-3/#text-shadow-property" /> <link rel="help" href="https://www.w3.org/TR/css-color-3/#currentcolor" /> - <link rel="match" href="reference/text-shadow-currentcolor-ref.html" /> + <link rel="match" href="currentcolor-ref.html" /> <style> body { color: red;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/decorations-multiple-zorder-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/decorations-multiple-zorder-ref.html new file mode 100644 index 0000000..5638673 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/decorations-multiple-zorder-ref.html
@@ -0,0 +1,36 @@ +<!DOCTYPE HTML> +<style> +div { + text-decoration-skip-ink: none; +} +</style> +<!-- Shadows --> +<!-- Blue underline/text --> +<div style="position: absolute; top: 22px; left: 22px;"><span style="color: blue; text-decoration: underline">test</span></div> +<!-- Red overline/text --> +<!-- +There are some additional pixels appearing when two red texts are overlap. We +use transparent color for the first one to prevent the situation and the failure +of reftest. +--> +<div style="position: absolute; top: 22px; left: 22px;"><span style="color: rgba(0, 0, 0, 0);">test</span><span style="color: transparent; text-decoration: red underline;">for</span></div> +<div style="position: absolute; top: 22px; left: 22px;"><span style="color: rgba(0, 0, 0, 0);">test</span><span style="color: red; text-decoration: overline;">for</span></div> +<!-- Green text/underline --> +<!-- +There are some additional pixels appearing when two red texts are overlap. We +use transparent color for the first one to prevent the situation and the failure +of reftest. +--> +<div style="position: absolute; top: 22px; left: 22px;"><span style="color: rgba(0, 0, 0, 0);">testfor</span><span style="text-decoration: green underline; color: transparent;">quirks</span></div> +<div style="position: absolute; top: 22px; left: 22px;"><span style="color: rgba(0, 0, 0, 0);">testfor</span><span style="text-decoration: overline; color: green;">quirks</span></div> + +<!-- "Real" text --> +<!-- Blue underline/text --> +<div style="position: absolute; top: 20px; left: 20px; color: blue; text-decoration: underline;"><span style="color: rgba(0, 0, 0, 0);">testforquirks</span></div> +<div style="position: absolute; top: 20px; left: 20px;"><span style="color: blue;">test</span></div> +<!-- Red overline/text --> +<div style="position: absolute; top: 20px; left: 20px; color: rgba(0, 0, 0, 0);">test<span style="text-decoration: overline; color: red;"><span style="color: rgba(0, 0, 0, 0);">forquirks</span></span></div> +<div style="position: absolute; top: 20px; left: 20px;"><span style="color: rgba(0, 0, 0, 0);">test</span><span style="color: red;">for</span></div> +<!-- Green underline/text --> +<div style="position: absolute; top: 20px; left: 20px;"><span style="color: rgba(0, 0, 0, 0);">testfor</span><span style="text-decoration: underline; color: green;"><span style="color: rgba(0, 0, 0, 0);">quirks</span></span></div> +<div style="position: absolute; top: 20px; left: 20px;"><span style="color: rgba(0, 0, 0, 0);">testfor</span><span style="color: green;">quirks</span></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/decorations-multiple-zorder.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/decorations-multiple-zorder.html new file mode 100644 index 0000000..22406534 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/decorations-multiple-zorder.html
@@ -0,0 +1,9 @@ +<!DOCTYPE HTML> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property"> +<link rel="match" href="decorations-multiple-zorder-ref.html"> +<style> +div { + text-decoration-skip-ink: none; +} +</style> +<div style="text-shadow: 2px 2px; color: blue; text-decoration: underline; position: absolute; top: 20px; left: 20px;">test<span style="text-decoration: overline; color: red;">for<span style="text-decoration: underline; color: green;">quirks</span></span></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/dynamic-blur-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/dynamic-blur-ref.html new file mode 100644 index 0000000..779f4ad --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/dynamic-blur-ref.html
@@ -0,0 +1,5 @@ +<!DOCTYPE html> +<html style='text-shadow: 0.6em 0.6em 0.1em green'> +<body>I have a green shadow</body> +</html> +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/dynamic-blur.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/dynamic-blur.html new file mode 100644 index 0000000..3f1f02b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/dynamic-blur.html
@@ -0,0 +1,9 @@ +<!DOCTYPE html> +<html> +<head> + <link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property"> + <link rel="match" href="dynamic-blur-ref.html"> +</head> +<body onload="document.documentElement.style.textShadow = '0.6em 0.6em 0.1em green';">I have a green shadow</body> +</html> +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/lineoverflow-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/lineoverflow-ref.html new file mode 100644 index 0000000..07fad32 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/lineoverflow-ref.html
@@ -0,0 +1,3 @@ +<!DOCTYPE HTML> + +<div style="position: absolute; top: 20px; left: 20px;"><span style="text-decoration: underline; text-shadow: 3px 3px 2px red; font-size: 40px;">Testingtestingtestingtesting</span></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/lineoverflow.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/lineoverflow.html new file mode 100644 index 0000000..050ee65 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/lineoverflow.html
@@ -0,0 +1,4 @@ +<!DOCTYPE HTML> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property"> +<link rel="match" href="lineoverflow-ref.html"> +<div style="position: absolute; top: 20px; left: 20px; width: 50px; text-decoration: underline; text-shadow: 3px 3px 2px red; font-size: 40px;">Testingtestingtestingtesting</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/multiple-noblur-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/multiple-noblur-ref.html new file mode 100644 index 0000000..a5f125e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/multiple-noblur-ref.html
@@ -0,0 +1,5 @@ +<div style="position: absolute; top: 33px; left: 33px; color: grey; z-index: 0;">Hello</div> +<div style="position: absolute; top: 30px; left: 30px; color: green; z-index: 1;">Hello</div> +<div style="position: absolute; top: 27px; left: 27px; color: red; z-index: 2;">Hello</div> +<div style="position: absolute; top: 24px; left: 24px; color: purple; z-index: 3;">Hello</div> +<div style="position: absolute; top: 20px; left: 20px; color: black; z-index: 4;">Hello</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/multiple-noblur.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/multiple-noblur.html new file mode 100644 index 0000000..cf86e4b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/multiple-noblur.html
@@ -0,0 +1,3 @@ +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property"> +<link rel="match" href="multiple-noblur-ref.html"> +<div style="position: absolute; top: 20px; left: 20px; color: black; text-shadow: purple 4px 4px, red 7px 7px, green 10px 10px, grey 13px 13px;">Hello</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/overflow-not-scrollable-1-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/overflow-not-scrollable-1-ref.html new file mode 100644 index 0000000..642d1018 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/overflow-not-scrollable-1-ref.html
@@ -0,0 +1,16 @@ +<!DOCTYPE HTML> +<style type="text/css"> + +div { + height: 200px; width: 200px; overflow: hidden; + text-shadow: 210px 210px 2px gray; + font-size: 50px; +} + +/* work around potential font overflow */ +span { margin-left: 5px } + +</style> +<div> +<span>text</span> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/overflow-not-scrollable-1-ref2.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/overflow-not-scrollable-1-ref2.html new file mode 100644 index 0000000..4ed3a46 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/overflow-not-scrollable-1-ref2.html
@@ -0,0 +1,15 @@ +<!DOCTYPE HTML> +<style type="text/css"> + +div { + height: 200px; width: 200px; + font-size: 50px; +} + +/* work around potential font overflow */ +span { margin-left: 5px } + +</style> +<div> +<span>text</span> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/overflow-not-scrollable-1.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/overflow-not-scrollable-1.html new file mode 100644 index 0000000..ca9fc8c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/overflow-not-scrollable-1.html
@@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property"> +<link rel="match" href="overflow-not-scrollable-1-ref.html"> +<link rel="match" href="overflow-not-scrollable-1-ref2.html"> +<style> +div { + height: 200px; width: 200px; overflow: auto; + text-shadow: 210px 210px 2px gray; + font-size: 50px; +} + +/* work around potential font overflow */ +span { margin-left: 5px } +</style> +<div> +<span>text</span> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/overflow-not-scrollable-2-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/overflow-not-scrollable-2-ref.html new file mode 100644 index 0000000..4d0e745 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/overflow-not-scrollable-2-ref.html
@@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<style type="text/css"> + +div { + height: 200px; width: 200px; overflow: hidden; + text-shadow: 100px 100px 30px black; + font-size: 50px; + font-weight: bold; +} + +/* work around potential font overflow */ +span { margin-left: 5px } + +</style> +<div> +<span>text</span> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/overflow-not-scrollable-2.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/overflow-not-scrollable-2.html new file mode 100644 index 0000000..b532789 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/overflow-not-scrollable-2.html
@@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property"> +<link rel="match" href="overflow-not-scrollable-2-ref.html"> +<style> +div { + height: 200px; width: 200px; overflow: auto; + text-shadow: 100px 100px 30px black; + font-size: 50px; + font-weight: bold; +} + +/* work around potential font overflow */ +span { margin-left: 5px } +</style> +<div> +<span>text</span> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/padding-decoration-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/padding-decoration-ref.html new file mode 100644 index 0000000..1cc1f5ec --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/padding-decoration-ref.html
@@ -0,0 +1 @@ +<!DOCTYPE HTML><div><a href="http://test" style="margin-left: 20px; text-shadow: 2px 2px 2px blue;">Hello world hello world</a></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/padding-decoration.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/padding-decoration.html new file mode 100644 index 0000000..7512f28 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/padding-decoration.html
@@ -0,0 +1,4 @@ +<!DOCTYPE HTML> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property"> +<link rel="match" href="padding-decoration-ref.html"> +<div><a href="http://test" style="padding-left: 20px; text-shadow: 2px 2px 2px blue;">Hello world hello world</a></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-shadow-computed.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/parsing/text-shadow-computed.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-shadow-computed.html rename to third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/parsing/text-shadow-computed.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-shadow-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/parsing/text-shadow-invalid.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-shadow-invalid.html rename to third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/parsing/text-shadow-invalid.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-shadow-valid.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/parsing/text-shadow-valid.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-shadow-valid.html rename to third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/parsing/text-shadow-valid.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/quirks-decor-noblur-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/quirks-decor-noblur-ref.html new file mode 100644 index 0000000..9644146 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/quirks-decor-noblur-ref.html
@@ -0,0 +1,11 @@ +<style> +div { +text-decoration: underline; +} +</style> + +<div style="position: absolute; top: 33px; left: 33px; color: grey; z-index: 0;">Hello</div> +<div style="position: absolute; top: 30px; left: 30px; color: green; z-index: 1;">Hello</div> +<div style="position: absolute; top: 27px; left: 27px; color: red; z-index: 2;">Hello</div> +<div style="position: absolute; top: 24px; left: 24px; color: purple; z-index: 3;">Hello</div> +<div style="position: absolute; top: 20px; left: 20px; color: black; z-index: 4;">Hello</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/quirks-decor-noblur.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/quirks-decor-noblur.html new file mode 100644 index 0000000..e5de43d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/quirks-decor-noblur.html
@@ -0,0 +1,3 @@ +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property"> +<link rel="match" href="quirks-decor-noblur-ref.html"> +<div style="position: absolute; top: 20px; left: 20px; color: black; text-shadow: purple 4px 4px, red 7px 7px, green 10px 10px, grey 13px 13px; text-decoration: underline;">Hello</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/standards-decor-noblur-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/standards-decor-noblur-ref.html new file mode 100644 index 0000000..8a962a4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/standards-decor-noblur-ref.html
@@ -0,0 +1,16 @@ +<!DOCTYPE HTML> +<style> +.underlined { +text-decoration: underline; +} + +span { +color: rgba(0, 0, 0, 0); +} +</style> + +<div class="underlined" style="position: absolute; top: 33px; left: 33px; color: grey; z-index: 0;">Hello</div> +<div class="underlined" style="position: absolute; top: 30px; left: 30px; color: green; z-index: 1;">Hello</div> +<div class="underlined" style="position: absolute; top: 27px; left: 27px; color: red; z-index: 2;">Hello</div> +<div class="underlined" style="position: absolute; top: 24px; left: 24px; color: purple; z-index: 3;">Hello</div> +<div class="underlined" style="position: absolute; top: 20px; left: 20px; color: black; z-index: 4;">Hello</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/standards-decor-noblur.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/standards-decor-noblur.html new file mode 100644 index 0000000..d5a2f4e0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/standards-decor-noblur.html
@@ -0,0 +1,5 @@ +<!DOCTYPE HTML> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property"> +<link rel="match" href="standards-decor-noblur-ref.html"> +<!-- Shadows are painted below text AND its decorations --> +<div style="position: absolute; top: 20px; left: 20px; color: black; text-shadow: purple 4px 4px, red 7px 7px, green 10px 10px, grey 13px 13px; text-decoration: underline;">Hello</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/textindent-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/textindent-ref.html new file mode 100644 index 0000000..c3e3315 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/textindent-ref.html
@@ -0,0 +1,3 @@ +<!DOCTYPE HTML> + +<div style="position:absolute; top: 20px; left: 60px; text-decoration: underline; text-shadow: 5px 5px 3px blue; font-size: 40px;">M</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/textindent.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/textindent.html new file mode 100644 index 0000000..4b66f9dc --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-shadow/textindent.html
@@ -0,0 +1,4 @@ +<!DOCTYPE HTML> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-shadow-property"> +<link rel="match" href="textindent-ref.html"> +<div style="position:absolute; top: 20px; left: 120px; text-indent: -60px; text-decoration: underline; text-shadow: 5px 5px 3px blue; font-size: 40px;">M</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/tools/generate-text-emphasis-line-height-tests.py b/third_party/blink/web_tests/external/wpt/css/css-text-decor/tools/generate-text-emphasis-line-height-tests.py new file mode 100755 index 0000000..12fb6a3a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/tools/generate-text-emphasis-line-height-tests.py
@@ -0,0 +1,86 @@ +#!/usr/bin/env python +# - * - coding: UTF-8 - * - + +""" +This script generates tests text-emphasis-line-height-001 ~ 004 except +001z. They test the line height expansion in different directions. This +script outputs a list of all tests it generated in the format of Mozilla +reftest.list to the stdout. +""" + +from __future__ import unicode_literals, print_function, absolute_import + +TEST_FILE = 'text-emphasis-line-height-{:03}{}.html' +TEST_TEMPLATE = '''<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Test: text-emphasis line height, {pos}, {wm}, {tag}</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="text emphasis marks should expand the line height like ruby if necessary"> +<link rel="match" href="text-emphasis-line-height-{index:03}-ref.html"> +<p>Pass if the emphasis marks are {dir} the black line:</p> +{start}試験テスト{end} +''' + +REF_FILE = 'text-emphasis-line-height-{:03}-ref.html' +REF_TEMPLATE='''<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-line-height-tests.py --> +<title>CSS Reference: text-emphasis line height, {pos}</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt {{ font-variant-east-asian: inherit; }} </style> +<p>Pass if the emphasis marks are {dir} the black line:</p> +<div lang="ja" style="line-height: 1; border-{pos}: 1px solid black; writing-mode: {wm}; ruby-position: {posval}"><ruby>試<rt>●</rt>験<rt>●</rt>テ<rt>●</rt>ス<rt>●</rt>ト<rt>●</rt></ruby></div> +''' + +STYLE1 = 'line-height: 1; border-{pos}: 1px solid black; ' + \ + 'writing-mode: {wm}; text-emphasis-position: {posval};' +STYLE2 = 'text-emphasis: circle;' + +TAGS = [ + # (tag, start, end) + ('div', '<div lang="ja" style="{style1}{style2}">', '</div>'), + ('span', '<div lang="ja" style="{style1}"><span style="{style2}">', '</span></div>'), + ] +POSITIONS = [ + # pos, text-emphasis-position, ruby-position, + # writing-modes, dir text + ('top', 'over right', 'over', + ['horizontal-tb'], 'below'), + ('bottom', 'under right', 'under', + ['horizontal-tb'], 'over'), + ('right', 'over right', 'over', + ['vertical-rl', 'vertical-lr'], 'to the left of'), + ('left', 'over left', 'under', + ['vertical-rl', 'vertical-lr'], 'to the right of'), + ] + +import string + +def write_file(filename, content): + with open(filename, 'wb') as f: + f.write(content.encode('UTF-8')) + +print("# START tests from {}".format(__file__)) +idx = 0 +for (pos, emphasis_pos, ruby_pos, wms, dir) in POSITIONS: + idx += 1 + ref_file = REF_FILE.format(idx) + content = REF_TEMPLATE.format(pos=pos, dir=dir, wm=wms[0], posval=ruby_pos) + write_file(ref_file, content) + suffix = iter(string.ascii_lowercase) + for wm in wms: + style1 = STYLE1.format(pos=pos, wm=wm, posval=emphasis_pos) + for (tag, start, end) in TAGS: + test_file = TEST_FILE.format(idx, next(suffix)) + content = TEST_TEMPLATE.format( + pos=pos, wm=wm, tag=tag, index=idx, dir=dir, + start=start.format(style1=style1, style2=STYLE2), end=end) + write_file(test_file, content) + print("== {} {}".format(test_file, ref_file)) +print("# END tests from {}".format(__file__))
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/tools/generate-text-emphasis-position-property-tests.py b/third_party/blink/web_tests/external/wpt/css/css-text-decor/tools/generate-text-emphasis-position-property-tests.py new file mode 100755 index 0000000..5279590 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/tools/generate-text-emphasis-position-property-tests.py
@@ -0,0 +1,81 @@ +#!/usr/bin/env python +# - * - coding: UTF-8 - * - + +""" +This script generates tests text-emphasis-position-property-001 ~ 006 +which cover all possible values of text-emphasis-position property with +all combination of three main writing modes and two orientations. Only +test files are generated by this script. It also outputs a list of all +tests it generated in the format of Mozilla reftest.list to the stdout. +""" + +from __future__ import unicode_literals, print_function, absolute_import + +import itertools + +TEST_FILE = 'text-emphasis-position-property-{:03}{}.html' +REF_FILE = 'text-emphasis-position-property-{:03}-ref.html' +TEST_TEMPLATE = '''<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-position-property-tests.py --> +<title>CSS Test: text-emphasis-position: {value}, {title}</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="'text-emphasis-position: {value}' with 'writing-mode: {wm}' puts emphasis marks {position} the text."> +<link rel="match" href="text-emphasis-position-property-{index:03}-ref.html"> +<p>Pass if the emphasis marks are {position} the text below:</p> +<div lang="ja" style="line-height: 5; text-emphasis: circle; writing-mode: {wm}; text-orientation: {orient}; text-emphasis-position: {value}">試験テスト</div> +''' + +SUFFIXES = ['', 'a', 'b', 'c', 'd', 'e', 'f', 'g'] + +WRITING_MODES = ["horizontal-tb", "vertical-rl", "vertical-lr"] +POSITION_HORIZONTAL = ["over", "under"] +POSITION_VERTICAL = ["right", "left"] + +REF_MAP_MIXED = { "over": 1, "under": 2, "right": 3, "left": 4 } +REF_MAP_SIDEWAYS = { "right": 5, "left": 6 } +POSITION_TEXT = { "over": "over", "under": "under", + "right": "to the right of", "left": "to the left of" } + +suffixes = [iter(SUFFIXES) for i in range(6)] + +reftest_items = [] + +def write_file(filename, content): + with open(filename, 'wb') as f: + f.write(content.encode('UTF-8')) + +def write_test_file(idx, suffix, wm, orient, value, position): + filename = TEST_FILE.format(idx, suffix) + write_file(filename, TEST_TEMPLATE.format( + value=value, wm=wm, orient=orient, index=idx, position=position, + title=(wm if orient == "mixed" else "{}, {}".format(wm, orient)))) + reftest_items.append("== {} {}".format(filename, REF_FILE.format(idx))) + +def write_test_files(wm, orient, pos1, pos2): + idx = (REF_MAP_MIXED if orient == "mixed" else REF_MAP_SIDEWAYS)[pos1] + position = POSITION_TEXT[pos1] + suffix = suffixes[idx - 1] + write_test_file(idx, next(suffix), wm, orient, pos1 + " " + pos2, position) + write_test_file(idx, next(suffix), wm, orient, pos2 + " " + pos1, position) + +for wm in WRITING_MODES: + if wm == "horizontal-tb": + effective_pos = POSITION_HORIZONTAL + ineffective_pos = POSITION_VERTICAL + else: + effective_pos = POSITION_VERTICAL + ineffective_pos = POSITION_HORIZONTAL + for pos1, pos2 in itertools.product(effective_pos, ineffective_pos): + write_test_files(wm, "mixed", pos1, pos2) + if wm != "horizontal-tb": + write_test_files(wm, "sideways", pos1, pos2) + +print("# START tests from {}".format(__file__)) +reftest_items.sort() +for item in reftest_items: + print(item) +print("# END tests from {}".format(__file__))
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/tools/generate-text-emphasis-ruby-tests.py b/third_party/blink/web_tests/external/wpt/css/css-text-decor/tools/generate-text-emphasis-ruby-tests.py new file mode 100755 index 0000000..fdbaec0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/tools/generate-text-emphasis-ruby-tests.py
@@ -0,0 +1,73 @@ +#!/usr/bin/env python +# - * - coding: UTF-8 - * - + +""" +This script generates tests text-emphasis-ruby-001 ~ 004 which tests +emphasis marks with ruby in four directions. It outputs a list of all +tests it generated in the format of Mozilla reftest.list to the stdout. +""" + +from __future__ import unicode_literals, print_function, absolute_import + +TEST_FILE = 'text-emphasis-ruby-{:03}{}.html' +TEST_TEMPLATE = '''<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-ruby-tests.py --> +<title>CSS Test: text-emphasis and ruby, {wm}, {pos}</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-position-property"> +<meta name="assert" content="emphasis marks are drawn outside the ruby"> +<link rel="match" href="text-emphasis-ruby-{index:03}-ref.html"> +<p>Pass if the emphasis marks are outside the ruby:</p> +<div lang="ja" style="line-height: 5; writing-mode: {wm}; ruby-position: {ruby_pos}; text-emphasis-position: {posval}">ルビ<span style="text-emphasis: circle">と<ruby>圏<rt>けん</rt>点<rt>てん</rt></ruby>を</span>同時</div> +''' + +REF_FILE = 'text-emphasis-ruby-{:03}-ref.html' +REF_TEMPLATE = '''<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-ruby-tests.py --> +<title>CSS Reference: text-emphasis and ruby, {wm}, {pos}</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rtc {{ font-variant-east-asian: inherit; }} </style> +<p>Pass if the emphasis marks are outside the ruby:</p> +<div lang="ja" style="line-height: 5; writing-mode: {wm}; ruby-position: {posval}">ルビ<ruby>と<rtc>●</rtc>圏<rt>けん</rt><rtc>●</rtc>点<rt>てん</rt><rtc>●</rtc>を<rtc>●</rtc></ruby>同時</div> +''' + +TEST_CASES = [ + ('top', 'horizontal-tb', 'over', [ + ('horizontal-tb', 'over right')]), + ('bottom', 'horizontal-tb', 'under', [ + ('horizontal-tb', 'under right')]), + ('right', 'vertical-rl', 'over', [ + ('vertical-rl', 'over right'), + ('vertical-lr', 'over right')]), + ('left', 'vertical-rl', 'under', [ + ('vertical-rl', 'over left'), + ('vertical-lr', 'over left')]), + ] + +SUFFIXES = ['', 'a'] + +def write_file(filename, content): + with open(filename, 'wb') as f: + f.write(content.encode('UTF-8')) + +print("# START tests from {}".format(__file__)) +idx = 0 +for pos, ref_wm, ruby_pos, subtests in TEST_CASES: + idx += 1 + ref_file = REF_FILE.format(idx) + ref_content = REF_TEMPLATE.format(pos=pos, wm=ref_wm, posval=ruby_pos) + write_file(ref_file, ref_content) + suffix = iter(SUFFIXES) + for wm, posval in subtests: + test_file = TEST_FILE.format(idx, next(suffix)) + test_content = TEST_TEMPLATE.format( + wm=wm, pos=pos, index=idx, ruby_pos=ruby_pos, posval=posval) + write_file(test_file, test_content) + print("== {} {}".format(test_file, ref_file)) +print("# END tests from {}".format(__file__))
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/tools/generate-text-emphasis-style-property-010-tests.sh b/third_party/blink/web_tests/external/wpt/css/css-text-decor/tools/generate-text-emphasis-style-property-010-tests.sh new file mode 100755 index 0000000..0cf60db --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/tools/generate-text-emphasis-style-property-010-tests.sh
@@ -0,0 +1,83 @@ +#!/usr/bin/env bash + +# This script generates tests text-emphasis-style-property-010* except +# 010Cn. The tests generated cover all characters listed in the unicode +# data file which should not have emphasis mark specified in the spec. +# This script downloads UnicodeData.txt from the website of the Unicode +# Consortium and extract the characters form that file. It requires +# python (either 2.5+ or 3.x), awk, and wget to work. Only test files +# are generated by this script. It also outputs a list of all tests it +# generated in the format of Mozilla reftest.list to the stdout. Other +# information has been redirected to the stderr. + +UNICODE_DATA_FILE='UnicodeData.txt' +UNICODE_DATA_URL="http://www.unicode.org/Public/8.0.0/ucd/$UNICODE_DATA_FILE" +UNICODE_DATA_DIGEST='38b17e1118206489a7e0ab5d29d7932212d38838df7d3ec025ecb58e8798ec20' + +TEST_FILE='text-emphasis-style-property-010%s.html' +REF_FILE='text-emphasis-style-property-010-ref.html' + +digest_file() { + python -c "import hashlib; +print(hashlib.sha256(open('$1', 'rb').read()).hexdigest())" +} + +check_file() { + [[ -f "$UNICODE_DATA_FILE" ]] || return 1 + digest=`digest_file "$UNICODE_DATA_FILE"` + [[ "$digest" == "$UNICODE_DATA_DIGEST" ]] || return 2 +} + +download_data() { + check_file + if [[ $? -eq 2 ]]; then + echo "Removing incorrect data file..." >&2 + rm "$UNICODE_DATA_FILE" + fi + wget -nc -O"$UNICODE_DATA_FILE" "$UNICODE_DATA_URL" >&2 + + check_file + if [[ $? -ne 0 ]]; then + echo "Failed to get the correct unicode data file!" >&2 + exit 1 + fi +} + +list_codepoints() { + awk -F';' "\$3 == \"$1\" { print \" 0x\"\$1\",\" }" "$UNICODE_DATA_FILE" +} + +write_test_file() { + filename=`printf "$TEST_FILE" $1` + echo "== $filename $REF_FILE" + cat <<EOF > $filename +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-010-tests.sh --> +<title>CSS Test: text-emphasis, $1</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="Emphasis marks should not be rendered for characters in general category $1"> +<link rel="match" href="text-emphasis-style-property-010-ref.html"> +<p>Pass if there is nothing rendered below:</p> +<div style="color: white; white-space: pre-wrap; text-emphasis: filled circle red"> +<script> + var codepoints = [ +`list_codepoints "$1"` + ]; + document.write(codepoints.map(function (code) { + return String.fromCodePoint(code); + }).join(' ')); +</script> +</div> +EOF +} + +download_data +echo "# START tests from $0" +for c in Zs Zl Zp Cc Cf; do + write_test_file "$c" +done +echo "# END tests from $0"
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/tools/generate-text-emphasis-style-property-tests.py b/third_party/blink/web_tests/external/wpt/css/css-text-decor/tools/generate-text-emphasis-style-property-tests.py new file mode 100755 index 0000000..1b1d6fc1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/tools/generate-text-emphasis-style-property-tests.py
@@ -0,0 +1,89 @@ +#!/usr/bin/env python +# - * - coding: UTF-8 - * - + +""" +This script generates tests text-emphasis-style-property-011 ~ 020 which +cover all possible values of text-emphasis-style property, except none +and <string>, with horizontal writing mode. It outputs a list of all +tests it generated in the format of Mozilla reftest.list to the stdout. +""" + +from __future__ import unicode_literals, print_function, absolute_import + +TEST_FILE = 'text-emphasis-style-property-{:03}{}.html' +TEST_TEMPLATE = '''<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Test: text-emphasis-style: {title}</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#text-emphasis-style-property"> +<meta name="assert" content="'text-emphasis-style: {value}' produces {code} as emphasis marks."> +<link rel="match" href="text-emphasis-style-property-{index:03}-ref.html"> +<p>Pass if there is a '{char}' above every character below:</p> +<div lang="ja" style="line-height: 5; text-emphasis-style: {value}">試験テスト</div> +''' + +REF_FILE = 'text-emphasis-style-property-{:03}-ref.html' +REF_TEMPLATE = '''<!DOCTYPE html> +<meta charset="utf-8"> +<!-- This file was generated automatically by the script + ./support/generate-text-emphasis-style-property-tests.py --> +<title>CSS Reference: text-emphasis-style: {0}</title> +<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org"> +<link rel="author" title="Mozilla" href="https://www.mozilla.org"> +<style> rt {{ font-variant-east-asian: inherit; }} </style> +<p>Pass if there is a '{1}' above every character below:</p> +<div lang="ja" style="line-height: 5;"><ruby>試<rt>{1}</rt>験<rt>{1}</rt>テ<rt>{1}</rt>ス<rt>{1}</rt>ト<rt>{1}</rt></ruby></div> +''' + +DATA_SET = [ + ('dot', 0x2022, 0x25e6), + ('circle', 0x25cf, 0x25cb), + ('double-circle', 0x25c9, 0x25ce), + ('triangle', 0x25b2, 0x25b3), + ('sesame', 0xfe45, 0xfe46), + ] + +SUFFIXES = ['', 'a', 'b', 'c', 'd', 'e'] + +def get_html_entity(code): + return '&#x{:04X};'.format(code) + +def write_file(filename, content): + with open(filename, 'wb') as f: + f.write(content.encode('UTF-8')) + +def write_test_file(idx, suffix, style, code, name=None): + if not name: + name = style + filename = TEST_FILE.format(idx, suffix) + write_file(filename, TEST_TEMPLATE.format(index=idx, value=style, + char=get_html_entity(code), + code='U+{:04X}'.format(code), + title=name)) + print("== {} {}".format(filename, REF_FILE.format(idx))) + +idx = 10 +def write_files(style, code): + global idx + idx += 1 + fill, shape = style + basic_style = "{} {}".format(fill, shape) + write_file(REF_FILE.format(idx), + REF_TEMPLATE.format(basic_style, get_html_entity(code))) + suffix = iter(SUFFIXES) + write_test_file(idx, next(suffix), basic_style, code) + write_test_file(idx, next(suffix), "{} {}".format(shape, fill), code) + if fill == 'filled': + write_test_file(idx, next(suffix), shape, code) + if shape == 'circle': + write_test_file(idx, next(suffix), fill, code, fill + ', horizontal') + +print("# START tests from {}".format(__file__)) +for name, code, _ in DATA_SET: + write_files(('filled', name), code) +for name, _, code in DATA_SET: + write_files(('open', name), code) +print("# END tests from {}".format(__file__))
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/support/generate-segment-break-transformation-rules-tests.py b/third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/tools/generate-segment-break-transformation-rules-tests.py similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/support/generate-segment-break-transformation-rules-tests.py rename to third_party/blink/web_tests/external/wpt/css/css-text/line-breaking/tools/generate-segment-break-transformation-rules-tests.py
diff --git a/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/META.yml b/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/META.yml deleted file mode 100644 index 427ab62..0000000 --- a/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/META.yml +++ /dev/null
@@ -1,3 +0,0 @@ -suggested_reviewers: - - dbaron - - Ms2ger
diff --git a/third_party/blink/web_tests/external/wpt/dom/historical-expected.txt b/third_party/blink/web_tests/external/wpt/dom/historical-expected.txt index 66cad48..e31ca4f3 100644 --- a/third_party/blink/web_tests/external/wpt/dom/historical-expected.txt +++ b/third_party/blink/web_tests/external/wpt/dom/historical-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 77 tests; 72 PASS, 5 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 78 tests; 73 PASS, 5 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Historical DOM features must be removed: DOMConfiguration PASS Historical DOM features must be removed: DOMCursor FAIL Historical DOM features must be removed: DOMError assert_false: expected false got true @@ -19,6 +19,7 @@ PASS Historical DOM features must be removed: TypeInfo PASS Historical DOM features must be removed: UserDataHandler PASS Historical DOM features must be removed: RangeException +PASS Historical DOM features must be removed: SVGPathSegList PASS Historical DOM features must be removed: createEntityReference FAIL Historical DOM features must be removed: xmlEncoding assert_false: expected false got true FAIL Historical DOM features must be removed: xmlStandalone assert_false: expected false got true
diff --git a/third_party/blink/web_tests/external/wpt/dom/historical.html b/third_party/blink/web_tests/external/wpt/dom/historical.html index 0e337c1..155dc89 100644 --- a/third_party/blink/web_tests/external/wpt/dom/historical.html +++ b/third_party/blink/web_tests/external/wpt/dom/historical.html
@@ -29,7 +29,8 @@ "Notation", "TypeInfo", "UserDataHandler", - "RangeException" // DOM Range + "RangeException", // DOM Range + "SVGPathSegList" ] removedInterfaces.forEach(isInterfaceRemoved)
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-006.html b/third_party/blink/web_tests/external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-006.html new file mode 100644 index 0000000..d6a260b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-006.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html><head> + <meta charset="utf-8"> + <title>HTML LI element: implied scope</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.org"> + <link rel="help" href="https://html.spec.whatwg.org/multipage/grouping-content.html#the-li-element"> + <link rel="help" href="https://drafts.csswg.org/css-lists/#propdef-counter-reset"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1745506"> + <link rel="match" href="grouping-li-reftest-004-ref.html"> + <style> + body { margin-left: 40px } + ol { margin: 0; padding: 0; } + li { list-style-type: decimal } + </style> +</head> +<body> +<div><ol start=99></ol></div> <!-- this scope shouldn't affect the LIs below --> +<li></li> +<li></li> +<li></li> +<li></li> +<div><li></li></div> +<div><div><li></li></div></div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-007.html b/third_party/blink/web_tests/external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-007.html new file mode 100644 index 0000000..8eda7057 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-007.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html><head> + <meta charset="utf-8"> + <title>HTML LI element: implied scope</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.org"> + <link rel="help" href="https://html.spec.whatwg.org/multipage/grouping-content.html#the-li-element"> + <link rel="help" href="https://drafts.csswg.org/css-lists/#propdef-counter-reset"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1745506"> + <link rel="match" href="grouping-li-reftest-004-ref.html"> + <style> + body { margin-left: 40px } + ol { margin: 0; padding: 0 } + li { list-style-type: decimal } + </style> +</head> +<body> +<div><ol start=99></ol></div> <!-- this scope shouldn't affect the LIs below --> +<ol style="counter-reset: item"> <!-- this counter shouldn't affect the LIs below --> +<li></li> +<li></li> +<li></li> +<li></li> +<div><li></li></div> +<div><div><li></li></div></div> +</ol> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/intersection-ratio-with-fractional-bounds-2.html b/third_party/blink/web_tests/external/wpt/intersection-observer/intersection-ratio-with-fractional-bounds-2.html new file mode 100644 index 0000000..1e250ac --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/intersection-observer/intersection-ratio-with-fractional-bounds-2.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<title>IntersectionObserver ratio with fractional bounds</title> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1278897"> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<style> + #container { + overflow: hidden; + width: 500px; + } + #target { + display: list-item; + padding: 16.1px; + background: rebeccapurple; + } +</style> + +<div id="container"> + <div id="list"> + <span id="target"></span> + </div> +</div> + +<script> +async_test(function(t) { + let target = document.getElementById("target"); + let list = document.getElementById("list"); + let observer = new IntersectionObserver(t.step_func_done(function(entries) { + assert_equals(entries.length, 1); + assert_equals(entries[0].intersectionRatio, 1); + assert_equals(entries[0].isIntersecting, true); + }), { root: list, threshold: 1 }); + observer.observe(target); +}); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/svg/path/property/test_style_flush_on_dom_api_with_d_property.html b/third_party/blink/web_tests/external/wpt/svg/path/property/test_style_flush_on_dom_api_with_d_property.html new file mode 100644 index 0000000..2481184 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/svg/path/property/test_style_flush_on_dom_api_with_d_property.html
@@ -0,0 +1,80 @@ +<!DOCTYPE html> +<title>Test DOM APIs which flush the style properly, with d property</title> +<meta charset=utf-8> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<style> +svg { + width: 10%; + height: 10%; + background: #eee; +} +svg path { + fill: none; + stroke: #000; +} +</style> + +<div id="log"></div> + +<svg viewBox="0 0 20 20" id="svgroot"></svg> + +<script> +'use strict'; + +function createPath(t) { + const target = document.createElementNS("http://www.w3.org/2000/svg", "path"); + document.getElementById('svgroot').appendChild(target); + + if (t && typeof t.add_cleanup === "function") { + t.add_cleanup(function() { + target.remove(); + }); + } + + // Set an initial d and flush style first to make sure the following DOM APIs + // do flush again. + target.style.d = 'path("M 0 0")'; + assert_equals(getComputedStyle(target).d, 'path("M 0 0")', "the initial d"); + return target; +} + +test(function(t) { + const target = createPath(t); + target.style.d = 'path("M5,5 L10,5 L10,10")'; + assert_equals(target.getTotalLength(), 10, "the total length"); +}, "getTotalLength() with d property"); + +test(function(t) { + const target = createPath(t); + target.style.d = 'path("M5,5 L10,5 L10,10")'; + // The first segment of path is (5,5) to (10,5), its length is 5. + // The second segment of path is (10,5) to (10,10), its length is 5. + // So, the length 8 is on the 2nd segment, at (10,8). + const point = target.getPointAtLength(8); + assert_equals(point.x, 10, "x-axis position"); + assert_equals(point.y, 8, "y-axis position"); +}, "getPointAtLength() with d property"); + +test(function(t) { + const target = createPath(t); + const svgPoint = document.getElementById("svgroot").createSVGPoint(); + svgPoint.x = 10; + svgPoint.y = 8; + + target.style.d = 'path("M5,5 L10,5 L10,10")'; + assert_equals(target.isPointInFill(svgPoint), true); +}, "isPointInFill() with d property"); + +test(function(t) { + const target = createPath(t); + const svgPoint = document.getElementById("svgroot").createSVGPoint(); + svgPoint.x = 10; + svgPoint.y = 8; + + target.style.d = 'path("M5,5 L10,5 L10,10")'; + assert_equals(target.isPointInStroke(svgPoint), true); +}, "isPointInStroke() with d property"); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/web-locks/signal.tentative.https.any-expected.txt b/third_party/blink/web_tests/external/wpt/web-locks/signal.tentative.https.any-expected.txt new file mode 100644 index 0000000..47df25e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/web-locks/signal.tentative.https.any-expected.txt
@@ -0,0 +1,14 @@ +This is a testharness.js-based test. +PASS The signal option must be an AbortSignal +PASS Passing an already aborted signal aborts +PASS An aborted request results in AbortError +PASS Abort after a timeout +PASS Signal that is not aborted +PASS Synchronously signaled abort +PASS Abort signaled after lock granted +PASS Abort signaled after lock released +PASS Abort should process the next pending lock request +FAIL Aborted promise should reject with the custom abort reason promise_rejects_exactly: Rejection should give the abort reason function "function() { throw e }" threw object "AbortError: The request was aborted." but we expected it to throw "My cat handled it" +FAIL Aborted promise should reject with the default abort reason promise_rejects_exactly: Should be the same reason function "function() { throw e }" threw object "AbortError: The request was aborted." but we expected it to throw object "AbortError: signal is aborted without reason" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/web-locks/signal.tentative.https.any.js b/third_party/blink/web_tests/external/wpt/web-locks/signal.tentative.https.any.js index c4509de..cbb23df 100644 --- a/third_party/blink/web_tests/external/wpt/web-locks/signal.tentative.https.any.js +++ b/third_party/blink/web_tests/external/wpt/web-locks/signal.tentative.https.any.js
@@ -206,3 +206,26 @@ "The next request is processed after abort" ); }, "Abort should process the next pending lock request"); + +promise_test(async t => { + const res = uniqueName(t); + + const controller = new AbortController(); + const promise = requestLockAndHold(t, res, { signal: controller.signal }); + + const reason = "My cat handled it"; + controller.abort(reason); + + await promise_rejects_exactly(t, reason, promise, "Rejection should give the abort reason"); +}, "Aborted promise should reject with the custom abort reason"); + +promise_test(async t => { + const res = uniqueName(t); + + const controller = new AbortController(); + const promise = requestLockAndHold(t, res, { signal: controller.signal }); + + controller.abort(); + + await promise_rejects_exactly(t, controller.signal.reason, promise, "Should be the same reason"); +}, "Aborted promise should reject with the default abort reason");
diff --git a/third_party/blink/web_tests/external/wpt/web-locks/signal.tentative.https.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/web-locks/signal.tentative.https.any.serviceworker-expected.txt new file mode 100644 index 0000000..47df25e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/web-locks/signal.tentative.https.any.serviceworker-expected.txt
@@ -0,0 +1,14 @@ +This is a testharness.js-based test. +PASS The signal option must be an AbortSignal +PASS Passing an already aborted signal aborts +PASS An aborted request results in AbortError +PASS Abort after a timeout +PASS Signal that is not aborted +PASS Synchronously signaled abort +PASS Abort signaled after lock granted +PASS Abort signaled after lock released +PASS Abort should process the next pending lock request +FAIL Aborted promise should reject with the custom abort reason promise_rejects_exactly: Rejection should give the abort reason function "function() { throw e }" threw object "AbortError: The request was aborted." but we expected it to throw "My cat handled it" +FAIL Aborted promise should reject with the default abort reason promise_rejects_exactly: Should be the same reason function "function() { throw e }" threw object "AbortError: The request was aborted." but we expected it to throw object "AbortError: signal is aborted without reason" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/web-locks/signal.tentative.https.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/web-locks/signal.tentative.https.any.sharedworker-expected.txt new file mode 100644 index 0000000..47df25e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/web-locks/signal.tentative.https.any.sharedworker-expected.txt
@@ -0,0 +1,14 @@ +This is a testharness.js-based test. +PASS The signal option must be an AbortSignal +PASS Passing an already aborted signal aborts +PASS An aborted request results in AbortError +PASS Abort after a timeout +PASS Signal that is not aborted +PASS Synchronously signaled abort +PASS Abort signaled after lock granted +PASS Abort signaled after lock released +PASS Abort should process the next pending lock request +FAIL Aborted promise should reject with the custom abort reason promise_rejects_exactly: Rejection should give the abort reason function "function() { throw e }" threw object "AbortError: The request was aborted." but we expected it to throw "My cat handled it" +FAIL Aborted promise should reject with the default abort reason promise_rejects_exactly: Should be the same reason function "function() { throw e }" threw object "AbortError: The request was aborted." but we expected it to throw object "AbortError: signal is aborted without reason" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/web-locks/signal.tentative.https.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/web-locks/signal.tentative.https.any.worker-expected.txt new file mode 100644 index 0000000..47df25e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/web-locks/signal.tentative.https.any.worker-expected.txt
@@ -0,0 +1,14 @@ +This is a testharness.js-based test. +PASS The signal option must be an AbortSignal +PASS Passing an already aborted signal aborts +PASS An aborted request results in AbortError +PASS Abort after a timeout +PASS Signal that is not aborted +PASS Synchronously signaled abort +PASS Abort signaled after lock granted +PASS Abort signaled after lock released +PASS Abort should process the next pending lock request +FAIL Aborted promise should reject with the custom abort reason promise_rejects_exactly: Rejection should give the abort reason function "function() { throw e }" threw object "AbortError: The request was aborted." but we expected it to throw "My cat handled it" +FAIL Aborted promise should reject with the default abort reason promise_rejects_exactly: Should be the same reason function "function() { throw e }" threw object "AbortError: The request was aborted." but we expected it to throw object "AbortError: signal is aborted without reason" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/fuchsia/external/wpt/html/semantics/interactive-elements/the-details-element/toggleEvent-expected.txt b/third_party/blink/web_tests/platform/fuchsia/external/wpt/html/semantics/interactive-elements/the-details-element/toggleEvent-expected.txt deleted file mode 100644 index 5c808aa..0000000 --- a/third_party/blink/web_tests/platform/fuchsia/external/wpt/html/semantics/interactive-elements/the-details-element/toggleEvent-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -This is a testharness.js-based test. -PASS Adding open to 'details' should fire a toggle event at the 'details' element -PASS Removing open from 'details' should fire a toggle event at the 'details' element -PASS Adding open to 'details' (display:none) should fire a toggle event at the 'details' element -PASS Adding open from 'details' (no children) should fire a toggle event at the 'details' element -PASS Calling open twice on 'details' fires only one toggle event -PASS Calling setAttribute('open', '') to 'details' should fire a toggle event at the 'details' element -PASS Calling removeAttribute('open') to 'details' should fire a toggle event at the 'details' element -FAIL Setting open=true to opened 'details' element should not fire a toggle event at the 'details' element assert_true: expected true got false -PASS Setting open=false to closed 'details' element should not fire a toggle event at the 'details' element -PASS Adding open to 'details' (not in the document) should fire a toggle event at the 'details' element -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/dom/historical-expected.txt b/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/dom/historical-expected.txt new file mode 100644 index 0000000..66cad48 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/dom/historical-expected.txt
@@ -0,0 +1,81 @@ +This is a testharness.js-based test. +Found 77 tests; 72 PASS, 5 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Historical DOM features must be removed: DOMConfiguration +PASS Historical DOM features must be removed: DOMCursor +FAIL Historical DOM features must be removed: DOMError assert_false: expected false got true +PASS Historical DOM features must be removed: DOMErrorHandler +PASS Historical DOM features must be removed: DOMImplementationList +PASS Historical DOM features must be removed: DOMImplementationSource +PASS Historical DOM features must be removed: DOMLocator +PASS Historical DOM features must be removed: DOMObject +PASS Historical DOM features must be removed: DOMRequest +PASS Historical DOM features must be removed: DOMSettableTokenList +PASS Historical DOM features must be removed: DOMUserData +PASS Historical DOM features must be removed: Entity +PASS Historical DOM features must be removed: EntityReference +PASS Historical DOM features must be removed: EventException +PASS Historical DOM features must be removed: NameList +PASS Historical DOM features must be removed: Notation +PASS Historical DOM features must be removed: TypeInfo +PASS Historical DOM features must be removed: UserDataHandler +PASS Historical DOM features must be removed: RangeException +PASS Historical DOM features must be removed: createEntityReference +FAIL Historical DOM features must be removed: xmlEncoding assert_false: expected false got true +FAIL Historical DOM features must be removed: xmlStandalone assert_false: expected false got true +FAIL Historical DOM features must be removed: xmlVersion assert_false: expected false got true +PASS Historical DOM features must be removed: strictErrorChecking +PASS Historical DOM features must be removed: domConfig +PASS Historical DOM features must be removed: normalizeDocument +PASS Historical DOM features must be removed: renameNode +PASS Historical DOM features must be removed: defaultCharset +PASS Historical DOM features must be removed: height +PASS Historical DOM features must be removed: width +PASS Historical DOM features must be removed: commands +PASS Historical DOM features must be removed: cssElementMap +PASS Historical DOM features must be removed: async +PASS Historical DOM features must be removed: origin +PASS document.load +PASS XMLDocument.load +PASS DOMImplementation.getFeature() must be removed. +PASS Historical DOM features must be removed: schemaTypeInfo +PASS Historical DOM features must be removed: setIdAttribute +PASS Historical DOM features must be removed: setIdAttributeNS +PASS Historical DOM features must be removed: setIdAttributeNode +PASS Attr member must be removed: schemaTypeInfo +PASS Attr member must be removed: isId +PASS DocumentType member must be removed: entities +PASS DocumentType member must be removed: notations +PASS DocumentType member must be removed: internalSubset +PASS Text member must be removed: isElementContentWhitespace +PASS Text member must be removed: replaceWholeText +PASS Node member must be removed: hasAttributes +PASS Node member must be removed: attributes +PASS Node member must be removed: namespaceURI +PASS Node member must be removed: prefix +PASS Node member must be removed: localName +PASS Node member must be removed: isSupported +PASS Node member must be removed: getFeature +PASS Node member must be removed: getUserData +PASS Node member must be removed: setUserData +PASS Node member must be removed: rootNode +PASS Window member must be removed: attachEvent +PASS Event should not have this constant: MOUSEDOWN +PASS Event should not have this constant: MOUSEUP +PASS Event should not have this constant: MOUSEOVER +PASS Event should not have this constant: MOUSEOUT +PASS Event should not have this constant: MOUSEMOVE +PASS Event should not have this constant: MOUSEDRAG +PASS Event should not have this constant: CLICK +PASS Event should not have this constant: DBLCLICK +PASS Event should not have this constant: KEYDOWN +PASS Event should not have this constant: KEYUP +PASS Event should not have this constant: KEYPRESS +PASS Event should not have this constant: DRAGDROP +PASS Event should not have this constant: FOCUS +PASS Event should not have this constant: BLUR +PASS Event should not have this constant: SELECT +PASS Event should not have this constant: CHANGE +PASS Event.prototype should not have this property: getPreventDefault +FAIL Event.prototype should not have this property: path assert_false: expected false got true +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/system-color-compute/external/wpt/css/css-color/color-mix-non-srgb-001-expected.txt b/third_party/blink/web_tests/virtual/system-color-compute/external/wpt/css/css-color/color-mix-non-srgb-001-expected.txt new file mode 100644 index 0000000..77ccec0 --- /dev/null +++ b/third_party/blink/web_tests/virtual/system-color-compute/external/wpt/css/css-color/color-mix-non-srgb-001-expected.txt
@@ -0,0 +1,12 @@ +This is a testharness.js-based test. +FAIL From red to green in xyz color space assert_not_equals: Should parse color-mix(in xyz, red, green) got disallowed value "" +FAIL From red to green in lab color space assert_not_equals: Should parse color-mix(in lab, red, green) got disallowed value "" +FAIL From red to green in lch color space assert_not_equals: Should parse color-mix(in lch, red, green) got disallowed value "" +FAIL From red to green 90% in xyz color space assert_not_equals: Should parse color-mix(in xyz, red, green 90%) got disallowed value "" +FAIL From red to green 90% in lab color space assert_not_equals: Should parse color-mix(in lab, red, green 90%) got disallowed value "" +FAIL From red to green 90% in lch color space assert_not_equals: Should parse color-mix(in lch, red, green 90%) got disallowed value "" +FAIL From red 90% to green in xyz color space assert_not_equals: Should parse color-mix(in xyz, red 90%, green) got disallowed value "" +FAIL From red 90% to green in lab color space assert_not_equals: Should parse color-mix(in lab, red 90%, green) got disallowed value "" +FAIL From red 90% to green in lch color space assert_not_equals: Should parse color-mix(in lch, red 90%, green) got disallowed value "" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/system-color-compute/external/wpt/css/css-color/parsing/relative-color-computed-expected.txt b/third_party/blink/web_tests/virtual/system-color-compute/external/wpt/css/css-color/parsing/relative-color-computed-expected.txt new file mode 100644 index 0000000..6b9f5f9 --- /dev/null +++ b/third_party/blink/web_tests/virtual/system-color-compute/external/wpt/css/css-color/parsing/relative-color-computed-expected.txt
@@ -0,0 +1,590 @@ +This is a testharness.js-based test. +Found 586 tests; 0 PASS, 586 FAIL, 0 TIMEOUT, 0 NOTRUN. +FAIL Property color value 'rgb(from rebeccapurple r g b)' assert_true: 'rgb(from rebeccapurple r g b)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r g b / alpha)' assert_true: 'rgb(from rebeccapurple r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from hsl(120deg 20% 50% / .5) r g b / alpha)' assert_true: 'rgb(from hsl(120deg 20% 50% / .5) r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(from rebeccapurple r g b) r g b)' assert_true: 'rgb(from rgb(from rebeccapurple r g b) r g b)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from color(display-p3 0 1 0) r g b / alpha)' assert_true: 'rgb(from color(display-p3 0 1 0) r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple 0 0 0)' assert_true: 'rgb(from rebeccapurple 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple 0 0 0 / 0)' assert_true: 'rgb(from rebeccapurple 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple 0 g b / alpha)' assert_true: 'rgb(from rebeccapurple 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r 0 b / alpha)' assert_true: 'rgb(from rebeccapurple r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r g 0 / alpha)' assert_true: 'rgb(from rebeccapurple r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r g b / 0)' assert_true: 'rgb(from rebeccapurple r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 0 g b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 0 b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g 0 / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / 0)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple 25 g b / alpha)' assert_true: 'rgb(from rebeccapurple 25 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r 25 b / alpha)' assert_true: 'rgb(from rebeccapurple r 25 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r g 25 / alpha)' assert_true: 'rgb(from rebeccapurple r g 25 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r g b / .25)' assert_true: 'rgb(from rebeccapurple r g b / .25)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / .20)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / .20)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple 20% g b / alpha)' assert_true: 'rgb(from rebeccapurple 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r 20% b / alpha)' assert_true: 'rgb(from rebeccapurple r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r g 20% / alpha)' assert_true: 'rgb(from rebeccapurple r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r g b / 20%)' assert_true: 'rgb(from rebeccapurple r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 20% g b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 20% b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g 20% / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / 20%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple 25 g b / 25%)' assert_true: 'rgb(from rebeccapurple 25 g b / 25%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r 25 b / 25%)' assert_true: 'rgb(from rebeccapurple r 25 b / 25%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r g 25 / 25%)' assert_true: 'rgb(from rebeccapurple r g 25 / 25%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / 25%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / 25%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / 25%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / 25%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / 25%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / 25%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple g b r)' assert_true: 'rgb(from rebeccapurple g b r)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple b alpha r / g)' assert_true: 'rgb(from rebeccapurple b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r r r / r)' assert_true: 'rgb(from rebeccapurple r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple alpha alpha alpha / alpha)' assert_true: 'rgb(from rebeccapurple alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) g b r)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) g b r)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) b alpha r / g)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r r r / r)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) alpha alpha alpha / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r 20% 10)' assert_true: 'rgb(from rebeccapurple r 20% 10)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r 10 20%)' assert_true: 'rgb(from rebeccapurple r 10 20%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple 0% 10 10)' assert_true: 'rgb(from rebeccapurple 0% 10 10)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 20% 10)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 20% 10)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 10 20%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 10 20%)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 0% 10 10)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 0% 10 10)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple calc(r) calc(g) calc(b))' assert_true: 'rgb(from rebeccapurple calc(r) calc(g) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r calc(g * 2) 10)' assert_true: 'rgb(from rebeccapurple r calc(g * 2) 10)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple b calc(r * .5) 10)' assert_true: 'rgb(from rebeccapurple b calc(r * .5) 10)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r calc(g * .5 + g * .5) 10)' assert_true: 'rgb(from rebeccapurple r calc(g * .5 + g * .5) 10)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rebeccapurple r calc(b * .5 - g * .5) 10)' assert_true: 'rgb(from rebeccapurple r calc(b * .5 - g * .5) 10)' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h s l)' assert_true: 'hsl(from rebeccapurple h s l)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h s l / alpha)' assert_true: 'hsl(from rebeccapurple h s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from hsl(120deg 20% 50% / .5) h s l / alpha)' assert_true: 'hsl(from hsl(120deg 20% 50% / .5) h s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from hsl(from rebeccapurple h s l) h s l)' assert_true: 'hsl(from hsl(from rebeccapurple h s l) h s l)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from color(display-p3 0 1 0) h s l / alpha)' assert_true: 'hsl(from color(display-p3 0 1 0) h s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple 0 0% 0%)' assert_true: 'hsl(from rebeccapurple 0 0% 0%)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple 0deg 0% 0%)' assert_true: 'hsl(from rebeccapurple 0deg 0% 0%)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple 0 0% 0% / 0)' assert_true: 'hsl(from rebeccapurple 0 0% 0% / 0)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple 0deg 0% 0% / 0)' assert_true: 'hsl(from rebeccapurple 0deg 0% 0% / 0)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple 0 s l / alpha)' assert_true: 'hsl(from rebeccapurple 0 s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple 0deg s l / alpha)' assert_true: 'hsl(from rebeccapurple 0deg s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h 0% l / alpha)' assert_true: 'hsl(from rebeccapurple h 0% l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h s 0% / alpha)' assert_true: 'hsl(from rebeccapurple h s 0% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h s l / 0)' assert_true: 'hsl(from rebeccapurple h s l / 0)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) 0 s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) 0 s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) 0deg s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) 0deg s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h 0% l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h 0% l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s 0% / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s 0% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / 0)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / 0)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple 25 s l / alpha)' assert_true: 'hsl(from rebeccapurple 25 s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple 25deg s l / alpha)' assert_true: 'hsl(from rebeccapurple 25deg s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h 20% l / alpha)' assert_true: 'hsl(from rebeccapurple h 20% l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h s 20% / alpha)' assert_true: 'hsl(from rebeccapurple h s 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h s l / .25)' assert_true: 'hsl(from rebeccapurple h s l / .25)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) 25 s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) 25 s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) 25deg s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) 25deg s l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h 20% l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h 20% l / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s 20% / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / .2)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / .2)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h l s)' assert_true: 'hsl(from rebeccapurple h l s)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h alpha l / s)' assert_true: 'hsl(from rebeccapurple h alpha l / s)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h l l / l)' assert_true: 'hsl(from rebeccapurple h l l / l)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple h alpha alpha / alpha)' assert_true: 'hsl(from rebeccapurple h alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h l s)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h l s)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h alpha l / s)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h alpha l / s)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h l l / l)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h l l / l)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rebeccapurple calc(h) calc(s) calc(l))' assert_true: 'hsl(from rebeccapurple calc(h) calc(s) calc(l))' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) calc(h) calc(s) calc(l) / calc(alpha))' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) calc(h) calc(s) calc(l) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h w b)' assert_true: 'hwb(from rebeccapurple h w b)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h w b / alpha)' assert_true: 'hwb(from rebeccapurple h w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from hsl(120deg 20% 50% / .5) h w b / alpha)' assert_true: 'hwb(from hsl(120deg 20% 50% / .5) h w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from hwb(from rebeccapurple h w b) h w b)' assert_true: 'hwb(from hwb(from rebeccapurple h w b) h w b)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from color(display-p3 0 1 0) h w b / alpha)' assert_true: 'hwb(from color(display-p3 0 1 0) h w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple 0 0% 0%)' assert_true: 'hwb(from rebeccapurple 0 0% 0%)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple 0deg 0% 0%)' assert_true: 'hwb(from rebeccapurple 0deg 0% 0%)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple 0 0% 0% / 0)' assert_true: 'hwb(from rebeccapurple 0 0% 0% / 0)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple 0deg 0% 0% / 0)' assert_true: 'hwb(from rebeccapurple 0deg 0% 0% / 0)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple 0 w b / alpha)' assert_true: 'hwb(from rebeccapurple 0 w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple 0deg w b / alpha)' assert_true: 'hwb(from rebeccapurple 0deg w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h 0% b / alpha)' assert_true: 'hwb(from rebeccapurple h 0% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h w 0% / alpha)' assert_true: 'hwb(from rebeccapurple h w 0% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h w b / 0)' assert_true: 'hwb(from rebeccapurple h w b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) 0 w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) 0 w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) 0deg w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) 0deg w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h 0% b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h 0% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w 0% / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w 0% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / 0)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple 25 w b / alpha)' assert_true: 'hwb(from rebeccapurple 25 w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple 25deg w b / alpha)' assert_true: 'hwb(from rebeccapurple 25deg w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h 20% b / alpha)' assert_true: 'hwb(from rebeccapurple h 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h w 20% / alpha)' assert_true: 'hwb(from rebeccapurple h w 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h w b / .2)' assert_true: 'hwb(from rebeccapurple h w b / .2)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) 25 w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) 25 w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) 25deg w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) 25deg w b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h 20% b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w 20% / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / .2)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / .2)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h b w)' assert_true: 'hwb(from rebeccapurple h b w)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h alpha w / b)' assert_true: 'hwb(from rebeccapurple h alpha w / b)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h w w / w)' assert_true: 'hwb(from rebeccapurple h w w / w)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple h alpha alpha / alpha)' assert_true: 'hwb(from rebeccapurple h alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h b w)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h b w)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h alpha w / b)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h alpha w / b)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w w / w)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w w / w)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rebeccapurple calc(h) calc(w) calc(b))' assert_true: 'hwb(from rebeccapurple calc(h) calc(w) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) calc(h) calc(w) calc(b) / calc(alpha))' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) calc(h) calc(w) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l a b)' assert_true: 'lab(from lab(25% 20 50) l a b)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l a b / alpha)' assert_true: 'lab(from lab(25% 20 50) l a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a b / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(from lab(25% 20 50) l a b) l a b)' assert_true: 'lab(from lab(from lab(25% 20 50) l a b) l a b)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from color(display-p3 0 0 0) l a b / alpha)' assert_true: 'lab(from color(display-p3 0 0 0) l a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) 0% 0 0)' assert_true: 'lab(from lab(25% 20 50) 0% 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) 0% 0 0 / 0)' assert_true: 'lab(from lab(25% 20 50) 0% 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) 0% a b / alpha)' assert_true: 'lab(from lab(25% 20 50) 0% a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l 0 b / alpha)' assert_true: 'lab(from lab(25% 20 50) l 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l a 0 / alpha)' assert_true: 'lab(from lab(25% 20 50) l a 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l a b / 0)' assert_true: 'lab(from lab(25% 20 50) l a b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) 0% a b / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) 0% a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l 0 b / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) l 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a 0 / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a b / 0)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) 35% a b / alpha)' assert_true: 'lab(from lab(25% 20 50) 35% a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l 35 b / alpha)' assert_true: 'lab(from lab(25% 20 50) l 35 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l a 35 / alpha)' assert_true: 'lab(from lab(25% 20 50) l a 35 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l a b / .35)' assert_true: 'lab(from lab(25% 20 50) l a b / .35)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) 35% a b / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) 35% a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l 35 b / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) l 35 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a 35 / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a 35 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a b / .35)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a b / .35)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l b a)' assert_true: 'lab(from lab(25% 20 50) l b a)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) l a a / a)' assert_true: 'lab(from lab(25% 20 50) l a a / a)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l b a)' assert_true: 'lab(from lab(25% 20 50 / 40%) l b a)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a a / a)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a a / a)' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50) calc(l) calc(a) calc(b))' assert_true: 'lab(from lab(25% 20 50) calc(l) calc(a) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'lab(from lab(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))' assert_true: 'lab(from lab(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l a b)' assert_true: 'oklab(from oklab(25% 20 50) l a b)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50) l a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(from oklab(25% 20 50) l a b) l a b)' assert_true: 'oklab(from oklab(from oklab(25% 20 50) l a b) l a b)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from color(display-p3 0 0 0) l a b / alpha)' assert_true: 'oklab(from color(display-p3 0 0 0) l a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) 0% 0 0)' assert_true: 'oklab(from oklab(25% 20 50) 0% 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) 0% 0 0 / 0)' assert_true: 'oklab(from oklab(25% 20 50) 0% 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) 0% a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50) 0% a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l 0 b / alpha)' assert_true: 'oklab(from oklab(25% 20 50) l 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l a 0 / alpha)' assert_true: 'oklab(from oklab(25% 20 50) l a 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l a b / 0)' assert_true: 'oklab(from oklab(25% 20 50) l a b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) 0% a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) 0% a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l 0 b / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a 0 / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a b / 0)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) 35% a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50) 35% a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l 35 b / alpha)' assert_true: 'oklab(from oklab(25% 20 50) l 35 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l a 35 / alpha)' assert_true: 'oklab(from oklab(25% 20 50) l a 35 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l a b / .35)' assert_true: 'oklab(from oklab(25% 20 50) l a b / .35)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) 35% a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) 35% a b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l 35 b / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l 35 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a 35 / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a 35 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a b / .35)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a b / .35)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l b a)' assert_true: 'oklab(from oklab(25% 20 50) l b a)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) l a a / a)' assert_true: 'oklab(from oklab(25% 20 50) l a a / a)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l b a)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l b a)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a a / a)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a a / a)' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50) calc(l) calc(a) calc(b))' assert_true: 'oklab(from oklab(25% 20 50) calc(l) calc(a) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))' assert_true: 'oklab(from oklab(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c h)' assert_true: 'lch(from lch(70% 45 30) l c h)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c h / alpha)' assert_true: 'lch(from lch(70% 45 30) l c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c h/ alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c h/ alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(from lch(70% 45 30) l c h) l c h)' assert_true: 'lch(from lch(from lch(70% 45 30) l c h) l c h)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from color(display-p3 0 0 0) l c h / alpha)' assert_true: 'lch(from color(display-p3 0 0 0) l c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lab(70% 45 30) l c h / alpha)' assert_true: 'lch(from lab(70% 45 30) l c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) 0% 0 0)' assert_true: 'lch(from lch(70% 45 30) 0% 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) 0% 0 0deg)' assert_true: 'lch(from lch(70% 45 30) 0% 0 0deg)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) 0% 0 0 / 0)' assert_true: 'lch(from lch(70% 45 30) 0% 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) 0% 0 0deg / 0)' assert_true: 'lch(from lch(70% 45 30) 0% 0 0deg / 0)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) 0% c h / alpha)' assert_true: 'lch(from lch(70% 45 30) 0% c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l 0 h / alpha)' assert_true: 'lch(from lch(70% 45 30) l 0 h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c 0 / alpha)' assert_true: 'lch(from lch(70% 45 30) l c 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c 0deg / alpha)' assert_true: 'lch(from lch(70% 45 30) l c 0deg / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c h / 0)' assert_true: 'lch(from lch(70% 45 30) l c h / 0)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) 0% c h / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) 0% c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l 0 h / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l 0 h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c 0 / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c 0deg / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c 0deg / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c h / 0)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c h / 0)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) 25% c h / alpha)' assert_true: 'lch(from lch(70% 45 30) 25% c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l 25 h / alpha)' assert_true: 'lch(from lch(70% 45 30) l 25 h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c 25 / alpha)' assert_true: 'lch(from lch(70% 45 30) l c 25 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c 25deg / alpha)' assert_true: 'lch(from lch(70% 45 30) l c 25deg / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c h / .25)' assert_true: 'lch(from lch(70% 45 30) l c h / .25)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) 25% c h / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) 25% c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l 25 h / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l 25 h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c 25 / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c 25 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c 25deg / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c 25deg / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c h / .25)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c h / .25)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) alpha c h / l)' assert_true: 'lch(from lch(70% 45 30) alpha c h / l)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) l c c / alpha)' assert_true: 'lch(from lch(70% 45 30) l c c / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) alpha c h / alpha)' assert_true: 'lch(from lch(70% 45 30) alpha c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) alpha c c / alpha)' assert_true: 'lch(from lch(70% 45 30) alpha c c / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) alpha c h / l)' assert_true: 'lch(from lch(70% 45 30 / 40%) alpha c h / l)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c c / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c c / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) alpha c h / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) alpha c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) alpha c c / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) alpha c c / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30) calc(l) calc(c) calc(h))' assert_true: 'lch(from lch(70% 45 30) calc(l) calc(c) calc(h))' is a supported value for color. expected true got false +FAIL Property color value 'lch(from lch(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))' assert_true: 'lch(from lch(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c h)' assert_true: 'oklch(from oklch(70% 45 30) l c h)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c h/ alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c h/ alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(from oklch(70% 45 30) l c h) l c h)' assert_true: 'oklch(from oklch(from oklch(70% 45 30) l c h) l c h)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from color(display-p3 0 0 0) l c h / alpha)' assert_true: 'oklch(from color(display-p3 0 0 0) l c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklab(70% 45 30) l c h / alpha)' assert_true: 'oklch(from oklab(70% 45 30) l c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) 0% 0 0)' assert_true: 'oklch(from oklch(70% 45 30) 0% 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) 0% 0 0deg)' assert_true: 'oklch(from oklch(70% 45 30) 0% 0 0deg)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) 0% 0 0 / 0)' assert_true: 'oklch(from oklch(70% 45 30) 0% 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) 0% 0 0deg / 0)' assert_true: 'oklch(from oklch(70% 45 30) 0% 0 0deg / 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) 0% c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) 0% c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l 0 h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l 0 h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c 0 / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c 0deg / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c 0deg / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c h / 0)' assert_true: 'oklch(from oklch(70% 45 30) l c h / 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) 0% c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) 0% c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l 0 h / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l 0 h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c 0 / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c 0deg / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c 0deg / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c h / 0)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c h / 0)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) 25% c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) 25% c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l 25 h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l 25 h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c 25 / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c 25 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c 25deg / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c 25deg / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c h / .25)' assert_true: 'oklch(from oklch(70% 45 30) l c h / .25)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) 25% c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) 25% c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l 25 h / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l 25 h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c 25 / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c 25 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c 25deg / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c 25deg / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c h / .25)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c h / .25)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) alpha c h / l)' assert_true: 'oklch(from oklch(70% 45 30) alpha c h / l)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) l c c / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c c / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) alpha c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) alpha c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) alpha c c / alpha)' assert_true: 'oklch(from oklch(70% 45 30) alpha c c / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) alpha c h / l)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) alpha c h / l)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c c / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c c / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) alpha c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) alpha c h / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) alpha c c / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) alpha c c / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30) calc(l) calc(c) calc(h))' assert_true: 'oklch(from oklch(70% 45 30) calc(l) calc(c) calc(h))' is a supported value for color. expected true got false +FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))' assert_true: 'oklch(from oklch(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(from color(srgb 0.7 0.5 0.3) srgb r g b) srgb r g b)' assert_true: 'color(from color(from color(srgb 0.7 0.5 0.3) srgb r g b) srgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0 / 0)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 0 g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r 0 b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g 0 / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0 g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0 b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0 / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 0.2 g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 20% g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r 0.2 b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r 20% b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g 0.2 / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g 20% / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0.2)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 20%)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0.2 g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 20% g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0.2 b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 20% b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0.2 / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 20% / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0.2)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 20%)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb g b r)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb b alpha r / g)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r r r / r)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb alpha alpha alpha / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb g b r)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb b alpha r / g)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r r r / r)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb alpha alpha alpha / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb calc(r) calc(g) calc(b))' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb calc(r) calc(g) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b) srgb-linear r g b)' assert_true: 'color(from color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b) srgb-linear r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0 / 0)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0 b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0 / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0 g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0 b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0 / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0.2 g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 20% g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0.2 b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 20% b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0.2 / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 20% / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0.2)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 20%)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0.2 g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 20% g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0.2 b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 20% b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0.2 / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 20% / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0.2)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 20%)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear g b r)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear b alpha r / g)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r r r / r)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear alpha alpha alpha / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear g b r)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear b alpha r / g)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r r r / r)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear alpha alpha alpha / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear calc(r) calc(g) calc(b))' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear calc(r) calc(g) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b) a98-rgb r g b)' assert_true: 'color(from color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b) a98-rgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0 / 0)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0 b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0 / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0 g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0 b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0 / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0.2 g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 20% g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0.2 b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 20% b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0.2 / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 20% / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0.2)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 20%)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0.2 g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 20% g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0.2 b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 20% b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0.2 / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 20% / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0.2)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 20%)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb g b r)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb b alpha r / g)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r r r / r)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb alpha alpha alpha / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb g b r)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb b alpha r / g)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r r r / r)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb alpha alpha alpha / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb calc(r) calc(g) calc(b))' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb calc(r) calc(g) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b) rec2020 r g b)' assert_true: 'color(from color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b) rec2020 r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0 / 0)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0 b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0 / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0 g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0 b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0 / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0.2 g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 20% g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0.2 b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 20% b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0.2 / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 20% / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0.2)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 20%)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0.2 g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 20% g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0.2 b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 20% b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0.2 / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 20% / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0.2)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 20%)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 g b r)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 b alpha r / g)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r r r / r)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 alpha alpha alpha / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 g b r)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 b alpha r / g)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r r r / r)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 alpha alpha alpha / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 calc(r) calc(g) calc(b))' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 calc(r) calc(g) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b) prophoto-rgb r g b)' assert_true: 'color(from color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b) prophoto-rgb r g b)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0 / 0)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0 b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0 / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0 g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0 b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0 / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0.2 g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 20% g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0.2 b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 20% b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0.2 / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 20% / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0.2)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 20%)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0.2 g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0.2 g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 20% g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 20% g b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0.2 b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0.2 b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 20% b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 20% b / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0.2 / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 20% / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 20% / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0.2)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 20%)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb g b r)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb b alpha r / g)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r r r / r)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb alpha alpha alpha / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb g b r)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb g b r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb b alpha r / g)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb b alpha r / g)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r r r / r)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r r r / r)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb alpha alpha alpha / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb calc(r) calc(g) calc(b))' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb calc(r) calc(g) calc(b))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(from color(xyz 7 -20.5 100) xyz x y z) xyz x y z)' assert_true: 'color(from color(from color(xyz 7 -20.5 100) xyz x y z) xyz x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz 0 0 0)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz 0 0 0 / 0)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz 0 y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz 0 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x 0 z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x 0 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y 0 / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / 0)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz 0 y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz 0 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x 0 z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x 0 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0 / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz 0.2 y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz 0.2 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x 0.2 z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x 0.2 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y 0.2 / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / 0.2)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / 20%)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz 0.2 y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz 0.2 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x 0.2 z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x 0.2 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0.2 / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0.2)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz y z x)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz y z x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x x x / x)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x x x / x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz y z x)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz y z x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x x x / x)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x x x / x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz calc(x) calc(y) calc(z))' assert_true: 'color(from color(xyz 7 -20.5 100) xyz calc(x) calc(y) calc(z))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz calc(x) calc(y) calc(z) / calc(alpha))' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz calc(x) calc(y) calc(z) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z) xyz-d50 x y z)' assert_true: 'color(from color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z) xyz-d50 x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0 / 0)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0 z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0 / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0 y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0 z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0 / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0.2 y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0.2 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0.2 z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0.2 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0.2 / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0.2)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 20%)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0.2 y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0.2 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0.2 z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0.2 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0.2 / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0.2)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 y z x)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 y z x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x x x / x)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x x x / x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 y z x)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 y z x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x x x / x)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x x x / x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 calc(x) calc(y) calc(z))' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 calc(x) calc(y) calc(z))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 calc(x) calc(y) calc(z) / calc(alpha))' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 calc(x) calc(y) calc(z) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z) xyz-d65 x y z)' assert_true: 'color(from color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z) xyz-d65 x y z)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0 / 0)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0 / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0 z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0 / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0 y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0 z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0 / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0.2 y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0.2 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0.2 z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0.2 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0.2 / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0.2)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 20%)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 20%)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0.2 y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0.2 y z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0.2 z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0.2 z / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0.2 / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0.2 / alpha)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0.2)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0.2)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 y z x)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 y z x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x x x / x)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x x x / x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 y z x)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 y z x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x x x / x)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x x x / x)' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 calc(x) calc(y) calc(z))' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 calc(x) calc(y) calc(z))' is a supported value for color. expected true got false +FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 calc(x) calc(y) calc(z) / calc(alpha))' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 calc(x) calc(y) calc(z) / calc(alpha))' is a supported value for color. expected true got false +FAIL Property color value 'rgb(from var(--bg-color) r g b / 80%)' assert_equals: expected "rgba(0, 0, 255, 0.8)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lch(from var(--color) calc(l / 2) c h)' assert_equals: expected "lch(23.138971% 67.989716 134.39125)" but got "rgb(0, 0, 0)" +FAIL Property color value 'rgb(from var(--color) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11))' assert_equals: expected "rgb(76, 76, 76)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lch(from var(--color) l 0 h)' assert_equals: expected "lch(46.277943% 0 134.39125)" but got "rgb(0, 0, 0)" +FAIL Property color value 'rgb(from indianred 255 g b)' assert_true: 'rgb(from indianred 255 g b)' is a supported value for color. expected true got false +FAIL Property color value 'hsl(from var(--accent) calc(h + 180deg) s l)' assert_equals: expected "rgb(178, 32, 40)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lab(from var(--mycolor) l a b / 100%)' assert_equals: expected "lab(62.751923% 52.45802 -34.117283)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lab(from var(--mycolor) l a b / calc(alpha * 0.8))' assert_equals: expected "lab(62.751923% 52.45802 -34.117283 / 0.8)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lab(from var(--mycolor) l a b / calc(alpha - 20%))' assert_equals: expected "lab(62.751923% 52.45802 -34.117283 / 0.8)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lab(from var(--mycolor) l 0 0)' assert_equals: expected "lab(62.751923% 0 0)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lch(from peru calc(l * 0.8) c h)' assert_true: 'lch(from peru calc(l * 0.8) c h)' is a supported value for color. expected true got false +FAIL Property color value 'LCH(from var(--accent) l c calc(h + 180deg))' assert_equals: expected "lch(65.49473% 39.446903 10.114471)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lch(from var(--mycolor) l 0 h)' assert_equals: expected "lch(62.751923% 0 326.96112)" but got "rgb(0, 0, 0)" +FAIL Property color value 'var(--mygray)' assert_equals: expected "lch(62.751923% 0 326.96112)" but got "rgb(0, 0, 0)" +FAIL Property color value 'lch(from var(--mygray) l 30 h)' assert_equals: expected "lch(62.751923% 30 326.96112)" but got "rgb(0, 0, 0)" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/wpt_internal/ambient-light/AmbientLightSensor.https.html b/third_party/blink/web_tests/wpt_internal/ambient-light/AmbientLightSensor.https.html deleted file mode 100644 index 82f38deb..0000000 --- a/third_party/blink/web_tests/wpt_internal/ambient-light/AmbientLightSensor.https.html +++ /dev/null
@@ -1,76 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>AmbientLightSensor Test</title> -<meta name="timeout" content="long"> -<link rel="author" title="Intel" href="http://www.intel.com"> -<link rel="help" href="https://www.w3.org/TR/ambient-light/"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/generic-sensor/resources/generic-sensor-helpers.js"></script> -<script src="/generic-sensor/generic-sensor-tests.js"></script> -<script> - -'use strict'; - -const kReadings = { - readings: [ - // We need to have at least two values here because some tests expect - // at least two readings to be available. If we have one value here, - // the ALS implementation will consider the value has not changed from - // the previous reading and not fire a reading event. - [240], - [110] - ], - expectedReadings: [ - // Our ALS implementation rounds off raw illuminance values to the - // nearest 50 Lux. - // See kAlsRoundingThreshold in ambient_light_sensor.cc. - [250], - [100] - ] -}; - -runGenericSensorTests( - 'AmbientLightSensor', - kReadings, - verifyAlsSensorReading, - ['ambient-light-sensor']); - -sensor_test(async (t, sensorProvider) => { - const sensor1 = new AmbientLightSensor(); - const sensor2 = new AmbientLightSensor(); - - return new Promise((resolve, reject) => { - sensor1.addEventListener('reading', () => { - sensor2.addEventListener('activate', () => { - try { - assert_true(sensor1.activated); - assert_true(sensor1.hasReading); - assert_not_equals(sensor1.illuminance, null); - assert_not_equals(sensor1.timestamp, null); - - assert_true(sensor2.activated); - assert_not_equals(sensor2.illuminance, null); - assert_not_equals(sensor2.timestamp, null); - } catch (e) { - reject(e); - } - }, { once: true }); - sensor2.addEventListener('reading', () => { - try { - assert_true(sensor2.activated); - assert_true(sensor2.hasReading); - assert_equals(sensor1.illuminance, sensor2.illuminance); - assert_equals(sensor1.timestamp, sensor2.timestamp); - resolve(); - } catch (e) { - reject(e); - } - }, { once: true }); - sensor2.start(); - }, { once: true }); - sensor1.start(); - }); -}, "Readings delivered by shared platform sensor are immediately accessible to all sensors."); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/webgpu/cts.https.html b/third_party/blink/web_tests/wpt_internal/webgpu/cts.https.html index c5246a4b..f7d2c112 100644 --- a/third_party/blink/web_tests/wpt_internal/webgpu/cts.https.html +++ b/third_party/blink/web_tests/wpt_internal/webgpu/cts.https.html
@@ -1301,8 +1301,7 @@ <meta name=variant content='?q=webgpu:api,operation,rendering,draw:vertex_attributes,basic:*'> <meta name=variant content='?q=webgpu:api,operation,rendering,draw:vertex_attributes,formats:*'> <meta name=variant content='?q=webgpu:api,operation,rendering,draw:largeish_buffer:*'> -<meta name=variant content='?q=webgpu:api,operation,rendering,indirect_draw:basics,drawIndirect:*'> -<meta name=variant content='?q=webgpu:api,operation,rendering,indirect_draw:basics,drawIndexedIndirect:*'> +<meta name=variant content='?q=webgpu:api,operation,rendering,indirect_draw:basics:*'> <meta name=variant content='?q=webgpu:api,operation,resource_init,buffer:partial_write_buffer:*'> <meta name=variant content='?q=webgpu:api,operation,resource_init,buffer:map_whole_buffer:*'> <meta name=variant content='?q=webgpu:api,operation,resource_init,buffer:map_partial_buffer:*'>
diff --git a/third_party/widevine/cdm/DEPS b/third_party/widevine/cdm/DEPS index 0d6a1d5..12390aeb 100644 --- a/third_party/widevine/cdm/DEPS +++ b/third_party/widevine/cdm/DEPS
@@ -1,4 +1,5 @@ include_rules = [ "+base/token.h", "+build/build_config.h", + "+media/cdm/cdm_type.h" ]
diff --git a/third_party/widevine/cdm/widevine_cdm_common.h b/third_party/widevine/cdm/widevine_cdm_common.h index eacd2dc..50a9e566 100644 --- a/third_party/widevine/cdm/widevine_cdm_common.h +++ b/third_party/widevine/cdm/widevine_cdm_common.h
@@ -7,6 +7,7 @@ #include "base/token.h" #include "build/build_config.h" +#include "media/cdm/cdm_type.h" // nogncheck // Default constants common to all Widevine CDMs. @@ -35,23 +36,27 @@ const char kWidevineCdmDisplayName[] = "Widevine Content Decryption Module"; -const base::Token kWidevineCdmType{0x05d908e5dcca9960ull, - 0xcd92d30eac98157aull}; - -// Identifier used by the PluginPrivateFileSystem to identify the files stored -// for the Widevine CDM. This is used to store persistent files. As the files -// were initially used by the CDM running as a pepper plugin, this ID is based -// on the pepper plugin MIME type. Changing this will result in any existing -// saved files becoming inaccessible. -const char kWidevineCdmFileSystemId[] = "application_x-ppapi-widevine-cdm"; +// TODO(crbug.com/1231162): Remove the string identifier once we've migrated off +// of the PluginPrivateFileSystem. +// Identifier used for both CDM process site isolation and by the +// PluginPrivateFileSystem to identify the files stored for the Widevine CDM. +// This is used to store persistent files. As the files were initially used by +// the CDM running as a pepper plugin, this ID is based on the pepper plugin +// MIME type. Changing this will result in any existing saved files becoming +// inaccessible. +const media::CdmType kWidevineCdmType{ + base::Token{0x05d908e5dcca9960ull, 0xcd92d30eac98157aull}, + "application_x-ppapi-widevine-cdm"}; // Constants specific to Windows MediaFoundation-based Widevine CDM library. #if defined(OS_WIN) const char kMediaFoundationWidevineCdmLibraryName[] = "Google.Widevine.CDM"; const char kMediaFoundationWidevineCdmDisplayName[] = "Google Widevine Windows CDM"; -const base::Token kMediaFoundationWidevineCdmType{0x8e73dec793bf5adcull, - 0x27e572c9a1fd930eull}; +// TODO(crbug.com/1231162): Remove the string identifier once we've migrated off +// of the PluginPrivateFileSystem. +const media::CdmType kMediaFoundationWidevineCdmType{ + base::Token{0x8e73dec793bf5adcull, 0x27e572c9a1fd930eull}, ""}; #endif // defined(OS_WIN) #endif // WIDEVINE_CDM_WIDEVINE_CDM_COMMON_H_
diff --git a/tools/determinism/compare_build_artifacts.py b/tools/determinism/compare_build_artifacts.py index 649b8e01..85e900f 100755 --- a/tools/determinism/compare_build_artifacts.py +++ b/tools/determinism/compare_build_artifacts.py
@@ -311,6 +311,17 @@ first_list = get_files_to_compare(first_dir, recursive) second_list = get_files_to_compare(second_dir, recursive) + # Always check that the main ninja files are deterministic. + # Ideally we'd compare all of them, but that requires walking + # the clobbered build dir to find them. This is less code + # and gives most of the benefit. + # TODO(thakis): Add build.ninja once comments 9/11 on crbug.com/1278777 are figured out. + # TODO(thakis): Run this on non-win32 once we have some plan for handling differences + # in goma/non-goma (crbug.com/1278777 comments 14/15) -- maybe have the recipe run + # `gn gen` in two additional build dirs with goma off and compare ninja files there? + if sys.platform == 'win32': + first_list.update(['toolchain.ninja']) + second_list.update(['toolchain.ninja']) equals = [] expected_diffs = []
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index bafdb58..b948f9b 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -50159,6 +50159,7 @@ <int value="-1639534120" label="VaapiVp9kSVCHWEncoding:enabled"/> <int value="-1639050182" label="NavigationPredictorRendererWarmup:enabled"/> <int value="-1638815914" label="enable-experimental-productivity-features"/> + <int value="-1637552275" label="NtpRealboxUseGoogleGIcon:disabled"/> <int value="-1636188191" label="IncognitoNtpRevamp:enabled"/> <int value="-1635048938" label="DetectFormSubmissionOnFormClear:disabled"/> <int value="-1634878515" label="ChromeHomeModernLayout:enabled"/> @@ -54616,6 +54617,7 @@ <int value="1660772828" label="NtpModulesDragAndDrop:enabled"/> <int value="1661354480" label="BlockInsecurePrivateNetworkRequests:disabled"/> <int value="1661925474" label="silent-debugger-extension-api"/> + <int value="1662466302" label="NtpRealboxUseGoogleGIcon:enabled"/> <int value="1663574600" label="WebViewDisplayCutout:enabled"/> <int value="1664401033" label="ColorCorrectRendering:enabled"/> <int value="1664463407" label="FirstPartySets:enabled"/> @@ -64677,9 +64679,17 @@ </enum> <enum name="OmniboxZeroSuggestRequests"> - <int value="1" label="requests sent"/> - <int value="2" label="requests invalidated"/> - <int value="3" label="(non-invalidated) replies received"/> + <int value="1" label="requests sent">Suggest requests that were sent.</int> + <int value="2" label="requests invalidated"> + Suggest requests that were invalidated, e.g., due to user starting to type. + </int> + <int value="3" label="responses received"> + Suggest responses that were received. Includes both those received directly + from the server and those loaded from the HTTP cache. + </int> + <int value="4" label="responses loaded from HTTP cache"> + Subset of Suggest responses that were loaded from the HTTP cache. + </int> </enum> <enum name="OnServiceConnectedTimedOutResult"> @@ -70259,6 +70269,28 @@ label="[main frame send, main frame change, other send, other change]"/> </enum> +<enum name="PrerenderCrossOriginRedirectionDomain"> + <int value="0" label="kRedirectToSubDomain"/> + <int value="1" label="kRedirectFromSubDomain"/> + <int value="2" label="kCrossDomain"/> +</enum> + +<enum name="PrerenderCrossOriginRedirectionMismatch"> + <int value="0" label="kShouldNotBeReported"/> + <int value="1" label="kPortMismatch"/> + <int value="2" label="kHostMismatch"/> + <int value="3" label="kHostPortMismatch"/> + <int value="4" label="kSchemeMismatch"/> + <int value="5" label="kSchemePortMismatch"/> + <int value="6" label="kSchemeHostMismatch"/> + <int value="7" label="kSchemeHostPortMismatch"/> +</enum> + +<enum name="PrerenderCrossOriginRedirectionProtocolChange"> + <int value="0" label="kHttpProtocolUpgrade"/> + <int value="1" label="kHttpProtocolDowngrade"/> +</enum> + <enum name="PrerenderEvent"> <obsolete> Deprecated Dec 12 2014.
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml index a3b5facd..ccdd1b26 100644 --- a/tools/metrics/histograms/metadata/chromeos/histograms.xml +++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -553,7 +553,7 @@ </histogram> <histogram name="ChromeOS.CWP.CollectProcessTypes" - enum="ChromeOSProcessTypeCollectionStatus" expires_after="2022-01-19"> + enum="ChromeOSProcessTypeCollectionStatus" expires_after="2023-01-19"> <owner>aalexand@google.com</owner> <owner>cwp-team@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/navigation/histograms.xml b/tools/metrics/histograms/metadata/navigation/histograms.xml index 0421ecce..12965af6 100644 --- a/tools/metrics/histograms/metadata/navigation/histograms.xml +++ b/tools/metrics/histograms/metadata/navigation/histograms.xml
@@ -34,6 +34,21 @@ <variant name="WillStartRequest"/> </variants> +<variants name="PrerenderTriggerType"> +<!-- +Also used in tools/metrics/histograms/metadata/page/histograms.xml. +--> + + <variant name=""> + <obsolete> + Base histogram. Use suffixes of this histogram instead. Non-suffix name + was removed in Nov 2021. + </obsolete> + </variant> + <variant name=".Embedder_DirectURLInput"/> + <variant name=".SpeculationRule"/> +</variants> + <histogram name="BackForwardCache.AllSites.EvictedAfterDocumentRestoredReason" enum="BackForwardCacheEvictedAfterDocumentRestoredReason" expires_after="2022-10-01"> @@ -1610,6 +1625,41 @@ </summary> </histogram> +<histogram + name="Prerender.Experimental.CrossOriginRedirectionDomain{PrerenderTriggerType}" + enum="PrerenderCrossOriginRedirectionDomain" expires_after="2022-01-27"> + <owner>lingqi@chromium.org</owner> + <owner>nhiroki@chromium.org</owner> + <owner>src/content/browser/prerender/OWNERS</owner> + <summary> + A breakdown metric for analyzing cross-origin redirection cases during + embedder-triggered prerendering. Recorded when a prerendering page was + redirected to a subdomain. + + Note that for now it is not used for prerendering that are triggered by + speculation rules. + </summary> + <token key="PrerenderTriggerType" variants="PrerenderTriggerType"/> +</histogram> + +<histogram + name="Prerender.Experimental.CrossOriginRedirectionProtocolChange{PrerenderTriggerType}" + enum="PrerenderCrossOriginRedirectionProtocolChange" + expires_after="2022-01-27"> + <owner>lingqi@chromium.org</owner> + <owner>nhiroki@chromium.org</owner> + <owner>src/content/browser/prerender/OWNERS</owner> + <summary> + A breakdown metric for analyzing cross-origin redirection cases during + embedder-triggered prerendering, Recorded when redirections were caused due + to HTTP protocol upgrades. + + Note that for now it is not used for prerendering that are triggered by + speculation rules. + </summary> + <token key="PrerenderTriggerType" variants="PrerenderTriggerType"/> +</histogram> + <histogram name="Prerender.Experimental.PrerenderCancelledInterface" enum="PrerenderCancelledInterface" expires_after="2022-06-05"> <owner>nhiroki@chromium.org</owner> @@ -1649,6 +1699,27 @@ </histogram> <histogram + name="Prerender.Experimental.PrerenderCrossOriginRedirectionMismatch{PrerenderTriggerType}" + enum="PrerenderCrossOriginRedirectionMismatch" expires_after="2022-01-27"> + <owner>lingqi@chromium.org</owner> + <owner>nhiroki@chromium.org</owner> + <owner>src/content/browser/prerender/OWNERS</owner> + <summary> + A breakdown metric for analyzing cross-origin redirection cases during + embedder-triggered prerendering. Recorded when the embedder-triggered + prerendering was redirected to another origin that differs from the initial + one. + + The cases are encoded into 3 bits(scheme mismatch, host mismatch, port + mismatch). + + Note that for now it is not used for prerendering that are triggered by + speculation rules. + </summary> + <token key="PrerenderTriggerType" variants="PrerenderTriggerType"/> +</histogram> + +<histogram name="Prerender.Experimental.PrerenderHostCancelReasonBeforeActivation" enum="PrerenderHostFinalStatus" expires_after="2021-08-06"> <obsolete> @@ -1682,7 +1753,8 @@ </summary> </histogram> -<histogram name="Prerender.Experimental.PrerenderHostFinalStatus{TriggerType}" +<histogram + name="Prerender.Experimental.PrerenderHostFinalStatus{PrerenderTriggerType}" enum="PrerenderHostFinalStatus" expires_after="2022-06-05"> <owner>nhiroki@chromium.org</owner> <owner>toyoshim@chromium.org</owner> @@ -1692,16 +1764,7 @@ Final status for a prerendering attempt. Recorded by PrerenderHost or PrerenderHostRegistry in the browser process when the attempt finishes. </summary> - <token key="TriggerType"> - <variant name=""> - <obsolete> - Base histogram. Use suffixes of this histogram instead. Non-suffix name - was removed in Dec 2021. - </obsolete> - </variant> - <variant name=".Embedder_DirectURLInput"/> - <variant name=".SpeculationRule"/> - </token> + <token key="PrerenderTriggerType" variants="PrerenderTriggerType"/> </histogram> <histogram name="Prerender.FinalStatus" enum="PrerenderFinalStatus"
diff --git a/tools/metrics/histograms/metadata/omnibox/histograms.xml b/tools/metrics/histograms/metadata/omnibox/histograms.xml index 67d8ce2b..e9e9eafe 100644 --- a/tools/metrics/histograms/metadata/omnibox/histograms.xml +++ b/tools/metrics/histograms/metadata/omnibox/histograms.xml
@@ -1246,6 +1246,10 @@ <histogram name="Omnibox.ZeroSuggestRequests" enum="OmniboxZeroSuggestRequests" expires_after="2022-06-05"> + <obsolete> + No longer reported as of 2021-12. Omnibox.ZeroSuggestRequests.Prefetch and + Omnibox.ZeroSuggestRequests.NonPrefetch are being reported instead. + </obsolete> <owner>ender@chromium.org</owner> <owner>tommycli@chromium.org</owner> <owner>chrome-omnibox-team@google.com</owner> @@ -1256,6 +1260,54 @@ </summary> </histogram> +<histogram name="Omnibox.ZeroSuggestRequests.NonPrefetch" + enum="OmniboxZeroSuggestRequests" expires_after="2022-06-05"> + <owner>mahmadi@chromium.org</owner> + <owner>chrome-omnibox-team@google.com</owner> + <summary> + Counts the number of non-prefetch zero suggest requests (requests for + suggestions when the user has focused but not modified the omnibox) the + omnibox sent, requests that were invalidated, responses that were received, + and the subset of responses that were loaded from HTTP cache. + </summary> +</histogram> + +<histogram name="Omnibox.ZeroSuggestRequests.NonPrefetch.RoundTripTime" + units="ms" expires_after="2022-06-05"> + <owner>mahmadi@chromium.org</owner> + <owner>chrome-omnibox-team@google.com</owner> + <summary> + Records the time elapsed between non-prefetch zero suggest requests + (requests for suggestions when the user has focused but not modified the + omnibox) sent and the responses received; whether or not the response is + loaded from HTTP cache. + </summary> +</histogram> + +<histogram name="Omnibox.ZeroSuggestRequests.Prefetch" + enum="OmniboxZeroSuggestRequests" expires_after="2022-06-05"> + <owner>mahmadi@chromium.org</owner> + <owner>chrome-omnibox-team@google.com</owner> + <summary> + Counts the number of prefetch zero suggest requests (requests for + suggestions when the user opens a new tab or brings one to foreground) the + omnibox sent, requests that were invalidated, responses that were received, + and the subset of responses that were loaded from HTTP cache. + </summary> +</histogram> + +<histogram name="Omnibox.ZeroSuggestRequests.Prefetch.RoundTripTime" units="ms" + expires_after="2022-06-05"> + <owner>mahmadi@chromium.org</owner> + <owner>chrome-omnibox-team@google.com</owner> + <summary> + Records the time elapsed between prefetch zero suggest requests (requests + for suggestions when the user opens a new tab or brings one to foreground) + sent and the responses received; whether or not the response is loaded from + HTTP cache. + </summary> +</histogram> + </histograms> </histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml index 5910cb1..94dbc8af 100644 --- a/tools/metrics/histograms/metadata/page/histograms.xml +++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -55,17 +55,6 @@ <variant name="xslt"/> </variants> -<variants name="TriggerType"> - <variant name=""> - <obsolete> - Base histogram. Use suffixes of this histogram instead. Non-suffix name - was removed in Nov 2021. - </obsolete> - </variant> - <variant name=".Embedder_DirectURLInput"/> - <variant name=".SpeculationRule"/> -</variants> - <variants name="Window"> <variant name="SessionWindow"/> <variant name="SessionWindowByInputs"> @@ -720,7 +709,7 @@ </histogram> <histogram - name="PageLoad.Clients.Prerender.InteractiveTiming.FirstInputDelay4{TriggerType}" + name="PageLoad.Clients.Prerender.InteractiveTiming.FirstInputDelay4{PrerenderTriggerType}" units="ms" expires_after="2022-01-27"> <owner>ksakamoto@chromium.org</owner> <owner>asamidoi@chromium.org</owner> @@ -730,11 +719,15 @@ prerendered and were later activated. Note that prerendered page loads are excluded from PageLoad.InteractiveTiming.FirstInputDelay4. </summary> - <token key="TriggerType" variants="TriggerType"/> +<!-- PrerenderTriggerType variant is defined in + tools/metrics/histograms/metadata/navigation/histograms.xml. +--> + + <token key="PrerenderTriggerType" variants="PrerenderTriggerType"/> </histogram> <histogram - name="PageLoad.Clients.Prerender.LayoutInstability.CumulativeShiftScore.MainFrame{TriggerType}" + name="PageLoad.Clients.Prerender.LayoutInstability.CumulativeShiftScore.MainFrame{PrerenderTriggerType}" units="ms" expires_after="2022-01-27"> <owner>ksakamoto@chromium.org</owner> <owner>asamidoi@chromium.org</owner> @@ -745,11 +738,15 @@ page loads are excluded from PageLoad.LayoutInstability.CumulativeShiftScore.MainFrame. </summary> - <token key="TriggerType" variants="TriggerType"/> +<!-- PrerenderTriggerType variant is defined in + tools/metrics/histograms/metadata/navigation/histograms.xml. +--> + + <token key="PrerenderTriggerType" variants="PrerenderTriggerType"/> </histogram> <histogram - name="PageLoad.Clients.Prerender.LayoutInstability.CumulativeShiftScore{TriggerType}" + name="PageLoad.Clients.Prerender.LayoutInstability.CumulativeShiftScore{PrerenderTriggerType}" units="ms" expires_after="2022-01-27"> <owner>ksakamoto@chromium.org</owner> <owner>asamidoi@chromium.org</owner> @@ -759,11 +756,15 @@ were prerendered and were later activated. Note that prerendered page loads are excluded from PageLoad.LayoutInstability.CumulativeShiftScore. </summary> - <token key="TriggerType" variants="TriggerType"/> +<!-- PrerenderTriggerType variant is defined in + tools/metrics/histograms/metadata/navigation/histograms.xml. +--> + + <token key="PrerenderTriggerType" variants="PrerenderTriggerType"/> </histogram> <histogram - name="PageLoad.Clients.Prerender.NavigationToActivation{TriggerType}" + name="PageLoad.Clients.Prerender.NavigationToActivation{PrerenderTriggerType}" units="ms" expires_after="2022-01-27"> <owner>ksakamoto@chromium.org</owner> <owner>asamidoi@chromium.org</owner> @@ -774,11 +775,15 @@ attribute of PerformanceNavigationTiming. Recorded when a prerendered page is activated. </summary> - <token key="TriggerType" variants="TriggerType"/> +<!-- PrerenderTriggerType variant is defined in + tools/metrics/histograms/metadata/navigation/histograms.xml. +--> + + <token key="PrerenderTriggerType" variants="PrerenderTriggerType"/> </histogram> <histogram - name="PageLoad.Clients.Prerender.PaintTiming.ActivationToFirstContentfulPaint{TriggerType}" + name="PageLoad.Clients.Prerender.PaintTiming.ActivationToFirstContentfulPaint{PrerenderTriggerType}" units="ms" expires_after="2022-01-27"> <owner>ksakamoto@chromium.org</owner> <owner>asamidoi@chromium.org</owner> @@ -790,11 +795,15 @@ loads are excluded from PageLoad.PaintTiming.NavigationToFirstContentfulPaint. </summary> - <token key="TriggerType" variants="TriggerType"/> +<!-- PrerenderTriggerType variant is defined in + tools/metrics/histograms/metadata/navigation/histograms.xml. +--> + + <token key="PrerenderTriggerType" variants="PrerenderTriggerType"/> </histogram> <histogram - name="PageLoad.Clients.Prerender.PaintTiming.ActivationToFirstPaint{TriggerType}" + name="PageLoad.Clients.Prerender.PaintTiming.ActivationToFirstPaint{PrerenderTriggerType}" units="ms" expires_after="2022-01-27"> <owner>ksakamoto@chromium.org</owner> <owner>asamidoi@chromium.org</owner> @@ -805,11 +814,15 @@ activation navigation start. Note that prerendered page loads are excluded from PageLoad.PaintTiming.NavigationToFirstPaint. </summary> - <token key="TriggerType" variants="TriggerType"/> +<!-- PrerenderTriggerType variant is defined in + tools/metrics/histograms/metadata/navigation/histograms.xml. +--> + + <token key="PrerenderTriggerType" variants="PrerenderTriggerType"/> </histogram> <histogram - name="PageLoad.Clients.Prerender.PaintTiming.ActivationToLargestContentfulPaint2{TriggerType}" + name="PageLoad.Clients.Prerender.PaintTiming.ActivationToLargestContentfulPaint2{PrerenderTriggerType}" units="ms" expires_after="2022-01-27"> <owner>ksakamoto@chromium.org</owner> <owner>asamidoi@chromium.org</owner> @@ -821,7 +834,11 @@ loads are excluded from PageLoad.PaintTiming.NavigationToLargestContentfulPaint2. </summary> - <token key="TriggerType" variants="TriggerType"/> +<!-- PrerenderTriggerType variant is defined in + tools/metrics/histograms/metadata/navigation/histograms.xml. +--> + + <token key="PrerenderTriggerType" variants="PrerenderTriggerType"/> </histogram> <histogram name="PageLoad.Clients.Scheme.HTTP.PaintTiming.UnderStat"
diff --git a/tools/metrics/histograms/metadata/service/histograms.xml b/tools/metrics/histograms/metadata/service/histograms.xml index 40c0e4944..a9a29fb 100644 --- a/tools/metrics/histograms/metadata/service/histograms.xml +++ b/tools/metrics/histograms/metadata/service/histograms.xml
@@ -743,6 +743,9 @@ <histogram name="ServiceWorker.OfflineCapable.Reason" enum="OfflineCapableReason" expires_after="2022-01-02"> + <obsolete> + Removed 2021-12-14. + </obsolete> <owner>asamidoi@chromium.org</owner> <owner>chrome-worker@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/subresource/histograms.xml b/tools/metrics/histograms/metadata/subresource/histograms.xml index 66ded5d..ff36f289 100644 --- a/tools/metrics/histograms/metadata/subresource/histograms.xml +++ b/tools/metrics/histograms/metadata/subresource/histograms.xml
@@ -613,7 +613,7 @@ <histogram name="SubresourceFilter.PageLoad.SubresourceEvaluation.TotalCPUDuration" - units="microseconds" expires_after="2022-01-12"> + units="microseconds" expires_after="2023-01-12"> <owner>alexmt@chromium.org</owner> <owner>chrome-ads-histograms@google.com</owner> <summary> @@ -631,7 +631,7 @@ <histogram name="SubresourceFilter.PageLoad.SubresourceEvaluation.TotalWallDuration" - units="microseconds" expires_after="2022-01-12"> + units="microseconds" expires_after="2023-01-12"> <owner>alexmt@chromium.org</owner> <owner>chrome-ads-histograms@google.com</owner> <summary> @@ -709,7 +709,7 @@ </histogram> <histogram name="SubresourceFilter.SubresourceLoad.Evaluation.WallDuration" - units="microseconds" expires_after="2022-01-12"> + units="microseconds" expires_after="2023-01-12"> <owner>alexmt@chromium.org</owner> <owner>chrome-ads-histograms@google.com</owner> <summary>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml index 71b5f1a..955d192 100644 --- a/tools/metrics/ukm/ukm.xml +++ b/tools/metrics/ukm/ukm.xml
@@ -18650,6 +18650,13 @@ happens. </summary> </metric> + <metric name="UserInitiated" enum="Boolean"> + <summary> + True if this page visit was initiated by user input. For renderer + navigations, only true if the code can trace back to the original input + event - there are cases where this known not to be possible. + </summary> + </metric> </event> <event name="UserSettingsEvent">
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py index 9d53baf4..efbdc3d2 100755 --- a/tools/perf/core/perf_data_generator.py +++ b/tools/perf/core/perf_data_generator.py
@@ -731,7 +731,7 @@ 'pool': 'chrome.tests.perf-webview', 'os': 'Android', 'device_type': 'flame', - 'device_os': 'R', + 'device_os': 'RP1A.201105.002', 'device_os_flavor': 'google', }, }, @@ -744,7 +744,7 @@ 'pool': 'chrome.tests.perf-weblayer', 'os': 'Android', 'device_type': 'flame', - 'device_os': 'R', + 'device_os': 'RP1A.201105.002', 'device_os_flavor': 'google', }, }, @@ -759,7 +759,7 @@ 'pool': 'chrome.tests.perf', 'os': 'Android', 'device_type': 'flame', - 'device_os': 'R', + 'device_os': 'RP1A.201105.002', 'device_os_flavor': 'google', }, },
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index 06154e9..95cdffe 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@ "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "win": { - "hash": "2fa72448c613dfdf2546ba7988c6c1fd420ddee6", - "remote_path": "perfetto_binaries/trace_processor_shell/win/1357bd132733ccc23a295739e4bc432d7a53d120/trace_processor_shell.exe" + "hash": "e86a33a1d4a5e95146e8d502232aefa4d085cd28", + "remote_path": "perfetto_binaries/trace_processor_shell/win/f9abf9948a180a56a3595ec54ff9f2f5c2c9947c/trace_processor_shell.exe" }, "mac": { "hash": "851992a7ccb80791df659bcca23f47292cfce319",
diff --git a/ui/accessibility/ax_event_generator.cc b/ui/accessibility/ax_event_generator.cc index 24125ba..ea9f7459 100644 --- a/ui/accessibility/ax_event_generator.cc +++ b/ui/accessibility/ax_event_generator.cc
@@ -780,6 +780,14 @@ void AXEventGenerator::OnNodeWillBeDeleted(AXTree* tree, AXNode* node) { live_region_tracker_->OnNodeWillBeDeleted(*node); + // TODO(accessibility): This should also handle firing MENU_POPUP_END when a + // node with the menu role is removed. The issue to be solved is that after we + // add MENU_POPUP_END here, the node gets removed from the tree. Then + // PostprocessEvents removes the events from that now-removed node, thus + // MENU_POPUP_END never gets fired. We work around this issue currently by + // firing the event from BrowserAccessibilityManager. Adding the ability to + // fire generated events immediately should make it possible to fire + // MENU_POPUP_END here. DCHECK_EQ(tree_, tree); tree_events_.erase(node->id()); } @@ -802,6 +810,14 @@ AddEvent(node, Event::PARENT_CHANGED); } +void AXEventGenerator::OnNodeCreated(AXTree* tree, AXNode* node) { + DCHECK_EQ(tree_, tree); + if (node->GetRole() == ax::mojom::Role::kMenu && + !node->IsInvisibleOrIgnored()) { + AddEvent(node, Event::MENU_POPUP_START); + } +} + void AXEventGenerator::OnAtomicUpdateFinished( AXTree* tree, bool root_changed,
diff --git a/ui/accessibility/ax_event_generator.h b/ui/accessibility/ax_event_generator.h index cd3ad791..75f9ef5 100644 --- a/ui/accessibility/ax_event_generator.h +++ b/ui/accessibility/ax_event_generator.h
@@ -300,6 +300,7 @@ void OnNodeWillBeReparented(AXTree* tree, AXNode* node) override; void OnSubtreeWillBeReparented(AXTree* tree, AXNode* node) override; void OnNodeReparented(AXTree* tree, AXNode* node) override; + void OnNodeCreated(AXTree* tree, AXNode* node) override; void OnAtomicUpdateFinished(AXTree* tree, bool root_changed, const std::vector<Change>& changes) override;
diff --git a/ui/base/ime/ash/ime_bridge.cc b/ui/base/ime/ash/ime_bridge.cc index 360bc9d..5771b1f 100644 --- a/ui/base/ime/ash/ime_bridge.cc +++ b/ui/base/ime/ash/ime_bridge.cc
@@ -75,12 +75,6 @@ } // static. -void IMEBridge::Initialize() { - if (!g_ime_bridge) - g_ime_bridge = new IMEBridge(); -} - -// static. void IMEBridge::Shutdown() { delete g_ime_bridge; g_ime_bridge = nullptr; @@ -88,6 +82,9 @@ // static. IMEBridge* IMEBridge::Get() { + if (!g_ime_bridge) { + g_ime_bridge = new IMEBridge(); + } return g_ime_bridge; }
diff --git a/ui/base/ime/ash/ime_bridge.h b/ui/base/ime/ash/ime_bridge.h index 8cf444d..c3147f8 100644 --- a/ui/base/ime/ash/ime_bridge.h +++ b/ui/base/ime/ash/ime_bridge.h
@@ -26,17 +26,12 @@ IMEBridge& operator=(const IMEBridge&) = delete; ~IMEBridge(); - // Allocates the global instance. Must be called before any calls to Get(). - // TODO(crbug/1279743): This is a stateful global. Make it into true global - // singleton first, then use dependency injection instead in the next step. - static void Initialize(); - // Releases the global instance. // TODO(crbug/1279743): This is a stateful global. Make it into true global // singleton first, then use dependency injection instead in the next step. static void Shutdown(); - // Returns IMEBridge global instance. Initialize() must be called first. + // Constructs the global instance (if not available yet) then returns it. // TODO(crbug/1279743): This is a stateful global. Make it into true global // singleton first, then use dependency injection instead in the next step. static IMEBridge* Get();
diff --git a/ui/base/ime/ash/input_method_ash_unittest.cc b/ui/base/ime/ash/input_method_ash_unittest.cc index bac2e585..ffdefa8 100644 --- a/ui/base/ime/ash/input_method_ash_unittest.cc +++ b/ui/base/ime/ash/input_method_ash_unittest.cc
@@ -219,8 +219,6 @@ ~InputMethodAshTest() override = default; void SetUp() override { - IMEBridge::Initialize(); - mock_ime_engine_handler_ = std::make_unique<ash::MockIMEEngineHandler>(); IMEBridge::Get()->SetCurrentEngineHandler(mock_ime_engine_handler_.get());
diff --git a/ui/base/ime/init/input_method_initializer.cc b/ui/base/ime/init/input_method_initializer.cc index abcd0db..82d387f 100644 --- a/ui/base/ime/init/input_method_initializer.cc +++ b/ui/base/ime/init/input_method_initializer.cc
@@ -31,9 +31,7 @@ namespace ui { void InitializeInputMethod() { -#if BUILDFLAG(IS_CHROMEOS_ASH) - IMEBridge::Initialize(); -#elif defined(OS_WIN) +#if !BUILDFLAG(IS_CHROMEOS_ASH) && defined(OS_WIN) TSFBridge::Initialize(); #endif } @@ -47,9 +45,8 @@ } void InitializeInputMethodForTesting() { -#if BUILDFLAG(IS_CHROMEOS_ASH) - IMEBridge::Initialize(); -#elif defined(USE_AURA) && (defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) +#if !BUILDFLAG(IS_CHROMEOS_ASH) && defined(USE_AURA) && \ + (defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) if (!g_linux_input_method_context_factory_for_testing) g_linux_input_method_context_factory_for_testing = new FakeInputMethodContextFactory();
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb index ded6c48..81b7637 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb
@@ -311,6 +311,7 @@ <translation id="3691184985318546178">Сингал</translation> <translation id="3726463242007121105">Бұл құрылғыны ашу мүмкін емес, себебі оның файл жүйесіне қолдау көрсетілмеген.</translation> <translation id="3727148787322499904">Бұл параметрдің өзгерісі барлық ортақ желілерге әсерін етеді</translation> +<translation id="3737576078404241332">Жылжыту жолағынан өшіру</translation> <translation id="3741243925913727067">Google Drive қоймасына медиа құрылғыдағы фотосуреттер мен бейнелердің сақтық көшірмесін жасауға болады.</translation> <translation id="3749289110408117711">Файл атауы</translation> <translation id="3780536599611287598">Файлдарды "<ph name="FOLDER_NAME" />" қалтасына салатын рұқсатыңыз жоқ.</translation> @@ -371,6 +372,7 @@ <translation id="4326142238881453352">Ботаник</translation> <translation id="4326192123064055915">Кофе</translation> <translation id="4336032328163998280">Көшіру операциясы сәтсіз аяқталды. <ph name="ERROR_MESSAGE" /></translation> +<translation id="4340491671558548972">Жылжыту жолағына қосу</translation> <translation id="4348495354623233847">Сорани күрд (араб тілі негізіндегі пернетақтамен)</translation> <translation id="4363958938297989186">Орыс (фонетикалық пернетақтамен)</translation> <translation id="4364327530094270451">Қауын</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_vi.xtb b/ui/chromeos/translations/ui_chromeos_strings_vi.xtb index cd83fa7..3c0c639 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_vi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_vi.xtb
@@ -311,6 +311,7 @@ <translation id="3691184985318546178">Tiếng Sinhala</translation> <translation id="3726463242007121105">Thiết bị này không thể mở được vì hệ thống tệp của thiết bị không được hỗ trợ.</translation> <translation id="3727148787322499904">Việc thay đổi cài đặt này sẽ ảnh hưởng đến tất cả các mạng chia sẻ</translation> +<translation id="3737576078404241332">Xoá khỏi thanh bên</translation> <translation id="3741243925913727067">Sao lưu ảnh và video trên thiết bị truyền thông của bạn vào Google Drive.</translation> <translation id="3749289110408117711">Tên tệp</translation> <translation id="3780536599611287598">Bạn không có quyền di chuyển tệp vào '<ph name="FOLDER_NAME" />'.</translation> @@ -371,6 +372,7 @@ <translation id="4326142238881453352">Nhà thực vật học</translation> <translation id="4326192123064055915">Cà phê</translation> <translation id="4336032328163998280">Thao tác sao chép không thành công. <ph name="ERROR_MESSAGE" /></translation> +<translation id="4340491671558548972">Thêm vào thanh bên</translation> <translation id="4348495354623233847">Tiếng Soran (Trung Kurd) bằng bàn phím dựa trên tiếng Ả Rập</translation> <translation id="4363958938297989186">Tiếng Nga bằng bàn phím phiên âm</translation> <translation id="4364327530094270451">Quả dưa</translation>
diff --git a/ui/strings/translations/ui_strings_kk.xtb b/ui/strings/translations/ui_strings_kk.xtb index 7b92d21..7c6d318 100644 --- a/ui/strings/translations/ui_strings_kk.xtb +++ b/ui/strings/translations/ui_strings_kk.xtb
@@ -105,6 +105,7 @@ <translation id="4565377596337484307">Құпия сөзді жасыру</translation> <translation id="4588090240171750605">Оңға айналдыру</translation> <translation id="4724120544754982507">Хабарландыру орталығы, <ph name="UNREAD_NOTIFICATION_COUNT" /> жаңа хабарландыру</translation> +<translation id="4746179598275229723">Кеңейтім босатылды.</translation> <translation id="4788285488841504513">{MONTHS,plural, =1{1 ай қалды}other{# ай қалды}}</translation> <translation id="4888938634149558681">Қоңырау шалу</translation> <translation id="4968171027979920686">{SECONDS,plural, =1{1 секунд}other{# секунд}}</translation> @@ -130,6 +131,7 @@ <translation id="5906667377645263094">{SECONDS,plural, =1{1 секунд қалды}other{# секунд қалды}}</translation> <translation id="5941711191222866238">Жию</translation> <translation id="5943826764092288734">{HOURS,plural, =1{1 сағат}other{# сағат}}</translation> +<translation id="6007284015834422026">Кеңейтім бекітілді.</translation> <translation id="6040143037577758943">Жабу</translation> <translation id="6117103120090651229">Ортадағы түйме</translation> <translation id="6129953537138746214">Бос орын</translation>
diff --git a/ui/strings/translations/ui_strings_vi.xtb b/ui/strings/translations/ui_strings_vi.xtb index 207e5620..c64a433 100644 --- a/ui/strings/translations/ui_strings_vi.xtb +++ b/ui/strings/translations/ui_strings_vi.xtb
@@ -105,6 +105,7 @@ <translation id="4565377596337484307">Ẩn mật khẩu</translation> <translation id="4588090240171750605">Cuộn qua Phải</translation> <translation id="4724120544754982507">Trung tâm thông báo, <ph name="UNREAD_NOTIFICATION_COUNT" /> thông báo chưa đọc</translation> +<translation id="4746179598275229723">Đã bỏ ghim tiện ích</translation> <translation id="4788285488841504513">{MONTHS,plural, =1{Còn 1 tháng}other{Còn # tháng}}</translation> <translation id="4888938634149558681">Gọi điện</translation> <translation id="4968171027979920686">{SECONDS,plural, =1{1 giây}other{# giây}}</translation> @@ -130,6 +131,7 @@ <translation id="5906667377645263094">{SECONDS,plural, =1{Còn 1 giây}other{Còn # giây}}</translation> <translation id="5941711191222866238">Thu nhỏ</translation> <translation id="5943826764092288734">{HOURS,plural, =1{1 giờ}other{# giờ}}</translation> +<translation id="6007284015834422026">Đã ghim tiện ích</translation> <translation id="6040143037577758943">Đóng</translation> <translation id="6117103120090651229">Nút giữa</translation> <translation id="6129953537138746214">Dấu cách</translation>
diff --git a/ui/views/widget/native_widget_aura.cc b/ui/views/widget/native_widget_aura.cc index 6ab9be0..70809b7 100644 --- a/ui/views/widget/native_widget_aura.cc +++ b/ui/views/widget/native_widget_aura.cc
@@ -208,6 +208,8 @@ gfx::NativeView parent = params.parent; gfx::NativeView context = params.context; if (!params.child) { + wm::TransientWindowManager::GetOrCreate(window_)->AddObserver(this); + // Set up the transient child before the window is added. This way the // LayoutManager knows the window has a transient parent. if (parent && parent->GetType() != aura::client::WINDOW_TYPE_UNKNOWN) { @@ -1109,6 +1111,13 @@ } //////////////////////////////////////////////////////////////////////////////// +// NativeWidgetAura, wm::TransientWindowObserver implementation: + +void NativeWidgetAura::OnTransientParentChanged(aura::Window* new_parent) { + delegate_->OnNativeWidgetParentChanged(new_parent); +} + +//////////////////////////////////////////////////////////////////////////////// // NativeWidgetAura, protected: NativeWidgetAura::~NativeWidgetAura() {
diff --git a/ui/views/widget/native_widget_aura.h b/ui/views/widget/native_widget_aura.h index b8f6a95f..50edf92 100644 --- a/ui/views/widget/native_widget_aura.h +++ b/ui/views/widget/native_widget_aura.h
@@ -19,6 +19,7 @@ #include "ui/events/event_constants.h" #include "ui/views/views_export.h" #include "ui/views/widget/native_widget_private.h" +#include "ui/wm/core/transient_window_observer.h" #include "ui/wm/public/activation_change_observer.h" #include "ui/wm/public/activation_delegate.h" @@ -42,6 +43,7 @@ public aura::WindowObserver, public wm::ActivationDelegate, public wm::ActivationChangeObserver, + public wm::TransientWindowObserver, public aura::client::FocusChangeObserver, public aura::client::DragDropDelegate { public: @@ -222,6 +224,9 @@ aura::client::DragDropDelegate::DropCallback GetDropCallback( const ui::DropTargetEvent& event) override; + // aura::TransientWindowObserver: + void OnTransientParentChanged(aura::Window* new_parent) override; + protected: ~NativeWidgetAura() override;
diff --git a/ui/views/widget/native_widget_delegate.h b/ui/views/widget/native_widget_delegate.h index 6abb63703..f3239499f 100644 --- a/ui/views/widget/native_widget_delegate.h +++ b/ui/views/widget/native_widget_delegate.h
@@ -76,6 +76,9 @@ // Called just after the native widget is destroyed. virtual void OnNativeWidgetDestroyed() = 0; + // Called after the native widget's parent has changed. + virtual void OnNativeWidgetParentChanged(gfx::NativeView parent) = 0; + // Returns the smallest size the window can be resized to by the user. virtual gfx::Size GetMinimumSize() const = 0;
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc index b96ce53..ef8434f6 100644 --- a/ui/views/widget/widget.cc +++ b/ui/views/widget/widget.cc
@@ -283,30 +283,11 @@ void Widget::ReparentNativeView(gfx::NativeView native_view, gfx::NativeView new_parent) { internal::NativeWidgetPrivate::ReparentNativeView(native_view, new_parent); - Widget* child_widget = GetWidgetForNativeView(native_view); Widget* parent_widget = new_parent ? GetWidgetForNativeView(new_parent) : nullptr; - if (child_widget) { - child_widget->parent_ = parent_widget; - - // Release the paint-as-active lock on the old parent. - bool has_lock_on_parent = !!child_widget->parent_paint_as_active_lock_; - child_widget->parent_paint_as_active_lock_.reset(); - child_widget->parent_paint_as_active_subscription_ = - base::CallbackListSubscription(); - - // Lock and subscribe to parent's paint-as-active. - if (parent_widget) { - if (has_lock_on_parent) - child_widget->parent_paint_as_active_lock_ = - parent_widget->LockPaintAsActive(); - child_widget->parent_paint_as_active_subscription_ = - parent_widget->RegisterPaintAsActiveChangedCallback( - base::BindRepeating(&Widget::OnParentShouldPaintAsActiveChanged, - base::Unretained(child_widget))); - } - } + if (child_widget) + child_widget->SetParent(parent_widget); } // static @@ -1220,7 +1201,6 @@ } void Widget::OnParentShouldPaintAsActiveChanged() { - DCHECK(parent()); // |native_widget_| has already been deleted and |this| is being deleted so // that we don't have to handle the event and also it's unsafe to reference // |native_widget_| in this case. @@ -1420,6 +1400,11 @@ native_widget_destroyed_ = true; } +void Widget::OnNativeWidgetParentChanged(gfx::NativeView parent) { + Widget* parent_widget = parent ? GetWidgetForNativeView(parent) : nullptr; + SetParent(parent_widget); +} + gfx::Size Widget::GetMinimumSize() const { return non_client_view_ ? non_client_view_->GetMinimumSize() : gfx::Size(); } @@ -1875,6 +1860,28 @@ } } +void Widget::SetParent(Widget* parent) { + if (parent == parent_) + return; + + parent_ = parent; + + // Release the paint-as-active lock on the old parent. + bool has_lock_on_parent = !!parent_paint_as_active_lock_; + parent_paint_as_active_lock_.reset(); + parent_paint_as_active_subscription_ = base::CallbackListSubscription(); + + // Lock and subscribe to parent's paint-as-active. + if (parent) { + if (has_lock_on_parent || native_widget_active_) + parent_paint_as_active_lock_ = parent->LockPaintAsActive(); + parent_paint_as_active_subscription_ = + parent->RegisterPaintAsActiveChangedCallback( + base::BindRepeating(&Widget::OnParentShouldPaintAsActiveChanged, + base::Unretained(this))); + } +} + bool Widget::GetSavedWindowPlacement(gfx::Rect* bounds, ui::WindowShowState* show_state) { // First we obtain the window's saved show-style and store it. We need to do
diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h index 70d1930..5225b04 100644 --- a/ui/views/widget/widget.h +++ b/ui/views/widget/widget.h
@@ -928,8 +928,12 @@ focus_on_creation_ = focus_on_creation; } - // Returns the parent of this widget. Note that a top-level widget is not - // necessarily a root widget and can have a parent. + // Returns the parent of this widget. Note that + // * A top-level widget is not necessarily the root and may have a parent. + // * A child widget shares the same visual style, e.g. the dark/light theme, + // with its parent. + // * The native widget may change a widget's parent. + // * The native view's parent might or might not be the parent's native view. Widget* parent() { return parent_; } const Widget* parent() const { return parent_; } @@ -1006,6 +1010,7 @@ void OnNativeWidgetCreated() override; void OnNativeWidgetDestroying() override; void OnNativeWidgetDestroyed() override; + void OnNativeWidgetParentChanged(gfx::NativeView parent) override; gfx::Size GetMinimumSize() const override; gfx::Size GetMaximumSize() const override; void OnNativeWidgetMove() override; @@ -1132,6 +1137,9 @@ // Sizes and positions the frameless window just after it is created. void SetInitialBoundsForFramelessWindow(const gfx::Rect& bounds); + // Set the parent of this widget. + void SetParent(Widget* parent); + // Returns the bounds and "show" state from the delegate. Returns true if // the delegate wants to use a specified bounds. bool GetSavedWindowPlacement(gfx::Rect* bounds, @@ -1157,8 +1165,8 @@ // to Init() a default WidgetDelegate is created. raw_ptr<WidgetDelegate> widget_delegate_ = nullptr; - // The parent of this widget. This is the widget that associates with the - // |params.parent| supplied to Init(). If no parent is given or the native + // The parent of this widget. This is the widget that associates with + // the |params.parent| supplied to Init(). If no parent is given or the native // view parent has no associating Widget, this value will be nullptr. raw_ptr<Widget> parent_ = nullptr;
diff --git a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_item.html b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_item.html index eebb09c..32693121 100644 --- a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_item.html +++ b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_item.html
@@ -30,30 +30,15 @@ } </style> -<div id="wrapper" focus-row-container> - <div id="container" - class="cr-row continuation" - actionable - focus-row-control - selectable - aria-label$="[[getAriaLabel_(device.*, itemIndex, listSize)]]" - role="button" - focus-type="rowWrapper" - on-keydown="onKeydown_" - on-click="onSelected_"> - <bluetooth-icon device="[[device]]"></bluetooth-icon> - <div aria-live="polite" - aria-label="[[getSecondaryAriaLabel_( - secondaryLabel_, pairingFailed_, device.*)]]" - class="text-row"> - <div id="deviceName" aria-hidden="true"> - [[getDeviceName_(device.*)]] - </div> - <div id="secondaryLabel" - aria-hidden="true" - class="secondary"> - [[secondaryLabel_]] - </div> +<div id="container" class="cr-row continuation" + on-click="onSelected_" + on-keydown="onKeydown_"> + <bluetooth-icon device="[[device]]"></bluetooth-icon> + <div id="deviceName" class="text-row"> + [[getDeviceName_(device.*)]] + <!-- TODO(crbug.com/1010321): Add A11Y. --> + <div id="secondaryLabel" class="secondary"> + [[secondaryLabel_]] </div> </div> </div>
diff --git a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_item.js b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_item.js index f8d8430..21849587 100644 --- a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_item.js +++ b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_item.js
@@ -12,8 +12,9 @@ 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 {FocusRowBehavior} from 'chrome://resources/js/cr/ui/focus_row_behavior.m.js'; + import {assertNotReached} from '../../../js/assert.m.js'; + import {DeviceItemState} from './bluetooth_types.js'; import {mojoString16ToString} from './bluetooth_utils.js'; @@ -23,7 +24,7 @@ * @extends {PolymerElement} */ const SettingsBluetoothPairingDeviceItemElementBase = - mixinBehaviors([I18nBehavior, FocusRowBehavior], PolymerElement); + mixinBehaviors([I18nBehavior], PolymerElement); /** @polymer */ export class SettingsBluetoothPairingDeviceItemElement extends @@ -49,15 +50,6 @@ value: DeviceItemState.DEFAULT, }, - /** The index of this item in its parent list, used for its a11y label. */ - itemIndex: Number, - - /** - * The total number of elements in this item's parent list, used for its - * a11y label. - */ - listSize: Number, - /** @private {string} */ secondaryLabel_: { type: String, @@ -139,66 +131,6 @@ detail: {device: this.device}, })); } - - /** - * @return {string} - * @private - */ - getAriaLabel_() { - return this.i18n( - this.getA11yLabelMessageId_(), this.itemIndex + 1, this.listSize, - this.getDeviceName_()); - } - - /** - * @return {string} - * @private - */ - getA11yLabelMessageId_() { - const deviceType = chromeos.bluetoothConfig.mojom.DeviceType; - switch (this.device.deviceType) { - case deviceType.kUnknown: - return 'bluetoothPairingDeviceItemA11YLabelUnknown'; - case deviceType.kComputer: - return 'bluetoothPairingDeviceItemA11YLabelComputer'; - case deviceType.kPhone: - return 'bluetoothPairingDeviceItemA11YLabelPhone'; - case deviceType.kHeadset: - return 'bluetoothPairingDeviceItemA11YLabelHeadset'; - case deviceType.kVideoCamera: - return 'bluetoothPairingDeviceItemA11YLabelVideoCamera'; - case deviceType.kGameController: - return 'bluetoothPairingDeviceItemA11YLabelGameContoller'; - case deviceType.kKeyboard: - return 'bluetoothPairingDeviceItemA11YLabelKeyboard'; - case deviceType.kMouse: - return 'bluetoothPairingDeviceItemA11YLabelMouse'; - case deviceType.kTablet: - return 'bluetoothPairingDeviceItemA11YLabelTablet'; - default: - assertNotReached(); - } - } - - /** - * @return {string} - * @private - */ - getSecondaryAriaLabel_() { - const deviceName = this.getDeviceName_(); - switch (this.deviceItemState) { - case DeviceItemState.FAILED: - return this.i18n( - 'bluetoothPairingDeviceItemSecondaryErrorA11YLabel', deviceName); - case DeviceItemState.PAIRING: - return this.i18n( - 'bluetoothPairingDeviceItemSecondaryPairingA11YLabel', deviceName); - case DeviceItemState.DEFAULT: - return ''; - default: - assertNotReached(); - } - } } customElements.define(
diff --git a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_selection_page.html b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_selection_page.html index 39ec00ca..a2b53ce4 100644 --- a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_selection_page.html +++ b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_selection_page.html
@@ -14,32 +14,27 @@ margin: 20px 0 8px 0; } </style> -<bluetooth-base-page show-scan-progress +<bluetooth-base-page + show-scan-progress="[[isBluetoothEnabled]]" button-bar-state="[[buttonBarState_]]"> <div slot="page-body" id="pageBody"> <localized-link localized-string="[[i18nAdvanced('bluetoothPairingLearnMoreLabel')]]"> </localized-link> - <div id="deviceListTitle">[[getDeviceListTitle_(devices.*)]]</div> - <template is="dom-if" if="[[shouldShowDeviceList_(devices.*)]]"> + <div id="deviceListTitle" tabindex="0"> + [[getDeviceListTitle_(devices.*, isBluetoothEnabled)]] + </div> + <!-- TODO(crbug.com/1010321): Fix item focus. --> + <template is="dom-if" if="[[shouldShowDeviceList_(devices.*, + isBluetoothEnabled)]]" restamp> <div id="container" class="layout vertical flex" scrollable no-bottom-scroll-border> - <iron-list items="[[devices]]" - scroll-target="container" - preserve-focus> + <iron-list items="[[devices]]" preserve-focus> <template> <bluetooth-pairing-device-item - item="[[item]]" device="[[item]]" device-item-state="[[getDeviceItemState_( - item, devicePendingPairing.*, failedPairingDeviceId)]]" - tabindex$="[[tabIndex]]" - focus-row-index="[[index]]" - iron-list-tab-index="[[tabIndex]]" - last-focused="{{lastFocused_}}" - list-blurred="{{listBlurred_}}" - item-index="[[index]]" - list-size="[[devices.length]]" > + item, devicePendingPairing.*, failedPairingDeviceId)]]" > </bluetooth-pairing-device-item> </template> </iron-list>
diff --git a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_selection_page.js b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_selection_page.js index f191cc43..002e411 100644 --- a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_selection_page.js +++ b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_selection_page.js
@@ -65,6 +65,12 @@ value: null, }, + /** @type {boolean} */ + isBluetoothEnabled: { + type: Boolean, + value: false, + }, + /** @private {!ButtonBarState} */ buttonBarState_: { type: Object, @@ -72,19 +78,7 @@ cancel: ButtonState.ENABLED, pair: ButtonState.HIDDEN, }, - }, - - /** - * Used by FocusRowBehavior to track the last focused element on a row. - * @private - */ - lastFocused_: Object, - - /** - * Used by FocusRowBehavior to track if the list has been blurred. - * @private - */ - listBlurred_: Boolean, + } }; } @@ -93,7 +87,7 @@ * @return {boolean} */ shouldShowDeviceList_() { - return this.devices && this.devices.length > 0; + return this.isBluetoothEnabled && this.devices && this.devices.length > 0; } /** @@ -101,6 +95,10 @@ * @return {string} */ getDeviceListTitle_() { + if (!this.isBluetoothEnabled) { + return this.i18n('bluetoothDisabled'); + } + if (this.shouldShowDeviceList_()) { return this.i18n('bluetoothAvailableDevices'); }
diff --git a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.html b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.html index 8e0a9a4..1875432 100644 --- a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.html +++ b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.html
@@ -15,6 +15,7 @@ devices="[[discoveredDevices_]]" device-pending-pairing="[[devicePendingPairing_]]" on-pair-device="onPairDevice_" + is-bluetooth-enabled="[[isBluetoothEnabled_]]" id="deviceSelectionPage"> </bluetooth-pairing-device-selection-page> </template>
diff --git a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.js b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.js index e4c801eb..8555751 100644 --- a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.js +++ b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.js
@@ -73,6 +73,7 @@ let ConfirmCodeCallback; /** + * @implements {chromeos.bluetoothConfig.mojom.SystemPropertiesObserverInterface} * @implements {chromeos.bluetoothConfig.mojom.BluetoothDiscoveryDelegateInterface} * @implements {chromeos.bluetoothConfig.mojom.DevicePairingDelegateInterface} * @implements {chromeos.bluetoothConfig.mojom.KeyEnteredHandlerInterface} @@ -156,6 +157,12 @@ value: '', }, + /** @private {boolean} */ + isBluetoothEnabled_: { + type: Boolean, + value: false, + }, + /** * Used to access |BluetoothPairingSubpageId| type in HTML. * @private {!BluetoothPairingSubpageId} @@ -170,6 +177,16 @@ constructor() { super(); /** + * @private {!chromeos.bluetoothConfig.mojom.SystemPropertiesObserverReceiver} + */ + this.systemPropertiesObserverReceiver_ = + new chromeos.bluetoothConfig.mojom.SystemPropertiesObserverReceiver( + /** + * @type {!chromeos.bluetoothConfig.mojom.SystemPropertiesObserverInterface} + */ + (this)); + + /** * @private {!chromeos.bluetoothConfig.mojom.BluetoothDiscoveryDelegateReceiver} */ this.bluetoothDiscoveryDelegateReceiver_ = @@ -207,8 +224,8 @@ ready() { super.ready(); - getBluetoothConfig().startDiscovery( - this.bluetoothDiscoveryDelegateReceiver_.$.bindNewPipeAndPassRemote()); + getBluetoothConfig().observeSystemProperties( + this.systemPropertiesObserverReceiver_.$.bindNewPipeAndPassRemote()); // If there's a specific device to pair with, immediately go to the spinner // page. @@ -218,6 +235,23 @@ } /** @override */ + onPropertiesUpdated(properties) { + const wasBluetoothEnabled = this.isBluetoothEnabled_; + this.isBluetoothEnabled_ = properties.systemState === + chromeos.bluetoothConfig.mojom.BluetoothSystemState.kEnabled; + + if (!wasBluetoothEnabled && this.isBluetoothEnabled_) { + // If Bluetooth enables after being disabled, initialize the UI state. + this.lastFailedPairingDeviceId_ = ''; + + // Start discovery. + getBluetoothConfig().startDiscovery( + this.bluetoothDiscoveryDelegateReceiver_.$ + .bindNewPipeAndPassRemote()); + } + } + + /** @override */ onDiscoveredDevicesListChanged(discoveredDevices) { this.discoveredDevices_ = discoveredDevices; @@ -244,7 +278,10 @@ /** @override */ onBluetoothDiscoveryStopped() { - // TODO(crbug.com/1010321): Implement this function. + // Discovery will stop if Bluetooth disables. Reset the UI back to the + // selection page. + this.bluetoothDiscoveryDelegateReceiver_.$.close(); + this.selectedPageId_ = BluetoothPairingSubpageId.DEVICE_SELECTION_PAGE; } /** @@ -296,6 +333,8 @@ * @private */ pairDevice_(device) { + assert(this.devicePairingHandler_); + this.pairingDelegateReceiver_ = new chromeos.bluetoothConfig.mojom.DevicePairingDelegateReceiver(this); @@ -310,6 +349,12 @@ this.pairingDelegateReceiver_.$.bindNewPipeAndPassRemote()) .then(result => { this.handlePairDeviceResult_(result.result); + }) + .catch(() => { + // Pairing failed due to external issues, such as Mojo pipe + // disconnecting from Bluetooth disabling. + this.handlePairDeviceResult_( + chromeos.bluetoothConfig.mojom.PairingResult.kNonAuthFailure); }); }
diff --git a/ui/webui/resources/cr_elements/shared_vars_css.html b/ui/webui/resources/cr_elements/shared_vars_css.html index fba4eb1..c96a23ca 100644 --- a/ui/webui/resources/cr_elements/shared_vars_css.html +++ b/ui/webui/resources/cr_elements/shared_vars_css.html
@@ -8,24 +8,50 @@ html { --google-blue-50-rgb: 232, 240, 254; /* #e8f0fe */ --google-blue-50: rgb(var(--google-blue-50-rgb)); + --google-blue-100-rgb: 210, 227, 252; /* #d2e3fc */ + --google-blue-100: rgb(var(--google-blue-100-rgb)); --google-blue-200-rgb: 174, 203, 250; /* #aecbfa */ --google-blue-200: rgb(var(--google-blue-200-rgb)); + --google-blue-300-rgb: 138, 180, 248; /* #8ab4f8 */ + --google-blue-300: rgb(var(--google-blue-300-rgb)); + --google-blue-400-rgb: 102, 157, 246; /* #669df6 */ + --google-blue-400: rgb(var(--google-blue-400-rgb)); + --google-blue-500-rgb: 66, 133, 244; /* #4285f4 */ + --google-blue-500: rgb(var(--google-blue-500-rgb)); --google-blue-600-rgb: 26, 115, 232; /* #1a73e8 */ --google-blue-600: rgb(var(--google-blue-600-rgb)); + --google-blue-700-rgb: 25, 103, 210; /* #1966d2 */ + --google-blue-700: rgb(var(--google-blue-700-rgb)); --google-green-50-rgb: 230, 244, 234; /* #e6f4ea */ --google-green-50: rgb(var(--google-green-50-rgb)); + --google-green-300-rgb: 129, 201, 149; /* #81c995 */ + --google-green-300: rgb(var(--google-green-300-rgb)); + --google-green-400-rgb: 91, 185, 116; /* #5bb974 */ + --google-green-400: rgb(var(--google-green-400-rgb)); + --google-green-500-rgb: 52, 168, 83; /* #34a853 */ + --google-green-500: rgb(var(--google-green-500-rgb)); --google-green-600-rgb: 30, 142, 62; /* #1e8e3e */ --google-green-600: rgb(var(--google-green-600-rgb)); + --google-green-700-rgb: 24, 128, 56; /* #188038 */ + --google-green-700: rgb(var(--google-green-700-rgb)); --google-grey-50-rgb: 248, 249, 250; /* #f8f9fa */ --google-grey-50: rgb(var(--google-grey-50-rgb)); + --google-grey-100-rgb: 241, 243, 244; /* #f1f3f4 */ + --google-grey-100: rgb(var(--google-grey-100-rgb)); --google-grey-200-rgb: 232, 234, 237; /* #e8eaed */ --google-grey-200: rgb(var(--google-grey-200-rgb)); + --google-grey-300-rgb: 218, 220, 224; /* #dadce0 */ + --google-grey-300: rgb(var(--google-grey-300-rgb)); --google-grey-400-rgb: 189, 193, 198; /* #bdc1c6 */ --google-grey-400: rgb(var(--google-grey-400-rgb)); + --google-grey-500-rgb: 154, 160, 166; /* #9aa0a6 */ + --google-grey-500: rgb(var(--google-grey-500-rgb)); --google-grey-600-rgb: 128, 134, 139; /* #80868b */ --google-grey-600: rgb(var(--google-grey-600-rgb)); + --google-grey-700-rgb: 95, 99, 104; /* #5f6368 */ + --google-grey-700: rgb(var(--google-grey-700-rgb)); --google-grey-800-rgb: 60, 64, 67; /* #3c4043 */ --google-grey-800: rgb(var(--google-grey-800-rgb)); --google-grey-900-rgb: 32, 33, 36; /* #202124 */ @@ -33,53 +59,59 @@ /* --google-grey-900 + 4% white blended together. */ --google-grey-900-white-4-percent: #292a2d; + --google-red-300-rgb: 242, 139, 130; /* #f28b82 */ + --google-red-300: rgb(var(--google-red-300-rgb)); + --google-red-500-rgb: 234, 67, 53; /* #ea4335 */ + --google-red-500: rgb(var(--google-red-500-rgb)); --google-red-600-rgb: 217, 48, 37; /* #d93025 */ --google-red-600: rgb(var(--google-red-600-rgb)); --google-yellow-50-rgb: 254, 247, 224; /* #fef7e0 */ --google-yellow-50: rgb(var(--google-yellow-50-rgb)); + --google-yellow-300-rgb: 253, 214, 51; /* #fdd633 */ + --google-yellow-300: rgb(var(--google-yellow-300-rgb)); + --google-yellow-400-rgb: 252, 201, 52; /* #fcc934 */ + --google-yellow-400: rgb(var(--google-yellow-400-rgb)); + --google-yellow-500-rgb: 251, 188, 4; /* #fbbc04 */ + --google-yellow-500: rgb(var(--google-yellow-500-rgb)); - /* -refresh differentiate from polymer's color.html. */ - --google-blue-refresh-100-rgb: 210, 227, 252; /* #d2e3fc */ - --google-blue-refresh-100: rgb(var(--google-blue-refresh-100-rgb)); - --google-blue-refresh-300-rgb: 138, 180, 248; /* #8ab4f8 */ - --google-blue-refresh-300: rgb(var(--google-blue-refresh-300-rgb)); - --google-blue-refresh-400-rgb: 102, 157, 246; /* #669df6 */ - --google-blue-refresh-400: rgb(var(--google-blue-refresh-400-rgb)); - --google-blue-refresh-500-rgb: 66, 133, 244; /* #4285f4 */ - --google-blue-refresh-500: rgb(var(--google-blue-refresh-500-rgb)); - --google-blue-refresh-700-rgb: 25, 103, 210; /* #1966d2 */ - --google-blue-refresh-700: rgb(var(--google-blue-refresh-700-rgb)); - - --google-green-refresh-300-rgb: 129, 201, 149; /* #81c995 */ - --google-green-refresh-300: rgb(var(--google-green-refresh-300-rgb)); - --google-green-refresh-400-rgb: 91, 185, 116; /* #5bb974 */ - --google-green-refresh-400: rgb(var(--google-green-refresh-400-rgb)); - --google-green-refresh-500-rgb: 52, 168, 83; /* #34a853 */ - --google-green-refresh-500: rgb(var(--google-green-refresh-500-rgb)); - --google-green-refresh-700-rgb: 24, 128, 56; /* #188038 */ - --google-green-refresh-700: rgb(var(--google-green-refresh-700-rgb)); - - --google-grey-refresh-100-rgb: 241, 243, 244; /* #f1f3f4 */ - --google-grey-refresh-100: rgb(var(--google-grey-refresh-100-rgb)); - --google-grey-refresh-300-rgb: 218, 220, 224; /* #dadce0 */ - --google-grey-refresh-300: rgb(var(--google-grey-refresh-300-rgb)); - --google-grey-refresh-500-rgb: 154, 160, 166; /* #9aa0a6 */ - --google-grey-refresh-500: rgb(var(--google-grey-refresh-500-rgb)); - --google-grey-refresh-700-rgb: 95, 99, 104; /* #5f6368 */ - --google-grey-refresh-700: rgb(var(--google-grey-refresh-700-rgb)); - - --google-red-refresh-300-rgb: 242, 139, 130; /* #f28b82 */ - --google-red-refresh-300: rgb(var(--google-red-refresh-300-rgb)); - --google-red-refresh-500-rgb: 234, 67, 53; /* #ea4335 */ - --google-red-refresh-500: rgb(var(--google-red-refresh-500-rgb)); - - --google-yellow-refresh-300-rgb: 253, 214, 51; /* #fdd633 */ - --google-yellow-refresh-300: rgb(var(--google-yellow-refresh-300-rgb)); - --google-yellow-refresh-400-rgb: 252, 201, 52; /* #fcc934 */ - --google-yellow-refresh-400: rgb(var(--google-yellow-refresh-400-rgb)); - --google-yellow-refresh-500-rgb: 251, 188, 4; /* #fbbc04 */ - --google-yellow-refresh-500: rgb(var(--google-yellow-refresh-500-rgb)); + /* DO NOT USE. Temporarily here to prevent breakages. crbug.com/1062154. */ + --google-blue-refresh-100-rgb: var(--google-blue-100-rgb); + --google-blue-refresh-100: var(--google-blue-100); + --google-blue-refresh-300-rgb: var(--google-blue-300-rgb); + --google-blue-refresh-300: var(--google-blue-300); + --google-blue-refresh-400-rgb: var(--google-blue-400-rgb); + --google-blue-refresh-400: var(--google-blue-400); + --google-blue-refresh-500-rgb: var(--google-blue-500-rgb); + --google-blue-refresh-500: var(--google-blue-500); + --google-blue-refresh-700-rgb: var(--google-blue-700-rgb); + --google-blue-refresh-700: var(--google-blue-700); + --google-green-refresh-300-rgb: var(--google-green-300-rgb); + --google-green-refresh-300: var(--google-green-300); + --google-green-refresh-400-rgb: var(--google-green-400-rgb); + --google-green-refresh-400: var(--google-green-400); + --google-green-refresh-500-rgb: var(--google-green-500-rgb); + --google-green-refresh-500: var(--google-green-500); + --google-green-refresh-700-rgb: var(--google-green-700-rgb); + --google-green-refresh-700: var(--google-green-700); + --google-grey-refresh-100-rgb: var(--google-grey-100-rgb); + --google-grey-refresh-100: var(--google-grey-100); + --google-grey-refresh-300-rgb: var(--google-grey-300-rgb); + --google-grey-refresh-300: var(--google-grey-300); + --google-grey-refresh-500-rgb: var(--google-grey-500-rgb); + --google-grey-refresh-500: var(--google-grey-500); + --google-grey-refresh-700-rgb: var(--google-grey-700-rgb); + --google-grey-refresh-700: var(--google-grey-700); + --google-red-refresh-300-rgb: var(--google-red-300-rgb); + --google-red-refresh-300: var(--google-red-300); + --google-red-refresh-500-rgb: var(--google-red-500-rgb); + --google-red-refresh-500: var(--google-red-500); + --google-yellow-refresh-300-rgb: var(--google-yellow-300-rgb); + --google-yellow-refresh-300: var(--google-yellow-300); + --google-yellow-refresh-400-rgb: var(--google-yellow-400-rgb); + --google-yellow-refresh-400: var(--google-yellow-400); + --google-yellow-refresh-500-rgb: var(--google-yellow-500-rgb); + --google-yellow-refresh-500: var(--google-yellow-500); --cr-primary-text-color: var(--google-grey-900); --cr-secondary-text-color: var(--google-grey-refresh-700);
diff --git a/ui/wm/core/transient_window_manager.cc b/ui/wm/core/transient_window_manager.cc index 0bf41b4..39219ef 100644 --- a/ui/wm/core/transient_window_manager.cc +++ b/ui/wm/core/transient_window_manager.cc
@@ -84,6 +84,8 @@ for (auto& observer : observers_) observer.OnTransientChildAdded(window_, child); + for (auto& observer : child_manager->observers_) + observer.OnTransientParentChanged(window_); } void TransientWindowManager::RemoveTransientChild(Window* child) { @@ -108,6 +110,8 @@ for (auto& observer : observers_) observer.OnTransientChildRemoved(window_, child); + for (auto& observer : child_manager->observers_) + observer.OnTransientParentChanged(nullptr); } bool TransientWindowManager::IsStackingTransient(
diff --git a/ui/wm/core/transient_window_manager_unittest.cc b/ui/wm/core/transient_window_manager_unittest.cc index e6df623..2ba69106 100644 --- a/ui/wm/core/transient_window_manager_unittest.cc +++ b/ui/wm/core/transient_window_manager_unittest.cc
@@ -24,8 +24,7 @@ class TestTransientWindowObserver : public TransientWindowObserver { public: - TestTransientWindowObserver() : add_count_(0), remove_count_(0) { - } + TestTransientWindowObserver() = default; TestTransientWindowObserver(const TestTransientWindowObserver&) = delete; TestTransientWindowObserver& operator=(const TestTransientWindowObserver&) = @@ -35,6 +34,7 @@ int add_count() const { return add_count_; } int remove_count() const { return remove_count_; } + int parent_change_count() const { return parent_change_count_; } // TransientWindowObserver overrides: void OnTransientChildAdded(Window* window, Window* transient) override { @@ -43,10 +43,14 @@ void OnTransientChildRemoved(Window* window, Window* transient) override { remove_count_++; } + void OnTransientParentChanged(Window* window) override { + parent_change_count_++; + } private: - int add_count_; - int remove_count_; + int add_count_ = 0; + int remove_count_ = 0; + int parent_change_count_ = 0; }; class WindowVisibilityObserver : public aura::WindowObserver { @@ -443,20 +447,26 @@ std::unique_ptr<Window> parent(CreateTestWindowWithId(0, root_window())); std::unique_ptr<Window> w1(CreateTestWindowWithId(1, parent.get())); - TestTransientWindowObserver test_observer; + TestTransientWindowObserver test_parent_observer, test_child_observer; TransientWindowManager::GetOrCreate(parent.get()) - ->AddObserver(&test_observer); + ->AddObserver(&test_parent_observer); + TransientWindowManager::GetOrCreate(w1.get())->AddObserver( + &test_child_observer); AddTransientChild(parent.get(), w1.get()); - EXPECT_EQ(1, test_observer.add_count()); - EXPECT_EQ(0, test_observer.remove_count()); + EXPECT_EQ(1, test_parent_observer.add_count()); + EXPECT_EQ(0, test_parent_observer.remove_count()); + EXPECT_EQ(1, test_child_observer.parent_change_count()); RemoveTransientChild(parent.get(), w1.get()); - EXPECT_EQ(1, test_observer.add_count()); - EXPECT_EQ(1, test_observer.remove_count()); + EXPECT_EQ(1, test_parent_observer.add_count()); + EXPECT_EQ(1, test_parent_observer.remove_count()); + EXPECT_EQ(2, test_child_observer.parent_change_count()); TransientWindowManager::GetOrCreate(parent.get()) - ->RemoveObserver(&test_observer); + ->RemoveObserver(&test_parent_observer); + TransientWindowManager::GetOrCreate(parent.get()) + ->RemoveObserver(&test_child_observer); } TEST_F(TransientWindowManagerTest, ChangeParent) {
diff --git a/ui/wm/core/transient_window_observer.h b/ui/wm/core/transient_window_observer.h index 6a7a2e2..d935a80 100644 --- a/ui/wm/core/transient_window_observer.h +++ b/ui/wm/core/transient_window_observer.h
@@ -17,11 +17,13 @@ public: // Called when a transient child is added to |window|. virtual void OnTransientChildAdded(aura::Window* window, - aura::Window* transient) = 0; + aura::Window* transient) {} // Called when a transient child is removed from |window|. virtual void OnTransientChildRemoved(aura::Window* window, - aura::Window* transient) = 0; + aura::Window* transient) {} + + virtual void OnTransientParentChanged(aura::Window* new_parent) {} protected: virtual ~TransientWindowObserver() {}
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TabCallbackTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TabCallbackTest.java index 605c730..5795a38 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TabCallbackTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TabCallbackTest.java
@@ -155,11 +155,12 @@ @Test @SmallTest - @DisableIf. - Build(supported_abis_includes = "x86", - sdk_is_greater_than = Build.VERSION_CODES.P, - message = "https://crbug.com/1201813") - public void testDownloadFromContextMenu() throws TimeoutException { + @DisableIf.Build(supported_abis_includes = "x86", sdk_is_greater_than = Build.VERSION_CODES.P, + message = "https://crbug.com/1201813") + @DisableIf.Build(supported_abis_includes = "x86_64", + sdk_is_greater_than = Build.VERSION_CODES.R, message = "https://crbug.com/1201813") + public void + testDownloadFromContextMenu() throws TimeoutException { ContextMenuParams params = runContextMenuTest("download.html"); ; Assert.assertFalse(params.isImage); @@ -174,11 +175,12 @@ @Test @SmallTest - @DisableIf. - Build(supported_abis_includes = "x86", - sdk_is_greater_than = Build.VERSION_CODES.P, - message = "https://crbug.com/1201813") - public void testDownloadFromContextMenuImg() throws TimeoutException { + @DisableIf.Build(supported_abis_includes = "x86", sdk_is_greater_than = Build.VERSION_CODES.P, + message = "https://crbug.com/1201813") + @DisableIf.Build(supported_abis_includes = "x86_64", + sdk_is_greater_than = Build.VERSION_CODES.R, message = "https://crbug.com/1201813") + public void + testDownloadFromContextMenuImg() throws TimeoutException { ContextMenuParams params = runContextMenuTest("img.html"); ; Assert.assertTrue(params.isImage);