diff --git a/DEPS b/DEPS index 0aa515b2..3379ba6 100644 --- a/DEPS +++ b/DEPS
@@ -250,7 +250,7 @@ # luci-go CIPD package version. # Make sure the revision is uploaded by infra-packagers builder. # https://ci.chromium.org/p/infra-internal/g/infra-packagers/console - 'luci_go': 'git_revision:a0624fca6d6e6fc1da6462ce0ee7678d4cc739d8', + 'luci_go': 'git_revision:05765dd1fd00909347fcc36cac12b732e3039e3d', # This can be overridden, e.g. with custom_vars, to build clang from HEAD # instead of downloading the prebuilt pinned revision. @@ -284,7 +284,7 @@ 'dawn_standalone': False, # reclient CIPD package version - 'reclient_version': 're_client_version:0.78.0.6f1e751-gomaip', + 'reclient_version': 're_client_version:0.81.1.0853992-gomaip', # Fetch Rust-related packages. 'use_rust': False, @@ -307,11 +307,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': 'f2036096c93c6760b1308923c2e04ba1c967f579', + 'skia_revision': '3a990bac0bd53e13f105914a7ab0f657398719aa', # 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': 'a62b12a6d662f541262d416970b69d1910d38dbf', + 'v8_revision': '2b0be936426d7226ec71be4048e5192963d31062', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. @@ -422,7 +422,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': 'fafeb9a3279b602f59cc7493bb15fe1931fefaee', + 'dawn_revision': 'ba384f0383502bb182f810c3007235a6d0aadc3f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -442,7 +442,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libavif # and whatever else without interference from each other. - 'libavif_revision': 'b3e0f315fcf9f0aca68d695d8b917215768030f4', + 'libavif_revision': 'de7e6c0d98abcd6843c4a9bf4cee731141dca566', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling nearby # and whatever else without interference from each other. @@ -470,7 +470,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'libunwind_revision': '118a58005a16d1b06b2b9ce2fbb34af2ecc55ad4', + 'libunwind_revision': '1111799723f6a003e6f52202b9bf84387c552081', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -818,12 +818,12 @@ 'src/clank': { 'url': 'https://chrome-internal.googlesource.com/clank/internal/apps.git' + '@' + - '9ea4f61b3c171f9393aa126d3b9913f7bec2d644', + 'fcea22e26c67e9b39f3f3d00810500b306722e32', 'condition': 'checkout_android and checkout_src_internal and not checkout_clank_via_src_internal', }, 'src/docs/website': { - 'url': Var('chromium_git') + '/website.git' + '@' + '1be3076436b5535f31cf306e9b80b528b0e10c27', + 'url': Var('chromium_git') + '/website.git' + '@' + 'b5ad817e0eecb584486d51f769bd91f013d287c4', }, 'src/ios/third_party/earl_grey2/src': { @@ -1245,13 +1245,13 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '5b5ee2de1b2b405061b92185c129a7016c6d62b4', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '67d8bcb9957d1154387c0702fd8115729f81f935', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), 'src/third_party/devtools-frontend-internal': { - 'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + 'bb40f187b3587d8893e0a5a62448c06f59b30a3c', + 'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + 'cc58c5f3d991b96ca28eb13c3b639728d846d4e4', 'condition': 'checkout_src_internal', }, @@ -1851,7 +1851,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'eba1a78f3d741241b0dbee728561b61e9587a686', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '2068d0daa78100056dd1e3c1eae7317389079859', + Var('webrtc_git') + '/src.git' + '@' + '601b2f5e8c33a68b521346d6ce8ac899408d11b2', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -1888,7 +1888,7 @@ 'packages': [ { 'package': 'skia/tools/goldctl/windows-amd64', - 'version': '3IrV971Fn9UEAXu0UwL8cBBY3L8il5zi4Qjhvfa43TQC', + 'version': 'UQplRaUw9FHcOfJNcDs_v_q1RgFiRQOm1YPonxadxu0C', }, ], 'dep_type': 'cipd', @@ -1899,7 +1899,7 @@ 'packages': [ { 'package': 'skia/tools/goldctl/mac-amd64', - 'version': 'OKl2kxI6rF8oLCJQma7QhqQHTC_J3hMRKoAqyW4tqq0C', + 'version': 'spR3Wh59oLDHcwMl_Aw4KX_h3c0G4xcOxQSi7KM8uNgC', }, ], 'dep_type': 'cipd', @@ -1910,7 +1910,7 @@ 'packages': [ { 'package': 'skia/tools/goldctl/mac-arm64', - 'version': 'pZmD81q5BF6lQcwTgrtJre8iXtofPubDLM8624rQKNsC', + 'version': 'GBW03jFiyCg47tt4xFsQ4Qql_kYZm-A-ADSEmuqRCRIC', }, ], 'dep_type': 'cipd', @@ -1921,7 +1921,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@09f5b2382850af3ea498f4b386d8a2696abafca2', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@b8ba6757c04ce866ecb8720119d7c3c56b5dbaf5', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java index 3314f7a..e50dface 100644 --- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java +++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -186,6 +186,8 @@ Flag.baseFeature(AutofillFeatures.AUTOFILL_CONSIDER_PLACEHOLDER_FOR_PARSING, "When enabled, Autofill local heuristics consider the placeholder attribute " + "for determining field types."), + Flag.baseFeature(AutofillFeatures.AUTOFILL_IMPROVED_LABEL_FOR_INFERENCE, + "When enabled, Autofill associates assigned labels with inputs in unowned forms."), Flag.baseFeature(AutofillFeatures.AUTOFILL_SERVER_BEHAVIORS, "When enabled, Autofill will request experimental " + "predictions from the Autofill API."),
diff --git a/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt b/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt index dfb4b668..a31ccb1 100644 --- a/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt +++ b/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt
@@ -281,7 +281,6 @@ # FedCM API is not implemented on WebView. crbug.com/1340252 interface IdentityCredential : Credential - getter token [GLOBAL OBJECT] method openDatabase
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index d338202..f991c4c3 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -1783,6 +1783,8 @@ "system/unified/feature_pod_controller_base.h", "system/unified/feature_pods_container_view.cc", "system/unified/feature_pods_container_view.h", + "system/unified/feature_tiles_container_view.cc", + "system/unified/feature_tiles_container_view.h", "system/unified/ime_mode_view.cc", "system/unified/ime_mode_view.h", "system/unified/managed_device_tray_item_view.cc", @@ -3001,6 +3003,7 @@ "system/unified/camera_mic_tray_item_view_unittest.cc", "system/unified/date_tray_unittest.cc", "system/unified/feature_pods_container_view_unittest.cc", + "system/unified/feature_tiles_container_view_unittest.cc", "system/unified/notification_counter_view_unittest.cc", "system/unified/notification_icons_controller_unittest.cc", "system/unified/page_indicator_view_unittest.cc",
diff --git a/ash/accelerators/ash_accelerator_configuration.cc b/ash/accelerators/ash_accelerator_configuration.cc index 0cf73991..4d2eb50 100644 --- a/ash/accelerators/ash_accelerator_configuration.cc +++ b/ash/accelerators/ash_accelerator_configuration.cc
@@ -11,6 +11,7 @@ #include "ash/accelerators/debug_commands.h" #include "ash/constants/ash_features.h" #include "ash/public/cpp/accelerators.h" +#include "ash/public/cpp/accelerators_util.h" #include "ash/public/mojom/accelerator_info.mojom.h" #include "base/containers/span.h" #include "base/strings/strcat.h" @@ -172,7 +173,8 @@ : ui::Accelerator::KeyState::RELEASED); // TODO(jimmyxgong): Ash accelerators should not be locked when // customization is allowed. - AcceleratorInfo info(type, accelerator, /**locked=*/true); + AcceleratorInfo info(type, accelerator, KeycodeToKeyString(data.keycode), + /*locked=*/true); accelerator_to_id_.InsertNew(std::make_pair(accelerator, data.action)); id_to_accelerator_infos_[static_cast<uint32_t>(data.action)].push_back( info);
diff --git a/ash/accelerators/ash_accelerator_configuration_unittest.cc b/ash/accelerators/ash_accelerator_configuration_unittest.cc index a63b034..9038065 100644 --- a/ash/accelerators/ash_accelerator_configuration_unittest.cc +++ b/ash/accelerators/ash_accelerator_configuration_unittest.cc
@@ -9,6 +9,7 @@ #include "ash/accelerators/accelerator_layout_table.h" #include "ash/public/cpp/accelerators.h" +#include "ash/public/cpp/accelerators_util.h" #include "base/test/scoped_feature_list.h" #include "ui/base/ui_base_features.h" #include "ui/events/event_constants.h" @@ -24,14 +25,19 @@ const ash::AcceleratorInfo& actual_info) { ui::Accelerator expected_accel(expected_data.keycode, expected_data.modifiers); - ash::AcceleratorInfo expected_info(actual_info.type, expected_accel, - /**locked=*/true); + ash::AcceleratorInfo expected_info( + actual_info.type, expected_accel, + ash::KeycodeToKeyString(expected_data.keycode), + /*locked=*/true); const bool type_equals = expected_info.type == actual_info.type; const bool accelerator_equals = expected_info.accelerator == actual_info.accelerator; + const bool key_display_equals = + expected_info.key_display == actual_info.key_display; const bool locked_equals = expected_info.locked == actual_info.locked; - return type_equals && accelerator_equals && locked_equals; + return type_equals && accelerator_equals && key_display_equals && + locked_equals; } void ExpectAllAcceleratorsEqual(
diff --git a/ash/app_list/app_list_metrics.cc b/ash/app_list/app_list_metrics.cc index c720d378..2eb303d4 100644 --- a/ash/app_list/app_list_metrics.cc +++ b/ash/app_list/app_list_metrics.cc
@@ -236,7 +236,7 @@ case AppListShowSource::kSearchKeyFullscreen_DEPRECATED: return "SearchKey"; case AppListShowSource::kShelfButton: - case AppListShowSource::kShelfButtonFullscreen: + case AppListShowSource::kShelfButtonFullscreen_DEPRACTED: return "HomeButton"; case AppListShowSource::kSwipeFromShelf: return "Swipe";
diff --git a/ash/app_list/app_list_metrics.h b/ash/app_list/app_list_metrics.h index 59aa608..a7f420c 100644 --- a/ash/app_list/app_list_metrics.h +++ b/ash/app_list/app_list_metrics.h
@@ -58,8 +58,8 @@ kShelfButton = 1, kSwipeFromShelf = 2, kTabletMode = 3, - kSearchKeyFullscreen_DEPRECATED = 4, // Migrated to kSearchKey. - kShelfButtonFullscreen = 5, + kSearchKeyFullscreen_DEPRECATED = 4, // Migrated to kSearchKey. + kShelfButtonFullscreen_DEPRACTED = 5, // Obsolete on bubble launcher. kAssistantEntryPoint = 6, kScrollFromShelf = 7, kMaxValue = kScrollFromShelf,
diff --git a/ash/app_list/views/assistant/assistant_main_stage.cc b/ash/app_list/views/assistant/assistant_main_stage.cc index 07de262d..0083cdb 100644 --- a/ash/app_list/views/assistant/assistant_main_stage.cc +++ b/ash/app_list/views/assistant/assistant_main_stage.cc
@@ -11,7 +11,6 @@ #include "ash/assistant/ui/assistant_view_delegate.h" #include "ash/assistant/ui/assistant_view_ids.h" #include "ash/assistant/ui/base/stack_layout.h" -#include "ash/assistant/ui/colors/assistant_colors_util.h" #include "ash/assistant/ui/main_stage/assistant_footer_view.h" #include "ash/assistant/ui/main_stage/assistant_progress_indicator.h" #include "ash/assistant/ui/main_stage/assistant_query_view.h" @@ -118,8 +117,7 @@ AppListAssistantMainStage::AppListAssistantMainStage( AssistantViewDelegate* delegate) - : delegate_(delegate), - use_dark_light_mode_colors_(assistant::UseDarkLightModeColors()) { + : delegate_(delegate) { SetID(AssistantViewID::kMainStage); InitLayout(); @@ -142,10 +140,6 @@ void AppListAssistantMainStage::OnThemeChanged() { views::View::OnThemeChanged(); - - if (!use_dark_light_mode_colors_) - return; - horizontal_separator_->SetColorId(ui::kColorAshSystemUIMenuSeparator); } @@ -258,9 +252,7 @@ 2; horizontal_separator_->SetBorder( views::CreateEmptyBorder(gfx::Insets::VH(vertical_inset, 0))); - // We use default color of views::Separator if dark light mode flag is off. - if (use_dark_light_mode_colors_) - horizontal_separator_->SetColorId(ui::kColorAshSystemUIMenuSeparator); + horizontal_separator_->SetColorId(ui::kColorAshSystemUIMenuSeparator); horizontal_separator_->SetPreferredSize(gfx::Size( kSeparatorWidthDip, progress_indicator_->GetPreferredSize().height())); horizontal_separator_->SetPaintToLayer();
diff --git a/ash/app_list/views/assistant/assistant_main_stage.h b/ash/app_list/views/assistant/assistant_main_stage.h index 7e899e432..852fdca 100644 --- a/ash/app_list/views/assistant/assistant_main_stage.h +++ b/ash/app_list/views/assistant/assistant_main_stage.h
@@ -86,9 +86,6 @@ AssistantViewDelegate* const delegate_; // Owned by Shell. - // Whether to use dark/light mode colors, which default to dark. - const bool use_dark_light_mode_colors_; - // Owned by view hierarchy. AssistantProgressIndicator* progress_indicator_; views::Separator* horizontal_separator_;
diff --git a/ash/assistant/assistant_controller_impl_unittest.cc b/ash/assistant/assistant_controller_impl_unittest.cc index 36863b1..c4f1988 100644 --- a/ash/assistant/assistant_controller_impl_unittest.cc +++ b/ash/assistant/assistant_controller_impl_unittest.cc
@@ -254,21 +254,18 @@ ui_model()->RemoveObserver(&ui_model_observer_mock); } -// Make sure that AssistantControllerImpl sets dark mode = false even if the -// flag is off. SettingsController won't set options if dark mode bit is not -// set. +// Dark mode is set to true if the DarkLightMode flag is off. This is determined +// in DarkLightModeControllerImpl::IsDarkModeEnabled(). TEST_F(AssistantControllerImplTest, ColorModeIsSetWhenAssistantIsReadyFlagOff) { - // ProductivityLauncher uses DarkLightMode colors. base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( /*enabled_features=*/{}, /*disabled_features=*/{ - chromeos::features::kDarkLightMode, features::kNotificationsRefresh, - features::kProductivityLauncher}); + chromeos::features::kDarkLightMode, features::kNotificationsRefresh}); controller()->SetAssistant(test_assistant_service()); ASSERT_TRUE(test_assistant_service()->dark_mode_enabled().has_value()); - EXPECT_FALSE(test_assistant_service()->dark_mode_enabled().value()); + EXPECT_TRUE(test_assistant_service()->dark_mode_enabled().value()); } TEST_F(AssistantControllerImplTest, ColorModeIsUpdated) {
diff --git a/ash/assistant/assistant_interaction_controller_impl_unittest.cc b/ash/assistant/assistant_interaction_controller_impl_unittest.cc index 7f50465..26706f41 100644 --- a/ash/assistant/assistant_interaction_controller_impl_unittest.cc +++ b/ash/assistant/assistant_interaction_controller_impl_unittest.cc
@@ -275,10 +275,8 @@ static constexpr int kNarrowLayoutAshWebViewWidth = 496; base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures( - {app_list_features::kCompactBubbleLauncher, - features::kProductivityLauncher}, - {}); + scoped_feature_list.InitAndEnableFeature( + app_list_features::kCompactBubbleLauncher); UpdateDisplay("1200x800"); ShowAssistantUi();
diff --git a/ash/assistant/ui/base/assistant_button_unittest.cc b/ash/assistant/ui/base/assistant_button_unittest.cc index f28067a..76d9084 100644 --- a/ash/assistant/ui/base/assistant_button_unittest.cc +++ b/ash/assistant/ui/base/assistant_button_unittest.cc
@@ -162,16 +162,12 @@ /*is_opaque=*/true); const SkBitmap button_image_with_focus = CreateExpectedImageWithFocus( - /*icon_color=*/ash::features::IsProductivityLauncherEnabled() - ? gfx::kGoogleGrey200 - : gfx::kGoogleGrey900, + /*icon_color=*/gfx::kGoogleGrey200, /*focus_color=*/ColorProvider::Get()->GetControlsLayerColor( ColorProvider::ControlsLayerType::kFocusRingColor)); const SkBitmap button_image_without_focus = CreateExpectedImageWithoutFocus( - /*icon_color=*/ash::features::IsProductivityLauncherEnabled() - ? gfx::kGoogleGrey200 - : gfx::kGoogleGrey900); + /*icon_color=*/gfx::kGoogleGrey200); button->RequestFocus(); ASSERT_TRUE(button->HasFocus());
diff --git a/ash/assistant/ui/colors/assistant_colors_util.cc b/ash/assistant/ui/colors/assistant_colors_util.cc index fd5aeda..498a638 100644 --- a/ash/assistant/ui/colors/assistant_colors_util.cc +++ b/ash/assistant/ui/colors/assistant_colors_util.cc
@@ -11,35 +11,13 @@ namespace ash { namespace assistant { -namespace { - -SkColor GetDarkLightModeFlagOffColor(assistant_colors::ColorName color_name) { - if (color_name == assistant_colors::ColorName::kBgAssistantPlate) - return SK_ColorWHITE; - - return assistant_colors::ResolveColor(color_name, /*is_dark_mode=*/false, - /*use_debug_colors=*/false); -} - -} // namespace SkColor ResolveAssistantColor(assistant_colors::ColorName color_name) { - // Delete this utility class and call assistant_colors::ResolveColor directly - // once dark and light mode has launched and features::IsDarkLightModeEnabled - // gets removed. - if (!UseDarkLightModeColors()) - return GetDarkLightModeFlagOffColor(color_name); - return assistant_colors::ResolveColor( color_name, DarkLightModeController::Get()->IsDarkModeEnabled(), base::FeatureList::IsEnabled( ash::features::kSemanticColorsDebugOverride)); } -bool UseDarkLightModeColors() { - return features::IsDarkLightModeEnabled() || - features::IsProductivityLauncherEnabled(); -} - } // namespace assistant } // namespace ash
diff --git a/ash/assistant/ui/colors/assistant_colors_util.h b/ash/assistant/ui/colors/assistant_colors_util.h index b6f82513..270157a 100644 --- a/ash/assistant/ui/colors/assistant_colors_util.h +++ b/ash/assistant/ui/colors/assistant_colors_util.h
@@ -15,11 +15,6 @@ // flag is off, this resolve the color from a map defined in the cc file. SkColor ResolveAssistantColor(assistant_colors::ColorName color_name); -// Whether to use the modern dark/light mode colors, instead of legacy colors. -// Returns true if either feature kDarkLightMode or kProductivityLauncher is -// enabled. -bool UseDarkLightModeColors(); - } // namespace assistant } // namespace ash
diff --git a/ash/assistant/ui/colors/assistant_colors_util_unittest.cc b/ash/assistant/ui/colors/assistant_colors_util_unittest.cc index 99d9dc55..0346756 100644 --- a/ash/assistant/ui/colors/assistant_colors_util_unittest.cc +++ b/ash/assistant/ui/colors/assistant_colors_util_unittest.cc
@@ -51,35 +51,33 @@ } TEST_F(AssistantColorsUtilUnittest, AssistantColorFlagOff) { - // ProductivityLauncher uses DarkLightMode colors. base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( /*enabled_features=*/{}, /*disabled_features=*/{ - chromeos::features::kDarkLightMode, features::kNotificationsRefresh, - features::kProductivityLauncher}); + chromeos::features::kDarkLightMode, features::kNotificationsRefresh}); + // If DarkLightMode is off, the dark mode is on by default. EXPECT_EQ( ResolveAssistantColor(assistant_colors::ColorName::kBgAssistantPlate), - SK_ColorWHITE); - EXPECT_EQ( - ResolveAssistantColor(assistant_colors::ColorName::kBgAssistantPlate), - SK_ColorWHITE); + assistant_colors::ResolveColor( + assistant_colors::ColorName::kBgAssistantPlate, + /*is_dark_mode=*/true, + /*use_debug_colors=*/false)); } // ResolveAssistantColor falls back to assistant_colors::ResolveColor with dark // mode off if the color is not defined in the cc file map and the flag is off. TEST_F(AssistantColorsUtilUnittest, AssistantColorFlagOffFallback) { - // ProductivityLauncher uses DarkLightMode colors. base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures( /*enabled_features=*/{}, /*disabled_features=*/{ - chromeos::features::kDarkLightMode, features::kNotificationsRefresh, - features::kProductivityLauncher}); + chromeos::features::kDarkLightMode, features::kNotificationsRefresh}); + // If DarkLightMode is off, the dark mode is on by default. EXPECT_EQ(ResolveAssistantColor(assistant_colors::ColorName::kGoogleBlue100), assistant_colors::ResolveColor( assistant_colors::ColorName::kGoogleBlue100, - /*is_dark_mode=*/false, /*use_debug_colors=*/false)); + /*is_dark_mode=*/true, /*use_debug_colors=*/false)); } } // namespace assistant
diff --git a/ash/assistant/ui/main_stage/suggestion_chip_view.cc b/ash/assistant/ui/main_stage/suggestion_chip_view.cc index 8296a98f..16f7aa35 100644 --- a/ash/assistant/ui/main_stage/suggestion_chip_view.cc +++ b/ash/assistant/ui/main_stage/suggestion_chip_view.cc
@@ -12,7 +12,6 @@ #include "ash/assistant/ui/assistant_view_delegate.h" #include "ash/assistant/ui/assistant_view_ids.h" #include "ash/assistant/ui/colors/assistant_colors.h" -#include "ash/assistant/ui/colors/assistant_colors_util.h" #include "ash/assistant/util/resource_util.h" #include "ash/style/ash_color_id.h" #include "base/bind.h" @@ -43,8 +42,6 @@ using assistant::util::ResourceLinkType; // Appearance. -constexpr SkColor kFocusColor = SkColorSetA(gfx::kGoogleGrey900, 0x14); - constexpr int kStrokeWidthDip = 1; constexpr int kFocusedStrokeWidthDip = 2; @@ -53,25 +50,13 @@ constexpr int kChipPaddingDip = 16; constexpr int kPreferredHeightDip = 32; -// Returns the color of the border stroke. -SkColor GetStrokeColor(ui::ColorProvider* color_provider, - bool use_dark_light_mode_colors) { - if (use_dark_light_mode_colors) { - DCHECK(color_provider); - return color_provider->GetColor(kColorAshSeparatorColor); - } - return SkColorSetA(gfx::kGoogleGrey900, 0x24); -} - } // namespace // SuggestionChipView ---------------------------------------------------------- SuggestionChipView::SuggestionChipView(AssistantViewDelegate* delegate, const AssistantSuggestion& suggestion) - : delegate_(delegate), - use_dark_light_mode_colors_(assistant::UseDarkLightModeColors()), - suggestion_id_(suggestion.id) { + : delegate_(delegate), suggestion_id_(suggestion.id) { InitLayout(suggestion); } @@ -110,17 +95,12 @@ // 2. Dark light mode is ON // We use focus ring. No background color change with focus. SetFocusBehavior(FocusBehavior::ALWAYS); - SetInstallFocusRingOnFocus(use_dark_light_mode_colors_); + SetInstallFocusRingOnFocus(true); - if (use_dark_light_mode_colors_) { - views::FocusRing* focus_ring = views::FocusRing::Get(this); - focus_ring->SetColorId(ui::kColorAshFocusRing); - focus_ring->SetHaloThickness(kFocusedStrokeWidthDip); - focus_ring->SetHaloInset(0.0f); - } else { - // We don't call Button::OnFocus (views::OnFocus) in our OnFocus. - set_suppress_default_focus_handling(); - } + views::FocusRing* focus_ring = views::FocusRing::Get(this); + focus_ring->SetColorId(ui::kColorAshFocusRing); + focus_ring->SetHaloThickness(kFocusedStrokeWidthDip); + focus_ring->SetHaloInset(0.0f); // Path is used for the focus ring, i.e. path is not necessary for dark and // light mode flag off case. But we always install this as it shouldn't be a @@ -171,35 +151,6 @@ text_view_->SetFontList(font_list.Derive( /*size_delta=*/1, font_list.GetFontStyle(), gfx::Font::Weight::MEDIUM)); SetText(text); - - if (!use_dark_light_mode_colors_) { - SetBackground( - views::CreateRoundedRectBackground(SK_ColorTRANSPARENT, radius)); - } -} - -void SuggestionChipView::OnFocus() { - if (use_dark_light_mode_colors_) { - Button::OnFocus(); - } else { - background()->SetNativeControlColor(kFocusColor); - - // SetNativeControlColor doesn't trigger a paint. - SchedulePaint(); - - // Manually notify an event as we called - // set_suppress_default_focus_handling. - NotifyAccessibilityEvent(ax::mojom::Event::kSelection, true); - } -} - -void SuggestionChipView::OnBlur() { - if (use_dark_light_mode_colors_) { - Button::OnBlur(); - } else { - background()->SetNativeControlColor(SK_ColorTRANSPARENT); - SchedulePaint(); - } } bool SuggestionChipView::OnKeyPressed(const ui::KeyEvent& event) { @@ -218,10 +169,6 @@ const int radius = views::LayoutProvider::Get()->GetCornerRadiusMetric( views::Emphasis::kMaximum, size()); - if (!use_dark_light_mode_colors_) { - SetBackground(views::CreateRoundedRectBackground( - HasFocus() ? kFocusColor : SK_ColorTRANSPARENT, radius)); - } // Only set the border if a ColorProvider is available. Otherwise, we cannot // compute the stroke color. @@ -229,7 +176,7 @@ if (color_provider) { SetBorder(views::CreateRoundedRectBorder( kStrokeWidthDip, radius, - GetStrokeColor(color_provider, use_dark_light_mode_colors_))); + color_provider->GetColor(kColorAshSeparatorColor))); } views::InstallRoundRectHighlightPathGenerator(this, gfx::Insets(), radius); @@ -242,13 +189,11 @@ DCHECK(color_provider); text_view_->SetEnabledColor( color_provider->GetColor(kColorAshSuggestionChipViewTextView)); - if (use_dark_light_mode_colors_) { - const int radius = views::LayoutProvider::Get()->GetCornerRadiusMetric( - views::Emphasis::kMaximum, size()); - SetBorder(views::CreateRoundedRectBorder( - kStrokeWidthDip, radius, - GetStrokeColor(color_provider, use_dark_light_mode_colors_))); - } + const int radius = views::LayoutProvider::Get()->GetCornerRadiusMetric( + views::Emphasis::kMaximum, size()); + SetBorder(views::CreateRoundedRectBorder( + kStrokeWidthDip, radius, + color_provider->GetColor(kColorAshSeparatorColor))); } void SuggestionChipView::SetIcon(const gfx::ImageSkia& icon) {
diff --git a/ash/assistant/ui/main_stage/suggestion_chip_view.h b/ash/assistant/ui/main_stage/suggestion_chip_view.h index e17fad5..df622139 100644 --- a/ash/assistant/ui/main_stage/suggestion_chip_view.h +++ b/ash/assistant/ui/main_stage/suggestion_chip_view.h
@@ -37,8 +37,6 @@ gfx::Size CalculatePreferredSize() const override; int GetHeightForWidth(int width) const override; void ChildVisibilityChanged(views::View* child) override; - void OnFocus() override; - void OnBlur() override; bool OnKeyPressed(const ui::KeyEvent& event) override; void OnThemeChanged() override; void OnBoundsChanged(const gfx::Rect& previous_bounds) override; @@ -56,9 +54,6 @@ AssistantViewDelegate* const delegate_; - // Whether to use dark/light mode colors, which default to dark. - const bool use_dark_light_mode_colors_; - const base::UnguessableToken suggestion_id_; views::BoxLayout* layout_manager_; // Owned by view hierarchy.
diff --git a/ash/assistant/ui/main_stage/ui_element_container_view.cc b/ash/assistant/ui/main_stage/ui_element_container_view.cc index d7083579..aa4e883 100644 --- a/ash/assistant/ui/main_stage/ui_element_container_view.cc +++ b/ash/assistant/ui/main_stage/ui_element_container_view.cc
@@ -12,7 +12,6 @@ #include "ash/assistant/ui/assistant_ui_constants.h" #include "ash/assistant/ui/assistant_view_delegate.h" #include "ash/assistant/ui/assistant_view_ids.h" -#include "ash/assistant/ui/colors/assistant_colors_util.h" #include "ash/assistant/ui/main_stage/animated_container_view.h" #include "ash/assistant/ui/main_stage/assistant_ui_element_view.h" #include "ash/assistant/ui/main_stage/assistant_ui_element_view_factory.h" @@ -88,8 +87,7 @@ UiElementContainerView::UiElementContainerView(AssistantViewDelegate* delegate) : AnimatedContainerView(delegate), - view_factory_(std::make_unique<AssistantUiElementViewFactory>(delegate)), - use_dark_light_mode_colors_(assistant::UseDarkLightModeColors()) { + view_factory_(std::make_unique<AssistantUiElementViewFactory>(delegate)) { SetID(AssistantViewID::kUiElementContainer); InitLayout(); } @@ -260,12 +258,8 @@ } SkColor UiElementContainerView::GetOverflowIndicatorBackgroundColor() const { - if (use_dark_light_mode_colors_) { - return ColorProvider::Get()->GetContentLayerColor( - ColorProvider::ContentLayerType::kSeparatorColor); - } - - return gfx::kGoogleGrey300; + return ColorProvider::Get()->GetContentLayerColor( + ColorProvider::ContentLayerType::kSeparatorColor); } } // namespace ash
diff --git a/ash/assistant/ui/main_stage/ui_element_container_view.h b/ash/assistant/ui/main_stage/ui_element_container_view.h index 7e792f7..9273830a 100644 --- a/ash/assistant/ui/main_stage/ui_element_container_view.h +++ b/ash/assistant/ui/main_stage/ui_element_container_view.h
@@ -64,9 +64,6 @@ // Factory instance used to construct views for modeled UI elements. std::unique_ptr<AssistantUiElementViewFactory> view_factory_; - - // Whether to use dark/light mode colors, which default to dark. - const bool use_dark_light_mode_colors_; }; } // namespace ash
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 41eb4cbf..64664f1 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -663,7 +663,7 @@ base::FEATURE_DISABLED_BY_DEFAULT); // Enables the System Web App (SWA) version of Eche. -BASE_FEATURE(kEcheSWA, "EcheSWA", base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kEcheSWA, "EcheSWA", base::FEATURE_DISABLED_BY_DEFAULT); // Enables the Debug Mode of Eche. BASE_FEATURE(kEcheSWADebugMode,
diff --git a/ash/constants/ash_switches.cc b/ash/constants/ash_switches.cc index 386f5c3..68df430 100644 --- a/ash/constants/ash_switches.cc +++ b/ash/constants/ash_switches.cc
@@ -315,6 +315,10 @@ // App ID to use for screensaver app in demo mode. const char kDemoModeScreensaverApp[] = "demo-mode-screensaver-extension"; +// Directory from which to fetch the demo mode SWA content (instead of +// downloading from Omaha). +const char kDemoModeSwaContentDirectory[] = "demo-mode-swa-content-directory"; + // Time in seconds before a machine at OOBE is considered derelict. const char kDerelictDetectionTimeout[] = "derelict-detection-timeout";
diff --git a/ash/constants/ash_switches.h b/ash/constants/ash_switches.h index 07441a3..9c021cb 100644 --- a/ash/constants/ash_switches.h +++ b/ash/constants/ash_switches.h
@@ -101,6 +101,8 @@ COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDefaultWallpaperSmall[]; COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDemoModeHighlightsApp[]; COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDemoModeScreensaverApp[]; +COMPONENT_EXPORT(ASH_CONSTANTS) +extern const char kDemoModeSwaContentDirectory[]; COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDerelictDetectionTimeout[]; COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDerelictIdleTimeout[]; COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDisableArcCpuRestriction[];
diff --git a/ash/public/cpp/accelerator_configuration.h b/ash/public/cpp/accelerator_configuration.h index 7e774fb..657850e 100644 --- a/ash/public/cpp/accelerator_configuration.h +++ b/ash/public/cpp/accelerator_configuration.h
@@ -29,10 +29,15 @@ struct ASH_PUBLIC_EXPORT AcceleratorInfo { AcceleratorInfo(ash::mojom::AcceleratorType type, ui::Accelerator accelerator, + const std::u16string& key_display, bool locked) - : type(type), accelerator(accelerator), locked(locked) {} + : type(type), + accelerator(accelerator), + key_display(key_display), + locked(locked) {} ash::mojom::AcceleratorType type; ui::Accelerator accelerator; + std::u16string key_display; // Whether the accelerator can be modified. bool locked = true; // Accelerators are enabled by default.
diff --git a/ash/public/mojom/accelerator_info.mojom b/ash/public/mojom/accelerator_info.mojom index 5d099e11..ad0772c 100644 --- a/ash/public/mojom/accelerator_info.mojom +++ b/ash/public/mojom/accelerator_info.mojom
@@ -87,6 +87,8 @@ struct AcceleratorInfo { // Underlying accelerator struct, contains keycode and modifier. ui.mojom.Accelerator accelerator; + // The user viewable string of the primary activation key for the accelerator. + mojo_base.mojom.String16 key_display; AcceleratorType type; AcceleratorState state; // True if the accelerator can not be customized by the user.
diff --git a/ash/shelf/home_button.cc b/ash/shelf/home_button.cc index 417cd35..14cc0368 100644 --- a/ash/shelf/home_button.cc +++ b/ash/shelf/home_button.cc
@@ -179,11 +179,8 @@ base::UserMetricsAction("AppList_HomeButtonPressedClamshell")); } - const AppListShowSource show_source = - event.IsShiftDown() ? AppListShowSource::kShelfButtonFullscreen - : AppListShowSource::kShelfButton; Shell::Get()->app_list_controller()->ToggleAppList( - GetDisplayId(), show_source, event.time_stamp()); + GetDisplayId(), AppListShowSource::kShelfButton, event.time_stamp()); // If the home button is pressed, fade out the nudge label if it is showing. if (label_container_) {
diff --git a/ash/shelf/launcher_nudge_controller_unittest.cc b/ash/shelf/launcher_nudge_controller_unittest.cc index 5494a11..5957287 100644 --- a/ash/shelf/launcher_nudge_controller_unittest.cc +++ b/ash/shelf/launcher_nudge_controller_unittest.cc
@@ -223,14 +223,10 @@ AdvanceClock(nudge_controller_->GetNudgeInterval(/*is_first_time=*/true)); EXPECT_EQ(1, GetNudgeShownCount()); - // Toggle the app list to show. Open fullscreen to avoid showing the expand - // arrow button, because the animation for that button causes an MSAN - // use-of-uninitialized-value. This workaround can be removed when - // ProductivityLauncher is the default, since it does not have an expand - // button. See https://crbug.com/926038. + // Toggle the app list to show. Shell::Get()->app_list_controller()->ToggleAppList( display::Screen::GetScreen()->GetPrimaryDisplay().id(), - AppListShowSource::kShelfButtonFullscreen, base::TimeTicks()); + AppListShowSource::kShelfButton, base::TimeTicks()); ASSERT_TRUE(Shell::Get()->app_list_controller()->IsVisible()); AdvanceClock(nudge_controller_->GetNudgeInterval(/*is_first_time=*/false));
diff --git a/ash/shell.cc b/ash/shell.cc index f3f1abc..65f1e7a7 100644 --- a/ash/shell.cc +++ b/ash/shell.cc
@@ -1089,8 +1089,7 @@ wallpaper_controller_ = WallpaperControllerImpl::Create(local_state_); - if (features::IsRgbKeyboardEnabled() && - rgb_keyboard_manager_->IsRgbKeyboardSupported()) { + if (features::IsRgbKeyboardEnabled()) { // Initialized after |wallpaper_controller_| because we will need to observe // when the extracted wallpaper color changes. keyboard_backlight_color_controller_ =
diff --git a/ash/system/eche/eche_tray.cc b/ash/system/eche/eche_tray.cc index 32f436f..18e895e1 100644 --- a/ash/system/eche/eche_tray.cc +++ b/ash/system/eche/eche_tray.cc
@@ -180,6 +180,18 @@ icon_( tray_container()->AddChildView(std::make_unique<views::ImageView>())), event_interceptor_(std::make_unique<EventInterceptor>(this)) { + SetPressedCallback(base::BindRepeating( + [](EcheTray* eche_tray, const ui::Event& event) { + // The `bubble_` is cached, so don't check for existence (which is the + // base TrayBackgroundView implementation), check for visibility to + // decide on whether to show or hide. + if (eche_tray->IsBubbleVisible()) { + eche_tray->HideBubble(); + return; + } + eche_tray->ShowBubble(); + }, + base::Unretained(this))); const int icon_padding = (kTrayItemSize - kIconSize) / 2; icon_->SetBorder( @@ -249,6 +261,12 @@ } void EcheTray::ShowBubble() { +#ifdef FAKE_BUBBLE_FOR_DEBUG + LoadBubble(GURL("http://google.com"), std::move(gfx::Image()), + u"visible_name"); + return; +#endif + if (!bubble_) return; SetIconVisibility(true); @@ -273,20 +291,6 @@ shelf()->UpdateAutoHideState(); } -bool EcheTray::PerformAction(const ui::Event& event) { - // Simply toggle between visible/invisibvle - if (IsBubbleVisible()) { - HideBubble(); - } else { -#ifdef FAKE_BUBBLE_FOR_DEBUG - LoadBubble(GURL("http://google.com"), std::move(gfx::Image()), - u"visible_name"); -#endif - ShowBubble(); - } - return true; -} - TrayBubbleView* EcheTray::GetBubbleView() { return bubble_ ? bubble_->bubble_view() : nullptr; }
diff --git a/ash/system/eche/eche_tray.h b/ash/system/eche/eche_tray.h index 2b71e60..82abde3 100644 --- a/ash/system/eche/eche_tray.h +++ b/ash/system/eche/eche_tray.h
@@ -41,7 +41,7 @@ } // namespace views namespace ui { -class Event; +class KeyEvent; } // namespace ui namespace gfx { @@ -88,7 +88,6 @@ void Initialize() override; void CloseBubble() override; void ShowBubble() override; - bool PerformAction(const ui::Event& event) override; TrayBubbleView* GetBubbleView() override; views::Widget* GetBubbleWidget() const override; void OnVirtualKeyboardVisibilityChanged() override;
diff --git a/ash/system/keyboard_brightness/keyboard_backlight_color_controller.cc b/ash/system/keyboard_brightness/keyboard_backlight_color_controller.cc index 50d9412..1ff11af5 100644 --- a/ash/system/keyboard_brightness/keyboard_backlight_color_controller.cc +++ b/ash/system/keyboard_brightness/keyboard_backlight_color_controller.cc
@@ -73,7 +73,12 @@ if (account_id.empty()) return personalization_app::mojom::BacklightColor::kWallpaper; auto* pref_service = GetUserPrefService(account_id); - DCHECK(pref_service); + if (!pref_service) { + // TODO(b/238463679): Migrate to local state pref. There may be a timing + // issue that results in null pref service. Defaults to |kWallpaper| when + // that happens. + return personalization_app::mojom::BacklightColor::kWallpaper; + } return static_cast<personalization_app::mojom::BacklightColor>( pref_service->GetInteger(prefs::kPersonalizationKeyboardBacklightColor)); }
diff --git a/ash/system/keyboard_brightness/keyboard_backlight_color_controller_unittest.cc b/ash/system/keyboard_brightness/keyboard_backlight_color_controller_unittest.cc index e804c12..724448ab 100644 --- a/ash/system/keyboard_brightness/keyboard_backlight_color_controller_unittest.cc +++ b/ash/system/keyboard_brightness/keyboard_backlight_color_controller_unittest.cc
@@ -3,9 +3,6 @@ // found in the LICENSE file. #include "ash/system/keyboard_brightness/keyboard_backlight_color_controller.h" - -#include <memory> - #include "ash/constants/ash_features.h" #include "ash/rgb_keyboard/rgb_keyboard_util.h" #include "ash/shell.h" @@ -83,15 +80,10 @@ void SetUp() override { AshTestBase::SetUp(); - controller_ = std::make_unique<KeyboardBacklightColorController>(); + controller_ = Shell::Get()->keyboard_backlight_color_controller(); wallpaper_controller_ = Shell::Get()->wallpaper_controller(); } - void TearDown() override { - controller_.reset(); - AshTestBase::TearDown(); - } - protected: const base::HistogramTester& histogram_tester() const { return histogram_tester_; @@ -105,7 +97,7 @@ controller_->displayed_color_for_testing_ = SK_ColorTRANSPARENT; } - std::unique_ptr<KeyboardBacklightColorController> controller_; + KeyboardBacklightColorController* controller_ = nullptr; WallpaperControllerImpl* wallpaper_controller_ = nullptr; private:
diff --git a/ash/system/keyboard_brightness/keyboard_backlight_color_nudge_controller_unittest.cc b/ash/system/keyboard_brightness/keyboard_backlight_color_nudge_controller_unittest.cc index b1f8525c..7d6fbce 100644 --- a/ash/system/keyboard_brightness/keyboard_backlight_color_nudge_controller_unittest.cc +++ b/ash/system/keyboard_brightness/keyboard_backlight_color_nudge_controller_unittest.cc
@@ -7,6 +7,7 @@ #include "ash/controls/contextual_tooltip.h" #include "ash/session/session_controller_impl.h" #include "ash/shell.h" +#include "ash/system/keyboard_brightness/keyboard_backlight_color_controller.h" #include "ash/test/ash_test_base.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" @@ -35,7 +36,18 @@ ~KeyboardBacklightColorNudgeControllerTest() override = default; + // testing::Test: + void SetUp() override { + AshTestBase::SetUp(); + + controller_ = Shell::Get() + ->keyboard_backlight_color_controller() + ->keyboard_backlight_color_nudge_controller(); + } + protected: + KeyboardBacklightColorNudgeController* controller_ = nullptr; + PrefService* pref_service() { return Shell::Get()->session_controller()->GetActivePrefService(); } @@ -46,8 +58,6 @@ contextual_tooltip::TooltipType::kKeyboardBacklightColor, nullptr); } - KeyboardBacklightColorNudgeController controller_; - private: base::test::ScopedFeatureList scoped_feature_list_; }; @@ -59,7 +69,7 @@ SimulateUserLogin(account_id_1); EXPECT_TRUE(can_show_nudge()); - controller_.MaybeShowEducationNudge(&anchor_view); + controller_->MaybeShowEducationNudge(&anchor_view); EXPECT_FALSE(can_show_nudge()); @@ -73,7 +83,7 @@ SimulateUserLogin(account_id_1); EXPECT_TRUE(can_show_nudge()); - controller_.SetUserPerformedAction(); + controller_->SetUserPerformedAction(); EXPECT_FALSE(can_show_nudge());
diff --git a/ash/system/privacy/privacy_indicators_controller.cc b/ash/system/privacy/privacy_indicators_controller.cc index 29e3878a..d30aea9 100644 --- a/ash/system/privacy/privacy_indicators_controller.cc +++ b/ash/system/privacy/privacy_indicators_controller.cc
@@ -24,13 +24,6 @@ namespace ash { -namespace { - -// Keep track of the button indexes in the privacy indicators notification. -enum PrivacyIndicatorsNotificationButton { kAppLaunch, kAppSettings }; - -} // namespace - PrivacyIndicatorsNotificationDelegate::PrivacyIndicatorsNotificationDelegate( const AppActionClosure& launch_app, const AppActionClosure& launch_settings) @@ -46,14 +39,7 @@ if (!button_index) return; - switch (button_index.value()) { - case PrivacyIndicatorsNotificationButton::kAppLaunch: - launch_app_.Run(); - break; - case PrivacyIndicatorsNotificationButton::kAppSettings: - launch_settings_.Run(); - break; - } + launch_settings_.Run(); } std::unique_ptr<message_center::Notification> @@ -94,10 +80,7 @@ optional_fields.parent_vector_small_image = &kPrivacyIndicatorsIcon; - // Note: The order of buttons added here should match the order in - // PrivacyIndicatorsNotificationButton. - optional_fields.buttons.emplace_back( - l10n_util::GetStringUTF16(IDS_PRIVACY_NOTIFICATION_BUTTON_APP_LAUNCH)); + // TODO(b/251686202): Add back the "Launch App button". optional_fields.buttons.emplace_back( l10n_util::GetStringUTF16(IDS_PRIVACY_NOTIFICATION_BUTTON_APP_SETTINGS));
diff --git a/ash/system/privacy/privacy_indicators_controller_unittest.cc b/ash/system/privacy/privacy_indicators_controller_unittest.cc index 1beb097..8a2de481 100644 --- a/ash/system/privacy/privacy_indicators_controller_unittest.cc +++ b/ash/system/privacy/privacy_indicators_controller_unittest.cc
@@ -120,14 +120,9 @@ GetNotificationViewFromMessageCenter(notification_id)); EXPECT_TRUE(notification_view); - // Clicking the first button will trigger launching the app. - EXPECT_FALSE(delegate->launch_app_called()); - ClickView(notification_view, 0); - EXPECT_TRUE(delegate->launch_app_called()); - // Clicking the first button will trigger launching the app settings. EXPECT_FALSE(delegate->launch_settings_called()); - ClickView(notification_view, 1); + ClickView(notification_view, 0); EXPECT_TRUE(delegate->launch_settings_called()); }
diff --git a/ash/system/tray/tray_constants.h b/ash/system/tray/tray_constants.h index 5ec1f30..aa3eb7d 100644 --- a/ash/system/tray/tray_constants.h +++ b/ash/system/tray/tray_constants.h
@@ -29,6 +29,9 @@ // The width of the tray menu. constexpr int kTrayMenuWidth = 360; +// The width of the revamped tray menu. +constexpr int kRevampedTrayMenuWidth = 440; + extern const int kTrayPopupAutoCloseDelayInSeconds; extern const int kTrayPopupAutoCloseDelayInSecondsWithSpokenFeedback; extern const int kTrayPopupPaddingHorizontal; @@ -142,6 +145,7 @@ constexpr int kUnifiedBackButtonLeftPadding = 16; constexpr auto kUnifiedTopShortcutPadding = gfx::Insets::VH(0, 16); constexpr auto kUnifiedNotificationHiddenPadding = gfx::Insets::VH(6, 16); +constexpr int kUnifiedNotificationSeparatorThickness = 1; constexpr gfx::Insets kUnifiedCircularButtonFocusPadding(4); constexpr gfx::Insets kTrayBackgroundFocusPadding(1); constexpr gfx::Insets kUnifiedSystemInfoBatteryIconPadding = @@ -199,7 +203,14 @@ constexpr int kUnifiedFeaturePodMinRows = 1; constexpr int kUnifiedFeaturePodMaxItemsInCollapsed = 5; constexpr int kUnifiedFeaturePodsPageSpacing = 48; -constexpr int kUnifiedNotificationSeparatorThickness = 1; + +// Constants used in FeatureTiles of QuickSettingsView. +constexpr int kFeatureTileItemsInRow = 2; +constexpr int kFeatureTileMaxRows = 4; +constexpr int kFeatureTileMinRows = 1; +constexpr int kFeatureTileHeight = 64; + +// Height of the page indicator view. constexpr int kPageIndicatorViewMaxHeight = 20; // Constants used in system tray page transition animations.
diff --git a/ash/system/unified/feature_tiles_container_view.cc b/ash/system/unified/feature_tiles_container_view.cc new file mode 100644 index 0000000..6400a34e --- /dev/null +++ b/ash/system/unified/feature_tiles_container_view.cc
@@ -0,0 +1,206 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/system/unified/feature_tiles_container_view.h" + +#include "ash/public/cpp/pagination/pagination_controller.h" +#include "ash/public/cpp/pagination/pagination_model.h" +#include "ash/system/tray/tray_constants.h" +#include "ash/system/unified/feature_pod_button.h" +#include "ash/system/unified/unified_system_tray_controller.h" +#include "ui/base/metadata/metadata_impl_macros.h" +#include "ui/views/background.h" +#include "ui/views/controls/label.h" +#include "ui/views/layout/flex_layout.h" +#include "ui/views/layout/flex_layout_view.h" + +using views::FlexLayout; +using views::FlexLayoutView; + +namespace ash { + +namespace { + +constexpr gfx::Size kFeatureTileRowSize(440, kFeatureTileHeight); +constexpr gfx::Size kFeatureTileDefaultSize(200, kFeatureTileHeight); +constexpr gfx::Size kFeatureTileCompactSize(96, kFeatureTileHeight); +constexpr gfx::Insets kFeatureTileRowMargins = gfx::Insets::VH(4, 0); +constexpr gfx::Insets kFeatureTileMargins = gfx::Insets::VH(0, 4); +constexpr gfx::Insets kFeatureTileRowPadding = gfx::Insets::VH(0, 16); +constexpr gfx::Insets kFeatureTileContainerPadding = gfx::Insets::VH(16, 0); + +class FeatureTileRow : public views::FlexLayoutView { + public: + METADATA_HEADER(FeatureTileRow); + + FeatureTileRow() { + SetPreferredSize(kFeatureTileRowSize); + SetDefault(views::kMarginsKey, kFeatureTileMargins); + SetIgnoreDefaultMainAxisMargins(true); + SetInteriorMargin(kFeatureTileRowPadding); + } + + FeatureTileRow(const FeatureTileRow&) = delete; + FeatureTileRow& operator=(const FeatureTileRow&) = delete; + ~FeatureTileRow() override = default; +}; + +BEGIN_METADATA(FeatureTileRow, views::FlexLayoutView) +END_METADATA + +// Temp class for prototyping. +class FeatureTile : public views::Label { + public: + METADATA_HEADER(FeatureTile); + + explicit FeatureTile(bool compact = false) { + SetPreferredSize(compact ? kFeatureTileCompactSize + : kFeatureTileDefaultSize); + SetBackground(views::CreateSolidBackground(SK_ColorGRAY)); + } + + FeatureTile(const FeatureTile&) = delete; + FeatureTile& operator=(const FeatureTile&) = delete; + ~FeatureTile() override = default; +}; + +BEGIN_METADATA(FeatureTile, views::Label) +END_METADATA + +} // namespace + +FeatureTilesContainerView::FeatureTilesContainerView( + UnifiedSystemTrayController* controller) + : controller_(controller), + pagination_model_(controller->model()->pagination_model()), + feature_tile_rows_(kFeatureTileMaxRows) { + DCHECK(pagination_model_); + DCHECK(controller_); + pagination_model_->AddObserver(this); + + SetLayoutManager(std::make_unique<FlexLayout>()) + ->SetOrientation(views::LayoutOrientation::kVertical) + .SetDefault(views::kMarginsKey, kFeatureTileRowMargins) + .SetIgnoreDefaultMainAxisMargins(true) + .SetInteriorMargin(kFeatureTileContainerPadding) + .SetCrossAxisAlignment(views::LayoutAlignment::kCenter); + + // Adds four rows with placeholder FeatureTile elements. + AddPlaceholderFeatureTiles(); +} + +FeatureTilesContainerView::~FeatureTilesContainerView() { + pagination_model_->RemoveObserver(this); +} + +void FeatureTilesContainerView::AddPlaceholderFeatureTiles() { + // TODO: add child rows based on `feature_tile_rows`. + FeatureTileRow* row1 = AddChildView(std::make_unique<FeatureTileRow>()); + FeatureTileRow* row2 = AddChildView(std::make_unique<FeatureTileRow>()); + FeatureTileRow* row3 = AddChildView(std::make_unique<FeatureTileRow>()); + FeatureTileRow* row4 = AddChildView(std::make_unique<FeatureTileRow>()); + + row1->AddChildView(std::make_unique<FeatureTile>()); + row1->AddChildView(std::make_unique<FeatureTile>(/*compact=*/true)); + row1->AddChildView(std::make_unique<FeatureTile>(/*compact=*/true)); + + row2->AddChildView(std::make_unique<FeatureTile>()); + row2->AddChildView(std::make_unique<FeatureTile>()); + + row3->AddChildView(std::make_unique<FeatureTile>()); + row3->AddChildView(std::make_unique<FeatureTile>()); + + row4->AddChildView(std::make_unique<FeatureTile>()); + row4->AddChildView(std::make_unique<FeatureTile>()); +} + +void FeatureTilesContainerView::SetRowsFromHeight(int max_height) { + int feature_tile_rows = CalculateRowsFromHeight(max_height); + + if (feature_tile_rows_ != feature_tile_rows) { + feature_tile_rows_ = feature_tile_rows; + UpdateTotalPages(); + } +} + +// TODO(crbug/1371668): Update pagination. +void FeatureTilesContainerView::ShowPageWithButton(views::View* button) { + auto index = visible_buttons_.GetIndexOfView(button->parent()); + if (!index.has_value()) + return; + + int tiles_per_page = GetTilesPerPage(); + size_t first_index = pagination_model_->selected_page() * tiles_per_page; + size_t last_index = + ((pagination_model_->selected_page() + 1) * tiles_per_page) - 1; + if (index.value() < first_index || index.value() > last_index) { + int page = ((index.value() + 1) / tiles_per_page) + + ((index.value() + 1) % tiles_per_page ? 1 : 0) - 1; + + pagination_model_->SelectPage(page, true /*animate*/); + } +} + +// TODO(crbug/1371668): Update pagination. +void FeatureTilesContainerView::SelectedPageChanged(int old_selected, + int new_selected) { + PaginationModelObserver::SelectedPageChanged(old_selected, new_selected); + InvalidateLayout(); +} + +// TODO(crbug/1371668): Update pagination. +void FeatureTilesContainerView::OnGestureEvent(ui::GestureEvent* event) {} + +// TODO(crbug/1371668): Update pagination. +void FeatureTilesContainerView::OnScrollEvent(ui::ScrollEvent* event) {} + +// TODO(crbug/1371668): Update pagination. +bool FeatureTilesContainerView::OnMouseWheel(const ui::MouseWheelEvent& event) { + return false; +} + +// TODO(crbug/1371668): Update pagination. +int FeatureTilesContainerView::CalculateRowsFromHeight(int height) { + int row_height = kFeatureTileRowSize.height(); + + // Uses the max number of rows with the space available. + int rows = kFeatureTileMaxRows; + while (height < (rows * row_height) && rows > kFeatureTileMinRows) + rows--; + return rows; +} + +// TODO(crbug/1371668): Update pagination. +int FeatureTilesContainerView::GetTilesPerPage() const { + return kFeatureTileItemsInRow * feature_tile_rows_; +} + +// TODO(crbug/1371668): Update pagination. +void FeatureTilesContainerView::UpdateTotalPages() { + int total_pages = 0; + + size_t total_visible = visible_buttons_.view_size(); + int tiles_per_page = GetTilesPerPage(); + + if (total_visible == 0 || tiles_per_page == 0) { + total_pages = 0; + } else { + total_pages = (total_visible / tiles_per_page) + + (total_visible % tiles_per_page ? 1 : 0); + } + pagination_model_->SetTotalPages(total_pages); +} + +// TODO(crbug/1371668): Update pagination. +void FeatureTilesContainerView::TransitionChanged() { + const PaginationModel::Transition& transition = + pagination_model_->transition(); + if (pagination_model_->is_valid_page(transition.target_page)) + Layout(); +} + +BEGIN_METADATA(FeatureTilesContainerView, views::View) +END_METADATA + +} // namespace ash
diff --git a/ash/system/unified/feature_tiles_container_view.h b/ash/system/unified/feature_tiles_container_view.h new file mode 100644 index 0000000..d0e7b51a --- /dev/null +++ b/ash/system/unified/feature_tiles_container_view.h
@@ -0,0 +1,93 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_SYSTEM_UNIFIED_FEATURE_TILES_CONTAINER_VIEW_H_ +#define ASH_SYSTEM_UNIFIED_FEATURE_TILES_CONTAINER_VIEW_H_ + +#include "ash/ash_export.h" +#include "ash/public/cpp/pagination/pagination_model_observer.h" +#include "ui/base/metadata/metadata_header_macros.h" +#include "ui/views/view.h" +#include "ui/views/view_model.h" + +namespace ash { + +// TODO(crbug/1368717): use FeatureTile. +class FeaturePodButton; +class PaginationModel; +class UnifiedSystemTrayController; + +// Container of FeatureTiles in the middle of QuickSettingsView. +// It can place buttons in a 1x2 to 4x2 grid given the available height. +// Implements pagination to be able to show all visible FeatureTiles. +class ASH_EXPORT FeatureTilesContainerView : public views::View, + public PaginationModelObserver { + public: + METADATA_HEADER(FeatureTilesContainerView); + + explicit FeatureTilesContainerView(UnifiedSystemTrayController* controller); + + FeatureTilesContainerView(const FeatureTilesContainerView&) = delete; + FeatureTilesContainerView& operator=(const FeatureTilesContainerView&) = + delete; + + ~FeatureTilesContainerView() override; + + // Adds FeatureTileRow elements with FeatureTile placeholders. + // This function is only used for prototyping. + void AddPlaceholderFeatureTiles(); + + // Sets the number of rows of feature tiles based on the max height the + // container can have. + void SetRowsFromHeight(int max_height); + + // Makes sure button is visible by switching page if needed. + void ShowPageWithButton(views::View* button); + + // PaginationModelObserver: + void SelectedPageChanged(int old_selected, int new_selected) override; + void TransitionChanged() override; + + // views::View: + void OnGestureEvent(ui::GestureEvent* event) override; + void OnScrollEvent(ui::ScrollEvent* event) override; + bool OnMouseWheel(const ui::MouseWheelEvent& event) override; + + int row_count() const { return feature_tile_rows_; } + + private: + friend class FeatureTilesContainerViewTest; + + // Calculates the number of feature tile rows based on the available `height`. + int CalculateRowsFromHeight(int height); + + // Returns the number of tiles per page. + int GetTilesPerPage() const; + + // Updates page splits for feature tiles. + void UpdateTotalPages(); + + // Owned by UnifiedSystemTrayBubble. + UnifiedSystemTrayController* const controller_; + + // Owned by UnifiedSystemTrayModel. + PaginationModel* const pagination_model_; + + // Number of rows of feature tiles to display. Updated based on the available + // max height for FeatureTilesContainer. + int feature_tile_rows_ = 0; + + // Used for preventing reentrancy issue in ChildVisibilityChanged. Should be + // always false if FeatureTilesContainerView is not in the call stack. + bool changing_visibility_ = false; + + // A view model that contains all visible feature tiles. + // Used to calculate required number of pages. + // TODO(crbug/1368717): use FeatureTile. + views::ViewModelT<FeaturePodButton> visible_buttons_; +}; + +} // namespace ash + +#endif // ASH_SYSTEM_UNIFIED_FEATURE_TILES_CONTAINER_VIEW_H_
diff --git a/ash/system/unified/feature_tiles_container_view_unittest.cc b/ash/system/unified/feature_tiles_container_view_unittest.cc new file mode 100644 index 0000000..413374e6 --- /dev/null +++ b/ash/system/unified/feature_tiles_container_view_unittest.cc
@@ -0,0 +1,89 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/system/unified/feature_tiles_container_view.h" + +#include "ash/constants/quick_settings_catalogs.h" +#include "ash/system/tray/tray_constants.h" +#include "ash/system/unified/feature_pod_button.h" +#include "ash/system/unified/feature_pod_controller_base.h" +#include "ash/system/unified/unified_system_tray.h" +#include "ash/system/unified/unified_system_tray_bubble.h" +#include "ash/system/unified/unified_system_tray_controller.h" +#include "ash/test/ash_test_base.h" +#include "ui/views/test/views_test_utils.h" + +namespace ash { + +// TODO(crbug/1368717): use FeatureTile. +class FeatureTilesContainerViewTest : public NoSessionAshTestBase, + public views::ViewObserver { + public: + FeatureTilesContainerViewTest() = default; + + FeatureTilesContainerViewTest(const FeatureTilesContainerViewTest&) = delete; + FeatureTilesContainerViewTest& operator=( + const FeatureTilesContainerViewTest&) = delete; + + ~FeatureTilesContainerViewTest() override = default; + + // AshTestBase: + void SetUp() override { + AshTestBase::SetUp(); + GetPrimaryUnifiedSystemTray()->ShowBubble(); + container_ = std::make_unique<FeatureTilesContainerView>(controller()); + container_->AddObserver(this); + } + + void TearDown() override { + container_->RemoveObserver(this); + container_.reset(); + GetPrimaryUnifiedSystemTray()->CloseBubble(); + NoSessionAshTestBase::TearDown(); + } + + // views::ViewObserver: + void OnViewPreferredSizeChanged(views::View* observed_view) override { + ++preferred_size_changed_count_; + } + + FeatureTilesContainerView* container() { return container_.get(); } + + UnifiedSystemTrayController* controller() { + return GetPrimaryUnifiedSystemTray() + ->bubble() + ->unified_system_tray_controller(); + } + + int preferred_size_changed_count() const { + return preferred_size_changed_count_; + } + + int CalculateRowsFromHeight(int height) { + return container()->CalculateRowsFromHeight(height); + } + + // TODO(crbug/1368717): use FeatureTile. + std::vector<FeaturePodButton*> buttons_; + + private: + std::unique_ptr<FeatureTilesContainerView> container_; + int preferred_size_changed_count_ = 0; +}; + +TEST_F(FeatureTilesContainerViewTest, CalculateRowsFromHeight) { + int row_height = kFeatureTileHeight; + + // Expect max number of rows even if available height could fit another row. + EXPECT_EQ(kFeatureTileMaxRows, + CalculateRowsFromHeight((kFeatureTileMaxRows + 1) * row_height)); + + // Expect appropriate number of rows with available height. + EXPECT_EQ(3, CalculateRowsFromHeight(3 * row_height)); + + // Expect min number of rows even with zero height. + EXPECT_EQ(kFeatureTileMinRows, CalculateRowsFromHeight(0)); +} + +} // namespace ash
diff --git a/ash/system/unified/quick_settings_view.cc b/ash/system/unified/quick_settings_view.cc index 0d9c2b63..815534e 100644 --- a/ash/system/unified/quick_settings_view.cc +++ b/ash/system/unified/quick_settings_view.cc
@@ -12,7 +12,7 @@ #include "ash/system/tray/tray_constants.h" #include "ash/system/unified/detailed_view_controller.h" #include "ash/system/unified/feature_pod_button.h" -#include "ash/system/unified/feature_pods_container_view.h" +#include "ash/system/unified/feature_tiles_container_view.h" #include "ash/system/unified/page_indicator_view.h" #include "ash/system/unified/quick_settings_footer.h" #include "ash/system/unified/quick_settings_header.h" @@ -86,14 +86,14 @@ SlidersContainerView::~SlidersContainerView() = default; int SlidersContainerView::GetHeight() const { - return std::accumulate(children().cbegin(), children().cend(), 0, - [](int height, const auto* v) { - return height + v->GetHeightForWidth(kTrayMenuWidth); - }); + return std::accumulate( + children().cbegin(), children().cend(), 0, [](int height, const auto* v) { + return height + v->GetHeightForWidth(kRevampedTrayMenuWidth); + }); } gfx::Size SlidersContainerView::CalculatePreferredSize() const { - return gfx::Size(kTrayMenuWidth, GetHeight()); + return gfx::Size(kRevampedTrayMenuWidth, GetHeight()); } BEGIN_METADATA(SlidersContainerView, views::View) @@ -141,8 +141,8 @@ header_ = system_tray_container_->AddChildView( std::make_unique<QuickSettingsHeader>()); - feature_pods_container_ = system_tray_container_->AddChildView( - std::make_unique<FeaturePodsContainerView>(controller_, true)); + feature_tiles_container_ = system_tray_container_->AddChildView( + std::make_unique<FeatureTilesContainerView>(controller_)); page_indicator_view_ = system_tray_container_->AddChildView( std::make_unique<PageIndicatorView>(controller_, true)); @@ -170,8 +170,10 @@ QuickSettingsView::~QuickSettingsView() = default; -void QuickSettingsView::AddFeaturePodButton(FeaturePodButton* button) { - feature_pods_container_->AddFeaturePodButton(button); +void QuickSettingsView::SetMaxHeight(int max_height) { + max_height_ = max_height; + feature_tiles_container_->SetRowsFromHeight( + CalculateHeightForFeatureTilesContainer()); } void QuickSettingsView::AddSliderView(views::View* slider_view) { @@ -236,8 +238,15 @@ return GetPreferredSize().height(); } -int QuickSettingsView::GetVisibleFeaturePodCount() const { - return feature_pods_container_->GetVisibleCount(); +int QuickSettingsView::CalculateHeightForFeatureTilesContainer() { + int media_controls_container_height = + media_controls_container_ ? media_controls_container_->GetExpandedHeight() + : 0; + + return max_height_ - header_->GetPreferredSize().height() - + page_indicator_view_->GetPreferredSize().height() - + sliders_container_->GetHeight() - media_controls_container_height - + footer_->GetPreferredSize().height(); } std::u16string QuickSettingsView::GetDetailedViewAccessibleName() const { @@ -252,9 +261,9 @@ int media_controls_container_height = media_controls_container_ ? media_controls_container_->GetExpandedHeight() : 0; - return gfx::Size(kTrayMenuWidth, + return gfx::Size(kRevampedTrayMenuWidth, header_->GetPreferredSize().height() + - feature_pods_container_->GetExpandedHeight() + + feature_tiles_container_->GetPreferredSize().height() + page_indicator_view_->GetExpandedHeight() + sliders_container_->GetHeight() + media_controls_container_height +
diff --git a/ash/system/unified/quick_settings_view.h b/ash/system/unified/quick_settings_view.h index 0335d0a..d39d001 100644 --- a/ash/system/unified/quick_settings_view.h +++ b/ash/system/unified/quick_settings_view.h
@@ -11,8 +11,7 @@ namespace ash { -class FeaturePodButton; -class FeaturePodsContainerView; +class FeatureTilesContainerView; class PageIndicatorView; class QuickSettingsFooter; class QuickSettingsHeader; @@ -31,7 +30,7 @@ ~SlidersContainerView() override; - // Get height of the view. + // Gets height of the view. int GetHeight() const; // views::View: @@ -52,41 +51,43 @@ ~QuickSettingsView() override; - // Add feature pod button to `feature_pods_`. - void AddFeaturePodButton(FeaturePodButton* button); + // Sets the maximum height that the view can take. + void SetMaxHeight(int max_height); - // Add slider view. + // Adds slider view. void AddSliderView(views::View* slider_view); - // Add media controls view to `media_controls_container_`; + // Adds media controls view to `media_controls_container_`; void AddMediaControlsView(views::View* media_controls); - // Hide the main view and show the given `detailed_view`. + // Hides the main view and shows the given `detailed_view`. void SetDetailedView(views::View* detailed_view); - // Remove the detailed view set by SetDetailedView, and show the main view. + // Removes the detailed view set by SetDetailedView, and shows the main view. // It deletes `detailed_view` and children. void ResetDetailedView(); - // Save and restore keyboard focus of the currently focused element. Called + // Saves and restores keyboard focus of the currently focused element. Called // before transitioning into a detailed view. void SaveFocus(); void RestoreFocus(); - // Get current height of the view (including the message center). + // Gets current height of the view (including the message center). int GetCurrentHeight() const; - // Returns the number of visible feature pods. - int GetVisibleFeaturePodCount() const; + // Calculates how many rows to use based on the max available height. + // FeatureTilesContainer can adjust it's height by reducing the number of rows + // it uses. + int CalculateHeightForFeatureTilesContainer(); - // Get the accessible name for the currently shown detailed view. + // Gets the accessible name for the currently shown detailed view. std::u16string GetDetailedViewAccessibleName() const; // Returns true if a detailed view is being shown in the tray. (e.g Bluetooth // Settings). bool IsDetailedViewShown() const; - // Show media controls view. + // Shows media controls view. void ShowMediaControls(); // views::View: @@ -95,8 +96,8 @@ void Layout() override; void ChildPreferredSizeChanged(views::View* child) override; - FeaturePodsContainerView* feature_pods_container() { - return feature_pods_container_; + FeatureTilesContainerView* feature_tiles_container() { + return feature_tiles_container_; } View* detailed_view() { return detailed_view_container_; } @@ -111,13 +112,13 @@ private: class SystemTrayContainer; - // Unowned. + // Owned by UnifiedSystemTrayBubble. UnifiedSystemTrayController* const controller_; // Owned by views hierarchy. SystemTrayContainer* system_tray_container_ = nullptr; QuickSettingsHeader* header_ = nullptr; - FeaturePodsContainerView* feature_pods_container_ = nullptr; + FeatureTilesContainerView* feature_tiles_container_ = nullptr; PageIndicatorView* page_indicator_view_ = nullptr; SlidersContainerView* sliders_container_ = nullptr; QuickSettingsFooter* footer_ = nullptr; @@ -126,6 +127,9 @@ // Null if media::kGlobalMediaControlsForChromeOS is disabled. UnifiedMediaControlsContainer* media_controls_container_ = nullptr; + // The maximum height available to the view. + int max_height_ = 0; + // The view that is saved by calling SaveFocus(). views::View* saved_focused_view_ = nullptr;
diff --git a/ash/system/unified/unified_system_tray_bubble.cc b/ash/system/unified/unified_system_tray_bubble.cc index 0815e98..6e29353 100644 --- a/ash/system/unified/unified_system_tray_bubble.cc +++ b/ash/system/unified/unified_system_tray_bubble.cc
@@ -40,7 +40,8 @@ TrayBubbleView::InitParams init_params; init_params.shelf_alignment = tray_->shelf()->alignment(); - init_params.preferred_width = kTrayMenuWidth; + init_params.preferred_width = + features::IsQsRevampEnabled() ? kRevampedTrayMenuWidth : kTrayMenuWidth; init_params.delegate = tray->GetWeakPtr(); init_params.parent_window = tray->GetBubbleWindowContainer(); init_params.anchor_view = nullptr; @@ -56,6 +57,7 @@ if (features::IsQsRevampEnabled()) { auto quick_settings_view = controller_->CreateQuickSettingsView(); + quick_settings_view->SetMaxHeight(max_height); bubble_view_->SetMaxHeight(max_height); quick_settings_view_ = bubble_view_->AddChildView(std::move(quick_settings_view)); @@ -343,7 +345,9 @@ void UnifiedSystemTrayBubble::UpdateBubbleBounds() { int max_height = CalculateMaxHeight(); - if (!features::IsQsRevampEnabled()) + if (features::IsQsRevampEnabled()) + quick_settings_view_->SetMaxHeight(max_height); + else unified_view_->SetMaxHeight(max_height); bubble_view_->SetMaxHeight(max_height); bubble_view_->ChangeAnchorAlignment(tray_->shelf()->alignment());
diff --git a/ash/system/unified/unified_system_tray_controller.cc b/ash/system/unified/unified_system_tray_controller.cc index d5e5349..11effbc7 100644 --- a/ash/system/unified/unified_system_tray_controller.cc +++ b/ash/system/unified/unified_system_tray_controller.cc
@@ -609,6 +609,10 @@ } void UnifiedSystemTrayController::InitFeaturePods() { + // TODO(crbug/1368717): use FeatureTiles. + if (ash::features::IsQsRevampEnabled()) + return; + if (ash::features::IsQuickSettingsNetworkRevampEnabled()) { AddFeaturePodItem(std::make_unique<NetworkFeaturePodController>(this)); } else { @@ -632,17 +636,10 @@ AddFeaturePodItem(std::make_unique<DarkModeFeaturePodController>(this)); if (base::FeatureList::IsEnabled(features::kShelfParty)) AddFeaturePodItem(std::make_unique<ShelfPartyFeaturePodController>()); - if (media::ShouldEnableAutoFraming()) AddFeaturePodItem(std::make_unique<AutozoomFeaturePodController>()); - // If you want to add a new feature pod item, add here. - if (features::IsQsRevampEnabled()) { - quick_settings_metrics_util::RecordQsFeaturePodCount( - quick_settings_view_->GetVisibleFeaturePodCount(), - Shell::Get()->tablet_mode_controller()->InTabletMode()); - return; - } + quick_settings_metrics_util::RecordQsFeaturePodCount( unified_view_->GetVisibleFeaturePodCount(), Shell::Get()->tablet_mode_controller()->InTabletMode()); @@ -660,10 +657,7 @@ quick_settings_metrics_util::RecordVisibleQsFeature( controller->GetCatalogName()); } - if (features::IsQsRevampEnabled()) - quick_settings_view_->AddFeaturePodButton(button); - else - unified_view_->AddFeaturePodButton(button); + unified_view_->AddFeaturePodButton(button); feature_pod_controllers_.push_back(std::move(controller)); }
diff --git a/ash/webui/common/resources/BUILD.gn b/ash/webui/common/resources/BUILD.gn index 2b285056..bdc7ad0a 100644 --- a/ash/webui/common/resources/BUILD.gn +++ b/ash/webui/common/resources/BUILD.gn
@@ -101,12 +101,16 @@ "cellular_setup/mojo_interface_provider.js", "cellular_setup/subflow_behavior.js", "cellular_setup/webview_post_util.js", + "cr_container_shadow_behavior.js", "cr_picture/cr_picture_types.js", "cr_picture/png.js", "cr_picture/webcam_utils.js", + "cr_policy_indicator_behavior.js", + "cr_scrollable_behavior.js", "focus_row_js.js", "focus_row_behavior.js", "focus_without_ink_js.js", + "i18n_behavior.js", "keyboard_shortcut_list_js.js", "list_property_update_behavior.js", "multidevice_setup/fake_mojo_service.js", @@ -131,6 +135,7 @@ "store/store_client.js", "traffic_counters/traffic_counters_adapter.js", "quick_unlock/lock_screen_constants.js", + "web_ui_listener_behavior.js", ] icons_html_files = [ @@ -299,9 +304,13 @@ } checked_in_dts_files = [ + "cr_container_shadow_behavior.d.ts", + "cr_scrollable_behavior.d.ts", + "cr_policy_indicator_behavior.d.ts", "fake_method_resolver.d.ts", "fake_observables.d.ts", "focus_row_behavior.d.ts", + "i18n_behavior.d.ts", "keyboard_diagram.d.ts", "keyboard_key.d.ts", "list_property_update_behavior.d.ts", @@ -309,6 +318,7 @@ "page_toolbar.d.ts", "navigation_view_panel.d.ts", "navigation_selector.d.ts", + "web_ui_listener_behavior.d.ts", "bluetooth/bluetooth_base_page.d.ts", "bluetooth/bluetooth_battery_icon_percentage.d.ts", @@ -407,6 +417,21 @@ ] } +js_library("cr_container_shadow_behavior") { + deps = [ "//ui/webui/resources/js:assert" ] +} + +js_library("cr_policy_indicator_behavior") { + deps = [ "//ui/webui/resources/js:assert" ] +} + +js_library("cr_scrollable_behavior") { + deps = [ + "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list", + "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", + ] +} + js_library("fake_observables") { deps = [ "//ui/webui/resources/js:cr.m" ] } @@ -439,19 +464,26 @@ ] } +js_library("i18n_behavior") { + deps = [ + "//ui/webui/resources/js:load_time_data.m", + "//ui/webui/resources/js:parse_html_subset", + ] +} + js_library("keyboard_diagram") { deps = [ ":keyboard_key", ":keyboard_layouts", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("keyboard_key") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -490,3 +522,7 @@ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] } + +js_library("web_ui_listener_behavior") { + deps = [ "//ui/webui/resources/js:cr.m" ] +}
diff --git a/ash/webui/common/resources/bluetooth/BUILD.gn b/ash/webui/common/resources/bluetooth/BUILD.gn index f99e704..f66b701 100644 --- a/ash/webui/common/resources/bluetooth/BUILD.gn +++ b/ash/webui/common/resources/bluetooth/BUILD.gn
@@ -69,10 +69,10 @@ ":bluetooth_base_page", ":bluetooth_pairing_device_item", ":bluetooth_types", + "//ash/webui/common/resources:cr_scrollable_behavior", "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:cr_scrollable_behavior", ] externs_list = [ "//ui/webui/resources/cr_components/localized_link/localized_link_externs.js" ] @@ -119,8 +119,8 @@ js_library("bluetooth_base_page") { deps = [ ":bluetooth_types", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js" ] @@ -128,20 +128,20 @@ js_library("bluetooth_battery_icon_percentage") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/bluetooth:bluetooth_utils", "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("bluetooth_device_battery_info") { deps = [ "//ash/webui/common/resources:focus_row_behavior", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/bluetooth:bluetooth_utils", "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] }
diff --git a/ash/webui/common/resources/bluetooth/bluetooth_base_page.js b/ash/webui/common/resources/bluetooth/bluetooth_base_page.js index 351c992..3545eac 100644 --- a/ash/webui/common/resources/bluetooth/bluetooth_base_page.js +++ b/ash/webui/common/resources/bluetooth/bluetooth_base_page.js
@@ -12,13 +12,12 @@ import '//resources/cr_elements/cr_shared_vars.css.js'; import '//resources/cr_elements/cr_button/cr_button.js'; -import {I18nBehavior, I18nBehaviorInterface} from '//resources/cr_elements/i18n_behavior.js'; -import {afterNextRender, html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {getTemplate} from './bluetooth_base_page.html.js'; - -import {assertNotReached} from '//resources/js/assert.js'; import {focusWithoutInk} from '//resources/ash/common/focus_without_ink_js.js'; +import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js'; +import {assertNotReached} from '//resources/js/assert.js'; +import {afterNextRender, html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {getTemplate} from './bluetooth_base_page.html.js'; import {ButtonBarState, ButtonName, ButtonState} from './bluetooth_types.js'; /**
diff --git a/ash/webui/common/resources/bluetooth/bluetooth_battery_icon_percentage.js b/ash/webui/common/resources/bluetooth/bluetooth_battery_icon_percentage.js index 3e0acc66..49d11a5 100644 --- a/ash/webui/common/resources/bluetooth/bluetooth_battery_icon_percentage.js +++ b/ash/webui/common/resources/bluetooth/bluetooth_battery_icon_percentage.js
@@ -12,12 +12,12 @@ import '//resources/cr_elements/cr_shared_style.css.js'; import './bluetooth_icons.html.js'; -import {I18nBehavior, I18nBehaviorInterface} from '//resources/cr_elements/i18n_behavior.js'; -import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {getTemplate} from './bluetooth_battery_icon_percentage.html.js'; +import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js'; import {assert} from '//resources/js/assert.js'; +import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {BluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js'; +import {getTemplate} from './bluetooth_battery_icon_percentage.html.js'; import {BatteryType} from './bluetooth_types.js'; import {getBatteryPercentage} from './bluetooth_utils.js';
diff --git a/ash/webui/common/resources/bluetooth/bluetooth_pairing_confirm_code_page.js b/ash/webui/common/resources/bluetooth/bluetooth_pairing_confirm_code_page.js index fb644e3..1d65760 100644 --- a/ash/webui/common/resources/bluetooth/bluetooth_pairing_confirm_code_page.js +++ b/ash/webui/common/resources/bluetooth/bluetooth_pairing_confirm_code_page.js
@@ -12,10 +12,10 @@ import '//resources/cr_elements/cr_shared_style.css.js'; import '//resources/cr_elements/cr_input/cr_input.js'; -import {I18nBehavior, I18nBehaviorInterface} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {getTemplate} from './bluetooth_pairing_confirm_code_page.html.js'; +import {getTemplate} from './bluetooth_pairing_confirm_code_page.html.js'; import {ButtonBarState, ButtonState} from './bluetooth_types.js'; /**
diff --git a/ash/webui/common/resources/bluetooth/bluetooth_pairing_device_item.js b/ash/webui/common/resources/bluetooth/bluetooth_pairing_device_item.js index 74f876c..9f2f6028 100644 --- a/ash/webui/common/resources/bluetooth/bluetooth_pairing_device_item.js +++ b/ash/webui/common/resources/bluetooth/bluetooth_pairing_device_item.js
@@ -11,7 +11,7 @@ import './bluetooth_icon.js'; import {FocusRowBehavior} from '//resources/ash/common/focus_row_behavior.js'; -import {I18nBehavior, I18nBehaviorInterface} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js'; import {assertNotReached} from '//resources/js/assert.js'; import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {BluetoothDeviceProperties, DeviceType} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
diff --git a/ash/webui/common/resources/bluetooth/bluetooth_pairing_device_selection_page.js b/ash/webui/common/resources/bluetooth/bluetooth_pairing_device_selection_page.js index 95b4846..d294485 100644 --- a/ash/webui/common/resources/bluetooth/bluetooth_pairing_device_selection_page.js +++ b/ash/webui/common/resources/bluetooth/bluetooth_pairing_device_selection_page.js
@@ -13,12 +13,12 @@ import '//resources/polymer/v3_0/iron-list/iron-list.js'; import '//resources/cr_components/localized_link/localized_link.js'; -import {CrScrollableBehavior, CrScrollableBehaviorInterface} from '//resources/cr_elements/cr_scrollable_behavior.js'; -import {I18nBehavior, I18nBehaviorInterface} from '//resources/cr_elements/i18n_behavior.js'; +import {CrScrollableBehavior, CrScrollableBehaviorInterface} from '//resources/ash/common/cr_scrollable_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js'; import {afterNextRender, html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {getTemplate} from './bluetooth_pairing_device_selection_page.html.js'; import {BluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js'; +import {getTemplate} from './bluetooth_pairing_device_selection_page.html.js'; import {ButtonBarState, ButtonState, DeviceItemState} from './bluetooth_types.js'; /**
diff --git a/ash/webui/common/resources/bluetooth/bluetooth_pairing_enter_code_page.js b/ash/webui/common/resources/bluetooth/bluetooth_pairing_enter_code_page.js index b6054ce3..52cd9a0ba 100644 --- a/ash/webui/common/resources/bluetooth/bluetooth_pairing_enter_code_page.js +++ b/ash/webui/common/resources/bluetooth/bluetooth_pairing_enter_code_page.js
@@ -12,11 +12,11 @@ import '//resources/cr_elements/cr_shared_style.css.js'; import '//resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js'; -import {I18nBehavior, I18nBehaviorInterface} from '//resources/cr_elements/i18n_behavior.js'; -import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {getTemplate} from './bluetooth_pairing_enter_code_page.html.js'; +import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js'; import {assert} from '//resources/js/assert.js'; +import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {getTemplate} from './bluetooth_pairing_enter_code_page.html.js'; import {ButtonBarState, ButtonState} from './bluetooth_types.js'; // Pairing passkey can be a maximum of 16 characters while pairing code a max
diff --git a/ash/webui/common/resources/bluetooth/bluetooth_pairing_request_code_page.js b/ash/webui/common/resources/bluetooth/bluetooth_pairing_request_code_page.js index 10b64bb..822f72d 100644 --- a/ash/webui/common/resources/bluetooth/bluetooth_pairing_request_code_page.js +++ b/ash/webui/common/resources/bluetooth/bluetooth_pairing_request_code_page.js
@@ -12,11 +12,11 @@ import '//resources/cr_elements/cr_shared_style.css.js'; import '//resources/cr_elements/cr_input/cr_input.js'; -import {I18nBehavior, I18nBehaviorInterface} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js'; import {afterNextRender, html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {getTemplate} from './bluetooth_pairing_request_code_page.html.js'; import {BluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js'; +import {getTemplate} from './bluetooth_pairing_request_code_page.html.js'; import {ButtonBarState, ButtonState, PairingAuthType} from './bluetooth_types.js'; import {mojoString16ToString} from './bluetooth_utils.js';
diff --git a/ash/webui/common/resources/cellular_setup/BUILD.gn b/ash/webui/common/resources/cellular_setup/BUILD.gn index 1c09ac7..8e5a2ace 100644 --- a/ash/webui/common/resources/cellular_setup/BUILD.gn +++ b/ash/webui/common/resources/cellular_setup/BUILD.gn
@@ -37,8 +37,8 @@ js_library("base_page") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -46,15 +46,15 @@ deps = [ ":base_page", ":cellular_setup_delegate", - "//ui/webui/resources/cr_elements:i18n_behavior", + "//ash/webui/common/resources:i18n_behavior", ] } js_library("activation_verification_page") { deps = [ ":base_page", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_lottie/cr_lottie_externs.js" ] @@ -64,32 +64,32 @@ deps = [ ":cellular_setup_delegate", ":subflow_behavior", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/paper-spinner:paper-spinner-lite", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("confirmation_code_page") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/paper-spinner:paper-spinner-lite", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("profile_discovery_list_item") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/paper-spinner:paper-spinner-lite", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("profile_discovery_list_page") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -137,9 +137,9 @@ ":base_page", ":cellular_setup_delegate", ":webview_post_util", + "//ash/webui/common/resources:i18n_behavior", "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", ] externs_list = [ @@ -152,8 +152,8 @@ deps = [ ":cellular_types", "//ash/webui/common/resources:focus_without_ink_js", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -176,9 +176,9 @@ ":provisioning_page", ":setup_loading_page", ":subflow_behavior", + "//ash/webui/common/resources:i18n_behavior", "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", ] externs_list = [ "$externs_path/metrics_private.js" ] @@ -197,13 +197,13 @@ ":profile_discovery_list_item", ":profile_discovery_list_page", ":subflow_behavior", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:cellular_utils", "//ash/webui/common/resources/network:mojo_interface_provider", "//ash/webui/common/resources/network:network_listener_behavior", "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js", "//chromeos/services/network_config/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", ] externs_list = [ "$externs_path/metrics_private.js" ] @@ -211,8 +211,8 @@ js_library("cellular_eid_dialog") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -223,8 +223,8 @@ ":cellular_types", ":esim_flow_ui", ":psim_flow_ui", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:cellular_utils", "//ash/webui/common/resources/network:mojo_interface_provider", - "//ui/webui/resources/cr_elements:i18n_behavior", ] }
diff --git a/ash/webui/common/resources/cellular_setup/activation_code_page.js b/ash/webui/common/resources/cellular_setup/activation_code_page.js index 6dae2bac..507cd40 100644 --- a/ash/webui/common/resources/cellular_setup/activation_code_page.js +++ b/ash/webui/common/resources/cellular_setup/activation_code_page.js
@@ -13,8 +13,8 @@ import './base_page.js'; import './cellular_setup_icons.html.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; import {focusWithoutInk} from '//resources/ash/common/focus_without_ink_js.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {loadTimeData} from '//resources/js/load_time_data.m.js'; import {afterNextRender, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/ash/webui/common/resources/cellular_setup/activation_verification_page.js b/ash/webui/common/resources/cellular_setup/activation_verification_page.js index a6f91435..42ec143 100644 --- a/ash/webui/common/resources/cellular_setup/activation_verification_page.js +++ b/ash/webui/common/resources/cellular_setup/activation_verification_page.js
@@ -11,7 +11,7 @@ import '//resources/polymer/v3_0/iron-media-query/iron-media-query.js'; import '//resources/cr_elements/cr_lottie/cr_lottie.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './activation_verification_page.html.js';
diff --git a/ash/webui/common/resources/cellular_setup/base_page.js b/ash/webui/common/resources/cellular_setup/base_page.js index 9bdbfe7..7c2cfe12 100644 --- a/ash/webui/common/resources/cellular_setup/base_page.js +++ b/ash/webui/common/resources/cellular_setup/base_page.js
@@ -7,7 +7,7 @@ import '//resources/ash/common/cellular_setup/cellular_setup_icons.html.js'; import '//resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './base_page.html.js';
diff --git a/ash/webui/common/resources/cellular_setup/button_bar.js b/ash/webui/common/resources/cellular_setup/button_bar.js index 3d5950a..9c4d67f0 100644 --- a/ash/webui/common/resources/cellular_setup/button_bar.js +++ b/ash/webui/common/resources/cellular_setup/button_bar.js
@@ -7,9 +7,9 @@ import '//resources/cr_elements/cr_shared_style.css.js'; import '//resources/cr_elements/cr_shared_vars.css.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; -import {assert, assertNotReached} from '//resources/js/assert.js'; import {focusWithoutInk} from '//resources/ash/common/focus_without_ink_js.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; +import {assert, assertNotReached} from '//resources/js/assert.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './button_bar.html.js';
diff --git a/ash/webui/common/resources/cellular_setup/cellular_eid_dialog.js b/ash/webui/common/resources/cellular_setup/cellular_eid_dialog.js index 583c99a0..204b410 100644 --- a/ash/webui/common/resources/cellular_setup/cellular_eid_dialog.js +++ b/ash/webui/common/resources/cellular_setup/cellular_eid_dialog.js
@@ -10,7 +10,7 @@ import '//resources/cr_elements/cr_shared_style.css.js'; import '//resources/cr_elements/cr_shared_vars.css.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {flush, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {EuiccProperties, QRCode} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js';
diff --git a/ash/webui/common/resources/cellular_setup/cellular_setup.js b/ash/webui/common/resources/cellular_setup/cellular_setup.js index f888a58..695fd74 100644 --- a/ash/webui/common/resources/cellular_setup/cellular_setup.js +++ b/ash/webui/common/resources/cellular_setup/cellular_setup.js
@@ -10,7 +10,7 @@ import './psim_flow_ui.js'; import './esim_flow_ui.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './cellular_setup.html.js';
diff --git a/ash/webui/common/resources/cellular_setup/confirmation_code_page.js b/ash/webui/common/resources/cellular_setup/confirmation_code_page.js index 0acc25b..c790c9e4 100644 --- a/ash/webui/common/resources/cellular_setup/confirmation_code_page.js +++ b/ash/webui/common/resources/cellular_setup/confirmation_code_page.js
@@ -12,7 +12,7 @@ import '//resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js'; import './base_page.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ESimProfileProperties, ESimProfileRemote} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js';
diff --git a/ash/webui/common/resources/cellular_setup/esim_flow_ui.js b/ash/webui/common/resources/cellular_setup/esim_flow_ui.js index 9389f65..834dbde 100644 --- a/ash/webui/common/resources/cellular_setup/esim_flow_ui.js +++ b/ash/webui/common/resources/cellular_setup/esim_flow_ui.js
@@ -10,10 +10,10 @@ import './profile_discovery_list_page.js'; import './confirmation_code_page.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {hasActiveCellularNetwork} from '//resources/ash/common/network/cellular_utils.js'; import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from '//resources/ash/common/network/mojo_interface_provider.js'; import {NetworkListenerBehavior} from '//resources/ash/common/network/network_listener_behavior.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; import {assert, assertNotReached} from '//resources/js/assert.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ESimManagerRemote, ESimOperationResult, ESimProfileRemote, EuiccRemote, ProfileInstallResult} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js';
diff --git a/ash/webui/common/resources/cellular_setup/final_page.js b/ash/webui/common/resources/cellular_setup/final_page.js index 9996f97..b9b3adb 100644 --- a/ash/webui/common/resources/cellular_setup/final_page.js +++ b/ash/webui/common/resources/cellular_setup/final_page.js
@@ -9,7 +9,7 @@ */ import './base_page.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {CellularSetupDelegate} from './cellular_setup_delegate.js';
diff --git a/ash/webui/common/resources/cellular_setup/profile_discovery_list_item.js b/ash/webui/common/resources/cellular_setup/profile_discovery_list_item.js index 7ef5cfb..6e7ec27 100644 --- a/ash/webui/common/resources/cellular_setup/profile_discovery_list_item.js +++ b/ash/webui/common/resources/cellular_setup/profile_discovery_list_item.js
@@ -15,7 +15,7 @@ import '//resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js'; import './cellular_setup_icons.html.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ESimProfileProperties, ESimProfileRemote} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js';
diff --git a/ash/webui/common/resources/cellular_setup/profile_discovery_list_page.js b/ash/webui/common/resources/cellular_setup/profile_discovery_list_page.js index 84bec6f..6d73476 100644 --- a/ash/webui/common/resources/cellular_setup/profile_discovery_list_page.js +++ b/ash/webui/common/resources/cellular_setup/profile_discovery_list_page.js
@@ -12,7 +12,7 @@ import './base_page.js'; import './profile_discovery_list_item.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ESimProfileRemote} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js';
diff --git a/ash/webui/common/resources/cellular_setup/provisioning_page.js b/ash/webui/common/resources/cellular_setup/provisioning_page.js index d080698a..4c50a46 100644 --- a/ash/webui/common/resources/cellular_setup/provisioning_page.js +++ b/ash/webui/common/resources/cellular_setup/provisioning_page.js
@@ -13,7 +13,7 @@ import '//resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js'; import '//resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {assert} from '//resources/js/assert.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {CellularMetadata} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/cellular_setup.mojom-webui.js';
diff --git a/ash/webui/common/resources/cellular_setup/psim_flow_ui.js b/ash/webui/common/resources/cellular_setup/psim_flow_ui.js index 4942bd8..cf54faef 100644 --- a/ash/webui/common/resources/cellular_setup/psim_flow_ui.js +++ b/ash/webui/common/resources/cellular_setup/psim_flow_ui.js
@@ -7,7 +7,7 @@ import './final_page.js'; import '//resources/polymer/v3_0/iron-pages/iron-pages.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {assert, assertNotReached} from '//resources/js/assert.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ActivationDelegateInterface, ActivationDelegateReceiver, ActivationResult, CarrierPortalHandlerRemote, CarrierPortalStatus, CellularMetadata, CellularSetup_StartActivation_ResponseParams, CellularSetupRemote} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/cellular_setup.mojom-webui.js';
diff --git a/ash/webui/common/resources/cellular_setup/setup_loading_page.js b/ash/webui/common/resources/cellular_setup/setup_loading_page.js index d6cb6af..8d27c4a7 100644 --- a/ash/webui/common/resources/cellular_setup/setup_loading_page.js +++ b/ash/webui/common/resources/cellular_setup/setup_loading_page.js
@@ -12,7 +12,7 @@ import '//resources/cr_elements/cr_lottie/cr_lottie.js'; import '//resources/polymer/v3_0/iron-media-query/iron-media-query.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './setup_loading_page.html.js';
diff --git a/ui/webui/resources/cr_elements/cr_container_shadow_behavior.d.ts b/ash/webui/common/resources/cr_container_shadow_behavior.d.ts similarity index 100% rename from ui/webui/resources/cr_elements/cr_container_shadow_behavior.d.ts rename to ash/webui/common/resources/cr_container_shadow_behavior.d.ts
diff --git a/ui/webui/resources/cr_elements/cr_container_shadow_behavior.js b/ash/webui/common/resources/cr_container_shadow_behavior.js similarity index 98% rename from ui/webui/resources/cr_elements/cr_container_shadow_behavior.js rename to ash/webui/common/resources/cr_container_shadow_behavior.js index 3b65ee9f..2df5cd8 100644 --- a/ui/webui/resources/cr_elements/cr_container_shadow_behavior.js +++ b/ash/webui/common/resources/cr_container_shadow_behavior.js
@@ -35,7 +35,7 @@ */ // clang-format off -import {assert} from '../js/assert.js'; +import {assert} from '//resources/js/assert.js'; // clang-format on /** @enum {string} */
diff --git a/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.d.ts b/ash/webui/common/resources/cr_policy_indicator_behavior.d.ts similarity index 100% rename from ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.d.ts rename to ash/webui/common/resources/cr_policy_indicator_behavior.d.ts
diff --git a/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js b/ash/webui/common/resources/cr_policy_indicator_behavior.js similarity index 98% rename from ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js rename to ash/webui/common/resources/cr_policy_indicator_behavior.js index 760abb0..285e0d73 100644 --- a/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js +++ b/ash/webui/common/resources/cr_policy_indicator_behavior.js
@@ -8,7 +8,7 @@ * rework the "policy" naming scheme throughout this directory. */ -import {assertNotReached} from '../../js/assert.js'; +import {assertNotReached} from '//resources/js/assert.js'; /** * Strings required for policy indicators. These must be set at runtime.
diff --git a/ui/webui/resources/cr_elements/cr_scrollable_behavior.d.ts b/ash/webui/common/resources/cr_scrollable_behavior.d.ts similarity index 100% rename from ui/webui/resources/cr_elements/cr_scrollable_behavior.d.ts rename to ash/webui/common/resources/cr_scrollable_behavior.d.ts
diff --git a/ui/webui/resources/cr_elements/cr_scrollable_behavior.js b/ash/webui/common/resources/cr_scrollable_behavior.js similarity index 100% rename from ui/webui/resources/cr_elements/cr_scrollable_behavior.js rename to ash/webui/common/resources/cr_scrollable_behavior.js
diff --git a/ui/webui/resources/cr_elements/i18n_behavior.d.ts b/ash/webui/common/resources/i18n_behavior.d.ts similarity index 87% rename from ui/webui/resources/cr_elements/i18n_behavior.d.ts rename to ash/webui/common/resources/i18n_behavior.d.ts index 998955c..f73e60d 100644 --- a/ui/webui/resources/cr_elements/i18n_behavior.d.ts +++ b/ash/webui/common/resources/i18n_behavior.d.ts
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {SanitizeInnerHtmlOpts} from '../js/parse_html_subset.js'; +import {SanitizeInnerHtmlOpts} from 'chrome://resources/js/parse_html_subset.js'; export interface I18nBehavior { locale: string|null|undefined;
diff --git a/ui/webui/resources/cr_elements/i18n_behavior.js b/ash/webui/common/resources/i18n_behavior.js similarity index 96% rename from ui/webui/resources/cr_elements/i18n_behavior.js rename to ash/webui/common/resources/i18n_behavior.js index a8b3359..1486640 100644 --- a/ui/webui/resources/cr_elements/i18n_behavior.js +++ b/ash/webui/common/resources/i18n_behavior.js
@@ -12,8 +12,8 @@ * code. */ -import {parseHtmlSubset, SanitizeInnerHtmlOpts, sanitizeInnerHtml} from '../js/parse_html_subset.js'; -import {loadTimeData} from '../js/load_time_data.m.js'; +import {loadTimeData} from '//resources/js/load_time_data.m.js'; +import {parseHtmlSubset, sanitizeInnerHtml, SanitizeInnerHtmlOpts} from '//resources/js/parse_html_subset.js'; /** @polymerBehavior */ export const I18nBehavior = { @@ -183,4 +183,3 @@ */ i18nExists(id) {} } -
diff --git a/ash/webui/common/resources/keyboard_diagram.js b/ash/webui/common/resources/keyboard_diagram.js index 3056ecc..3ac63238 100644 --- a/ash/webui/common/resources/keyboard_diagram.js +++ b/ash/webui/common/resources/keyboard_diagram.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './keyboard_diagram.html.js';
diff --git a/ash/webui/common/resources/keyboard_key.js b/ash/webui/common/resources/keyboard_key.js index 3661f00..8d153cd5 100644 --- a/ash/webui/common/resources/keyboard_key.js +++ b/ash/webui/common/resources/keyboard_key.js
@@ -5,7 +5,7 @@ import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; import './keyboard_icons.html.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './keyboard_key.html.js';
diff --git a/ash/webui/common/resources/multidevice_setup/BUILD.gn b/ash/webui/common/resources/multidevice_setup/BUILD.gn index 2934fa0..551b1f9a 100644 --- a/ash/webui/common/resources/multidevice_setup/BUILD.gn +++ b/ash/webui/common/resources/multidevice_setup/BUILD.gn
@@ -55,7 +55,7 @@ ":setup_succeeded_page", ":start_setup_page", "//ash/services/multidevice_setup/public/mojom:mojom_webui_js", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//ui/webui/resources/js:cr.m", ] } @@ -89,7 +89,7 @@ ":ui_page_container_behavior", "//ash/services/device_sync/public/mojom:mojom_webui_js", "//ash/services/multidevice_setup/public/mojom:mojom_webui_js", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_lottie/cr_lottie_externs.js" ] @@ -97,7 +97,7 @@ js_library("ui_page_container_behavior") { deps = [ - "//ui/webui/resources/cr_elements:i18n_behavior", + "//ash/webui/common/resources:i18n_behavior", "//ui/webui/resources/js:cr.m", ] }
diff --git a/ash/webui/common/resources/multidevice_setup/multidevice_setup.js b/ash/webui/common/resources/multidevice_setup/multidevice_setup.js index 25bc92a..3b7778b 100644 --- a/ash/webui/common/resources/multidevice_setup/multidevice_setup.js +++ b/ash/webui/common/resources/multidevice_setup/multidevice_setup.js
@@ -11,7 +11,7 @@ import '//resources/js/cr.m.js'; import '//resources/polymer/v3_0/iron-pages/iron-pages.js'; -import {WebUIListenerBehavior} from '//resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from '//resources/ash/common/web_ui_listener_behavior.js'; import {assert} from '//resources/js/assert.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {HostDevice} from 'chrome://resources/mojo/ash/services/multidevice_setup/public/mojom/multidevice_setup.mojom-webui.js';
diff --git a/ash/webui/common/resources/multidevice_setup/start_setup_page.js b/ash/webui/common/resources/multidevice_setup/start_setup_page.js index 534f066..f30bbb1e 100644 --- a/ash/webui/common/resources/multidevice_setup/start_setup_page.js +++ b/ash/webui/common/resources/multidevice_setup/start_setup_page.js
@@ -11,7 +11,7 @@ import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; import '//resources/polymer/v3_0/iron-media-query/iron-media-query.js'; -import {WebUIListenerBehavior} from '//resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from '//resources/ash/common/web_ui_listener_behavior.js'; import {loadTimeData} from '//resources/js/load_time_data.m.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ConnectivityStatus} from 'chrome://resources/mojo/ash/services/device_sync/public/mojom/device_sync.mojom-webui.js';
diff --git a/ash/webui/common/resources/multidevice_setup/ui_page_container_behavior.js b/ash/webui/common/resources/multidevice_setup/ui_page_container_behavior.js index 9b402c61..0f61dcb 100644 --- a/ash/webui/common/resources/multidevice_setup/ui_page_container_behavior.js +++ b/ash/webui/common/resources/multidevice_setup/ui_page_container_behavior.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; /** @polymerBehavior */ const UiPageContainerBehaviorImpl = {
diff --git a/ash/webui/common/resources/network/BUILD.gn b/ash/webui/common/resources/network/BUILD.gn index ad43cd31..c8568811a 100644 --- a/ash/webui/common/resources/network/BUILD.gn +++ b/ash/webui/common/resources/network/BUILD.gn
@@ -50,9 +50,9 @@ js_library("cr_policy_network_behavior_mojo") { deps = [ + "//ash/webui/common/resources:cr_policy_indicator_behavior", "//chromeos/services/network_config/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior", ] } @@ -60,8 +60,8 @@ deps = [ ":cr_policy_network_behavior_mojo", ":onc_mojo", + "//ash/webui/common/resources:cr_policy_indicator_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior", ] } @@ -69,8 +69,8 @@ deps = [ ":network_property_list_mojo", ":onc_mojo", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:load_time_data.m", ] @@ -83,10 +83,10 @@ js_library("network_choose_mobile") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//chromeos/services/network_config/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js" ] @@ -100,12 +100,12 @@ ":network_config_toggle", ":network_listener_behavior", ":network_password_input", + "//ash/webui/common/resources:i18n_behavior", "//chrome/browser/ui/webui/settings/ash/search:mojo_bindings_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes", "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon", "//third_party/polymer/v3_0/components-chromium/paper-spinner:paper-spinner-lite", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:load_time_data.m", ] externs_list = [ @@ -134,8 +134,8 @@ ":cr_policy_network_behavior_mojo", ":cr_policy_network_indicator_mojo", ":network_config_element_behavior", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/policy/cr_tooltip_icon_externs.js" ] @@ -155,8 +155,8 @@ js_library("network_icon") { deps = [ ":onc_mojo", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", ] } @@ -179,10 +179,10 @@ ":network_list_item", ":network_list_types", ":onc_mojo", + "//ash/webui/common/resources:cr_scrollable_behavior", "//ash/webui/common/resources:list_property_update_behavior", "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:cr_scrollable_behavior", ] } @@ -213,9 +213,9 @@ js_library("network_nameservers") { deps = [ ":cr_policy_network_behavior_mojo", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_input/cr_input_externs.js", @@ -229,8 +229,8 @@ ":cr_policy_network_behavior_mojo", ":cr_policy_network_indicator_mojo", ":network_config_element_behavior", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_input/cr_input_externs.js" ] @@ -254,9 +254,9 @@ ":network_proxy_exclusions", ":network_proxy_input", ":onc_mojo", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", ] externs_list = [ @@ -268,17 +268,17 @@ js_library("network_proxy_exclusions") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("network_proxy_input") { deps = [ ":onc_mojo", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_input/cr_input_externs.js" ] @@ -303,10 +303,10 @@ ":onc_mojo", ":sim_lock_dialogs", "//ash/webui/common/resources:focus_without_ink_js", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes", "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", ] externs_list = [ @@ -335,10 +335,10 @@ ":mojo_interface_provider", ":network_password_input", ":onc_mojo", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes", "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
diff --git a/ash/webui/common/resources/network/cr_policy_network_behavior_mojo.js b/ash/webui/common/resources/network/cr_policy_network_behavior_mojo.js index 08ba706..e9749510 100644 --- a/ash/webui/common/resources/network/cr_policy_network_behavior_mojo.js +++ b/ash/webui/common/resources/network/cr_policy_network_behavior_mojo.js
@@ -8,7 +8,7 @@ * optional properties (which may be null|undefined). */ -import {CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.js'; +import {CrPolicyIndicatorType} from 'chrome://resources/ash/common/cr_policy_indicator_behavior.js'; import {ApnProperties, ManagedApnList, ManagedBoolean, ManagedInt32, ManagedString, ManagedStringList} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {OncSource, PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/cr_policy_network_indicator_mojo.js b/ash/webui/common/resources/network/cr_policy_network_indicator_mojo.js index 2611606e..b20422d51 100644 --- a/ash/webui/common/resources/network/cr_policy_network_indicator_mojo.js +++ b/ash/webui/common/resources/network/cr_policy_network_indicator_mojo.js
@@ -10,7 +10,7 @@ import '//resources/cr_elements/policy/cr_tooltip_icon.js'; import '//resources/cr_elements/cr_hidden_style.css.js'; -import {CrPolicyIndicatorBehavior, CrPolicyIndicatorType} from '//resources/cr_elements/policy/cr_policy_indicator_behavior.js'; +import {CrPolicyIndicatorBehavior, CrPolicyIndicatorType} from '//resources/ash/common/cr_policy_indicator_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ManagedBoolean, ManagedInt32, ManagedString} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_apnlist.js b/ash/webui/common/resources/network/network_apnlist.js index 25a247d..881f280 100644 --- a/ash/webui/common/resources/network/network_apnlist.js +++ b/ash/webui/common/resources/network/network_apnlist.js
@@ -14,8 +14,8 @@ import './network_property_list_mojo.js'; import './network_shared.css.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {OncMojo} from '//resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; import {assert} from '//resources/js/assert.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ApnAuthenticationType, ApnIpType, ApnProperties, ApnState, ApnType, ManagedApnProperties, ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_choose_mobile.js b/ash/webui/common/resources/network/network_choose_mobile.js index b4b9cc0d..90e7cb5e 100644 --- a/ash/webui/common/resources/network/network_choose_mobile.js +++ b/ash/webui/common/resources/network/network_choose_mobile.js
@@ -13,7 +13,7 @@ import '//resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js'; import './network_shared.css.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {CrosNetworkConfigRemote, FoundNetworkProperties, ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_config.js b/ash/webui/common/resources/network/network_config.js index 5eb97a80..d9d4016 100644 --- a/ash/webui/common/resources/network/network_config.js +++ b/ash/webui/common/resources/network/network_config.js
@@ -22,7 +22,7 @@ import './network_password_input.js'; import './network_shared.css.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {assert, assertNotReached} from '//resources/js/assert.js'; import {loadTimeData} from '//resources/js/load_time_data.m.js'; import {flush, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/ash/webui/common/resources/network/network_config_select.js b/ash/webui/common/resources/network/network_config_select.js index 2cc9048..7d3a5d1 100644 --- a/ash/webui/common/resources/network/network_config_select.js +++ b/ash/webui/common/resources/network/network_config_select.js
@@ -12,7 +12,7 @@ import './cr_policy_network_indicator_mojo.js'; import './network_shared.css.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {assertNotReached} from '//resources/js/assert.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {NetworkCertificate} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_icon.js b/ash/webui/common/resources/network/network_icon.js index 2ce9026..4c582b49 100644 --- a/ash/webui/common/resources/network/network_icon.js +++ b/ash/webui/common/resources/network/network_icon.js
@@ -11,7 +11,7 @@ import '//resources/cr_elements/cr_hidden_style.css.js'; import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {SecurityType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {ConnectionStateType, DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_ip_config.js b/ash/webui/common/resources/network/network_ip_config.js index 0fe38bd..cf41e94 100644 --- a/ash/webui/common/resources/network/network_ip_config.js +++ b/ash/webui/common/resources/network/network_ip_config.js
@@ -12,7 +12,7 @@ import './network_property_list_mojo.js'; import './network_shared.css.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {IPConfigProperties, ManagedProperties, NO_ROUTING_PREFIX} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {IPConfigType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_list.js b/ash/webui/common/resources/network/network_list.js index bd5d6e6..4eeca30e 100644 --- a/ash/webui/common/resources/network/network_list.js +++ b/ash/webui/common/resources/network/network_list.js
@@ -11,7 +11,7 @@ import '//resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js'; import '//resources/polymer/v3_0/iron-list/iron-list.js'; -import {CrScrollableBehavior} from '//resources/cr_elements/cr_scrollable_behavior.js'; +import {CrScrollableBehavior} from '//resources/ash/common/cr_scrollable_behavior.js'; import {ListPropertyUpdateBehavior} from '//resources/ash/common/list_property_update_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {GlobalPolicy} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_list_item.js b/ash/webui/common/resources/network/network_list_item.js index 7c82362..ce84276 100644 --- a/ash/webui/common/resources/network/network_list_item.js +++ b/ash/webui/common/resources/network/network_list_item.js
@@ -19,7 +19,7 @@ import {CellularSetupPageName} from '//resources/ash/common/cellular_setup/cellular_types.js'; import {getESimProfileProperties} from '//resources/ash/common/cellular_setup/esim_manager_utils.js'; import {FocusRowBehavior} from '//resources/ash/common/focus_row_behavior.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {assert} from '//resources/js/assert.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
diff --git a/ash/webui/common/resources/network/network_nameservers.js b/ash/webui/common/resources/network/network_nameservers.js index 0518a59..fec5473d 100644 --- a/ash/webui/common/resources/network/network_nameservers.js +++ b/ash/webui/common/resources/network/network_nameservers.js
@@ -14,7 +14,7 @@ import '//resources/cr_elements/md_select.css.js'; import './network_shared.css.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {IPConfigType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_password_input.js b/ash/webui/common/resources/network/network_password_input.js index fcf14c89..5bb0d56 100644 --- a/ash/webui/common/resources/network/network_password_input.js +++ b/ash/webui/common/resources/network/network_password_input.js
@@ -14,7 +14,7 @@ import './cr_policy_network_indicator_mojo.js'; import './network_shared.css.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {CrPolicyNetworkBehaviorMojo} from './cr_policy_network_behavior_mojo.js';
diff --git a/ash/webui/common/resources/network/network_property_list_mojo.js b/ash/webui/common/resources/network/network_property_list_mojo.js index 5aa5cf2e..0c70c20 100644 --- a/ash/webui/common/resources/network/network_property_list_mojo.js +++ b/ash/webui/common/resources/network/network_property_list_mojo.js
@@ -13,7 +13,7 @@ import './cr_policy_network_indicator_mojo.js'; import './network_shared.css.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {assert} from '//resources/js/assert.js'; import {flush, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ActivationStateType, SecurityType, SubjectAltName, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_proxy.js b/ash/webui/common/resources/network/network_proxy.js index 519a881..ae66262 100644 --- a/ash/webui/common/resources/network/network_proxy.js +++ b/ash/webui/common/resources/network/network_proxy.js
@@ -17,7 +17,7 @@ import './network_proxy_input.js'; import './network_shared.css.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {assert} from '//resources/js/assert.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ManagedManualProxySettings, ManagedProperties, ManagedProxyLocation, ManagedProxySettings, ManagedStringList, ProxyLocation, ProxySettings} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_proxy_exclusions.js b/ash/webui/common/resources/network/network_proxy_exclusions.js index 72cb217..dd8a4761 100644 --- a/ash/webui/common/resources/network/network_proxy_exclusions.js +++ b/ash/webui/common/resources/network/network_proxy_exclusions.js
@@ -12,7 +12,7 @@ import '//resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js'; import './network_shared.css.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './network_proxy_exclusions.html.js';
diff --git a/ash/webui/common/resources/network/network_proxy_input.js b/ash/webui/common/resources/network/network_proxy_input.js index d75437d..53c9ae8c 100644 --- a/ash/webui/common/resources/network/network_proxy_input.js +++ b/ash/webui/common/resources/network/network_proxy_input.js
@@ -12,7 +12,7 @@ import '//resources/cr_elements/cr_input/cr_input.js'; import './network_shared.css.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ManagedProxyLocation} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_siminfo.js b/ash/webui/common/resources/network/network_siminfo.js index 840423d..d1305db0 100644 --- a/ash/webui/common/resources/network/network_siminfo.js +++ b/ash/webui/common/resources/network/network_siminfo.js
@@ -16,8 +16,8 @@ import './network_shared.css.js'; import './sim_lock_dialogs.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {isActiveSim} from '//resources/ash/common/network/cellular_utils.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; import {loadTimeData} from '//resources/js/load_time_data.m.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {GlobalPolicy} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/sim_lock_dialogs.js b/ash/webui/common/resources/network/sim_lock_dialogs.js index a933c837..429541a9 100644 --- a/ash/webui/common/resources/network/sim_lock_dialogs.js +++ b/ash/webui/common/resources/network/sim_lock_dialogs.js
@@ -15,7 +15,7 @@ import './network_password_input.js'; import './network_shared.css.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {assertNotReached} from '//resources/js/assert.js'; import {loadTimeData} from '//resources/js/load_time_data.m.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/ash/webui/common/resources/network_health/BUILD.gn b/ash/webui/common/resources/network_health/BUILD.gn index 019c613..707dcfd 100644 --- a/ash/webui/common/resources/network_health/BUILD.gn +++ b/ash/webui/common/resources/network_health/BUILD.gn
@@ -25,10 +25,10 @@ js_library("network_health_summary") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:onc_mojo", "//chromeos/services/network_health/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", ] } @@ -43,9 +43,9 @@ ":mojo_interface_provider", ":network_diagnostics_types", ":routine_group", + "//ash/webui/common/resources:i18n_behavior", "//chromeos/services/network_health/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -57,8 +57,8 @@ deps = [ ":network_diagnostics_types", ":network_health_container", + "//ash/webui/common/resources:i18n_behavior", "//chromeos/services/network_health/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] }
diff --git a/ash/webui/common/resources/network_health/network_diagnostics.js b/ash/webui/common/resources/network_health/network_diagnostics.js index e5cceda0..9ec19f6 100644 --- a/ash/webui/common/resources/network_health/network_diagnostics.js +++ b/ash/webui/common/resources/network_health/network_diagnostics.js
@@ -7,7 +7,7 @@ import {loadTimeData} from '//resources/js/load_time_data.m.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {ArcDnsResolutionProblem, ArcHttpProblem, ArcPingProblem, CaptivePortalProblem, DnsLatencyProblem, DnsResolutionProblem, DnsResolverPresentProblem, GatewayCanBePingedProblem, HasSecureWiFiConnectionProblem, HttpFirewallProblem, HttpsFirewallProblem, HttpsLatencyProblem, RoutineProblems, RoutineType, RoutineVerdict, SignalStrengthProblem, VideoConferencingProblem} from 'chrome://resources/mojo/chromeos/services/network_health/public/mojom/network_diagnostics.mojom-webui.js'; import {getNetworkDiagnosticsService} from './mojo_interface_provider.js';
diff --git a/ash/webui/common/resources/network_health/network_health_summary.js b/ash/webui/common/resources/network_health/network_health_summary.js index d487559c..e8082f6 100644 --- a/ash/webui/common/resources/network_health/network_health_summary.js +++ b/ash/webui/common/resources/network_health/network_health_summary.js
@@ -6,8 +6,8 @@ import 'chrome://resources/ash/common/network/network_shared.css.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {assertNotReached} from 'chrome://resources/js/assert.js'; import {NetworkType, PortalState} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js'; import {Network, NetworkHealthService, NetworkHealthServiceRemote, NetworkHealthState, NetworkState, UInt32Value} from 'chrome://resources/mojo/chromeos/services/network_health/public/mojom/network_health.mojom-webui.js';
diff --git a/ash/webui/common/resources/network_health/routine_group.js b/ash/webui/common/resources/network_health/routine_group.js index 4063ce8..f5ac9bf 100644 --- a/ash/webui/common/resources/network_health/routine_group.js +++ b/ash/webui/common/resources/network_health/routine_group.js
@@ -10,7 +10,7 @@ import './network_health_container.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {RoutineResult, RoutineVerdict} from 'chrome://resources/mojo/chromeos/services/network_health/public/mojom/network_diagnostics.mojom-webui.js'; import {Icons, Routine} from './network_diagnostics_types.js';
diff --git a/ash/webui/common/resources/quick_unlock/BUILD.gn b/ash/webui/common/resources/quick_unlock/BUILD.gn index 927e95a2..ef0608b 100644 --- a/ash/webui/common/resources/quick_unlock/BUILD.gn +++ b/ash/webui/common/resources/quick_unlock/BUILD.gn
@@ -24,8 +24,8 @@ js_library("pin_keyboard") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_input/cr_input_externs.js" ] @@ -35,8 +35,8 @@ deps = [ ":lock_screen_constants", ":pin_keyboard", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "$externs_path/quick_unlock_private.js" ] extra_sources = [ "$interfaces_path/quick_unlock_private_interface.js" ]
diff --git a/ash/webui/common/resources/quick_unlock/pin_keyboard.js b/ash/webui/common/resources/quick_unlock/pin_keyboard.js index 7afda44..9e277a2 100644 --- a/ash/webui/common/resources/quick_unlock/pin_keyboard.js +++ b/ash/webui/common/resources/quick_unlock/pin_keyboard.js
@@ -31,10 +31,9 @@ import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; import './pin_keyboard_icons.html.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; - import {getTemplate} from './pin_keyboard.html.js'; /**
diff --git a/ash/webui/common/resources/quick_unlock/setup_pin_keyboard.js b/ash/webui/common/resources/quick_unlock/setup_pin_keyboard.js index 0a5fda5..8a87a49d 100644 --- a/ash/webui/common/resources/quick_unlock/setup_pin_keyboard.js +++ b/ash/webui/common/resources/quick_unlock/setup_pin_keyboard.js
@@ -13,7 +13,7 @@ import 'chrome://resources/cr_elements/cr_shared_vars.css.js'; import './pin_keyboard.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert.js'; import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/ash/webui/common/resources/smb_shares/BUILD.gn b/ash/webui/common/resources/smb_shares/BUILD.gn index 442257bb..85d6df4 100644 --- a/ash/webui/common/resources/smb_shares/BUILD.gn +++ b/ash/webui/common/resources/smb_shares/BUILD.gn
@@ -17,9 +17,9 @@ js_library("add_smb_share_dialog") { deps = [ ":smb_browser_proxy", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:cr.m", "//ui/webui/resources/js:load_time_data.m", ]
diff --git a/ash/webui/common/resources/smb_shares/add_smb_share_dialog.js b/ash/webui/common/resources/smb_shares/add_smb_share_dialog.js index 88df76d4..8763ee2b 100644 --- a/ash/webui/common/resources/smb_shares/add_smb_share_dialog.js +++ b/ash/webui/common/resources/smb_shares/add_smb_share_dialog.js
@@ -20,8 +20,8 @@ import '//resources/cr_elements/md_select.css.js'; import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior} from '//resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior} from '//resources/ash/common/web_ui_listener_behavior.js'; import {loadTimeData} from '//resources/js/load_time_data.m.js'; import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/ash/webui/common/resources/traffic_counters/BUILD.gn b/ash/webui/common/resources/traffic_counters/BUILD.gn index 796407311..32679c59 100644 --- a/ash/webui/common/resources/traffic_counters/BUILD.gn +++ b/ash/webui/common/resources/traffic_counters/BUILD.gn
@@ -22,21 +22,21 @@ js_library("traffic_counters") { deps = [ ":traffic_counters_adapter", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:onc_mojo", "//chromeos/services/network_config/public/mojom:mojom_webui_js", "//chromeos/services/network_config/public/mojom:network_types_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("traffic_counters_adapter") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:mojo_interface_provider", "//ash/webui/common/resources/network:onc_mojo", "//chromeos/services/network_config/public/mojom:mojom_webui_js", "//chromeos/services/network_config/public/mojom:network_types_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] }
diff --git a/ash/webui/common/resources/traffic_counters/traffic_counters.js b/ash/webui/common/resources/traffic_counters/traffic_counters.js index b26fb0a..ac801d7 100644 --- a/ash/webui/common/resources/traffic_counters/traffic_counters.js +++ b/ash/webui/common/resources/traffic_counters/traffic_counters.js
@@ -4,8 +4,8 @@ import 'chrome://resources/ash/common/network/network_shared.css.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {TrafficCounterSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js'; import {Time} from 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-webui.js';
diff --git a/ui/webui/resources/cr_elements/web_ui_listener_behavior.d.ts b/ash/webui/common/resources/web_ui_listener_behavior.d.ts similarity index 100% rename from ui/webui/resources/cr_elements/web_ui_listener_behavior.d.ts rename to ash/webui/common/resources/web_ui_listener_behavior.d.ts
diff --git a/ui/webui/resources/cr_elements/web_ui_listener_behavior.js b/ash/webui/common/resources/web_ui_listener_behavior.js similarity index 93% rename from ui/webui/resources/cr_elements/web_ui_listener_behavior.js rename to ash/webui/common/resources/web_ui_listener_behavior.js index c5f45815..e33a539 100644 --- a/ui/webui/resources/cr_elements/web_ui_listener_behavior.js +++ b/ash/webui/common/resources/web_ui_listener_behavior.js
@@ -9,7 +9,8 @@ * it in new code. */ -import {WebUIListener, addWebUIListener, removeWebUIListener} from '../js/cr.m.js'; +import {addWebUIListener, removeWebUIListener, WebUIListener} from 'chrome://resources/js/cr.m.js'; + /** @polymerBehavior */ // eslint-disable-next-line no-var @@ -57,4 +58,3 @@ */ addWebUIListener(eventName, callback) {} } -
diff --git a/ash/webui/connectivity_diagnostics/resources/BUILD.gn b/ash/webui/connectivity_diagnostics/resources/BUILD.gn index f474b56..61aa068 100644 --- a/ash/webui/connectivity_diagnostics/resources/BUILD.gn +++ b/ash/webui/connectivity_diagnostics/resources/BUILD.gn
@@ -21,11 +21,11 @@ js_library("connectivity_diagnostics") { deps = [ + "//ash/webui/common/resources:cr_container_shadow_behavior", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network_health:network_diagnostics", "//ash/webui/common/resources/network_health:network_health_summary", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:cr_container_shadow_behavior", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "$externs_path/chrome_send.js" ]
diff --git a/ash/webui/connectivity_diagnostics/resources/connectivity_diagnostics.js b/ash/webui/connectivity_diagnostics/resources/connectivity_diagnostics.js index e732c961..244020b6 100644 --- a/ash/webui/connectivity_diagnostics/resources/connectivity_diagnostics.js +++ b/ash/webui/connectivity_diagnostics/resources/connectivity_diagnostics.js
@@ -7,8 +7,8 @@ import 'chrome://resources/cr_elements/cr_shared_style.css.js'; import './strings.m.js'; -import {CrContainerShadowBehavior} from 'chrome://resources/cr_elements/cr_container_shadow_behavior.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {CrContainerShadowBehavior} from 'chrome://resources/ash/common/cr_container_shadow_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {sendWithPromise} from 'chrome://resources/js/cr.m.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/ash/webui/diagnostics_ui/resources/drawing_provider.ts b/ash/webui/diagnostics_ui/resources/drawing_provider.ts index 04b17e4..304d984 100644 --- a/ash/webui/diagnostics_ui/resources/drawing_provider.ts +++ b/ash/webui/diagnostics_ui/resources/drawing_provider.ts
@@ -10,6 +10,8 @@ export const MARK_COLOR = 'rgba(var(--cros-icon-color-prominent), var(--cros-second-tone-opacity))'; export const TRAIL_COLOR = 'var(--google-blue-50)'; +export const TRAIL_MAX_OPACITY = 0.3; +export const MAX_TOUCH_PRESSURE = 255; export const SOURCE_OVER = 'source-over'; export const DESTINATION_OVER = 'destination-over'; @@ -19,7 +21,8 @@ */ interface DrawingProvider { // For touchscreen tester to draw a trail on screen. - drawTrail(x0: number, y0: number, x1: number, y1: number): void; + drawTrail(x0: number, y0: number, x1: number, y1: number, pressure: number): + void; // For touchscreen tester to draw a trial mark on screen. drawTrailMark(x: number, y: number): void; @@ -88,9 +91,11 @@ /** * Draw a line on canvas. */ - drawTrail(x0: number, y0: number, x1: number, y1: number): void { + drawTrail(x0: number, y0: number, x1: number, y1: number, pressure: number): + void { assert(this.ctx); - this.ctx.strokeStyle = TRAIL_COLOR; + this.ctx.strokeStyle = + `rgba(${TRAIL_COLOR}, ${this.getOpacityFromPressure(pressure)})`; this.ctx.beginPath(); this.ctx.moveTo(x0, y0); this.ctx.lineTo(x1, y1); @@ -110,4 +115,13 @@ this.ctx.fill(); this.ctx.globalCompositeOperation = DESTINATION_OVER; } + + /** + * Get trail's opacity based on touch pressure for touchscreen. + * TODO(wenyu): this function needs further fine-tune based on the + * distribution of pressure value. + */ + private getOpacityFromPressure(pressure: number): number { + return TRAIL_MAX_OPACITY * (pressure / MAX_TOUCH_PRESSURE); + } } \ No newline at end of file
diff --git a/ash/webui/diagnostics_ui/resources/realtime_cpu_chart.js b/ash/webui/diagnostics_ui/resources/realtime_cpu_chart.js index 63829b9..b4949e7 100644 --- a/ash/webui/diagnostics_ui/resources/realtime_cpu_chart.js +++ b/ash/webui/diagnostics_ui/resources/realtime_cpu_chart.js
@@ -6,7 +6,7 @@ import './diagnostics_shared.css.js'; import './strings.m.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/ash/webui/firmware_update_ui/resources/BUILD.gn b/ash/webui/firmware_update_ui/resources/BUILD.gn index 2411887..3643e32 100644 --- a/ash/webui/firmware_update_ui/resources/BUILD.gn +++ b/ash/webui/firmware_update_ui/resources/BUILD.gn
@@ -98,8 +98,8 @@ ":firmware_confirmation_dialog", ":firmware_update_dialog", ":peripheral_updates_list", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -107,9 +107,9 @@ deps = [ ":firmware_update_types", ":mojo_utils", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/firmware_update_ui/mojom:mojom_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -117,9 +117,9 @@ deps = [ ":firmware_update_types", ":mojo_utils", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/firmware_update_ui/mojom:mojom_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -145,19 +145,19 @@ ":firmware_update_types", ":mojo_interface_provider", ":update_card", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/firmware_update_ui/mojom:mojom_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("update_card") { deps = [ ":firmware_update_types", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/firmware_update_ui/mojom:mojom_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] }
diff --git a/ash/webui/firmware_update_ui/resources/firmware_confirmation_dialog.js b/ash/webui/firmware_update_ui/resources/firmware_confirmation_dialog.js index 280b944..cc8c2503 100644 --- a/ash/webui/firmware_update_ui/resources/firmware_confirmation_dialog.js +++ b/ash/webui/firmware_update_ui/resources/firmware_confirmation_dialog.js
@@ -10,7 +10,7 @@ import './strings.m.js'; import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {FirmwareUpdate} from './firmware_update_types.js';
diff --git a/ash/webui/firmware_update_ui/resources/firmware_update_app.js b/ash/webui/firmware_update_ui/resources/firmware_update_app.js index 8222fece..41f9f35 100644 --- a/ash/webui/firmware_update_ui/resources/firmware_update_app.js +++ b/ash/webui/firmware_update_ui/resources/firmware_update_app.js
@@ -9,7 +9,7 @@ import './peripheral_updates_list.js'; import './strings.m.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; /**
diff --git a/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js b/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js index ca1c5a0..ceacb8dc 100644 --- a/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js +++ b/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js
@@ -13,7 +13,7 @@ import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import 'chrome://resources/polymer/v3_0/paper-progress/paper-progress.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {DialogContent, FirmwareUpdate, InstallationProgress, InstallControllerRemote, UpdateProgressObserverInterface, UpdateProgressObserverReceiver, UpdateProviderInterface, UpdateState} from './firmware_update_types.js';
diff --git a/ash/webui/firmware_update_ui/resources/peripheral_updates_list.js b/ash/webui/firmware_update_ui/resources/peripheral_updates_list.js index 6c4b127..04eef7e 100644 --- a/ash/webui/firmware_update_ui/resources/peripheral_updates_list.js +++ b/ash/webui/firmware_update_ui/resources/peripheral_updates_list.js
@@ -12,7 +12,7 @@ import './update_card.js'; import './strings.m.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {IronA11yAnnouncer} from 'chrome://resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/ash/webui/firmware_update_ui/resources/update_card.js b/ash/webui/firmware_update_ui/resources/update_card.js index d6b9755..9539f03a 100644 --- a/ash/webui/firmware_update_ui/resources/update_card.js +++ b/ash/webui/firmware_update_ui/resources/update_card.js
@@ -12,7 +12,7 @@ import './mojom/firmware_update.mojom-lite.js'; import './strings.m.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {FirmwareUpdate, UpdatePriority} from './firmware_update_types.js';
diff --git a/ash/webui/os_feedback_ui/resources/BUILD.gn b/ash/webui/os_feedback_ui/resources/BUILD.gn index 4a19ce5..a94dfeb 100644 --- a/ash/webui/os_feedback_ui/resources/BUILD.gn +++ b/ash/webui/os_feedback_ui/resources/BUILD.gn
@@ -97,8 +97,8 @@ js_library("help_content") { deps = [ ":feedback_types", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui//webui/resources/cr_elements:i18n_behavior", ] } @@ -168,8 +168,8 @@ ":feedback_types", ":help_content", ":mojo_interface_provider", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] }
diff --git a/ash/webui/os_feedback_ui/resources/confirmation_page.js b/ash/webui/os_feedback_ui/resources/confirmation_page.js index 958690d..927a7628 100644 --- a/ash/webui/os_feedback_ui/resources/confirmation_page.js +++ b/ash/webui/os_feedback_ui/resources/confirmation_page.js
@@ -8,7 +8,7 @@ import 'chrome://resources/cr_elements/cr_link_row/cr_link_row.js'; import 'chrome://resources/cr_elements/cr_button/cr_button.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {FeedbackFlowState} from './feedback_flow.js';
diff --git a/ash/webui/os_feedback_ui/resources/file_attachment.js b/ash/webui/os_feedback_ui/resources/file_attachment.js index b422577..2f1e8f6f 100644 --- a/ash/webui/os_feedback_ui/resources/file_attachment.js +++ b/ash/webui/os_feedback_ui/resources/file_attachment.js
@@ -11,9 +11,9 @@ import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js'; import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {stringToMojoString16} from 'chrome://resources/ash/common/mojo_utils.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {AttachedFile, FeedbackAppPreSubmitAction, FeedbackServiceProviderInterface} from './feedback_types.js';
diff --git a/ash/webui/os_feedback_ui/resources/help_content.js b/ash/webui/os_feedback_ui/resources/help_content.js index 71c56fbf..daa035e 100644 --- a/ash/webui/os_feedback_ui/resources/help_content.js +++ b/ash/webui/os_feedback_ui/resources/help_content.js
@@ -12,8 +12,8 @@ import '//resources/cr_elements/policy/cr_tooltip_icon.js'; import '//resources/cr_elements/cr_shared_vars.css.js'; +import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js'; import {mojoString16ToString} from '//resources/ash/common/mojo_utils.js'; -import {I18nBehavior, I18nBehaviorInterface} from '//resources/cr_elements/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {HelpContent, HelpContentList, HelpContentType, SearchResult} from './feedback_types.js';
diff --git a/ash/webui/os_feedback_ui/resources/search_page.js b/ash/webui/os_feedback_ui/resources/search_page.js index 368ce92..266ea7d8 100644 --- a/ash/webui/os_feedback_ui/resources/search_page.js +++ b/ash/webui/os_feedback_ui/resources/search_page.js
@@ -7,8 +7,8 @@ import './os_feedback_shared_css.js'; import 'chrome://resources/cr_elements/cr_button/cr_button.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {stringToMojoString16} from 'chrome://resources/ash/common/mojo_utils.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {btRegEx, buildWordMatcher, FeedbackFlowState} from './feedback_flow.js';
diff --git a/ash/webui/os_feedback_ui/resources/share_data_page.js b/ash/webui/os_feedback_ui/resources/share_data_page.js index 88cd987..7d022c1 100644 --- a/ash/webui/os_feedback_ui/resources/share_data_page.js +++ b/ash/webui/os_feedback_ui/resources/share_data_page.js
@@ -9,7 +9,7 @@ import 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.js'; import 'chrome://resources/cr_elements/policy/cr_tooltip_icon.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {FEEDBACK_LEGAL_HELP_URL, FEEDBACK_PRIVACY_POLICY_URL, FEEDBACK_TERMS_OF_SERVICE_URL} from './feedback_constants.js';
diff --git a/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.ts b/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.ts index 7356c12..b5dabf4 100644 --- a/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.ts +++ b/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.ts
@@ -95,11 +95,6 @@ /** The list of Google Photos albums. */ googlePhotosAlbums_: Array, - showBackButton_: { - type: Boolean, - computed: 'computeShowBackButton_(path)', - }, - /** The breadcrumb being highlighted by keyboard navigation. */ selectedBreadcrumb_: { type: Object, @@ -115,7 +110,6 @@ private breadcrumbs_: string[]; private collections_: WallpaperCollection[]|null; private googlePhotosAlbums_: GooglePhotosAlbum[]|null; - private showBackButton_: boolean; private selectedBreadcrumb_: HTMLElement; override ready() {
diff --git a/ash/webui/projector_app/resources/annotator/trusted/BUILD.gn b/ash/webui/projector_app/resources/annotator/trusted/BUILD.gn index 85abea8d..e3fc9f3 100644 --- a/ash/webui/projector_app/resources/annotator/trusted/BUILD.gn +++ b/ash/webui/projector_app/resources/annotator/trusted/BUILD.gn
@@ -15,11 +15,11 @@ "trusted_annotator_comm_factory.js", ] deps = [ + "//ash/webui/common/resources:web_ui_listener_behavior", "//ash/webui/common/resources/post_message_api:post_message_api_client", "//ash/webui/common/resources/post_message_api:post_message_api_request_handler", "//ash/webui/projector_app/resources/common:message_types", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] externs_list = [ "../../common/projector_app.externs.js" ] }
diff --git a/ash/webui/projector_app/resources/annotator/trusted/annotator_embedder_impl.js b/ash/webui/projector_app/resources/annotator/trusted/annotator_embedder_impl.js index d4bac7b..3cc6d58 100644 --- a/ash/webui/projector_app/resources/annotator/trusted/annotator_embedder_impl.js +++ b/ash/webui/projector_app/resources/annotator/trusted/annotator_embedder_impl.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {AnnotatorBrowserProxyImpl} from './annotator_browser_proxy.js';
diff --git a/ash/webui/projector_app/resources/app/trusted/BUILD.gn b/ash/webui/projector_app/resources/app/trusted/BUILD.gn index c78c951..389eadd9 100644 --- a/ash/webui/projector_app/resources/app/trusted/BUILD.gn +++ b/ash/webui/projector_app/resources/app/trusted/BUILD.gn
@@ -16,10 +16,10 @@ "trusted_app_comm_factory.js", ] deps = [ + "//ash/webui/common/resources:web_ui_listener_behavior", "//ash/webui/common/resources/post_message_api:post_message_api_client", "//ash/webui/common/resources/post_message_api:post_message_api_request_handler", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] externs_list = [ "../../common/projector_app.externs.js",
diff --git a/ash/webui/projector_app/resources/app/trusted/embedder.js b/ash/webui/projector_app/resources/app/trusted/embedder.js index 918f011..4bc16584 100644 --- a/ash/webui/projector_app/resources/app/trusted/embedder.js +++ b/ash/webui/projector_app/resources/app/trusted/embedder.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {installLaunchHandler} from './launch.js';
diff --git a/ash/webui/scanning/resources/BUILD.gn b/ash/webui/scanning/resources/BUILD.gn index 04ab3dc3..bc4fd89 100644 --- a/ash/webui/scanning/resources/BUILD.gn +++ b/ash/webui/scanning/resources/BUILD.gn
@@ -45,24 +45,24 @@ deps = [ ":scanning_app_util", ":select_behavior", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/scanning/mojom:mojom_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("loading_page") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("file_type_select") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/scanning/mojom:mojom_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -70,26 +70,26 @@ deps = [ ":scanning_app_util", ":select_behavior", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/scanning/mojom:mojom_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("resolution_select") { deps = [ ":select_behavior", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/scanning/mojom:mojom_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("scan_done_section") { deps = [ ":scanning_app_types", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -98,17 +98,17 @@ ":action_toolbar", ":scanning_app_types", ":scanning_app_util", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/scanning/mojom:mojom_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("scan_to_select") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/scanning/mojom:mojom_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -116,25 +116,25 @@ deps = [ ":scanning_app_types", ":scanning_app_util", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/scanning/mojom:mojom_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("multi_page_checkbox") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/scanning/mojom:mojom_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("multi_page_scan") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/scanning/mojom:mojom_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -155,9 +155,9 @@ ":scanning_app_util", ":scanning_browser_proxy", ":source_select", + "//ash/webui/common/resources:cr_container_shadow_behavior", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:cr_container_shadow_behavior", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_toast/cr_toast_externs.js" ] @@ -176,9 +176,9 @@ deps = [ ":scanning_app_util", ":select_behavior", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/scanning/mojom:mojom_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] }
diff --git a/ash/webui/scanning/resources/action_toolbar.js b/ash/webui/scanning/resources/action_toolbar.js index b27f6397..140f3bf 100644 --- a/ash/webui/scanning/resources/action_toolbar.js +++ b/ash/webui/scanning/resources/action_toolbar.js
@@ -5,8 +5,8 @@ import './scanning_shared_css.js'; import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; /**
diff --git a/ash/webui/scanning/resources/color_mode_select.js b/ash/webui/scanning/resources/color_mode_select.js index 54b55eee..7e04457 100644 --- a/ash/webui/scanning/resources/color_mode_select.js +++ b/ash/webui/scanning/resources/color_mode_select.js
@@ -6,8 +6,8 @@ import './scan_settings_section.js'; import './strings.m.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {alphabeticalCompare, getColorModeString} from './scanning_app_util.js';
diff --git a/ash/webui/scanning/resources/file_type_select.js b/ash/webui/scanning/resources/file_type_select.js index 266b2bc..5e800903 100644 --- a/ash/webui/scanning/resources/file_type_select.js +++ b/ash/webui/scanning/resources/file_type_select.js
@@ -6,7 +6,7 @@ import './scan_settings_section.js'; import './strings.m.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; /**
diff --git a/ash/webui/scanning/resources/loading_page.js b/ash/webui/scanning/resources/loading_page.js index e4ca77ec..d099d589 100644 --- a/ash/webui/scanning/resources/loading_page.js +++ b/ash/webui/scanning/resources/loading_page.js
@@ -6,7 +6,7 @@ import 'chrome://resources/polymer/v3_0/iron-media-query/iron-media-query.js'; import 'chrome://resources/polymer/v3_0/paper-progress/paper-progress.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {AppState} from './scanning_app_types.js';
diff --git a/ash/webui/scanning/resources/multi_page_checkbox.js b/ash/webui/scanning/resources/multi_page_checkbox.js index b1dd3f0..774ffa8 100644 --- a/ash/webui/scanning/resources/multi_page_checkbox.js +++ b/ash/webui/scanning/resources/multi_page_checkbox.js
@@ -5,7 +5,7 @@ import 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.js'; import './scan_settings_section.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; /**
diff --git a/ash/webui/scanning/resources/multi_page_scan.js b/ash/webui/scanning/resources/multi_page_scan.js index 9e40957..b2ee3dac 100644 --- a/ash/webui/scanning/resources/multi_page_scan.js +++ b/ash/webui/scanning/resources/multi_page_scan.js
@@ -5,7 +5,7 @@ import 'chrome://resources/cr_elements/cr_button/cr_button.js'; import './scanning_fonts_css.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {AppState} from './scanning_app_types.js';
diff --git a/ash/webui/scanning/resources/page_size_select.js b/ash/webui/scanning/resources/page_size_select.js index f80d9a915..3af323a 100644 --- a/ash/webui/scanning/resources/page_size_select.js +++ b/ash/webui/scanning/resources/page_size_select.js
@@ -6,8 +6,8 @@ import './scan_settings_section.js'; import './strings.m.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {alphabeticalCompare, getPageSizeString} from './scanning_app_util.js';
diff --git a/ash/webui/scanning/resources/resolution_select.js b/ash/webui/scanning/resources/resolution_select.js index 12b6751..92a5a620 100644 --- a/ash/webui/scanning/resources/resolution_select.js +++ b/ash/webui/scanning/resources/resolution_select.js
@@ -6,8 +6,8 @@ import './scan_settings_section.js'; import './strings.m.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {SelectBehavior} from './select_behavior.js';
diff --git a/ash/webui/scanning/resources/scan_done_section.js b/ash/webui/scanning/resources/scan_done_section.js index fb3a3c5..46ad866 100644 --- a/ash/webui/scanning/resources/scan_done_section.js +++ b/ash/webui/scanning/resources/scan_done_section.js
@@ -7,8 +7,8 @@ import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; import './file_path.mojom-lite.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/ash/webui/scanning/resources/scan_preview.js b/ash/webui/scanning/resources/scan_preview.js index 755351b..3fdf65a 100644 --- a/ash/webui/scanning/resources/scan_preview.js +++ b/ash/webui/scanning/resources/scan_preview.js
@@ -10,8 +10,8 @@ import 'chrome://resources/polymer/v3_0/iron-media-query/iron-media-query.js'; import 'chrome://resources/polymer/v3_0/paper-progress/paper-progress.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {afterNextRender, html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/ash/webui/scanning/resources/scan_to_select.js b/ash/webui/scanning/resources/scan_to_select.js index 46ec5a8..1e58f675 100644 --- a/ash/webui/scanning/resources/scan_to_select.js +++ b/ash/webui/scanning/resources/scan_to_select.js
@@ -5,7 +5,7 @@ import './scan_settings_section.js'; import './strings.m.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ScanningBrowserProxy, ScanningBrowserProxyImpl, SelectedPath} from './scanning_browser_proxy.js';
diff --git a/ash/webui/scanning/resources/scanner_select.js b/ash/webui/scanning/resources/scanner_select.js index ba7938b..845403a 100644 --- a/ash/webui/scanning/resources/scanner_select.js +++ b/ash/webui/scanning/resources/scanner_select.js
@@ -9,7 +9,7 @@ import './scan_settings_section.js'; import './strings.m.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {afterNextRender, html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ScannerArr, ScannerInfo} from './scanning_app_types.js';
diff --git a/ash/webui/scanning/resources/scanning_app.js b/ash/webui/scanning/resources/scanning_app.js index 25f20855..06bf3e5d 100644 --- a/ash/webui/scanning/resources/scanning_app.js +++ b/ash/webui/scanning/resources/scanning_app.js
@@ -28,9 +28,9 @@ import './scanning_shared_css.js'; import './source_select.js'; -import {CrContainerShadowBehavior} from 'chrome://resources/cr_elements/cr_container_shadow_behavior.js'; +import {CrContainerShadowBehavior} from 'chrome://resources/ash/common/cr_container_shadow_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {afterNextRender, html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/ash/webui/scanning/resources/source_select.js b/ash/webui/scanning/resources/source_select.js index 451111c92..a3db202 100644 --- a/ash/webui/scanning/resources/source_select.js +++ b/ash/webui/scanning/resources/source_select.js
@@ -6,8 +6,8 @@ import './scan_settings_section.js'; import './strings.m.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {alphabeticalCompare, getSourceTypeString} from './scanning_app_util.js';
diff --git a/ash/webui/shimless_rma/backend/shimless_rma_service.cc b/ash/webui/shimless_rma/backend/shimless_rma_service.cc index 9d681675..d6a53113 100644 --- a/ash/webui/shimless_rma/backend/shimless_rma_service.cc +++ b/ash/webui/shimless_rma/backend/shimless_rma_service.cc
@@ -950,26 +950,12 @@ } void ShimlessRmaService::GetLog(GetLogCallback callback) { - if (state_proto_.state_case() != rmad::RmadState::kRepairComplete) { - LOG(ERROR) << "GetLog called from incorrect state " - << state_proto_.state_case(); - std::move(callback).Run("", - rmad::RmadErrorCode::RMAD_ERROR_REQUEST_INVALID); - return; - } RmadClient::Get()->GetLog(base::BindOnce(&ShimlessRmaService::OnGetLog, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } void ShimlessRmaService::SaveLog(SaveLogCallback callback) { - if (state_proto_.state_case() != rmad::RmadState::kRepairComplete) { - LOG(ERROR) << "SaveLog called from incorrect state " - << state_proto_.state_case(); - std::move(callback).Run(base::FilePath(""), - rmad::RmadErrorCode::RMAD_ERROR_REQUEST_INVALID); - return; - } RmadClient::Get()->SaveLog(base::BindOnce(&ShimlessRmaService::OnSaveLog, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); @@ -1148,8 +1134,9 @@ void ShimlessRmaService::ExternalDiskState(bool detected) { last_external_disk_state_ = detected; - if (external_disk_state_observer_.is_bound()) { - external_disk_state_observer_->OnExternalDiskStateChanged(detected); + for (auto& external_disk_state_observer : external_disk_state_observers_) { + external_disk_state_observer->OnExternalDiskStateChanged( + *last_external_disk_state_); } } @@ -1244,10 +1231,12 @@ void ShimlessRmaService::ObserveExternalDiskState( ::mojo::PendingRemote<mojom::ExternalDiskStateObserver> observer) { - external_disk_state_observer_.Bind(std::move(observer)); + external_disk_state_observers_.Add(std::move(observer)); if (last_external_disk_state_) { - external_disk_state_observer_->OnExternalDiskStateChanged( - *last_external_disk_state_); + for (auto& external_disk_state_observer : external_disk_state_observers_) { + external_disk_state_observer->OnExternalDiskStateChanged( + *last_external_disk_state_); + } } }
diff --git a/ash/webui/shimless_rma/backend/shimless_rma_service.h b/ash/webui/shimless_rma/backend/shimless_rma_service.h index d71b85d..a8d0095 100644 --- a/ash/webui/shimless_rma/backend/shimless_rma_service.h +++ b/ash/webui/shimless_rma/backend/shimless_rma_service.h
@@ -324,7 +324,10 @@ mojo::Remote<mojom::HardwareWriteProtectionStateObserver> hwwp_state_observer_; mojo::Remote<mojom::PowerCableStateObserver> power_cable_observer_; - mojo::Remote<mojom::ExternalDiskStateObserver> external_disk_state_observer_; + // ExternalDiskStateObserver is used to detect external disks for saving logs + // and installing firmware. + mojo::RemoteSet<mojom::ExternalDiskStateObserver> + external_disk_state_observers_; // HardwareVerificationStatusObserver is used by landing and OS update pages. mojo::RemoteSet<mojom::HardwareVerificationStatusObserver> hardware_verification_observers_;
diff --git a/ash/webui/shimless_rma/backend/shimless_rma_service_unittest.cc b/ash/webui/shimless_rma/backend/shimless_rma_service_unittest.cc index 3b5efcc0..914a6a95 100644 --- a/ash/webui/shimless_rma/backend/shimless_rma_service_unittest.cc +++ b/ash/webui/shimless_rma/backend/shimless_rma_service_unittest.cc
@@ -3095,26 +3095,6 @@ run_loop.RunUntilIdle(); } -TEST_F(ShimlessRmaServiceTest, GetLogWrongStateEmpty) { - const std::vector<rmad::GetStateReply> fake_states = {CreateStateReply( - rmad::RmadState::kDeviceDestination, rmad::RMAD_ERROR_OK)}; - fake_rmad_client_()->SetFakeStateReplies(std::move(fake_states)); - base::RunLoop run_loop; - shimless_rma_provider_->GetCurrentState( - base::BindLambdaForTesting([&](mojom::StateResultPtr state_result_ptr) { - EXPECT_EQ(state_result_ptr->state, mojom::State::kChooseDestination); - EXPECT_EQ(state_result_ptr->error, rmad::RmadErrorCode::RMAD_ERROR_OK); - })); - run_loop.RunUntilIdle(); - - shimless_rma_provider_->GetLog(base::BindLambdaForTesting( - [&](const std::string& log, rmad::RmadErrorCode error) { - EXPECT_TRUE(log.empty()); - EXPECT_EQ(error, rmad::RmadErrorCode::RMAD_ERROR_REQUEST_INVALID); - })); - run_loop.RunUntilIdle(); -} - TEST_F(ShimlessRmaServiceTest, SaveLog) { const std::vector<rmad::GetStateReply> fake_states = { CreateStateReply(rmad::RmadState::kRepairComplete, rmad::RMAD_ERROR_OK)}; @@ -3141,26 +3121,6 @@ run_loop.RunUntilIdle(); } -TEST_F(ShimlessRmaServiceTest, SaveLogWrongStateEmpty) { - const std::vector<rmad::GetStateReply> fake_states = {CreateStateReply( - rmad::RmadState::kDeviceDestination, rmad::RMAD_ERROR_OK)}; - fake_rmad_client_()->SetFakeStateReplies(std::move(fake_states)); - base::RunLoop run_loop; - shimless_rma_provider_->GetCurrentState( - base::BindLambdaForTesting([&](mojom::StateResultPtr state_result_ptr) { - EXPECT_EQ(state_result_ptr->state, mojom::State::kChooseDestination); - EXPECT_EQ(state_result_ptr->error, rmad::RmadErrorCode::RMAD_ERROR_OK); - })); - run_loop.RunUntilIdle(); - - shimless_rma_provider_->SaveLog(base::BindLambdaForTesting( - [&](const base::FilePath& save_path, rmad::RmadErrorCode error) { - EXPECT_TRUE(save_path.empty()); - EXPECT_EQ(error, rmad::RmadErrorCode::RMAD_ERROR_REQUEST_INVALID); - })); - run_loop.RunUntilIdle(); -} - TEST_F(ShimlessRmaServiceTest, GetPowerwashRequired) { rmad::GetStateReply repair_complete_state = CreateStateReply(rmad::RmadState::kRepairComplete, rmad::RMAD_ERROR_OK); @@ -3632,25 +3592,40 @@ }; TEST_F(ShimlessRmaServiceTest, ObserveExternalDiskState) { - FakeExternalDiskStateObserver fake_observer; + FakeExternalDiskStateObserver fake_observer1; + FakeExternalDiskStateObserver fake_observer2; + + // Shimless is expected to support multiple ExternalDiskState observers. shimless_rma_provider_->ObserveExternalDiskState( - fake_observer.receiver.BindNewPipeAndPassRemote()); + fake_observer1.receiver.BindNewPipeAndPassRemote()); + shimless_rma_provider_->ObserveExternalDiskState( + fake_observer2.receiver.BindNewPipeAndPassRemote()); base::RunLoop run_loop; fake_rmad_client_()->TriggerExternalDiskStateObservation(true); run_loop.RunUntilIdle(); - EXPECT_EQ(fake_observer.observations.size(), 1UL); - EXPECT_EQ(fake_observer.observations[0], true); + EXPECT_EQ(fake_observer1.observations.size(), 1UL); + EXPECT_EQ(fake_observer1.observations[0], true); + EXPECT_EQ(fake_observer2.observations.size(), 1UL); + EXPECT_EQ(fake_observer2.observations[0], true); } TEST_F(ShimlessRmaServiceTest, ObserveExternalDiskStateAfterSignal) { - FakeExternalDiskStateObserver fake_observer; + FakeExternalDiskStateObserver fake_observer1; + FakeExternalDiskStateObserver fake_observer2; fake_rmad_client_()->TriggerExternalDiskStateObservation(true); + + // Shimless is expected to support multiple ExternalDiskState observers. shimless_rma_provider_->ObserveExternalDiskState( - fake_observer.receiver.BindNewPipeAndPassRemote()); + fake_observer1.receiver.BindNewPipeAndPassRemote()); + shimless_rma_provider_->ObserveExternalDiskState( + fake_observer2.receiver.BindNewPipeAndPassRemote()); base::RunLoop run_loop; run_loop.RunUntilIdle(); - EXPECT_EQ(fake_observer.observations.size(), 1UL); - EXPECT_EQ(fake_observer.observations[0], true); + EXPECT_EQ(fake_observer1.observations.size(), 2UL); + EXPECT_EQ(fake_observer1.observations[0], true); + EXPECT_EQ(fake_observer1.observations[1], true); + EXPECT_EQ(fake_observer2.observations.size(), 1UL); + EXPECT_EQ(fake_observer2.observations[0], true); } class FakeHardwareVerificationStatusObserver
diff --git a/ash/webui/shimless_rma/resources/BUILD.gn b/ash/webui/shimless_rma/resources/BUILD.gn index 69cacfc..7a4a7a1 100644 --- a/ash/webui/shimless_rma/resources/BUILD.gn +++ b/ash/webui/shimless_rma/resources/BUILD.gn
@@ -178,8 +178,8 @@ ":base_page", ":mojo_interface_provider", ":shimless_rma_types", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -188,8 +188,8 @@ ":base_page", ":mojo_interface_provider", ":shimless_rma_types", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -231,8 +231,8 @@ ":base_page", ":mojo_interface_provider", ":shimless_rma_types", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_externs.js" ] } @@ -283,8 +283,8 @@ ":mojo_interface_provider", ":repair_component_chip", ":shimless_rma_types", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", ] } @@ -295,11 +295,11 @@ ":icons", ":mojo_interface_provider", ":shimless_rma_types", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:network_config", "//ash/webui/common/resources/network:network_list", "//ash/webui/common/resources/network:onc_mojo", "//chromeos/services/network_config/public/mojom:mojom_webui_js", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:util", ] @@ -314,9 +314,9 @@ ":base_page", ":mojo_interface_provider", ":shimless_rma_types", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/paper-spinner:paper-spinner-lite", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -346,8 +346,8 @@ ":base_page", ":mojo_interface_provider", ":shimless_rma_types", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -440,8 +440,8 @@ ":base_page", ":mojo_interface_provider", ":shimless_rma_types", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
diff --git a/ash/webui/shimless_rma/resources/critical_error_page.js b/ash/webui/shimless_rma/resources/critical_error_page.js index 9bb6bcd..8ffb7865a7 100644 --- a/ash/webui/shimless_rma/resources/critical_error_page.js +++ b/ash/webui/shimless_rma/resources/critical_error_page.js
@@ -7,7 +7,7 @@ import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import 'chrome://resources/cr_elements/cr_button/cr_button.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/hardware_error_page.js b/ash/webui/shimless_rma/resources/hardware_error_page.js index e40fde5..9511a363 100644 --- a/ash/webui/shimless_rma/resources/hardware_error_page.js +++ b/ash/webui/shimless_rma/resources/hardware_error_page.js
@@ -7,7 +7,7 @@ import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import 'chrome://resources/cr_elements/cr_button/cr_button.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_choose_destination_page.js b/ash/webui/shimless_rma/resources/onboarding_choose_destination_page.js index f3d0b99..dce3504 100644 --- a/ash/webui/shimless_rma/resources/onboarding_choose_destination_page.js +++ b/ash/webui/shimless_rma/resources/onboarding_choose_destination_page.js
@@ -7,7 +7,7 @@ import '//resources/cr_elements/cr_radio_button/cr_radio_button.js'; import '//resources/cr_elements/cr_radio_group/cr_radio_group.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_choose_wipe_device_page.js b/ash/webui/shimless_rma/resources/onboarding_choose_wipe_device_page.js index 28fdbbb..d4c832c 100644 --- a/ash/webui/shimless_rma/resources/onboarding_choose_wipe_device_page.js +++ b/ash/webui/shimless_rma/resources/onboarding_choose_wipe_device_page.js
@@ -7,8 +7,8 @@ import '//resources/cr_elements/cr_radio_button/cr_radio_button.js'; import '//resources/cr_elements/cr_radio_group/cr_radio_group.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_choose_wp_disable_method_page.js b/ash/webui/shimless_rma/resources/onboarding_choose_wp_disable_method_page.js index c421cbc..408fb1f 100644 --- a/ash/webui/shimless_rma/resources/onboarding_choose_wp_disable_method_page.js +++ b/ash/webui/shimless_rma/resources/onboarding_choose_wp_disable_method_page.js
@@ -5,7 +5,7 @@ import './shimless_rma_shared_css.js'; import './base_page.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_enter_rsu_wp_disable_code_page.js b/ash/webui/shimless_rma/resources/onboarding_enter_rsu_wp_disable_code_page.js index d5c7e0c0..98b505e7 100644 --- a/ash/webui/shimless_rma/resources/onboarding_enter_rsu_wp_disable_code_page.js +++ b/ash/webui/shimless_rma/resources/onboarding_enter_rsu_wp_disable_code_page.js
@@ -8,7 +8,7 @@ import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import 'chrome://resources/cr_elements/cr_input/cr_input.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_landing_page.js b/ash/webui/shimless_rma/resources/onboarding_landing_page.js index 7e7621ba..22c1aec 100644 --- a/ash/webui/shimless_rma/resources/onboarding_landing_page.js +++ b/ash/webui/shimless_rma/resources/onboarding_landing_page.js
@@ -8,7 +8,7 @@ import './base_page.js'; import './icons.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_network_page.js b/ash/webui/shimless_rma/resources/onboarding_network_page.js index 2621669..0eaa552b 100644 --- a/ash/webui/shimless_rma/resources/onboarding_network_page.js +++ b/ash/webui/shimless_rma/resources/onboarding_network_page.js
@@ -14,9 +14,9 @@ import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; import {HTMLEscape} from '//resources/js/util.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/ash/common/network/network_listener_behavior.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {FilterType, NetworkStateProperties, NO_LIMIT, StartConnectResult} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_select_components_page.js b/ash/webui/shimless_rma/resources/onboarding_select_components_page.js index 90bb7c7..42e3601 100644 --- a/ash/webui/shimless_rma/resources/onboarding_select_components_page.js +++ b/ash/webui/shimless_rma/resources/onboarding_select_components_page.js
@@ -6,8 +6,8 @@ import './repair_component_chip.js'; import './shimless_rma_shared_css.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ComponentTypeToId} from './data.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_update_page.js b/ash/webui/shimless_rma/resources/onboarding_update_page.js index f96688c..080fd06 100644 --- a/ash/webui/shimless_rma/resources/onboarding_update_page.js +++ b/ash/webui/shimless_rma/resources/onboarding_update_page.js
@@ -10,8 +10,8 @@ import './base_page.js'; import './icons.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_wait_for_manual_wp_disable_page.js b/ash/webui/shimless_rma/resources/onboarding_wait_for_manual_wp_disable_page.js index 0fe0dd66..20dac447 100644 --- a/ash/webui/shimless_rma/resources/onboarding_wait_for_manual_wp_disable_page.js +++ b/ash/webui/shimless_rma/resources/onboarding_wait_for_manual_wp_disable_page.js
@@ -5,7 +5,7 @@ import './shimless_rma_shared_css.js'; import './base_page.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_wp_disable_complete_page.js b/ash/webui/shimless_rma/resources/onboarding_wp_disable_complete_page.js index b03dfc1..d59d759 100644 --- a/ash/webui/shimless_rma/resources/onboarding_wp_disable_complete_page.js +++ b/ash/webui/shimless_rma/resources/onboarding_wp_disable_complete_page.js
@@ -5,7 +5,7 @@ import './shimless_rma_shared_css.js'; import './base_page.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/reboot_page.js b/ash/webui/shimless_rma/resources/reboot_page.js index 918f6eb..b7abfdcc 100644 --- a/ash/webui/shimless_rma/resources/reboot_page.js +++ b/ash/webui/shimless_rma/resources/reboot_page.js
@@ -6,7 +6,7 @@ import './base_page.js'; import './shimless_rma_shared_css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {RmadErrorCode} from './shimless_rma_types.js';
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 8291649..5853122e8 100644 --- a/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.js +++ b/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.js
@@ -10,8 +10,8 @@ import './icons.js'; import './shimless_rma_shared_css.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ComponentTypeToId} from './data.js';
diff --git a/ash/webui/shimless_rma/resources/reimaging_calibration_run_page.js b/ash/webui/shimless_rma/resources/reimaging_calibration_run_page.js index 08e4fc1a..3836a23 100644 --- a/ash/webui/shimless_rma/resources/reimaging_calibration_run_page.js +++ b/ash/webui/shimless_rma/resources/reimaging_calibration_run_page.js
@@ -8,7 +8,7 @@ import './base_page.js'; import './icons.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ComponentTypeToId} from './data.js';
diff --git a/ash/webui/shimless_rma/resources/reimaging_calibration_setup_page.js b/ash/webui/shimless_rma/resources/reimaging_calibration_setup_page.js index 9be49fa..9fa4da7 100644 --- a/ash/webui/shimless_rma/resources/reimaging_calibration_setup_page.js +++ b/ash/webui/shimless_rma/resources/reimaging_calibration_setup_page.js
@@ -8,8 +8,8 @@ import './base_page.js'; import './icons.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/reimaging_device_information_page.js b/ash/webui/shimless_rma/resources/reimaging_device_information_page.js index 4c1e507..93fb00d 100644 --- a/ash/webui/shimless_rma/resources/reimaging_device_information_page.js +++ b/ash/webui/shimless_rma/resources/reimaging_device_information_page.js
@@ -9,7 +9,7 @@ import 'chrome://resources/cr_elements/icons.html.js'; import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/reimaging_firmware_update_page.js b/ash/webui/shimless_rma/resources/reimaging_firmware_update_page.js index a69d709..55da2ad 100644 --- a/ash/webui/shimless_rma/resources/reimaging_firmware_update_page.js +++ b/ash/webui/shimless_rma/resources/reimaging_firmware_update_page.js
@@ -8,7 +8,7 @@ import './base_page.js'; import './icons.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/reimaging_provisioning_page.js b/ash/webui/shimless_rma/resources/reimaging_provisioning_page.js index 4ef10e5..49c3f84 100644 --- a/ash/webui/shimless_rma/resources/reimaging_provisioning_page.js +++ b/ash/webui/shimless_rma/resources/reimaging_provisioning_page.js
@@ -10,7 +10,7 @@ import './base_page.js'; import './icons.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/repair_component_chip.js b/ash/webui/shimless_rma/resources/repair_component_chip.js index 5c1b4874..7894cf7 100644 --- a/ash/webui/shimless_rma/resources/repair_component_chip.js +++ b/ash/webui/shimless_rma/resources/repair_component_chip.js
@@ -10,7 +10,7 @@ import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; import 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {modifyTabbableElement} from './shimless_rma_util.js';
diff --git a/ash/webui/shimless_rma/resources/shimless_rma.js b/ash/webui/shimless_rma/resources/shimless_rma.js index 4492bb7..d621e97a 100644 --- a/ash/webui/shimless_rma/resources/shimless_rma.js +++ b/ash/webui/shimless_rma/resources/shimless_rma.js
@@ -29,7 +29,7 @@ import './wrapup_wait_for_manual_wp_enable_page.js'; import 'chrome://resources/cr_elements/cr_button/cr_button.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; @@ -501,6 +501,11 @@ this.openLogsDialogCallback_ = () => { this.openLogsDialog_(); }; + + /** @private {?Function} */ + this.onKeyDownCallback_ = (event) => { + this.isOpenLogsKeyboardShortcut_(event); + }; } /** @override */ @@ -520,6 +525,8 @@ window.addEventListener( 'fatal-hardware-error', this.fatalHardwareErrorCallback_); window.addEventListener('open-logs-dialog', this.openLogsDialogCallback_); + + window.addEventListener('keydown', this.onKeyDownCallback_); } /** @override */ @@ -540,6 +547,8 @@ 'fatal-hardware-error', this.fatalHardwareErrorCallback_); window.removeEventListener( 'open-logs-dialog', this.openLogsDialogCallback_); + + window.removeEventListener('keydown', this.onKeyDownCallback_); } /** @override */ @@ -991,6 +1000,22 @@ return ''; } } + + /** + * Opens the logs dialog if the `Alt + Shift + L` keyboard shortcut is + * pressed. + * @param {Event} event + * @private + */ + isOpenLogsKeyboardShortcut_(event) { + const altKeyPressed = event.altKey; + const shiftKeyPressed = event.shiftKey; + const lKeyPressed = event.key.toLowerCase() === 'l'; + + if (altKeyPressed && shiftKeyPressed && lKeyPressed) { + this.openLogsDialog_(); + } + } } customElements.define(ShimlessRma.is, ShimlessRma);
diff --git a/ash/webui/shimless_rma/resources/splash_screen.js b/ash/webui/shimless_rma/resources/splash_screen.js index e6e5078..41460392 100644 --- a/ash/webui/shimless_rma/resources/splash_screen.js +++ b/ash/webui/shimless_rma/resources/splash_screen.js
@@ -9,7 +9,7 @@ import './icons.js'; import './shimless_rma_shared_css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {focusPageTitle} from './shimless_rma_util.js';
diff --git a/ash/webui/shimless_rma/resources/wrapup_finalize_page.js b/ash/webui/shimless_rma/resources/wrapup_finalize_page.js index 0b324f4..c9df790 100644 --- a/ash/webui/shimless_rma/resources/wrapup_finalize_page.js +++ b/ash/webui/shimless_rma/resources/wrapup_finalize_page.js
@@ -6,7 +6,7 @@ import './shimless_rma_shared_css.js'; import './base_page.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.js b/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.js index eb4f63f..8142e606 100644 --- a/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.js +++ b/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.js
@@ -9,7 +9,7 @@ import './shimless_rma_fonts_css.js'; import './shimless_rma_shared_css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/wrapup_restock_page.js b/ash/webui/shimless_rma/resources/wrapup_restock_page.js index a838633..ecf680c 100644 --- a/ash/webui/shimless_rma/resources/wrapup_restock_page.js +++ b/ash/webui/shimless_rma/resources/wrapup_restock_page.js
@@ -9,7 +9,7 @@ import './base_page.js'; import './icons.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/wrapup_wait_for_manual_wp_enable_page.js b/ash/webui/shimless_rma/resources/wrapup_wait_for_manual_wp_enable_page.js index 1694e32..17a6656b 100644 --- a/ash/webui/shimless_rma/resources/wrapup_wait_for_manual_wp_enable_page.js +++ b/ash/webui/shimless_rma/resources/wrapup_wait_for_manual_wp_enable_page.js
@@ -5,7 +5,7 @@ import './shimless_rma_shared_css.js'; import './base_page.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc index 5133a4b..26ea344 100644 --- a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc +++ b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc
@@ -10,6 +10,7 @@ #include "ash/accelerators/ash_accelerator_configuration.h" #include "ash/public/cpp/accelerator_configuration.h" #include "ash/public/cpp/accelerators.h" +#include "ash/public/cpp/accelerators_util.h" #include "ash/public/mojom/accelerator_keys.mojom.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h" @@ -31,8 +32,10 @@ const ash::AcceleratorInfo& actual_info) { ui::Accelerator expected_accel(expected_data.keycode, expected_data.modifiers); - ash::AcceleratorInfo expected_info(actual_info.type, expected_accel, - /**locked=*/true); + ash::AcceleratorInfo expected_info( + actual_info.type, expected_accel, + ash::KeycodeToKeyString(expected_data.keycode), + /*locked=*/true); const bool type_equals = expected_info.type == actual_info.type; const bool accelerator_equals =
diff --git a/ash/webui/shortcut_customization_ui/resources/common/icons.html b/ash/webui/shortcut_customization_ui/resources/common/icons.html index 8a00f5d3..df347da7 100644 --- a/ash/webui/shortcut_customization_ui/resources/common/icons.html +++ b/ash/webui/shortcut_customization_ui/resources/common/icons.html
@@ -24,6 +24,10 @@ d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"> </path> </g> + <!-- Keyboard icons --> + <g id="overview" width="20" height="20" viewbox="0 0 20 20"> + <path fill-rule="evenodd" d="M0.164062 15.3381H13.1281V4.65625H0.164062V15.3381ZM1.80029 6.28995H11.4919V13.7044H1.80029V6.28995ZM14.803 15.3381H16.4806V4.65625H14.803V15.3381ZM18.1583 4.65625H19.8359V15.3255H18.1583V4.65625Z"> + </g> </defs> </svg> </iron-iconset-svg> \ No newline at end of file
diff --git a/ash/webui/shortcut_customization_ui/resources/js/input_key.html b/ash/webui/shortcut_customization_ui/resources/js/input_key.html index ed0d908..c1de78be 100644 --- a/ash/webui/shortcut_customization_ui/resources/js/input_key.html +++ b/ash/webui/shortcut_customization_ui/resources/js/input_key.html
@@ -37,6 +37,18 @@ color: var(--google-grey-600); font-weight: bold; } + + #key-icon { + height: 14px; + width: 14px; + } </style> -<div id="key" class="key-container">[[key]]</div> \ No newline at end of file +<div id="key" class="key-container"> + <template is="dom-if" if="[[getIconIdForKey(key)]]"> + <iron-icon icon="[[getIconIdForKey(key)]]" id="key-icon"></iron-icon> + </template> + <template is="dom-if" if="[[!getIconIdForKey(key)]]"> + <span id="key-text">[[key]]</span> + </template> +</div> \ No newline at end of file
diff --git a/ash/webui/shortcut_customization_ui/resources/js/input_key.ts b/ash/webui/shortcut_customization_ui/resources/js/input_key.ts index 03be402..4bf8a38 100644 --- a/ash/webui/shortcut_customization_ui/resources/js/input_key.ts +++ b/ash/webui/shortcut_customization_ui/resources/js/input_key.ts
@@ -4,6 +4,7 @@ import 'chrome://resources/cr_elements/cr_shared_style.css.js'; import 'chrome://resources/cr_elements/cr_shared_vars.css.js'; +import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; @@ -18,6 +19,11 @@ ALPHANUMERIC_SELECTED = 'alpha-numeric-selected', } +const keyToIconNameMap: {[key: string]: string} = { + 'PrintScreen': 'overview', + // TODO(cambickel): Add remaining keyboard icons to this map. +}; + /** * @fileoverview * 'input-key' is a component wrapper for a single input key. Responsible for @@ -49,6 +55,20 @@ static get template() { return getTemplate(); } + + private getIconIdForKey(): string|null { + const iconName = keyToIconNameMap[this.key]; + if (iconName) { + return `shortcut-customization:${iconName}`; + } + return null; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'input-key': InputKeyElement; + } } customElements.define(InputKeyElement.is, InputKeyElement);
diff --git a/ash/wm/desks/desks_controller.cc b/ash/wm/desks/desks_controller.cc index 24bea438..7d6026c 100644 --- a/ash/wm/desks/desks_controller.cc +++ b/ash/wm/desks/desks_controller.cc
@@ -523,16 +523,19 @@ } void DesksController::NewDesk(DesksCreationRemovalSource source) { + // We do not want this function to run here when there is no + // `temporary_removed_desk_` because that will incorrectly record metrics. + // We also want to destroy the `temporary_removed_desk_` first in this + // function because we want to ensure that the removing desk's container is + // available for use if we need it for the new desk. + if (temporary_removed_desk_) + MaybeCommitPendingDeskRemoval(); + DCHECK(CanCreateDesks()); DCHECK(!available_container_ids_.empty()); base::AutoReset<bool> in_progress(&are_desks_being_modified_, true); - // We do not want this function to run here when there is no - // `temporary_removed_desk_` because that will incorrectly record metrics. - if (temporary_removed_desk_) - MaybeCommitPendingDeskRemoval(); - // The first default desk should not overwrite any desks restore data, nor // should it trigger any UMA stats reports. const bool is_first_ever_desk = desks_.empty(); @@ -1806,10 +1809,15 @@ // when `native_widget_->CloseNow()` finishes running, the window will // finally be removed from desk. Therefore, to remove the desk now, we have // to manually remove the window from desk now. - // Since floated window doesn't belong to desk container, handle it - // separately. - if (window != floated_window) - removed_desk->RemoveWindowFromDesk(window); + // We also want to ensure that any windows associated with `removed_desk`'s + // container are removed from the container in case we want to immediately + // reuse that container. Since floated window doesn't belong to desk + // container, handle it separately. + if (window != floated_window) { + aura::Window* removed_desk_container = + removed_desk->GetDeskContainerForRoot(window->GetRootWindow()); + removed_desk_container->RemoveChild(window); + } } // Schedules a delayed task to forcefully close all windows that have not
diff --git a/ash/wm/desks/desks_unittests.cc b/ash/wm/desks/desks_unittests.cc index be402de..a6a30f82 100644 --- a/ash/wm/desks/desks_unittests.cc +++ b/ash/wm/desks/desks_unittests.cc
@@ -8113,6 +8113,48 @@ EXPECT_EQ(2u, DesksController::Get()->desks().size()); } +// Tests that we can create the maximum number of desks, remove one, and add one +// before the toast asking if the user would like to undo goes away. +TEST_F(DesksCloseAllTest, CanAddLastDeskWhileUndoToastIsBeingDisplayed) { + auto* controller = DesksController::Get(); + while (controller->desks().size() < desks_util::kMaxNumberOfDesks) + NewDesk(); + ASSERT_EQ(desks_util::kMaxNumberOfDesks, controller->desks().size()); + + // Create a window to ensure that closing windows after removing the last desk + // still occurs correctly. + WindowHolder window(CreateAppWindow()); + const int last_desk_index = desks_util::kMaxNumberOfDesks - 1; + controller->SendToDeskAtIndex(window.window(), last_desk_index); + + EnterOverview(); + ASSERT_TRUE(Shell::Get()->overview_controller()->InOverviewSession()); + + // Remove the last desk with close-all. This should show the undo toast. + RemoveDesk(controller->desks()[last_desk_index].get(), + DeskCloseType::kCloseAllWindowsAndWait); + ASSERT_EQ(desks_util::kMaxNumberOfDesks - 1, controller->desks().size()); + ASSERT_TRUE(DesksTestApi::DesksControllerCanUndoDeskRemoval()); + + // The new desk button should be enabled at this point. + auto* new_desk_button = GetPrimaryRootDesksBarView() + ->expanded_state_new_desk_button() + ->inner_button(); + ASSERT_TRUE(new_desk_button->GetEnabled()); + + // If we click on the `new_desk_button`, we should create a new desk and + // destroy the previously removed desk and the window inside of it. + auto* event_generator = GetEventGenerator(); + ClickOnView(new_desk_button, event_generator); + EXPECT_EQ(desks_util::kMaxNumberOfDesks, controller->desks().size()); + EXPECT_FALSE(DesksTestApi::DesksControllerCanUndoDeskRemoval()); + + // Ensure that the window is still closed properly. + WaitForMilliseconds( + DesksController::kCloseAllWindowCloseTimeout.InMilliseconds()); + EXPECT_FALSE(window.is_valid()); +} + // TODO(afakhry): Add more tests: // - Always on top windows are not tracked by any desk. // - Reusing containers when desks are removed and created.
diff --git a/base/files/file_error_or.h b/base/files/file_error_or.h index b4b0554..5b85139 100644 --- a/base/files/file_error_or.h +++ b/base/files/file_error_or.h
@@ -1,13 +1,10 @@ -// Copyright 2020 The Chromium Authors +// Copyright 2021 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_FILES_FILE_ERROR_OR_H_ #define BASE_FILES_FILE_ERROR_OR_H_ -#include <utility> - -#include "base/check.h" #include "base/files/file.h" #include "base/types/expected.h" @@ -15,33 +12,17 @@ // Helper for methods which perform file system operations and which may fail. // Objects of this type can take on EITHER a base::File::Error value OR a result -// value of the specified type. -template <typename ValueType> -class FileErrorOr { - public: - // These constructors are intentionally not marked `explicit` for cleaner code - // at call sites. - FileErrorOr(File::Error error) : value_or_error_(unexpected(error)) {} - FileErrorOr(ValueType&& value) : value_or_error_(std::move(value)) {} - FileErrorOr(const FileErrorOr&) = default; - FileErrorOr(FileErrorOr&&) = default; - FileErrorOr& operator=(const FileErrorOr&) = default; - FileErrorOr& operator=(FileErrorOr&&) = default; - ~FileErrorOr() = default; - - bool is_error() const { return !value_or_error_.has_value(); } - File::Error error() const { return value_or_error_.error(); } - - bool is_value() const { return value_or_error_.has_value(); } - ValueType& value() { return value_or_error_.value(); } - const ValueType& value() const { return value_or_error_.value(); } - - ValueType* operator->() { return &value(); } - const ValueType* operator->() const { return &value(); } - - private: - expected<ValueType, File::Error> value_or_error_; -}; +// value of the specified type. For example: +// +// base::FileErrorOr<int64_t> GetSize() { +// if (failed_to_get_size) +// return base::unexpected(base::File::Error::FILE_ERROR_FAILED); +// +// return size; +// } +// +template <class ValueType> +using FileErrorOr = expected<ValueType, File::Error>; } // namespace base
diff --git a/base/files/file_error_or_unittest.cc b/base/files/file_error_or_unittest.cc index 9980e88..6945710 100644 --- a/base/files/file_error_or_unittest.cc +++ b/base/files/file_error_or_unittest.cc
@@ -4,31 +4,30 @@ #include "base/files/file_error_or.h" +#include "base/types/expected.h" #include "testing/gtest/include/gtest/gtest.h" namespace base { namespace { TEST(FileErrorOrDeathTest, Error) { - FileErrorOr<int> error(File::Error::FILE_ERROR_FAILED); - EXPECT_TRUE(error.is_error()); - EXPECT_FALSE(error.is_value()); + FileErrorOr<int> error; + error = unexpected(File::Error::FILE_ERROR_FAILED); + EXPECT_FALSE(error.has_value()); EXPECT_EQ(error.error(), File::Error::FILE_ERROR_FAILED); EXPECT_DEATH_IF_SUPPORTED(error.value(), ""); } TEST(FileErrorOrDeathTest, Value) { FileErrorOr<int> value(42); - EXPECT_FALSE(value.is_error()); - EXPECT_TRUE(value.is_value()); + EXPECT_TRUE(value.has_value()); EXPECT_EQ(value.value(), 42); EXPECT_DEATH_IF_SUPPORTED(value.error(), ""); } TEST(FileErrorOrDeathTest, ConstValue) { const FileErrorOr<int> const_value(1234); - EXPECT_FALSE(const_value.is_error()); - EXPECT_TRUE(const_value.is_value()); + EXPECT_TRUE(const_value.has_value()); EXPECT_EQ(const_value.value(), 1234); EXPECT_DEATH_IF_SUPPORTED(const_value.error(), ""); }
diff --git a/build/android/pylib/local/device/local_device_environment.py b/build/android/pylib/local/device/local_device_environment.py index bbb69da1..720aa9d 100644 --- a/build/android/pylib/local/device/local_device_environment.py +++ b/build/android/pylib/local/device/local_device_environment.py
@@ -133,6 +133,7 @@ self._trace_all = None if hasattr(args, 'trace_all'): self._trace_all = args.trace_all + self._use_persistent_shell = args.use_persistent_shell devil_chromium.Initialize( output_directory=constants.GetOutDirectory(), @@ -172,7 +173,8 @@ enable_device_files_cache=self._enable_device_cache, default_retries=self._max_tries - 1, device_arg=device_arg, - abis=self._preferred_abis) + abis=self._preferred_abis, + persistent_shell=self._use_persistent_shell) if self._logcat_output_file: self._logcat_output_dir = tempfile.mkdtemp()
diff --git a/build/android/test_runner.py b/build/android/test_runner.py index 4e87be9..ff776fbd 100755 --- a/build/android/test_runner.py +++ b/build/android/test_runner.py
@@ -315,6 +315,10 @@ action='store_true', dest='upload_logcats_file', help='Whether to upload logcat file to logdog.') + parser.add_argument( + '--use-persistent-shell', + action='store_true', + help='Uses a persistent shell connection for the adb connection.') logcat_output_group = parser.add_mutually_exclusive_group() logcat_output_group.add_argument(
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuTest.java index 5541a84..0fdbd6b 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuTest.java
@@ -16,6 +16,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.chromium.chrome.browser.flags.ChromeFeatureList.GRID_TAB_SWITCHER_FOR_TABLETS; +import static org.chromium.chrome.browser.flags.ChromeFeatureList.TAB_GROUPS_FOR_TABLETS; +import static org.chromium.chrome.browser.flags.ChromeFeatureList.TAB_STRIP_IMPROVEMENTS; import static org.chromium.ui.test.util.ViewUtils.onViewWaiting; import android.content.Context; @@ -29,6 +32,7 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TestRule; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -38,7 +42,6 @@ import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; -import org.chromium.base.test.util.Restriction; import org.chromium.chrome.browser.flags.CachedFeatureFlags; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.tab.Tab; @@ -50,6 +53,7 @@ import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.IconPosition; import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.ShowMode; import org.chromium.chrome.tab_ui.R; +import org.chromium.chrome.test.util.browser.Features; import org.chromium.components.browser_ui.widget.listmenu.ListMenuButton; import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -61,7 +65,6 @@ import org.chromium.ui.test.util.BlankUiTestActivityTestCase; import org.chromium.ui.test.util.RenderTestRule; import org.chromium.ui.test.util.RenderTestRule.Component; -import org.chromium.ui.test.util.UiRestriction; import java.util.ArrayList; import java.util.Arrays; @@ -75,9 +78,9 @@ * classes. */ @RunWith(BaseJUnit4ClassRunner.class) +@Features. +EnableFeatures({GRID_TAB_SWITCHER_FOR_TABLETS, TAB_STRIP_IMPROVEMENTS, TAB_GROUPS_FOR_TABLETS}) @Batch(Batch.UNIT_TESTS) -// TODO(crbug/1371594): Fix test on tablets. -@Restriction({UiRestriction.RESTRICTION_TYPE_PHONE}) public class TabSelectionEditorMenuTest extends BlankUiTestActivityTestCase { private static final int TAB_COUNT = 3; private static final Integer TAB_ID_0 = 0; @@ -93,6 +96,9 @@ .setDescription("Pluralize strings") .build(); + @Rule + public TestRule mProcessor = new Features.JUnitProcessor(); + static class FakeTabSelectionEditorAction extends TabSelectionEditorAction { private boolean mShouldEnableAction = true; private List<Integer> mLastTabIdList;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java index 1884995..049251b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java
@@ -91,6 +91,7 @@ private static final int SPINNER_FADEIN_DURATION_MS = 100; private static final int SPINNER_FADEOUT_DURATION_MS = 400; private static final int NAVBAR_BUTTON_RESTORE_DELAY_MS = 400; + private static final int NAVBAR_BUTTON_HIDE_SHOW_DELAY_MS = 50; private static final String PARAM_LOG_IMMERSIVE_MODE_CONFIRMATIONS = "log_immersive_mode_confirmations"; @VisibleForTesting @@ -886,13 +887,7 @@ } } - private void showNavbarButtons(boolean show) { - // If the feature flag is set to true then we don't want to hide the nav buttons. - if (mWindowAboveNavbar - && ChromeFeatureList.sCctResizableAlwaysShowNavBarButtons.isEnabled()) { - return; - } - + private void changeVisibilityNavbarButtons(boolean show) { View decorView = mActivity.getWindow().getDecorView(); WindowInsetsControllerCompat controller = WindowCompat.getInsetsController(mActivity.getWindow(), decorView); @@ -910,6 +905,28 @@ /*durationMillis*/ 1, null, null, mNavbarTransitionController); } + private void showNavbarButtons(boolean show) { + if (mWindowAboveNavbar + && ChromeFeatureList.sCctResizableAlwaysShowNavBarButtons.isEnabled()) { + // Resizing while the navbar buttons are visible, at times, flashes the host app. + // http://crbug/1360425 fixed this for when the navbar buttons are hidden, so taking + // advantage of that fix by hiding for a bit the navigation buttons, during the time the + // flashing usually occurs. The navbar buttons need to be visible while resizing so that + // the immersive mode confirmation dialog is not displayed, as fixed with + // http://crbug/1360453 + // TODO: http://crbug/1373984 for follow-up on long term solution for fixing host app + // flashing issues. + if (!show) { + changeVisibilityNavbarButtons(false); + new Handler().postDelayed(() -> { + changeVisibilityNavbarButtons(true); + }, NAVBAR_BUTTON_HIDE_SHOW_DELAY_MS); + } + } else { + changeVisibilityNavbarButtons(show); + } + } + // TODO(jinsukkim): Explore the way to use androidx.window.WindowManager or // androidx.window.java.WindowInfoRepoJavaAdapter once the androidx API get finalized and is // available in Chromium to use #getCurrentWindowMetrics()/#currentWindowMetrics() to get the
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java index 3bc6339..97dac88 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java
@@ -123,6 +123,7 @@ /** Main content view. */ private ViewGroup mContentView; + private View mAnchorView; /** Whether the user is now allowed to perform searches. */ private boolean mIsActivityUsable; @@ -184,7 +185,9 @@ // Build the search box. mSearchBox = (SearchActivityLocationBarLayout) mContentView.findViewById( R.id.search_location_bar); - View anchorView = mContentView.findViewById(R.id.toolbar); + mAnchorView = mContentView.findViewById(R.id.toolbar); + updateAnchorViewLayoutForActiveColorFlag(); + OverrideUrlLoadingDelegate overrideUrlLoadingDelegate = (String url, @PageTransition int transition, String postDataType, byte[] postData, boolean incognito) -> { @@ -198,7 +201,7 @@ getOnBackPressedDispatcher().addCallback(this, backPressManager.getCallback()); } // clang-format off - mLocationBarCoordinator = new LocationBarCoordinator(mSearchBox, anchorView, + mLocationBarCoordinator = new LocationBarCoordinator(mSearchBox, mAnchorView, mProfileSupplier, PrivacyPreferencesManagerImpl.getInstance(), mSearchBoxDataProvider, null, new WindowDelegate(getWindow()), getWindowAndroid(), /*activityTabSupplier=*/() -> null, getModalDialogManagerSupplier(), @@ -558,4 +561,25 @@ LocationBarCoordinator getLocationBarCoordinatorForTesting() { return mLocationBarCoordinator; } + + /** + * Increase the toolbar vertical height and bottom padding if the omnibox phase 2 active feature + * flag is enabled. + */ + private void updateAnchorViewLayoutForActiveColorFlag() { + if (!(OmniboxFeatures.shouldShowModernizeVisualUpdate(mAnchorView.getContext()) + && OmniboxFeatures.shouldShowActiveColorOnOmnibox())) { + return; + } + + var layoutParams = mAnchorView.getLayoutParams(); + layoutParams.height = getResources().getDimensionPixelSize(R.dimen.toolbar_height_no_shadow) + + getResources().getDimensionPixelSize(R.dimen.toolbar_url_focus_height_increase); + mAnchorView.setLayoutParams(layoutParams); + + mAnchorView.setPaddingRelative(mAnchorView.getPaddingStart(), mAnchorView.getPaddingTop(), + mAnchorView.getPaddingEnd(), + getResources().getDimensionPixelSize( + R.dimen.toolbar_url_focus_bottom_padding_increase)); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java index 70ed0271..39a807b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java
@@ -42,7 +42,6 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout { private boolean mPendingSearchPromoDecision; private boolean mPendingBeginQuery; - private boolean mHasWindowFocus; public SearchActivityLocationBarLayout(Context context, AttributeSet attrs) { super(context, attrs, R.layout.location_bar_base); @@ -74,8 +73,8 @@ } setBackground(backgroundDrawable); - // Expand status view's left and right space to match the expanded interface on the regular - // omnibox. + // Expand status view's left and right space, and expand the vertical padding of the + // location bar to match the expanded interface on the regular omnibox. setUrlFocusChangePercent(1f); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarSecurityIconTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarSecurityIconTest.java index f7a1c26..85854114 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarSecurityIconTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarSecurityIconTest.java
@@ -20,10 +20,10 @@ import org.junit.rules.TestRule; import org.junit.runner.RunWith; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.chromium.base.ContextUtils; +import org.chromium.base.UserDataHost; import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.UiThreadTest; import org.chromium.base.test.util.Batch; @@ -33,20 +33,21 @@ import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.omnibox.NewTabPageDelegate; import org.chromium.chrome.browser.omnibox.SearchEngineLogoUtils; -import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.TabImpl; +import org.chromium.chrome.browser.tab.TrustedCdn; import org.chromium.chrome.browser.theme.ThemeUtils; import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.test.util.ToolbarUnitTestUtils; import org.chromium.chrome.test.util.browser.Features; -import org.chromium.components.prefs.PrefService; import org.chromium.components.security_state.ConnectionSecurityLevel; import org.chromium.components.security_state.SecurityStateModel; import org.chromium.components.security_state.SecurityStateModelJni; import org.chromium.content_public.browser.test.NativeLibraryTestUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils; +import java.util.concurrent.ExecutionException; + /** * Instrumentation tests for the toolbar security icon. */ @@ -80,25 +81,12 @@ private SearchEngineLogoUtils mSearchEngineLogoUtils; @Mock - private PrefService mMockPrefService; - @Mock private Profile mMockProfile; - - /** - * Set up the lock icon policy for Mock PrefService. - * @param isPolicyEnabled If true, omnibox must show the lock icon. - */ - private void setupLockIconPolicyForTests(boolean isPolicyEnabled) { - Mockito.when(mMockPrefService.isManagedPreference( - ChromePreferenceKeys.LOCK_ICON_IN_ADDRESS_BAR_ENABLED)) - .thenReturn(isPolicyEnabled); - Mockito.when(mMockPrefService.getBoolean( - ChromePreferenceKeys.LOCK_ICON_IN_ADDRESS_BAR_ENABLED)) - .thenReturn(isPolicyEnabled); - } + @Mock + private TrustedCdn mTrustedCdn; @Before - public void setUp() { + public void setUp() throws ExecutionException { MockitoAnnotations.initMocks(this); NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess(); @@ -114,10 +102,12 @@ mSearchEngineLogoUtils)); // clang-format on Profile.setLastUsedProfileForTesting(mMockProfile); - TestThreadUtils.runOnUiThreadBlocking(() -> mLocationBarModel.initializeWithNative()); - - doReturn(mMockPrefService).when(mLocationBarModel).getPrefService(); - setupLockIconPolicyForTests(false); + TestThreadUtils.runOnUiThreadBlocking(() -> { + mLocationBarModel.initializeWithNative(); + UserDataHost userDataHost = new UserDataHost(); + userDataHost.setUserData(TrustedCdn.USER_DATA_KEY, mTrustedCdn); + doReturn(userDataHost).when(mTab).getUserDataHost(); + }); } @Test @@ -125,34 +115,37 @@ @UiThreadTest public void testGetSecurityLevel() { assertEquals(ConnectionSecurityLevel.NONE, - mLocationBarModel.getSecurityLevel(null, !IS_OFFLINE_PAGE, null)); + mLocationBarModel.getSecurityLevel(null, !IS_OFFLINE_PAGE)); assertEquals(ConnectionSecurityLevel.NONE, - mLocationBarModel.getSecurityLevel(null, IS_OFFLINE_PAGE, null)); + mLocationBarModel.getSecurityLevel(null, IS_OFFLINE_PAGE)); assertEquals(ConnectionSecurityLevel.NONE, - mLocationBarModel.getSecurityLevel(mTab, IS_OFFLINE_PAGE, null)); + mLocationBarModel.getSecurityLevel(mTab, IS_OFFLINE_PAGE)); for (int securityLevel : SECURITY_LEVELS) { doReturn(securityLevel).when(mLocationBarModel).getSecurityLevelFromStateModel(any()); assertEquals("Wrong security level returned for " + securityLevel, securityLevel, - mLocationBarModel.getSecurityLevel(mTab, !IS_OFFLINE_PAGE, null)); + mLocationBarModel.getSecurityLevel(mTab, !IS_OFFLINE_PAGE)); } doReturn(ConnectionSecurityLevel.SECURE) .when(mLocationBarModel) .getSecurityLevelFromStateModel(any()); + doReturn("https://example.com").when(mTrustedCdn).getPublisherUrl(); assertEquals("Wrong security level returned for HTTPS publisher URL", ConnectionSecurityLevel.SECURE, - mLocationBarModel.getSecurityLevel(mTab, !IS_OFFLINE_PAGE, "https://example.com")); + mLocationBarModel.getSecurityLevel(mTab, !IS_OFFLINE_PAGE)); + doReturn("http://example.com").when(mTrustedCdn).getPublisherUrl(); assertEquals("Wrong security level returned for HTTP publisher URL", ConnectionSecurityLevel.WARNING, - mLocationBarModel.getSecurityLevel(mTab, !IS_OFFLINE_PAGE, "http://example.com")); + mLocationBarModel.getSecurityLevel(mTab, !IS_OFFLINE_PAGE)); doReturn(ConnectionSecurityLevel.DANGEROUS) .when(mLocationBarModel) .getSecurityLevelFromStateModel(any()); + doReturn(null).when(mTrustedCdn).getPublisherUrl(); assertEquals("Wrong security level returned for publisher URL on insecure page", ConnectionSecurityLevel.DANGEROUS, - mLocationBarModel.getSecurityLevel(mTab, !IS_OFFLINE_PAGE, null)); + mLocationBarModel.getSecurityLevel(mTab, !IS_OFFLINE_PAGE)); } @Test @@ -221,39 +214,6 @@ @Test @SmallTest @UiThreadTest - @Feature({"Omnibox"}) - @Features.EnableFeatures(ChromeFeatureList.OMNIBOX_UPDATED_CONNECTION_SECURITY_INDICATORS) - public void testLockIconPolicyDisabled() { - setupLockIconPolicyForTests(false); - - assertEquals(R.drawable.omnibox_https_valid_arrow, - mLocationBarModel.getSecurityIconResource(ConnectionSecurityLevel.SECURE, - IS_SMALL_DEVICE, !IS_OFFLINE_PAGE, !IS_PAINT_PREVIEW)); - assertEquals(R.drawable.omnibox_https_valid_arrow, - mLocationBarModel.getSecurityIconResource(ConnectionSecurityLevel.SECURE, - !IS_SMALL_DEVICE, !IS_OFFLINE_PAGE, !IS_PAINT_PREVIEW)); - } - - @Test - @SmallTest - @UiThreadTest - @Feature({"Omnibox"}) - @Features.EnableFeatures(ChromeFeatureList.OMNIBOX_UPDATED_CONNECTION_SECURITY_INDICATORS) - public void testLockIconPolicyEnabled() { - setupLockIconPolicyForTests(true); - - // When the policy is enabled, omnibox should keep showing the lock icon. - assertEquals(R.drawable.omnibox_https_valid, - mLocationBarModel.getSecurityIconResource(ConnectionSecurityLevel.SECURE, - IS_SMALL_DEVICE, !IS_OFFLINE_PAGE, !IS_PAINT_PREVIEW)); - assertEquals(R.drawable.omnibox_https_valid, - mLocationBarModel.getSecurityIconResource(ConnectionSecurityLevel.SECURE, - !IS_SMALL_DEVICE, !IS_OFFLINE_PAGE, !IS_PAINT_PREVIEW)); - } - - @Test - @SmallTest - @UiThreadTest public void testGetSecurityIconColorWithSecurityLevel_DangerousWebsite() { assertEquals(R.color.default_red, mLocationBarModel.getSecurityIconColorWithSecurityLevel(
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 59d094ce..909d689 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -12787,6 +12787,12 @@ <message name="IDS_WEBAUTHN_ERROR_WRONG_KEY_REGISTER_DESCRIPTION" desc="Description in the dialog informing the user that they are trying to register a security key (an external physical device for user authentication) that they have already registered with the given web site before."> You already registered this security key. You don't have to register it again. </message> + <message name="IDS_WEBAUTHN_ERROR_WRONG_DEVICE_TITLE" desc="Title of the dialog informing the user that they are trying to register a passkey on a device that they have already registered with the given web site before."> + Try a different device + </message> + <message name="IDS_WEBAUTHN_ERROR_WRONG_DEVICE_REGISTER_DESCRIPTION" desc="Description in the dialog informing the user that they are trying to register a passkey on a device that they have already registered with the given web site before."> + You already registered this device. You don't have to register it again. + </message> <message name="IDS_WEBAUTHN_ERROR_WRONG_KEY_SIGN_DESCRIPTION" desc="Description in the dialog informing the user that they are trying to use the wrong security key (an external physical device for user authentication) to sign in to a given web site, that is, not the one they have previously registered on that site."> You're using a security key that's not registered with this website </message>
diff --git a/chrome/app/generated_resources_grd/IDS_WEBAUTHN_ERROR_WRONG_DEVICE_REGISTER_DESCRIPTION.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBAUTHN_ERROR_WRONG_DEVICE_REGISTER_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..8d849ec --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBAUTHN_ERROR_WRONG_DEVICE_REGISTER_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +3cfd451d63b257a1a6982b3a0b0b5efe54f9c318 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBAUTHN_ERROR_WRONG_DEVICE_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBAUTHN_ERROR_WRONG_DEVICE_TITLE.png.sha1 new file mode 100644 index 0000000..8d849ec --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBAUTHN_ERROR_WRONG_DEVICE_TITLE.png.sha1
@@ -0,0 +1 @@ +3cfd451d63b257a1a6982b3a0b0b5efe54f9c318 \ No newline at end of file
diff --git a/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc b/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc index 143a6219..4d16e525 100644 --- a/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc +++ b/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc
@@ -47,6 +47,7 @@ #include "extensions/common/extension.h" #include "extensions/common/extension_set.h" #include "extensions/common/manifest.h" +#include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h" #include "url/gurl.h" using extensions::ExternalInstallInfoFile; @@ -390,6 +391,9 @@ KioskAppManager::InitializeForTesting(this); + in_process_data_decoder_ = + std::make_unique<data_decoder::test::InProcessDataDecoder>(); + InitializePrimaryAppState(); extensions::ExtensionServiceTestBase::SetUp(); @@ -415,6 +419,7 @@ primary_app_provider_->ServiceShutdown(); secondary_apps_provider_->ServiceShutdown(); external_apps_loader_handler_.reset(); + in_process_data_decoder_.reset(); app_launch_tracker_.reset(); @@ -628,6 +633,9 @@ std::unique_ptr<extensions::ExternalProviderImpl> secondary_apps_provider_; std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_; + + std::unique_ptr<data_decoder::test::InProcessDataDecoder> + in_process_data_decoder_; }; TEST_F(StartupAppLauncherTest, PrimaryAppLaunchFlow) {
diff --git a/chrome/browser/ash/drive/DIR_METADATA b/chrome/browser/ash/drive/DIR_METADATA new file mode 100644 index 0000000..e9400b87 --- /dev/null +++ b/chrome/browser/ash/drive/DIR_METADATA
@@ -0,0 +1 @@ +mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chrome/browser/ash/file_manager/copy_or_move_io_task_impl.cc b/chrome/browser/ash/file_manager/copy_or_move_io_task_impl.cc index 4467330..6462059 100644 --- a/chrome/browser/ash/file_manager/copy_or_move_io_task_impl.cc +++ b/chrome/browser/ash/file_manager/copy_or_move_io_task_impl.cc
@@ -358,7 +358,7 @@ size_t idx, base::FileErrorOr<storage::FileSystemURL> destination_result) { DCHECK(idx < progress_.sources.size()); - if (destination_result.is_error()) { + if (!destination_result.has_value()) { progress_.outputs.emplace_back(progress_.destination_folder, absl::nullopt); OnCopyOrMoveComplete(idx, destination_result.error()); return;
diff --git a/chrome/browser/ash/file_manager/extract_io_task.cc b/chrome/browser/ash/file_manager/extract_io_task.cc index ba7dfcf..1b8b62c 100644 --- a/chrome/browser/ash/file_manager/extract_io_task.cc +++ b/chrome/browser/ash/file_manager/extract_io_task.cc
@@ -172,7 +172,7 @@ base::FileErrorOr<storage::FileSystemURL> destination_result) { DCHECK(index < progress_.sources.size()); const base::FilePath source_file = progress_.sources[index].url.path(); - if (destination_result.is_error()) { + if (!destination_result.has_value()) { ZipExtractCallback(base::FilePath(), false); } else { const base::FilePath destination_directory =
diff --git a/chrome/browser/ash/file_manager/fileapi_util.cc b/chrome/browser/ash/file_manager/fileapi_util.cc index 4fc183c..d4457c82 100644 --- a/chrome/browser/ash/file_manager/fileapi_util.cc +++ b/chrome/browser/ash/file_manager/fileapi_util.cc
@@ -475,7 +475,7 @@ return; } else if (error != base::File::FILE_OK && error != base::File::FILE_ERROR_NOT_A_DIRECTORY) { - std::move(callback).Run(error); + std::move(callback).Run(base::unexpected(error)); return; } @@ -687,7 +687,8 @@ base::OnceCallback<void(base::FileErrorOr<storage::FileSystemURL>)> callback) { if (filename.empty() || filename != filename.BaseName()) { - std::move(callback).Run(base::File::FILE_ERROR_INVALID_OPERATION); + std::move(callback).Run( + base::unexpected(base::File::FILE_ERROR_INVALID_OPERATION)); return; }
diff --git a/chrome/browser/ash/file_manager/fileapi_util_unittest.cc b/chrome/browser/ash/file_manager/fileapi_util_unittest.cc index 7ffcfd485c..fdac5734 100644 --- a/chrome/browser/ash/file_manager/fileapi_util_unittest.cc +++ b/chrome/browser/ash/file_manager/fileapi_util_unittest.cc
@@ -418,12 +418,12 @@ root_url, base::FilePath(target_filename), file_system_context, base::BindLambdaForTesting( [&](base::FileErrorOr<storage::FileSystemURL> result) { - if (expected.is_error()) { - EXPECT_TRUE(result.is_error()) + if (!expected.has_value()) { + EXPECT_FALSE(result.has_value()) << "Unexpected result " << result->ToGURL(); EXPECT_EQ(expected.error(), result.error()); } else { - EXPECT_FALSE(result.is_error()) + EXPECT_TRUE(result.has_value()) << "Unexpected error " << result.error(); EXPECT_EQ(temp_file_system->CreateFileSystemURL(expected.value()) .ToGURL(), @@ -489,9 +489,11 @@ } TEST_F(FileManagerFileAPIUtilTest, GenerateUnusedFilenameInvalidFilename) { - TestGenerateUnusedFilename({}, "", base::File::FILE_ERROR_INVALID_OPERATION); - TestGenerateUnusedFilename({}, "path/with/slashes", - base::File::FILE_ERROR_INVALID_OPERATION); + TestGenerateUnusedFilename( + {}, "", base::unexpected(base::File::FILE_ERROR_INVALID_OPERATION)); + TestGenerateUnusedFilename( + {}, "path/with/slashes", + base::unexpected(base::File::FILE_ERROR_INVALID_OPERATION)); } TEST_F(FileManagerFileAPIUtilTest, GenerateUnusedFilenameFileSystemProvider) { @@ -542,7 +544,7 @@ context, base::BindLambdaForTesting( [&](base::FileErrorOr<storage::FileSystemURL> result) { - EXPECT_FALSE(result.is_error()) + EXPECT_TRUE(result.has_value()) << "Unexpected error " << result.error(); EXPECT_EQ(expected_url.ToGURL(), result->ToGURL()); run_loop.Quit();
diff --git a/chrome/browser/ash/file_manager/restore_io_task.cc b/chrome/browser/ash/file_manager/restore_io_task.cc index 40dce42..2471526 100644 --- a/chrome/browser/ash/file_manager/restore_io_task.cc +++ b/chrome/browser/ash/file_manager/restore_io_task.cc
@@ -128,7 +128,7 @@ void RestoreIOTask::EnsureParentRestorePathExists( size_t idx, base::FileErrorOr<trash::ParsedTrashInfoData> parsed_data) { - if (parsed_data.is_error()) { + if (!parsed_data.has_value()) { progress_.sources[idx].error = parsed_data.error(); Complete(State::kError); return; @@ -180,7 +180,7 @@ storage::FileSystemURL source_url = CreateFileSystemURL(progress_.sources[idx].url, MakeRelativeFromBasePath(trashed_file_location)); - if (destination_result.is_error()) { + if (!destination_result.has_value()) { progress_.outputs.emplace_back(source_url, absl::nullopt); OnRestoreItem(idx, destination_result.error()); return;
diff --git a/chrome/browser/ash/file_manager/restore_to_destination_io_task.cc b/chrome/browser/ash/file_manager/restore_to_destination_io_task.cc index 988331d..f281936 100644 --- a/chrome/browser/ash/file_manager/restore_to_destination_io_task.cc +++ b/chrome/browser/ash/file_manager/restore_to_destination_io_task.cc
@@ -110,7 +110,7 @@ void RestoreToDestinationIOTask::OnTrashInfoParsed( size_t idx, base::FileErrorOr<trash::ParsedTrashInfoData> parsed_data) { - if (parsed_data.is_error()) { + if (!parsed_data.has_value()) { progress_.sources[idx].error = parsed_data.error(); Complete(State::kError); return;
diff --git a/chrome/browser/ash/file_manager/trash_info_validator.cc b/chrome/browser/ash/file_manager/trash_info_validator.cc index 19e476a..9cb43ef 100644 --- a/chrome/browser/ash/file_manager/trash_info_validator.cc +++ b/chrome/browser/ash/file_manager/trash_info_validator.cc
@@ -20,7 +20,7 @@ void RunCallbackWithError(base::File::Error error, ValidateAndParseTrashInfoCallback callback) { - std::move(callback).Run(base::FileErrorOr<ParsedTrashInfoData>(error)); + std::move(callback).Run(base::unexpected(error)); } } // namespace @@ -147,8 +147,7 @@ parsed_data.absolute_restore_path = std::move(absolute_restore_path); parsed_data.deletion_date = std::move(deletion_date); - std::move(callback).Run( - base::FileErrorOr<ParsedTrashInfoData>(std::move(parsed_data))); + std::move(callback).Run(std::move(parsed_data)); } } // namespace file_manager::trash
diff --git a/chrome/browser/ash/file_manager/trash_io_task.cc b/chrome/browser/ash/file_manager/trash_io_task.cc index 0b612e3..118ee56 100644 --- a/chrome/browser/ash/file_manager/trash_io_task.cc +++ b/chrome/browser/ash/file_manager/trash_io_task.cc
@@ -477,7 +477,7 @@ size_t output_idx, const storage::FileSystemURL& files_folder_location, base::FileErrorOr<storage::FileSystemURL> destination_result) { - if (destination_result.is_error()) { + if (!destination_result.has_value()) { progress_.outputs.emplace_back(files_folder_location, absl::nullopt); TrashComplete(source_idx, output_idx, destination_result.error()); return;
diff --git a/chrome/browser/ash/file_manager/zip_io_task.cc b/chrome/browser/ash/file_manager/zip_io_task.cc index ed5f929..a09a5f3 100644 --- a/chrome/browser/ash/file_manager/zip_io_task.cc +++ b/chrome/browser/ash/file_manager/zip_io_task.cc
@@ -195,7 +195,7 @@ // Starts the zip operation. void ZipIOTask::ZipItems( base::FileErrorOr<storage::FileSystemURL> destination_result) { - if (destination_result.is_error()) { + if (!destination_result.has_value()) { progress_.outputs.emplace_back(progress_.destination_folder, destination_result.error()); Complete(State::kError);
diff --git a/chrome/browser/ash/fusebox/DIR_METADATA b/chrome/browser/ash/fusebox/DIR_METADATA new file mode 100644 index 0000000..e9400b87 --- /dev/null +++ b/chrome/browser/ash/fusebox/DIR_METADATA
@@ -0,0 +1 @@ +mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chrome/browser/ash/login/demo_mode/demo_session.cc b/chrome/browser/ash/login/demo_mode/demo_session.cc index 1b0c46f..41ec5d8 100644 --- a/chrome/browser/ash/login/demo_mode/demo_session.cc +++ b/chrome/browser/ash/login/demo_mode/demo_session.cc
@@ -629,6 +629,13 @@ } } +base::FilePath DemoSession::GetDemoAppComponentPath() { + DCHECK(!DemoSession::default_demo_app_component_path_.empty()); + return base::FilePath(GetSwitchOrDefault( + switches::kDemoModeSwaContentDirectory, + DemoSession::default_demo_app_component_path_.value())); +} + void LaunchDemoSystemWebApp() { // SystemWebAppManager won't run this callback if the profile is destroyed, // so we don't need to worry about there being no active user profile @@ -644,7 +651,7 @@ << static_cast<int>(error); return; } - demo_app_component_path_ = path; + default_demo_app_component_path_ = path; Profile* profile = ProfileManager::GetActiveUserProfile(); ash::SystemWebAppManager::Get(profile)->on_apps_synchronized().Post( FROM_HERE, base::BindOnce(&LaunchDemoSystemWebApp));
diff --git a/chrome/browser/ash/login/demo_mode/demo_session.h b/chrome/browser/ash/login/demo_mode/demo_session.h index beba01c..d69d5ed 100644 --- a/chrome/browser/ash/login/demo_mode/demo_session.h +++ b/chrome/browser/ash/login/demo_mode/demo_session.h
@@ -177,10 +177,13 @@ bool started() const { return started_; } - base::FilePath DemoAppComponentPath() { - DCHECK(!demo_app_component_path_.empty()); - return demo_app_component_path_; - } + // Returns the Demo App component path, which defines the directory that the + // Demo Mode SWA should source its content from. + // If the demo-mode-swa-content-directory switch is set, we retrieve the + // content from there. Otherwise, the default location at + // /run/imageloader/demo-mode-app is used. When copying the directory to a + // custom location, make sure the permissions are set to 555. + base::FilePath GetDemoAppComponentPath(); const DemoResources* resources() const { return demo_resources_.get(); } @@ -262,7 +265,7 @@ bool splash_screen_removed_ = false; bool screensaver_activated_ = false; - base::FilePath demo_app_component_path_; + base::FilePath default_demo_app_component_path_; base::WeakPtrFactory<DemoSession> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/ash/login/ui/login_display_mojo.cc b/chrome/browser/ash/login/ui/login_display_mojo.cc index 6d28cef..a3561ef 100644 --- a/chrome/browser/ash/login/ui/login_display_mojo.cc +++ b/chrome/browser/ash/login/ui/login_display_mojo.cc
@@ -79,8 +79,10 @@ // Enable pin and challenge-response authentication for any users who can // use them. for (const user_manager::User* user : filtered_users) { - UpdatePinKeyboardState(user->GetAccountId()); - UpdateChallengeResponseAuthAvailability(user->GetAccountId()); + if (!user->IsDeviceLocalAccount()) { + UpdatePinKeyboardState(user->GetAccountId()); + UpdateChallengeResponseAuthAvailability(user->GetAccountId()); + } } }
diff --git a/chrome/browser/ash/login/users/avatar/user_image_loader.cc b/chrome/browser/ash/login/users/avatar/user_image_loader.cc index 685a637..c8bec3e7 100644 --- a/chrome/browser/ash/login/users/avatar/user_image_loader.cc +++ b/chrome/browser/ash/login/users/avatar/user_image_loader.cc
@@ -16,14 +16,25 @@ #include "base/task/sequenced_task_runner.h" #include "base/task/single_thread_task_runner.h" #include "base/task/task_runner_util.h" +#include "base/task/thread_pool.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/ash/login/helper.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/ui/ash/image_downloader_impl.h" #include "components/user_manager/user_image/user_image.h" +#include "ipc/ipc_channel.h" #include "net/traffic_annotation/network_traffic_annotation.h" +#include "services/data_decoder/public/cpp/data_decoder.h" +#include "services/data_decoder/public/cpp/decode_image.h" +#include "services/data_decoder/public/mojom/image_decoder.mojom.h" +#include "services/network/public/cpp/resource_request.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "services/network/public/cpp/simple_url_loader.h" #include "skia/ext/image_operations.h" #include "third_party/skia/include/core/SkBitmap.h" +#include "third_party/skia/include/encode/SkWebpEncoder.h" #include "ui/gfx/codec/png_codec.h" +#include "ui/gfx/codec/webp_codec.h" #include "ui/gfx/skbitmap_operations.h" #include "url/gurl.h" @@ -31,6 +42,9 @@ namespace user_image_loader { namespace { +constexpr int64_t kMaxImageSizeInBytes = + static_cast<int64_t>(IPC::Channel::kMaximumMessageSize); + // Contains attributes we need to know about each image we decode. struct ImageInfo { ImageInfo(const base::FilePath& file_path, @@ -236,11 +250,112 @@ ImageDecoder::StartWithOptions(image_request, *data, codec, false); } -void OnImageDownloaded(LoadedCallback loaded_cb, - const gfx::ImageSkia& image_skia) { - std::move(loaded_cb).Run(user_manager::UserImage::CreateAndEncode( - image_skia, - user_manager::UserImage::ChooseImageFormat(*image_skia.bitmap()))); +void OnAnimationDecoded( + LoadedCallback loaded_cb, + std::vector<data_decoder::mojom::AnimationFramePtr> mojo_frames) { + auto frame_size = mojo_frames.size(); + if (!frame_size) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(loaded_cb), + std::make_unique<user_manager::UserImage>())); + return; + } + + // Re-encode static image as PNG and send to requester. + if (frame_size == 1) { + base::ThreadPool::PostTaskAndReplyWithResult( + FROM_HERE, + base::BindOnce( + [](const SkBitmap& bitmap) { + auto encoded = base::MakeRefCounted<base::RefCountedBytes>(); + if (!gfx::PNGCodec::EncodeBGRASkBitmap( + bitmap, /*discard_transparency=*/false, + &encoded->data())) { + return std::make_unique<user_manager::UserImage>(); + } + + auto image_skia = gfx::ImageSkia::CreateFrom1xBitmap(bitmap); + image_skia.MakeThreadSafe(); + + auto user_image = std::make_unique<user_manager::UserImage>( + image_skia, encoded, user_manager::UserImage::FORMAT_PNG); + user_image->MarkAsSafe(); + + return user_image; + }, + mojo_frames[0]->bitmap), + std::move(loaded_cb)); + return; + } + + // The image is animated, re-encode as WebP animated image and send to + // requester. + std::vector<gfx::WebpCodec::Frame> frames; + for (auto& mojo_frame : mojo_frames) { + gfx::WebpCodec::Frame frame; + frame.bitmap = mojo_frame->bitmap; + frame.duration = mojo_frame->duration.InMilliseconds(); + frames.push_back(frame); + } + + base::ThreadPool::PostTaskAndReplyWithResult( + FROM_HERE, + base::BindOnce( + [](const std::vector<gfx::WebpCodec::Frame>& frames) { + SkWebpEncoder::Options options; + options.fCompression = SkWebpEncoder::Compression::kLossless; + // Lower quality under kLossless compression means compress faster + // into larger files. + options.fQuality = 0; + + auto encoded = gfx::WebpCodec::EncodeAnimated(frames, options); + if (!encoded.has_value()) { + return std::make_unique<user_manager::UserImage>(); + } + + auto image_skia = + gfx::ImageSkia::CreateFrom1xBitmap(frames[0].bitmap); + image_skia.MakeThreadSafe(); + + auto bytes = + base::MakeRefCounted<base::RefCountedBytes>(encoded.value()); + + auto user_image = std::make_unique<user_manager::UserImage>( + image_skia, bytes, user_manager::UserImage::FORMAT_WEBP); + user_image->MarkAsSafe(); + + return user_image; + }, + std::move(frames)), + std::move(loaded_cb)); +} + +void DecodeAnimation(LoadedCallback loaded_cb, base::StringPiece data) { + if (data.empty()) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(loaded_cb), + std::make_unique<user_manager::UserImage>())); + return; + } + + base::span<const uint8_t> bytes = base::make_span( + reinterpret_cast<const uint8_t*>(data.data()), data.size()); + + data_decoder::DecodeAnimationIsolated( + bytes, /*shrink_to_fit=*/true, kMaxImageSizeInBytes, + base::BindOnce(&OnAnimationDecoded, std::move(loaded_cb))); +} + +void OnImageDownloaded(std::unique_ptr<network::SimpleURLLoader> loader, + LoadedCallback loaded_cb, + std::unique_ptr<std::string> body) { + if (loader->NetError() != net::OK || !body) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(loaded_cb), + std::make_unique<user_manager::UserImage>())); + return; + } + DecodeAnimation(std::move(loaded_cb), *body); } } // namespace @@ -272,16 +387,30 @@ background_task_runner, data.get(), true /* data_is_ready */); } +void StartWithDataAnimated(base::StringPiece data, LoadedCallback loaded_cb) { + DecodeAnimation(std::move(loaded_cb), data); +} + +void StartWithFilePathAnimated(const base::FilePath& file_path, + LoadedCallback loaded_cb) { + base::ThreadTaskRunnerHandle::Get()->PostTaskAndReplyWithResult( + FROM_HERE, + base::BindOnce( + [](const base::FilePath& file_path) { + std::string data; + if (!base::ReadFileToString(file_path, &data)) { + return std::string(); + } + return data; + }, + file_path), + base::BindOnce(&DecodeAnimation, std::move(loaded_cb))); +} + // Used to load user images from GURL, specifically in the case of // retrieving images from the cloud. -void StartWithGURL(const GURL& default_image_url, LoadedCallback loaded_cb) { - if (!ash::ImageDownloader::Get()) { - LOG(ERROR) << "Could not retrieve image downloader for user image"; - return; - } - - ash::ImageDownloader::DownloadCallback download_callback = - base::BindOnce(&OnImageDownloaded, std::move(loaded_cb)); +void StartWithGURLAnimated(const GURL& default_image_url, + LoadedCallback loaded_cb) { constexpr net::NetworkTrafficAnnotationTag kNetworkTrafficAnnotationTag = net::DefineNetworkTrafficAnnotation("user_image_downloader", R"( semantics: { @@ -303,9 +432,25 @@ policy_exception_justification: "Not implemented." })"); - ash::ImageDownloader::Get()->Download(default_image_url, - kNetworkTrafficAnnotationTag, - std::move(download_callback)); + auto request = std::make_unique<network::ResourceRequest>(); + request->url = default_image_url; + request->credentials_mode = network::mojom::CredentialsMode::kOmit; + + auto loader = network::SimpleURLLoader::Create(std::move(request), + kNetworkTrafficAnnotationTag); + loader->SetRetryOptions( + /*max_retries=*/5, + network::SimpleURLLoader::RetryMode::RETRY_ON_5XX | + network::SimpleURLLoader::RETRY_ON_NETWORK_CHANGE | + network::SimpleURLLoader::RETRY_ON_NAME_NOT_RESOLVED); + + auto* loader_ptr = loader.get(); + loader_ptr->DownloadToString( + g_browser_process->shared_url_loader_factory().get(), + base::BindOnce(&OnImageDownloaded, std::move(loader), + std::move(loaded_cb)), + network::SimpleURLLoader::kMaxBoundedStringDownloadSize); } + } // namespace user_image_loader } // namespace ash
diff --git a/chrome/browser/ash/login/users/avatar/user_image_loader.h b/chrome/browser/ash/login/users/avatar/user_image_loader.h index a288e24..9a717f9 100644 --- a/chrome/browser/ash/login/users/avatar/user_image_loader.h +++ b/chrome/browser/ash/login/users/avatar/user_image_loader.h
@@ -50,10 +50,20 @@ int pixels_per_side, LoadedCallback loaded_cb); -// Loads the default image fetched from `default_image_url` and calls -// `loaded_cb` with the resulting UserImage (which may be empty in case of -// error). -void StartWithGURL(const GURL& default_image_url, LoadedCallback loaded_cb); +// Loads user image from provided |data| bytes. If the image is animated, encode +// with WebP encoder, otherwise encode with PNG encoder. +void StartWithDataAnimated(base::StringPiece data, LoadedCallback loaded_cb); + +// Loads user image from |file_path|. If the image is animated, encode with WebP +// encoder, otherwise encode with PNG encoder. +// TODO(b/251083485): Add support for external image from file. +void StartWithFilePathAnimated(const base::FilePath& file_path, + LoadedCallback loaded_cb); + +// Loads the default image fetched from |default_image_url|. If the image is +// animated, encode with WebP encoder, otherwise encode with PNG encoder. +void StartWithGURLAnimated(const GURL& default_image_url, + LoadedCallback loaded_cb); } // namespace user_image_loader } // namespace ash
diff --git a/chrome/browser/ash/login/users/avatar/user_image_manager_browsertest.cc b/chrome/browser/ash/login/users/avatar/user_image_manager_browsertest.cc index 296f72b..1ab0ce4 100644 --- a/chrome/browser/ash/login/users/avatar/user_image_manager_browsertest.cc +++ b/chrome/browser/ash/login/users/avatar/user_image_manager_browsertest.cc
@@ -371,6 +371,8 @@ const gfx::ImageSkia& default_image = default_user_image::GetDefaultImageDeprecated( default_user_image::kFirstDefaultImageIndex); + auto scale = + ui::ResourceBundle::GetSharedInstance().GetMaxResourceScaleFactor(); run_loop_ = std::make_unique<base::RunLoop>(); UserImageManager* user_image_manager = @@ -381,10 +383,17 @@ EXPECT_TRUE(user->HasDefaultImage()); EXPECT_EQ(default_user_image::kFirstDefaultImageIndex, user->image_index()); - EXPECT_TRUE(test::AreImagesEqual(default_image, user->GetImage())); + ExpectUserImageInfo(test_account_id1_, default_user_image::kFirstDefaultImageIndex, - GetUserImagePath(test_account_id1_, "jpg")); + GetUserImagePath(test_account_id1_, "png")); + + // Check image dimensions. Images can't be compared since we decode and + // re-encode the image bytes. + EXPECT_EQ(default_image.GetRepresentation(scale).pixel_width(), + user->GetImage().width()); + EXPECT_EQ(default_image.GetRepresentation(scale).pixel_height(), + user->GetImage().height()); } // Verifies that SaveUserImage() correctly sets and persists the chosen user @@ -730,6 +739,8 @@ const gfx::ImageSkia& default_image = default_user_image::GetDefaultImageDeprecated( default_user_image::kFirstDefaultImageIndex); + auto scale = + ui::ResourceBundle::GetSharedInstance().GetMaxResourceScaleFactor(); run_loop_ = std::make_unique<base::RunLoop>(); UserImageManager* user_image_manager = @@ -740,10 +751,16 @@ EXPECT_TRUE(user->HasDefaultImage()); EXPECT_EQ(default_user_image::kFirstDefaultImageIndex, user->image_index()); - EXPECT_TRUE(test::AreImagesEqual(default_image, user->GetImage())); + ExpectUserImageInfo(enterprise_account_id_, default_user_image::kFirstDefaultImageIndex, - GetUserImagePath(enterprise_account_id_, "jpg")); + GetUserImagePath(enterprise_account_id_, "png")); + // Check image dimensions. Images can't be compared since we decode and + // re-encode the image bytes. + EXPECT_EQ(default_image.GetRepresentation(scale).pixel_width(), + user->GetImage().width()); + EXPECT_EQ(default_image.GetRepresentation(scale).pixel_height(), + user->GetImage().height()); // Set policy. Verify that the policy-provided user image is downloaded, set // and persisted, overriding the previously set image.
diff --git a/chrome/browser/ash/login/users/avatar/user_image_manager_impl.cc b/chrome/browser/ash/login/users/avatar/user_image_manager_impl.cc index a503cf2..a425ff43 100644 --- a/chrome/browser/ash/login/users/avatar/user_image_manager_impl.cc +++ b/chrome/browser/ash/login/users/avatar/user_image_manager_impl.cc
@@ -104,6 +104,8 @@ return ".jpg"; case user_manager::UserImage::FORMAT_PNG: return ".png"; + case user_manager::UserImage::FORMAT_WEBP: + return ".webp"; default: NOTREACHED() << "Invalid format: " << image_format; return ".jpg"; @@ -288,30 +290,30 @@ !base::DirectoryExists(image_path_)) { // Will refactor to remove this redundant call after the feature flag // IsAvatarsCloudMigrationEnabled is no longer needed. - user_image_loader::StartWithFilePath( - parent_->background_task_runner_, image_path_, - ChooseCodecFromPath(image_path_), - 0, // Do not crop. - base::BindOnce(&Job::OnLoadImageDone, weak_factory_.GetWeakPtr(), - false)); + user_image_loader::StartWithFilePathAnimated( + image_path_, base::BindOnce(&Job::OnLoadImageDone, + weak_factory_.GetWeakPtr(), false)); } else { // Fetch the default image from cloud before caching it. image_url_ = default_user_image::GetDefaultImageUrl(image_index_); - user_image_loader::StartWithGURL( + user_image_loader::StartWithGURLAnimated( image_url_, base::BindOnce(&Job::OnLoadImageDone, weak_factory_.GetWeakPtr(), true)); } } else { - gfx::ImageSkia default_image = - default_user_image::GetDefaultImageDeprecated(image_index_); - std::unique_ptr<user_manager::UserImage> user_image( - user_manager::UserImage::CreateAndEncode( - default_image, user_manager::UserImage::ChooseImageFormat( - *default_image.bitmap()))); + auto& resource_bundle = ui::ResourceBundle::GetSharedInstance(); + auto data = resource_bundle.GetRawDataResourceForScale( + default_user_image::GetDefaultImageResourceId(image_index_), + resource_bundle.GetMaxResourceScaleFactor()); + // Cache the in-use default image as part of the migration of avatar // images to cloud. - UpdateUserAndSaveImage(std::move(user_image)); + user_image_loader::StartWithDataAnimated( + data, + base::BindOnce(&Job::OnLoadImageDone, weak_factory_.GetWeakPtr(), + /*save=*/true)); } + } else if (image_index_ == user_manager::User::USER_IMAGE_EXTERNAL || image_index_ == user_manager::User::USER_IMAGE_PROFILE) { // Load the user image from a file referenced by `image_path`. This happens @@ -341,21 +343,20 @@ if (ash::features::IsAvatarsCloudMigrationEnabled()) { // Fetch the default image from cloud before caching it. image_url_ = default_user_image::GetDefaultImageUrl(image_index_); - user_image_loader::StartWithGURL( + user_image_loader::StartWithGURLAnimated( image_url_, base::BindOnce(&Job::OnLoadImageDone, weak_factory_.GetWeakPtr(), true)); } else { - gfx::ImageSkia default_image = - default_user_image::GetDefaultImageDeprecated(image_index_); - std::unique_ptr<user_manager::UserImage> user_image( - user_manager::UserImage::CreateAndEncode( - default_image, user_manager::UserImage::ChooseImageFormat( - *default_image.bitmap()))); + auto& resource_bundle = ui::ResourceBundle::GetSharedInstance(); + auto data = resource_bundle.GetRawDataResourceForScale( + default_user_image::GetDefaultImageResourceId(image_index_), + resource_bundle.GetMaxResourceScaleFactor()); - // Now that default images are served from the cloud, the current in-use - // user avatar image needs to be saved and cached in local state for - // offline usage. - UpdateUserAndSaveImage(std::move(user_image)); + // Cache the in-use default image as part of the migration of avatar + // images to cloud. + user_image_loader::StartWithDataAnimated( + data, base::BindOnce(&Job::OnLoadImageDone, weak_factory_.GetWeakPtr(), + /*save=*/true)); } }
diff --git a/chrome/browser/ash/login/users/user_manager_unittest.cc b/chrome/browser/ash/login/users/user_manager_unittest.cc index 3d4bfe9..0d07ff1 100644 --- a/chrome/browser/ash/login/users/user_manager_unittest.cc +++ b/chrome/browser/ash/login/users/user_manager_unittest.cc
@@ -38,6 +38,7 @@ #include "content/public/test/browser_task_environment.h" #include "extensions/common/features/feature_session_type.h" #include "extensions/common/mojom/feature_session_type.mojom.h" +#include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -146,9 +147,13 @@ wallpaper_controller_client_ = std::make_unique<WallpaperControllerClientImpl>(); wallpaper_controller_client_->InitForTesting(&test_wallpaper_controller_); + + in_process_data_decoder_ = + std::make_unique<data_decoder::test::InProcessDataDecoder>(); } void TearDown() override { + in_process_data_decoder_.reset(); wallpaper_controller_client_.reset(); // Shut down the DeviceSettingsService. @@ -234,6 +239,8 @@ session_type_; std::unique_ptr<WallpaperControllerClientImpl> wallpaper_controller_client_; TestWallpaperController test_wallpaper_controller_; + std::unique_ptr<data_decoder::test::InProcessDataDecoder> + in_process_data_decoder_; content::BrowserTaskEnvironment task_environment_;
diff --git a/chrome/browser/ash/smb_client/DIR_METADATA b/chrome/browser/ash/smb_client/DIR_METADATA index 5345fc2..e9400b87 100644 --- a/chrome/browser/ash/smb_client/DIR_METADATA +++ b/chrome/browser/ash/smb_client/DIR_METADATA
@@ -1,3 +1 @@ -monorail: { - component: "Platform>Apps>FileManager" -} +mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.cc index 0471da7..7fd2f2b 100644 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.cc +++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.cc
@@ -24,6 +24,15 @@ namespace ash::personalization_app { +namespace { +KeyboardBacklightColorController* GetKeyboardBacklightColorController() { + auto* keyboard_backlight_color_controller = + ash::Shell::Get()->keyboard_backlight_color_controller(); + DCHECK(keyboard_backlight_color_controller); + return keyboard_backlight_color_controller; +} +} // namespace + PersonalizationAppKeyboardBacklightProviderImpl:: PersonalizationAppKeyboardBacklightProviderImpl(content::WebUI* web_ui) : profile_(Profile::FromWebUI(web_ui)) {} @@ -92,23 +101,6 @@ } void PersonalizationAppKeyboardBacklightProviderImpl:: - SetKeyboardBacklightColorControllerForTesting( - KeyboardBacklightColorController* controller) { - keyboard_backlight_color_controller_for_testing_ = controller; -} - -KeyboardBacklightColorController* -PersonalizationAppKeyboardBacklightProviderImpl:: - GetKeyboardBacklightColorController() { - if (keyboard_backlight_color_controller_for_testing_) - return keyboard_backlight_color_controller_for_testing_; - auto* keyboard_backlight_color_controller = - ash::Shell::Get()->keyboard_backlight_color_controller(); - DCHECK(keyboard_backlight_color_controller); - return keyboard_backlight_color_controller; -} - -void PersonalizationAppKeyboardBacklightProviderImpl:: NotifyBacklightColorChanged() { DCHECK(keyboard_backlight_observer_remote_.is_bound()); keyboard_backlight_observer_remote_->OnBacklightColorChanged(
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.h b/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.h index fd047ac..05db719 100644 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.h +++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.h
@@ -7,7 +7,6 @@ #include "ash/public/cpp/wallpaper/wallpaper_controller.h" #include "ash/public/cpp/wallpaper/wallpaper_controller_observer.h" -#include "ash/system/keyboard_brightness/keyboard_backlight_color_controller.h" #include "ash/webui/personalization_app/mojom/personalization_app.mojom.h" #include "ash/webui/personalization_app/personalization_app_keyboard_backlight_provider.h" #include "base/scoped_observation.h" @@ -53,23 +52,13 @@ // WallpaperControllerObserver: void OnWallpaperColorsChanged() override; - // Tests can provide the controller in case it is not initialized in - // ash::Shell. - void SetKeyboardBacklightColorControllerForTesting( - KeyboardBacklightColorController* controller); - private: - KeyboardBacklightColorController* GetKeyboardBacklightColorController(); - // Notify webUI the current state of backlight color. void NotifyBacklightColorChanged(); // Pointer to profile of user that opened personalization SWA. Not owned. raw_ptr<Profile> const profile_ = nullptr; - raw_ptr<KeyboardBacklightColorController> - keyboard_backlight_color_controller_for_testing_; - mojo::Receiver<mojom::KeyboardBacklightProvider> keyboard_backlight_receiver_{ this};
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl_unittest.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl_unittest.cc index 619d192..6100e52 100644 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl_unittest.cc +++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl_unittest.cc
@@ -4,10 +4,7 @@ #include "chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.h" -#include <memory> - #include "ash/constants/ash_features.h" -#include "ash/system/keyboard_brightness/keyboard_backlight_color_controller.h" #include "ash/webui/personalization_app/mojom/personalization_app.mojom.h" #include "base/test/metrics/histogram_tester.h" #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" @@ -104,16 +101,11 @@ keyboard_backlight_provider_ = std::make_unique<PersonalizationAppKeyboardBacklightProviderImpl>( &web_ui_); - keyboard_backlight_color_controller_ = - std::make_unique<KeyboardBacklightColorController>(); - keyboard_backlight_provider_->SetKeyboardBacklightColorControllerForTesting( - keyboard_backlight_color_controller_.get()); keyboard_backlight_provider_->BindInterface( keyboard_backlight_provider_remote_.BindNewPipeAndPassReceiver()); } void TearDown() override { - keyboard_backlight_color_controller_.reset(); keyboard_backlight_provider_.reset(); ChromeAshTestBase::TearDown(); } @@ -156,8 +148,6 @@ content::TestWebUI web_ui_; std::unique_ptr<content::WebContents> web_contents_; TestingProfile* profile_; - std::unique_ptr<KeyboardBacklightColorController> - keyboard_backlight_color_controller_; mojo::Remote<ash::personalization_app::mojom::KeyboardBacklightProvider> keyboard_backlight_provider_remote_; std::unique_ptr<PersonalizationAppKeyboardBacklightProviderImpl>
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl_unittest.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl_unittest.cc index e7c7fe1..9006388e 100644 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl_unittest.cc +++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl_unittest.cc
@@ -39,6 +39,7 @@ #include "mojo/public/cpp/base/big_buffer.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" +#include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/skia/include/core/SkColor.h" @@ -182,6 +183,9 @@ user_provider_->BindInterface( user_provider_remote_.BindNewPipeAndPassReceiver()); + + in_process_data_decoder_ = + std::make_unique<data_decoder::test::InProcessDataDecoder>(); } TestingProfile* profile() { return profile_; } @@ -242,6 +246,8 @@ const base::HistogramTester& histogram_tester() { return histogram_tester_; } + void RunUntilIdle() { task_environment_.RunUntilIdle(); } + private: base::test::ScopedFeatureList scoped_feature_list_; content::BrowserTaskEnvironment task_environment_; @@ -255,6 +261,8 @@ user_provider_remote_; std::unique_ptr<PersonalizationAppUserProviderImpl> user_provider_; base::HistogramTester histogram_tester_; + std::unique_ptr<data_decoder::test::InProcessDataDecoder> + in_process_data_decoder_; }; TEST_F(PersonalizationAppUserProviderImplTest, GetsUserInfo) { @@ -283,6 +291,7 @@ // Select a default image. int image_index = ash::default_user_image::GetRandomDefaultImageIndex(); user_image_manager()->SaveUserDefaultImageIndex(image_index); + RunUntilIdle(); // Observer received the updated image information. Because it is a default // image, receives a default image with the right index. @@ -297,6 +306,7 @@ int image_index = ash::default_user_image::GetRandomDefaultImageIndex(); user_provider_remote()->get()->SelectDefaultImage(image_index); user_provider_remote()->FlushForTesting(); + RunUntilIdle(); // Observer received the updated user image of type default with the right // index. @@ -370,6 +380,7 @@ user_provider_remote()->get()->SelectDefaultImage(image_index); user_provider_remote()->FlushForTesting(); + RunUntilIdle(); // Bucket count is incremented after selecting this default image. histogram_tester().ExpectBucketCount( @@ -379,6 +390,7 @@ // Select the same image again. user_provider_remote()->get()->SelectDefaultImage(image_index); user_provider_remote()->FlushForTesting(); + RunUntilIdle(); // Bucket count is not incremented. histogram_tester().ExpectBucketCount( @@ -423,6 +435,7 @@ // Select a default image first to make sure profile is not selected. user_provider_remote()->get()->SelectDefaultImage( ash::default_user_image::GetRandomDefaultImageIndex()); + RunUntilIdle(); // Now select profile. user_provider_remote()->get()->SelectProfileImage(); user_provider_remote()->FlushForTesting(); @@ -457,6 +470,7 @@ user_provider_remote()->get()->SelectDefaultImage( ash::default_user_image::GetRandomDefaultImageIndex()); user_provider_remote()->FlushForTesting(); + RunUntilIdle(); histogram_tester().ExpectBucketCount( ash::UserImageManager::kUserImageChangedHistogramName, @@ -499,6 +513,7 @@ user_image_manager()->SaveUserDefaultImageIndex( kDeprecatedImageWithSourceInfoIndex); SetUserImageObserver(); + RunUntilIdle(); absl::optional<default_user_image::DeprecatedSourceInfo> expected_source_info =
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc index 6819050..2bb5849 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
@@ -2038,7 +2038,7 @@ url::Origin origin = render_frame_host()->GetLastCommittedOrigin(); for (auto& trash_info_data : parsed_data) { - if (trash_info_data.is_error()) { + if (!trash_info_data.has_value()) { LOG(ERROR) << "Failed parsing trashinfo file: " << trash_info_data.error(); continue;
diff --git a/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc b/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc index eefbbe2..915f5d4 100644 --- a/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc +++ b/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc
@@ -359,6 +359,13 @@ << message_; } +IN_PROC_BROWSER_TEST_F(FileSystemProviderServiceWorkerApiTest, Configure) { + ASSERT_TRUE(RunExtensionTest("file_system_provider/service_worker/configure", + {.extension_url = "test.html"}, + {.load_as_component = true})) + << message_; +} + IN_PROC_BROWSER_TEST_F(FileSystemProviderServiceWorkerApiTest, CopyEntry) { ASSERT_TRUE(RunExtensionTest("file_system_provider/service_worker/copy_entry", {.extension_url = "test.html"}, @@ -373,6 +380,13 @@ << message_; } +IN_PROC_BROWSER_TEST_F(FileSystemProviderServiceWorkerApiTest, MoveEntry) { + ASSERT_TRUE(RunExtensionTest("file_system_provider/service_worker/move_entry", + {.extension_url = "test.html"}, + {.load_as_component = true})) + << message_; +} + IN_PROC_BROWSER_TEST_F(FileSystemProviderServiceWorkerApiTest, GetAll) { ASSERT_TRUE(RunExtensionTest("file_system_provider/service_worker/get_all", {.extension_url = "test.html"},
diff --git a/chrome/browser/chromeos/extensions/wm/wm_desks_private_api.cc b/chrome/browser/chromeos/extensions/wm/wm_desks_private_api.cc index 6934294..e9efe52 100644 --- a/chrome/browser/chromeos/extensions/wm/wm_desks_private_api.cc +++ b/chrome/browser/chromeos/extensions/wm/wm_desks_private_api.cc
@@ -8,6 +8,7 @@ #include "ash/public/cpp/desk_template.h" #include "ash/wm/desks/desk.h" +#include "base/metrics/histogram_functions.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "chrome/browser/profiles/profile.h" @@ -19,6 +20,11 @@ namespace { constexpr char kInvalidUuidError[] = "Invalid template UUID."; +constexpr char kInvalidDeskIdError[] = "The desk identifier is not valid."; +constexpr char kApiLaunchDeskResult[] = "Ash.DeskApi.LaunchDesk.Result"; +constexpr char kApiRemoveDeskResult[] = "Ash.DeskApi.RemoveDesk.Result"; +constexpr char kApiSwitchDeskResult[] = "Ash.DeskApi.SwitchDesk.Result"; +constexpr char kApiAllDeskResult[] = "Ash.DeskApi.AllDesk.Result"; api::wm_desks_private::Desk FromAshDesk(const ash::Desk& ash_desk) { api::wm_desks_private::Desk target; @@ -94,10 +100,11 @@ std::string error_string, const base::GUID& desk_uuid) { if (!error_string.empty()) { + base::UmaHistogramBoolean(kApiLaunchDeskResult, false); Respond(Error(std::move(error_string))); return; } - + base::UmaHistogramBoolean(kApiLaunchDeskResult, true); Respond(ArgumentList(api::wm_desks_private::LaunchDesk::Results::Create( desk_uuid.AsLowercaseString()))); } @@ -119,10 +126,12 @@ void WmDesksPrivateRemoveDeskFunction::OnRemoveDesk(std::string error_string) { if (!error_string.empty()) { + base::UmaHistogramBoolean(kApiRemoveDeskResult, false); Respond(Error(std::move(error_string))); return; } + base::UmaHistogramBoolean(kApiRemoveDeskResult, true); Respond(NoArguments()); } @@ -175,9 +184,11 @@ void WmDesksPrivateSetWindowPropertiesFunction::OnSetWindowProperties( std::string error_string) { if (!error_string.empty()) { + base::UmaHistogramBoolean(kApiAllDeskResult, false); Respond(Error(std::move(error_string))); return; } + base::UmaHistogramBoolean(kApiAllDeskResult, true); Respond(NoArguments()); } @@ -303,9 +314,10 @@ api::wm_desks_private::SwitchDesk::Params::Create(args())); EXTENSION_FUNCTION_VALIDATE(params); base::GUID uuid = base::GUID::ParseCaseInsensitive(params->desk_uuid); - if (!uuid.is_valid()) - return RespondNow(Error(kInvalidUuidError)); - + if (!uuid.is_valid()) { + base::UmaHistogramBoolean(kApiSwitchDeskResult, false); + return RespondNow(Error(kInvalidDeskIdError)); + } std::string error = DesksClient::Get()->SwitchDesk(uuid); OnSwitchDesk(error); return AlreadyResponded(); @@ -314,9 +326,11 @@ // The interface is to keep compatible with future lacros implementation. void WmDesksPrivateSwitchDeskFunction::OnSwitchDesk(std::string error_string) { if (!error_string.empty()) { + base::UmaHistogramBoolean(kApiSwitchDeskResult, false); Respond(Error(std::move(error_string))); return; } + base::UmaHistogramBoolean(kApiSwitchDeskResult, true); Respond(NoArguments()); }
diff --git a/chrome/browser/chromeos/extensions/wm/wm_desks_private_apitest.cc b/chrome/browser/chromeos/extensions/wm/wm_desks_private_apitest.cc index f6d7295..56ed576 100644 --- a/chrome/browser/chromeos/extensions/wm/wm_desks_private_apitest.cc +++ b/chrome/browser/chromeos/extensions/wm/wm_desks_private_apitest.cc
@@ -7,6 +7,7 @@ #include "ash/wm/desks/desks_test_util.h" #include "base/guid.h" #include "base/memory/scoped_refptr.h" +#include "base/test/metrics/histogram_tester.h" #include "build/build_config.h" #include "chrome/browser/chromeos/extensions/wm/wm_desks_private_api.h" #include "chrome/browser/extensions/extension_apitest.h" @@ -49,6 +50,7 @@ base::MakeRefCounted<WmDesksPrivateLaunchDeskFunction>(); ash::DeskSwitchAnimationWaiter launch_waiter; + base::HistogramTester histogram_tester; // The RunFunctionAndReturnSingleResult already asserts no error auto desk_id = extension_function_test_utils::RunFunctionAndReturnSingleResult( @@ -57,6 +59,7 @@ EXPECT_TRUE( base::GUID::ParseCaseInsensitive(desk_id->GetString()).is_valid()); + histogram_tester.ExpectBucketCount("Ash.DeskApi.LaunchDesk.Result", 1, 1); // Waiting for desk launch animation to settle // The check is necessary as both desk animation and extension function is // async. There is no guarantee which ones execute first. @@ -73,6 +76,7 @@ R"([")" + desk_id->GetString() + R"(", { "combineDesks": false }])", new_browser); + histogram_tester.ExpectBucketCount("Ash.DeskApi.RemoveDesk.Result", 1, 1); // Waiting for desk removal animation to settle if (ash::DesksController::Get()->AreDesksBeingModified()) { remove_waiter.Wait(); @@ -112,7 +116,7 @@ // Tests switch to different desk show trigger animation. IN_PROC_BROWSER_TEST_F(WmDesksPrivateApiTest, SwitchToDifferentDeskTest) { Browser* new_browser = CreateBrowser(browser()->profile()); - + base::HistogramTester histogram_tester; // Get the active desk. auto get_active_desk_function = base::MakeRefCounted<WmDesksPrivateGetActiveDeskFunction>(); @@ -136,6 +140,7 @@ EXPECT_TRUE(desk_id_1->is_string()); EXPECT_TRUE( base::GUID::ParseCaseInsensitive(desk_id_1->GetString()).is_valid()); + histogram_tester.ExpectBucketCount("Ash.DeskApi.LaunchDesk.Result", 1, 1); // Waiting for desk launch animation to settle if (ash::DesksController::Get()->AreDesksBeingModified()) { @@ -164,6 +169,7 @@ get_active_desk_function_.get(), "[]", new_browser); EXPECT_TRUE(desk_id_2->is_string()); EXPECT_EQ(desk_id->GetString(), desk_id_2->GetString()); + histogram_tester.ExpectBucketCount("Ash.DeskApi.SwitchDesk.Result", 1, 1); } // Tests switch to current desk should skip animation. @@ -197,4 +203,74 @@ EXPECT_TRUE(desk_id_1->is_string()); EXPECT_EQ(desk_id->GetString(), desk_id_1->GetString()); } + +// Tests launch desks failed. +IN_PROC_BROWSER_TEST_F(WmDesksPrivateApiTest, + LaunchDeskWhenMaxNumberExceedTest) { + Browser* new_browser = CreateBrowser(browser()->profile()); + + // Max number of desks allowed is 8. + const int kMaxDeskIndex = 7; + for (int i = 0; i < kMaxDeskIndex; i++) { + ash::DesksController::Get()->NewDesk(ash::DesksCreationRemovalSource::kApi); + } + + // Launch a desk. + auto launch_desk_function = + base::MakeRefCounted<WmDesksPrivateLaunchDeskFunction>(); + + base::HistogramTester histogram_tester; + // The RunFunctionAndReturnSingleResult already asserts no error + auto error = extension_function_test_utils::RunFunctionAndReturnError( + launch_desk_function.get(), R"([{"deskName":"test"}])", new_browser); + EXPECT_EQ(error, "The maximum number of desks is already open."); + histogram_tester.ExpectBucketCount("Ash.DeskApi.LaunchDesk.Result", 0, 1); +} + +// Tests remove desks failed. +IN_PROC_BROWSER_TEST_F(WmDesksPrivateApiTest, RemoveDeskWithInvalidIdTest) { + Browser* new_browser = CreateBrowser(browser()->profile()); + + base::HistogramTester histogram_tester; + // The RunFunctionAndReturnSingleResult already asserts no error + auto remove_desk_function = + base::MakeRefCounted<WmDesksPrivateRemoveDeskFunction>(); + auto error = extension_function_test_utils::RunFunctionAndReturnError( + remove_desk_function.get(), R"(["invalid-id"])", new_browser); + + EXPECT_EQ(error, "The desk identifier is not valid."); + histogram_tester.ExpectBucketCount("Ash.DeskApi.RemoveDesk.Result", 0, 1); +} + +// Tests switch desks failed. +IN_PROC_BROWSER_TEST_F(WmDesksPrivateApiTest, SwitchDeskWithInvalidIdTest) { + Browser* new_browser = CreateBrowser(browser()->profile()); + + base::HistogramTester histogram_tester; + // Switches to the current desk. + auto switch_desk_function = + base::MakeRefCounted<WmDesksPrivateSwitchDeskFunction>(); + auto error = extension_function_test_utils::RunFunctionAndReturnError( + switch_desk_function.get(), R"(["invalid-id"])", new_browser); + + EXPECT_EQ(error, "The desk identifier is not valid."); + histogram_tester.ExpectBucketCount("Ash.DeskApi.SwitchDesk.Result", 0, 1); +} + +// Tests set all desks with invalid ID. +IN_PROC_BROWSER_TEST_F(WmDesksPrivateApiTest, + SetAllDesksWindowWithInvalidIdTest) { + Browser* new_browser = CreateBrowser(browser()->profile()); + + base::HistogramTester histogram_tester; + // Switches to the current desk. + auto all_desk_function = + base::MakeRefCounted<WmDesksPrivateSetWindowPropertiesFunction>(); + auto error = extension_function_test_utils::RunFunctionAndReturnError( + all_desk_function.get(), R"([123,{"allDesks":true}])", new_browser); + + EXPECT_EQ(error, "The window cannot be found."); + histogram_tester.ExpectBucketCount("Ash.DeskApi.AllDesk.Result", 0, 1); +} + } // namespace extensions
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service.cc b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service.cc index 891f46469..30cbdba80 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service.cc +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service.cc
@@ -17,6 +17,7 @@ #include "chrome/browser/ash/attestation/tpm_challenge_key_result.h" #include "chrome/browser/ash/attestation/tpm_challenge_key_with_timeout.h" #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_utils.h" +#include "chrome/browser/enterprise/connectors/device_trust/common/common_types.h" #include "chrome/browser/enterprise/connectors/device_trust/common/metrics_utils.h" namespace enterprise_connectors { @@ -52,7 +53,8 @@ AttestationCallback callback) { std::string signals_json; if (!base::JSONWriter::Write(signals, &signals_json)) { - std::move(callback).Run(std::string()); + std::move(callback).Run( + {std::string(), DTAttestationResult::kFailedToSerializeSignals}); return; } @@ -78,11 +80,11 @@ if (result.IsSuccess()) { encoded_response = ProtobufChallengeToJsonChallenge(result.challenge_response); - LogAttestationResult(DTAttestationResult::kSuccess); - } else { - LogAttestationResult(ToAttestationResult(result.result_code)); } - std::move(callback).Run(encoded_response); + std::move(callback).Run( + {encoded_response, encoded_response.empty() + ? ToAttestationResult(result.result_code) + : DTAttestationResult::kSuccess}); } } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service_unittest.cc index 6f1b1a9..bc67a87c 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service_unittest.cc +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service_unittest.cc
@@ -17,6 +17,7 @@ #include "chrome/browser/ash/attestation/tpm_challenge_key.h" #include "chrome/browser/ash/attestation/tpm_challenge_key_result.h" #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_utils.h" +#include "chrome/browser/enterprise/connectors/device_trust/common/common_types.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" @@ -123,9 +124,12 @@ TEST_F(AshAttestationServiceTest, BuildChallengeResponse_Success) { base::RunLoop run_loop; - auto callback = - base::BindLambdaForTesting([&](const std::string& challenge_response) { + auto callback = base::BindLambdaForTesting( + [&](const AttestationResponse& attestation_response) { + auto challenge_response = attestation_response.challenge_response; ASSERT_FALSE(challenge_response.empty()); + EXPECT_EQ(attestation_response.result_code, + DTAttestationResult::kSuccess); auto parsed_value = ParseValueFromResponse(challenge_response); ASSERT_TRUE(parsed_value.has_value()); EXPECT_EQ(kFakeResponse, parsed_value.value());
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/common/BUILD.gn b/chrome/browser/enterprise/connectors/device_trust/attestation/common/BUILD.gn index 9345434..3d5c5240 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/common/BUILD.gn +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/common/BUILD.gn
@@ -43,6 +43,7 @@ public_deps = [ ":common", ":types", + "//chrome/browser/enterprise/connectors/device_trust/common", "//testing/gmock", ] }
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h b/chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h index 9a29b62..be6d3d4 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h
@@ -14,11 +14,14 @@ namespace enterprise_connectors { +struct AttestationResponse; + // Interface for classes in charge of building challenge-responses to enable // handshake between Chrome, an IdP and Verified Access. class AttestationService { public: - using AttestationCallback = base::OnceCallback<void(const std::string&)>; + using AttestationCallback = + base::OnceCallback<void(const AttestationResponse&)>; virtual ~AttestationService() = default;
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/common/mock_attestation_service.h b/chrome/browser/enterprise/connectors/device_trust/attestation/common/mock_attestation_service.h index 1280acc..21932895 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/common/mock_attestation_service.h +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/common/mock_attestation_service.h
@@ -9,6 +9,7 @@ #include "base/values.h" #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h" +#include "chrome/browser/enterprise/connectors/device_trust/common/common_types.h" #include "testing/gmock/include/gmock/gmock.h" namespace enterprise_connectors {
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service.cc b/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service.cc index 3cdf880..439308b 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service.cc +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service.cc
@@ -18,6 +18,7 @@ #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/proto/device_trust_attestation_ca.pb.h" #include "chrome/browser/enterprise/connectors/device_trust/attestation/desktop/crypto_utility.h" #include "chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_switches.h" +#include "chrome/browser/enterprise/connectors/device_trust/common/common_types.h" #include "chrome/browser/enterprise/connectors/device_trust/common/metrics_utils.h" #include "components/device_signals/core/common/signals_constants.h" #include "components/enterprise/browser/controller/browser_dm_token_storage.h" @@ -136,8 +137,8 @@ if (!exported_key) { // No key is available, so mark the device as untrusted (no challenge // response). - LogAttestationResult(DTAttestationResult::kMissingSigningKey); - std::move(callback).Run(std::string()); + std::move(callback).Run( + {std::string(), DTAttestationResult::kMissingSigningKey}); return; } @@ -146,8 +147,8 @@ !signed_data.ParseFromString(serialized_signed_challenge)) { // Challenge is not properly formatted, so mark the device as untrusted (no // challenge response). - LogAttestationResult(DTAttestationResult::kBadChallengeFormat); - std::move(callback).Run(std::string()); + std::move(callback).Run( + {std::string(), DTAttestationResult::kBadChallengeFormat}); return; } @@ -171,15 +172,15 @@ if (!is_va_challenge) { // Challenge does not come from VA, so mark the device as untrusted (no // challenge response). - LogAttestationResult(DTAttestationResult::kBadChallengeSource); - std::move(callback).Run(std::string()); + std::move(callback).Run( + {std::string(), DTAttestationResult::kBadChallengeSource}); return; } auto dm_token = dm_token_storage_->RetrieveDMToken(); if (!dm_token.is_valid()) { - LogAttestationResult(DTAttestationResult::kMissingCoreSignals); - std::move(callback).Run(std::string()); + std::move(callback).Run( + {std::string(), DTAttestationResult::kMissingCoreSignals}); return; } @@ -196,7 +197,8 @@ // VA should accept signals JSON string. std::string signals_json; if (!base::JSONWriter::Write(signals, &signals_json)) { - std::move(callback).Run(std::string()); + std::move(callback).Run( + {std::string(), DTAttestationResult::kFailedToSerializeSignals}); return; } @@ -204,8 +206,8 @@ std::string serialized_key_info; if (!key_info.SerializeToString(&serialized_key_info)) { - LogAttestationResult(DTAttestationResult::kFailedToSerializeKeyInfo); - std::move(callback).Run(std::string()); + std::move(callback).Run( + {std::string(), DTAttestationResult::kFailedToSerializeKeyInfo}); return; } @@ -226,8 +228,8 @@ if (!serialized_response) { // Failed to create a response, so mark the device as untrusted (no // challenge response). - LogAttestationResult(DTAttestationResult::kFailedToGenerateResponse); - std::move(callback).Run(std::string()); + std::move(callback).Run( + {std::string(), DTAttestationResult::kFailedToGenerateResponse}); return; } @@ -246,8 +248,8 @@ if (!encrypted_response) { // Failed to sign the response, so mark the device as untrusted (no // challenge response). - LogAttestationResult(DTAttestationResult::kFailedToSignResponse); - std::move(callback).Run(std::string()); + std::move(callback).Run( + {std::string(), DTAttestationResult::kFailedToSignResponse}); return; } @@ -259,21 +261,21 @@ std::string serialized_attestation_response; if (!signed_data.SerializeToString(&serialized_attestation_response)) { - LogAttestationResult(DTAttestationResult::kFailedToSerializeResponse); - std::move(callback).Run(std::string()); + std::move(callback).Run( + {std::string(), DTAttestationResult::kFailedToSerializeResponse}); return; } std::string json_response; if (!serialized_attestation_response.empty()) { - LogAttestationResult(DTAttestationResult::kSuccess); json_response = ProtobufChallengeToJsonChallenge(serialized_attestation_response); - } else { - LogAttestationResult(DTAttestationResult::kEmptySerializedResponse); } - std::move(callback).Run(json_response); + std::move(callback).Run( + {json_response, json_response.empty() + ? DTAttestationResult::kEmptySerializedResponse + : DTAttestationResult::kSuccess}); } } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service_unittest.cc index 891b477..1ec2932 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service_unittest.cc +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service_unittest.cc
@@ -11,7 +11,6 @@ #include "base/json/json_reader.h" #include "base/run_loop.h" #include "base/test/bind.h" -#include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" #include "base/values.h" #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_utils.h" @@ -62,9 +61,6 @@ constexpr char kDmToken[] = "fake-dm-token"; constexpr char kInvalidDmToken[] = "INVALID_DM_TOKEN"; -constexpr char kResultHistogramName[] = - "Enterprise.DeviceTrust.Attestation.Result"; - std::string GetSerializedSignedChallenge(bool use_dev = false) { std::string serialized_signed_challenge; if (!base::Base64Decode(use_dev ? kEncodedChallengeDev : kEncodedChallenge, @@ -132,7 +128,6 @@ test::ScopedKeyPersistenceDelegateFactory persistence_delegate_factory_; std::unique_ptr<DeviceTrustKeyManagerImpl> key_manager_; policy::FakeBrowserDMTokenStorage fake_dm_token_storage_; - base::HistogramTester histogram_tester_; }; TEST_F(DesktopAttestationServiceTest, BuildChallengeResponseDev_Success) { @@ -141,12 +136,16 @@ base::RunLoop run_loop; auto callback = base::BindLambdaForTesting( - [&](const std::string& serialized_signed_challenge) { - ASSERT_FALSE(serialized_signed_challenge.empty()); - auto signed_data = ParseDataFromResponse(serialized_signed_challenge); + [&](const AttestationResponse& attestation_response) { + ASSERT_FALSE(attestation_response.challenge_response.empty()); + auto signed_data = + ParseDataFromResponse(attestation_response.challenge_response); ASSERT_TRUE(signed_data); EXPECT_FALSE(signed_data->data().empty()); EXPECT_FALSE(signed_data->signature().empty()); + + EXPECT_EQ(attestation_response.result_code, + DTAttestationResult::kSuccess); run_loop.Quit(); }); @@ -162,12 +161,16 @@ base::RunLoop run_loop; auto callback = base::BindLambdaForTesting( - [&](const std::string& serialized_signed_challenge) { - ASSERT_FALSE(serialized_signed_challenge.empty()); - auto signed_data = ParseDataFromResponse(serialized_signed_challenge); + [&](const AttestationResponse& attestation_response) { + ASSERT_FALSE(attestation_response.challenge_response.empty()); + auto signed_data = + ParseDataFromResponse(attestation_response.challenge_response); ASSERT_TRUE(signed_data); EXPECT_FALSE(signed_data->data().empty()); EXPECT_FALSE(signed_data->signature().empty()); + + EXPECT_EQ(attestation_response.result_code, + DTAttestationResult::kSuccess); run_loop.Quit(); }); @@ -182,11 +185,11 @@ base::RunLoop run_loop; auto callback = base::BindLambdaForTesting( - [&](const std::string& serialized_signed_challenge) { + [&](const AttestationResponse& attestation_response) { // No challenge response is returned if no valid DMToken was found. - ASSERT_TRUE(serialized_signed_challenge.empty()); - histogram_tester_.ExpectUniqueSample( - kResultHistogramName, DTAttestationResult::kMissingCoreSignals, 1); + EXPECT_TRUE(attestation_response.challenge_response.empty()); + EXPECT_EQ(attestation_response.result_code, + DTAttestationResult::kMissingCoreSignals); run_loop.Quit(); }); @@ -200,11 +203,11 @@ base::RunLoop run_loop; auto callback = base::BindLambdaForTesting( - [&](const std::string& serialized_signed_challenge) { + [&](const AttestationResponse& attestation_response) { // No challenge response is returned if no valid DMToken was found. - ASSERT_TRUE(serialized_signed_challenge.empty()); - histogram_tester_.ExpectUniqueSample( - kResultHistogramName, DTAttestationResult::kMissingCoreSignals, 1); + ASSERT_TRUE(attestation_response.challenge_response.empty()); + EXPECT_EQ(attestation_response.result_code, + DTAttestationResult::kMissingCoreSignals); run_loop.Quit(); });
diff --git a/chrome/browser/enterprise/connectors/device_trust/common/BUILD.gn b/chrome/browser/enterprise/connectors/device_trust/common/BUILD.gn index a6703b6..f184120 100644 --- a/chrome/browser/enterprise/connectors/device_trust/common/BUILD.gn +++ b/chrome/browser/enterprise/connectors/device_trust/common/BUILD.gn
@@ -7,7 +7,10 @@ source_set("common") { sources = [ "metrics_utils.cc" ] - public = [ "metrics_utils.h" ] + public = [ + "common_types.h", + "metrics_utils.h", + ] public_deps = [ "//base" ]
diff --git a/chrome/browser/enterprise/connectors/device_trust/common/common_types.h b/chrome/browser/enterprise/connectors/device_trust/common/common_types.h new file mode 100644 index 0000000..9d6b7084a --- /dev/null +++ b/chrome/browser/enterprise/connectors/device_trust/common/common_types.h
@@ -0,0 +1,38 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_COMMON_COMMON_TYPES_H_ +#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_COMMON_COMMON_TYPES_H_ + +#include <string> + +namespace enterprise_connectors { + +// Various possible outcomes to the attestation step in the overarching Device +// Trust connector attestation flow. These values are persisted to logs and +// should not be renumbered. Please update the DTAttestationResult enum in +// enums.xml when adding a new value here. +enum class DTAttestationResult { + kMissingCoreSignals = 0, + kMissingSigningKey = 1, + kBadChallengeFormat = 2, + kBadChallengeSource = 3, + kFailedToSerializeKeyInfo = 4, + kFailedToGenerateResponse = 5, + kFailedToSignResponse = 6, + kFailedToSerializeResponse = 7, + kEmptySerializedResponse = 8, + kSuccess = 9, + kFailedToSerializeSignals = 10, + kMaxValue = kFailedToSerializeSignals, +}; + +struct AttestationResponse { + std::string challenge_response{}; + DTAttestationResult result_code{}; +}; + +} // namespace enterprise_connectors + +#endif // CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_COMMON_COMMON_TYPES_H_
diff --git a/chrome/browser/enterprise/connectors/device_trust/common/metrics_utils.h b/chrome/browser/enterprise/connectors/device_trust/common/metrics_utils.h index aad5ff0..cbef663 100644 --- a/chrome/browser/enterprise/connectors/device_trust/common/metrics_utils.h +++ b/chrome/browser/enterprise/connectors/device_trust/common/metrics_utils.h
@@ -6,6 +6,7 @@ #define CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_COMMON_METRICS_UTILS_H_ #include "base/time/time.h" +#include "chrome/browser/enterprise/connectors/device_trust/common/common_types.h" namespace enterprise_connectors { @@ -20,24 +21,6 @@ kMaxValue = kChallengeResponseSent, }; -// Various possible outcomes to the attestation step in the overarching Device -// Trust connector attestation flow. These values are persisted to logs and -// should not be renumbered. Please update the DTAttestationResult enum in -// enums.xml when adding a new value here. -enum class DTAttestationResult { - kMissingCoreSignals = 0, - kMissingSigningKey = 1, - kBadChallengeFormat = 2, - kBadChallengeSource = 3, - kFailedToSerializeKeyInfo = 4, - kFailedToGenerateResponse = 5, - kFailedToSignResponse = 6, - kFailedToSerializeResponse = 7, - kEmptySerializedResponse = 8, - kSuccess = 9, - kMaxValue = kSuccess, -}; - #if BUILDFLAG(IS_CHROMEOS_ASH) // Possible origins of the Device Trust connector attestation flow on ChromeOS. // These values are persisted to logs and should not be renumbered. Please
diff --git a/chrome/browser/enterprise/connectors/device_trust/device_trust_service.cc b/chrome/browser/enterprise/connectors/device_trust/device_trust_service.cc index d0f4d571..0a6fa70 100644 --- a/chrome/browser/enterprise/connectors/device_trust/device_trust_service.cc +++ b/chrome/browser/enterprise/connectors/device_trust/device_trust_service.cc
@@ -10,6 +10,7 @@ #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h" #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_utils.h" #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/signals_type.h" +#include "chrome/browser/enterprise/connectors/device_trust/common/common_types.h" #include "chrome/browser/enterprise/connectors/device_trust/common/metrics_utils.h" #include "chrome/browser/enterprise/connectors/device_trust/device_trust_connector_service.h" #include "chrome/browser/enterprise/connectors/device_trust/device_trust_features.h" @@ -107,7 +108,16 @@ LogAttestationFunnelStep(DTAttestationFunnelStep::kSignalsCollected); attestation_service_->BuildChallengeResponseForVAChallenge( - serialized_signed_challenge, std::move(signals), std::move(callback)); + serialized_signed_challenge, std::move(signals), + base::BindOnce(&DeviceTrustService::OnAttestationResponseReceived, + weak_factory_.GetWeakPtr(), std::move(callback))); +} + +void DeviceTrustService::OnAttestationResponseReceived( + AttestationCallback callback, + const AttestationResponse& response) { + LogAttestationResult(response.result_code); + std::move(callback).Run(response.challenge_response); } } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/device_trust_service.h b/chrome/browser/enterprise/connectors/device_trust/device_trust_service.h index 0918988..7547f4a 100644 --- a/chrome/browser/enterprise/connectors/device_trust/device_trust_service.h +++ b/chrome/browser/enterprise/connectors/device_trust/device_trust_service.h
@@ -18,6 +18,7 @@ namespace enterprise_connectors { +struct AttestationResponse; class AttestationService; class DeviceTrustConnectorService; class SignalsService; @@ -71,6 +72,8 @@ void OnSignalsCollected(const std::string& challenge, AttestationCallback callback, base::Value::Dict signals); + void OnAttestationResponseReceived(AttestationCallback callback, + const AttestationResponse& response); std::unique_ptr<AttestationService> attestation_service_; std::unique_ptr<SignalsService> signals_service_;
diff --git a/chrome/browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc index f9430c3..a828ca3 100644 --- a/chrome/browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc +++ b/chrome/browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc
@@ -12,10 +12,12 @@ #include "base/memory/raw_ptr.h" #include "base/run_loop.h" #include "base/test/bind.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/values.h" #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/mock_attestation_service.h" +#include "chrome/browser/enterprise/connectors/device_trust/common/common_types.h" #include "chrome/browser/enterprise/connectors/device_trust/device_trust_connector_service.h" #include "chrome/browser/enterprise/connectors/device_trust/device_trust_features.h" #include "chrome/browser/enterprise/connectors/device_trust/prefs.h" @@ -54,6 +56,9 @@ "u3W4CMboCswxIxNYRCGrIIVPElE3Yb4QS65mKrg=\"" "}"; +constexpr char kResultHistogramName[] = + "Enterprise.DeviceTrust.Attestation.Result"; + std::string GetSerializedSignedChallenge(const std::string& response) { absl::optional<base::Value> data = base::JSONReader::Read( response, base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS); @@ -135,6 +140,7 @@ raw_ptr<MockAttestationService> mock_attestation_service_; raw_ptr<MockSignalsService> mock_signals_service_; data_decoder::test::InProcessDataDecoder in_process_data_decoder; + base::HistogramTester histogram_tester_; }; // Tests that IsEnabled returns true only when the feature flag is enabled and @@ -159,16 +165,18 @@ std::move(signals_callback).Run(std::move(*fake_signals)); })); + const DTAttestationResult result_code = DTAttestationResult::kSuccess; EXPECT_CALL(*mock_attestation_service_, BuildChallengeResponseForVAChallenge( GetSerializedSignedChallenge(kJsonChallenge), _, _)) - .WillOnce(Invoke([&fake_display_name](const std::string& challenge, - const base::Value::Dict signals, - AttestationCallback callback) { + .WillOnce(Invoke([&fake_display_name]( + const std::string& challenge, + const base::Value::Dict signals, + AttestationService::AttestationCallback callback) { EXPECT_EQ( signals.FindString(device_signals::names::kDisplayName)->c_str(), fake_display_name); - std::move(callback).Run(challenge); + std::move(callback).Run({challenge, result_code}); })); base::RunLoop run_loop; @@ -177,6 +185,8 @@ /*callback=*/base::BindLambdaForTesting( [&run_loop](const std::string& response) { run_loop.Quit(); })); run_loop.Run(); + + histogram_tester_.ExpectUniqueSample(kResultHistogramName, result_code, 1); } INSTANTIATE_TEST_SUITE_P(All,
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator.cc b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator.cc index 4319be5e..b2f82f2 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator.cc +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator.cc
@@ -83,6 +83,12 @@ signals.Set(device_signals::names::kDiskEncrypted, static_cast<int32_t>(enterprise_signals::SettingValue::ENABLED)); + // Also, there is no way to remove the need for a password when logging into a + // device, including when the screen is locked. A password or pin is always + // required. + signals.Set(device_signals::names::kScreenLockSecured, + static_cast<int32_t>(enterprise_signals::SettingValue::ENABLED)); + const ash::DeviceState* device_state = GetCurrentlyActiveDeviceState(profile_); if (device_state) {
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator_browsertest.cc b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator_browsertest.cc index 0080912..f6ddfca8 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator_browsertest.cc +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator_browsertest.cc
@@ -164,6 +164,12 @@ ASSERT_TRUE(disk_encrypted); EXPECT_EQ(disk_encrypted.value(), static_cast<int32_t>(enterprise_signals::SettingValue::ENABLED)); + + auto screen_lock_secured = + signals.FindInt(device_signals::names::kScreenLockSecured); + ASSERT_TRUE(screen_lock_secured); + EXPECT_EQ(screen_lock_secured.value(), + static_cast<int32_t>(enterprise_signals::SettingValue::ENABLED)); } IN_PROC_BROWSER_TEST_F(AshSignalsDecoratorBrowserTest, TestNetworkSignals) {
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc index 45cb4e46..ca18783 100644 --- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc +++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
@@ -743,6 +743,73 @@ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) +#if BUILDFLAG(IS_MAC) +IN_PROC_BROWSER_TEST_F(EnterpriseReportingPrivateApiTest, GetSettings) { + constexpr char kTest[] = R"( + chrome.test.assertEq( + 'function', + typeof chrome.enterprise.reportingPrivate.getSettings); + const userContext = {userId: '%s'}; + + const options = []; + + %s + + const request = { userContext, options}; + + chrome.enterprise.reportingPrivate.getSettings( + request, + (settingItems) => { + chrome.test.assertNoLastError(); + + %s + + chrome.test.notifyPass(); + }); + )"; + + std::string extra_items = base::StringPrintf( + R"( + const filePath = '%s'; + const validKeyPath = "Key1.SubKey1.SubSubKey1[0][10]"; + const invalidKeyPath = "Key1.SubKey1.SubSubKey1[0][0][3]"; + options.push({ + path: filePath, + key: validKeyPath, + getValue: true + }); + options.push({ + path: filePath, + key: invalidKeyPath, + getValue: true + }); + )", + + device_signals::test::GetMixArrayDictionaryPlistPath().value().c_str()); + + constexpr char kAssertions[] = R"( + chrome.test.assertTrue(settingItems instanceof Array); + chrome.test.assertEq(2, settingItems.length); + for (const response of settingItems) { + chrome.test.assertEq(filePath, response.path); + if (response.key == validKeyPath) { + chrome.test.assertEq("FOUND", response.presence); + chrome.test.assertEq("\"string10\"", response.value); + } else if (response.key == invalidKeyPath) { + chrome.test.assertEq("NOT_FOUND", response.presence); + chrome.test.assertEq(null, response.value); + } else { + chrome.test.fail(); + } + } + )"; + + AccountInfo account_info = SignIn("some-email@example.com"); + RunTest(base::StringPrintf(kTest, account_info.gaia.c_str(), + extra_items.c_str(), kAssertions)); +} +#endif // BUILDFLAG(IS_MAC) + #if BUILDFLAG(IS_CHROMEOS) static void RunTestUsingProfile(const std::string& background_js, Profile* profile) {
diff --git a/chrome/browser/extensions/api/file_manager/DIR_METADATA b/chrome/browser/extensions/api/file_manager/DIR_METADATA index 2ea5b1db..e9400b87 100644 --- a/chrome/browser/extensions/api/file_manager/DIR_METADATA +++ b/chrome/browser/extensions/api/file_manager/DIR_METADATA
@@ -1,3 +1 @@ -monorail { - component: "Platform>Apps>FileManager" -} \ No newline at end of file +mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chrome/browser/first_party_sets/first_party_sets_policy_browsertest.cc b/chrome/browser/first_party_sets/first_party_sets_policy_browsertest.cc index 5c223b20..b5f193a 100644 --- a/chrome/browser/first_party_sets/first_party_sets_policy_browsertest.cc +++ b/chrome/browser/first_party_sets/first_party_sets_policy_browsertest.cc
@@ -16,6 +16,7 @@ #include "components/policy/core/common/policy_types.h" #include "components/policy/policy_constants.h" #include "components/prefs/pref_service.h" +#include "components/privacy_sandbox/privacy_sandbox_prefs.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_features.h" @@ -63,7 +64,8 @@ public ::testing::WithParamInterface<std::tuple<bool, PrefState>> { public: EnabledPolicyBrowsertest() - : https_server_(net::EmbeddedTestServer::TYPE_HTTPS) { + : https_server_(net::EmbeddedTestServer::TYPE_HTTPS), + pref_enabled_(GetPrefState() != PrefState::kDisabled) { if (IsFeatureEnabled()) { scoped_feature_list_.InitWithFeatures( {features::kFirstPartySets, @@ -161,28 +163,44 @@ std::vector<std::string> ExpectedCrossSiteCookiesInCrossPartyContext() { // Returns the expected cookies that are accessible in a cross-site, - // cros-party context. + // cross-party context. if (IsFirstPartySetsEnabled()) { return {}; } return kSameSiteNoneCookies; } + // Reverses the state of the First-Party Sets enabled preference. + void FlipEnabledPolicy() { + pref_enabled_ = !pref_enabled_; + policy_map().Set(policy::key::kFirstPartySetsEnabled, + POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, + POLICY_SOURCE_ENTERPRISE_DEFAULT, + base::Value(pref_enabled_), nullptr); + + provider_.UpdateChromePolicy(policy_map()); + } + + bool IsFirstPartySetsEnabled() { + return IsFeatureEnabled() && IsPrefEnabled(); + } + + // Clear cookies for the current browser context, returning the number + // cleared. + uint32_t ClearCookies() { + return content::DeleteCookies(web_contents()->GetBrowserContext(), + network::mojom::CookieDeletionFilter()); + } + private: bool IsFeatureEnabled() { return std::get<0>(GetParam()); } PrefState GetPrefState() { return std::get<1>(GetParam()); } - bool IsPrefEnabled() { return GetPrefState() == PrefState::kEnabled; } - - bool IsFirstPartySetsEnabled() { - if (GetPrefState() == PrefState::kDefault) { - return IsFeatureEnabled(); - } - return IsFeatureEnabled() && IsPrefEnabled(); - } + bool IsPrefEnabled() { return pref_enabled_; } net::test_server::EmbeddedTestServer https_server_; base::test::ScopedFeatureList scoped_feature_list_; PolicyMap policies_; + bool pref_enabled_; }; IN_PROC_BROWSER_TEST_P(EnabledPolicyBrowsertest, @@ -206,7 +224,19 @@ IN_PROC_BROWSER_TEST_P(EnabledPolicyBrowsertest, SetCrossSiteSamePartyEmbedWithFpsPrimaryTopLevel) { + std::vector<std::string> expected_cookies = + ExpectedCrossSiteCookiesInSamePartyContext(); // Cross-site, same-party iframe (B embedded in A). + EXPECT_THAT( + content::ArrangeFramesAndGetCanonicalCookiesForLeaf( + web_contents(), https_server(), "a.test(%s)", + SetSamePartyCookiesUrl(kHostB)), + UnorderedPointwise(net::CanonicalCookieNameIs(), expected_cookies)); + + // Clear cookies from above and flip the First-Party Sets enabled pref. + ASSERT_EQ(ClearCookies(), expected_cookies.size()); + FlipEnabledPolicy(); + EXPECT_THAT(content::ArrangeFramesAndGetCanonicalCookiesForLeaf( web_contents(), https_server(), "a.test(%s)", SetSamePartyCookiesUrl(kHostB)), @@ -216,7 +246,19 @@ IN_PROC_BROWSER_TEST_P(EnabledPolicyBrowsertest, SetCrossSiteSamePartyEmbedWithFpsPrimaryLeaf) { + std::vector<std::string> expected_cookies = + ExpectedCrossSiteCookiesInSamePartyContext(); // Cross-site, same-party iframe (A embedded in B). + EXPECT_THAT( + content::ArrangeFramesAndGetCanonicalCookiesForLeaf( + web_contents(), https_server(), "b.test(%s)", + SetSamePartyCookiesUrl(kHostA)), + UnorderedPointwise(net::CanonicalCookieNameIs(), expected_cookies)); + + // Clear cookies from above and flip the First-Party Sets enabled pref. + ASSERT_EQ(ClearCookies(), expected_cookies.size()); + FlipEnabledPolicy(); + EXPECT_THAT(content::ArrangeFramesAndGetCanonicalCookiesForLeaf( web_contents(), https_server(), "b.test(%s)", SetSamePartyCookiesUrl(kHostA)), @@ -227,7 +269,19 @@ IN_PROC_BROWSER_TEST_P( EnabledPolicyBrowsertest, SetCrossSiteSamePartyWithTwoNestedSamePartyContextFrames) { + std::vector<std::string> expected_cookies = + ExpectedCrossSiteCookiesInSamePartyContext(); // Cross-site, same-party nested iframe (A embedded in B embedded in A). + EXPECT_THAT( + content::ArrangeFramesAndGetCanonicalCookiesForLeaf( + web_contents(), https_server(), "a.test(b.test(%s))", + SetSamePartyCookiesUrl(kHostA)), + UnorderedPointwise(net::CanonicalCookieNameIs(), expected_cookies)); + + // Clear cookies from above and flip the First-Party Sets enabled pref. + ASSERT_EQ(ClearCookies(), expected_cookies.size()); + FlipEnabledPolicy(); + EXPECT_THAT(content::ArrangeFramesAndGetCanonicalCookiesForLeaf( web_contents(), https_server(), "a.test(b.test(%s))", SetSamePartyCookiesUrl(kHostA)), @@ -238,8 +292,20 @@ IN_PROC_BROWSER_TEST_P( EnabledPolicyBrowsertest, SetCrossSiteSamePartyWithThreeNestedSamePartyContextFrames) { + std::vector<std::string> expected_cookies = + ExpectedCrossSiteCookiesInSamePartyContext(); // Cross-site, same-party nested iframe (A embedded in B embedded in C // embedded in A). + EXPECT_THAT( + content::ArrangeFramesAndGetCanonicalCookiesForLeaf( + web_contents(), https_server(), "a.test(c.test(b.test(%s)))", + SetSamePartyCookiesUrl(kHostA)), + UnorderedPointwise(net::CanonicalCookieNameIs(), expected_cookies)); + + // Clear cookies from above and flip the First-Party Sets enabled pref. + ASSERT_EQ(ClearCookies(), expected_cookies.size()); + FlipEnabledPolicy(); + EXPECT_THAT(content::ArrangeFramesAndGetCanonicalCookiesForLeaf( web_contents(), https_server(), "a.test(c.test(b.test(%s)))", SetSamePartyCookiesUrl(kHostA)), @@ -259,11 +325,23 @@ IN_PROC_BROWSER_TEST_P(EnabledPolicyBrowsertest, SetCrossSiteCrossPartyEmbedWithFpsLeaf) { + std::vector<std::string> expected_cookies = + ExpectedCrossSiteCookiesInCrossPartyContext(); // Cross-site, cross-party iframe (A embedded in D). EXPECT_THAT( content::ArrangeFramesAndGetCanonicalCookiesForLeaf( web_contents(), https_server(), "d.test(%s)", SetSamePartyCookiesUrl(kHostA)), + UnorderedPointwise(net::CanonicalCookieNameIs(), expected_cookies)); + + // Clear cookies from above and flip the First-Party Sets enabled pref. + ASSERT_EQ(ClearCookies(), expected_cookies.size()); + FlipEnabledPolicy(); + + EXPECT_THAT( + content::ArrangeFramesAndGetCanonicalCookiesForLeaf( + web_contents(), https_server(), "d.test(%s)", + SetSamePartyCookiesUrl(kHostA)), UnorderedPointwise(net::CanonicalCookieNameIs(), ExpectedCrossSiteCookiesInCrossPartyContext())); } @@ -271,7 +349,21 @@ IN_PROC_BROWSER_TEST_P( EnabledPolicyBrowsertest, SetCrossSiteCrossPartyWithTwoNestedCrossPartyContextFrames) { - // Cross-site, cross-party nested iframe (A embedded in B embedded in D). + std::vector<std::string> expected_cookies = + ExpectedCrossSiteCookiesInCrossPartyContext(); + // Cross-site, cross-party nested iframe (A embedded in B embedded in + // D). + EXPECT_THAT( + content::ArrangeFramesAndGetCanonicalCookiesForLeaf( + web_contents(), https_server(), "d.test(b.test(%s))", + SetSamePartyCookiesUrl(kHostA)), + UnorderedPointwise(net::CanonicalCookieNameIs(), + ExpectedCrossSiteCookiesInCrossPartyContext())); + + // Clear cookies from above and flip the First-Party Sets enabled pref. + ASSERT_EQ(ClearCookies(), expected_cookies.size()); + FlipEnabledPolicy(); + EXPECT_THAT( content::ArrangeFramesAndGetCanonicalCookiesForLeaf( web_contents(), https_server(), "d.test(b.test(%s))", @@ -322,6 +414,18 @@ {0}, EchoCookiesUrl(kHostB)), net::CookieStringIs(UnorderedPointwise( net::NameIs(), ExpectedCrossSiteCookiesInSamePartyContext()))); + + // Clear cookies from above and flip the First-Party Sets enabled pref. + ASSERT_EQ(ClearCookies(), 3u); + FlipEnabledPolicy(); + + ASSERT_NO_FATAL_FAILURE(SetSamePartyCookies(kHostB)); + EXPECT_THAT( + content::ArrangeFramesAndGetContentFromLeaf(web_contents(), + https_server(), "a.test(%s)", + {0}, EchoCookiesUrl(kHostB)), + net::CookieStringIs(UnorderedPointwise( + net::NameIs(), ExpectedCrossSiteCookiesInSamePartyContext()))); } IN_PROC_BROWSER_TEST_P(EnabledPolicyBrowsertest, @@ -334,6 +438,18 @@ {0}, EchoCookiesUrl(kHostA)), net::CookieStringIs(UnorderedPointwise( net::NameIs(), ExpectedCrossSiteCookiesInSamePartyContext()))); + + // Clear cookies from above and flip the First-Party Sets enabled pref. + ASSERT_EQ(ClearCookies(), 3u); + FlipEnabledPolicy(); + + ASSERT_NO_FATAL_FAILURE(SetSamePartyCookies(kHostA)); + EXPECT_THAT( + content::ArrangeFramesAndGetContentFromLeaf(web_contents(), + https_server(), "b.test(%s)", + {0}, EchoCookiesUrl(kHostA)), + net::CookieStringIs(UnorderedPointwise( + net::NameIs(), ExpectedCrossSiteCookiesInSamePartyContext()))); } IN_PROC_BROWSER_TEST_P( @@ -347,6 +463,18 @@ EchoCookiesUrl(kHostA)), net::CookieStringIs(UnorderedPointwise( net::NameIs(), ExpectedCrossSiteCookiesInSamePartyContext()))); + + // Clear cookies from above and flip the First-Party Sets enabled pref. + ASSERT_EQ(ClearCookies(), 3u); + FlipEnabledPolicy(); + + ASSERT_NO_FATAL_FAILURE(SetSamePartyCookies(kHostA)); + EXPECT_THAT( + content::ArrangeFramesAndGetContentFromLeaf( + web_contents(), https_server(), "a.test(b.test(%s))", {0, 0}, + EchoCookiesUrl(kHostA)), + net::CookieStringIs(UnorderedPointwise( + net::NameIs(), ExpectedCrossSiteCookiesInSamePartyContext()))); } IN_PROC_BROWSER_TEST_P( @@ -361,6 +489,18 @@ {0, 0, 0}, EchoCookiesUrl(kHostA)), net::CookieStringIs(UnorderedPointwise( net::NameIs(), ExpectedCrossSiteCookiesInSamePartyContext()))); + + // Clear cookies from above and flip the First-Party Sets enabled pref. + ASSERT_EQ(ClearCookies(), 3u); + FlipEnabledPolicy(); + + ASSERT_NO_FATAL_FAILURE(SetSamePartyCookies(kHostA)); + EXPECT_THAT( + content::ArrangeFramesAndGetContentFromLeaf( + web_contents(), https_server(), "a.test(c.test(b.test(%s)))", + {0, 0, 0}, EchoCookiesUrl(kHostA)), + net::CookieStringIs(UnorderedPointwise( + net::NameIs(), ExpectedCrossSiteCookiesInSamePartyContext()))); } IN_PROC_BROWSER_TEST_P(EnabledPolicyBrowsertest, @@ -384,6 +524,18 @@ {0}, EchoCookiesUrl(kHostA)), net::CookieStringIs(UnorderedPointwise( net::NameIs(), ExpectedCrossSiteCookiesInCrossPartyContext()))); + + // Clear cookies from above and flip the First-Party Sets enabled pref. + ASSERT_EQ(ClearCookies(), 3u); + FlipEnabledPolicy(); + + ASSERT_NO_FATAL_FAILURE(SetSamePartyCookies(kHostA)); + EXPECT_THAT( + content::ArrangeFramesAndGetContentFromLeaf(web_contents(), + https_server(), "d.test(%s)", + {0}, EchoCookiesUrl(kHostA)), + net::CookieStringIs(UnorderedPointwise( + net::NameIs(), ExpectedCrossSiteCookiesInCrossPartyContext()))); } IN_PROC_BROWSER_TEST_P( @@ -397,6 +549,18 @@ EchoCookiesUrl(kHostA)), net::CookieStringIs(UnorderedPointwise( net::NameIs(), ExpectedCrossSiteCookiesInCrossPartyContext()))); + + // Clear cookies from above and flip the First-Party Sets enabled pref. + ASSERT_EQ(ClearCookies(), 3u); + FlipEnabledPolicy(); + + ASSERT_NO_FATAL_FAILURE(SetSamePartyCookies(kHostA)); + EXPECT_THAT( + content::ArrangeFramesAndGetContentFromLeaf( + web_contents(), https_server(), "d.test(b.test(%s))", {0, 0}, + EchoCookiesUrl(kHostA)), + net::CookieStringIs(UnorderedPointwise( + net::NameIs(), ExpectedCrossSiteCookiesInCrossPartyContext()))); } IN_PROC_BROWSER_TEST_P(EnabledPolicyBrowsertest, @@ -661,6 +825,5 @@ ::testing::Values(PrefState::kDefault, PrefState::kDisabled, PrefState::kEnabled))); - } // namespace } // namespace policy
diff --git a/chrome/browser/first_party_sets/first_party_sets_policy_service.cc b/chrome/browser/first_party_sets/first_party_sets_policy_service.cc index ff3cadf..1b96d5a8 100644 --- a/chrome/browser/first_party_sets/first_party_sets_policy_service.cc +++ b/chrome/browser/first_party_sets/first_party_sets_policy_service.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/first_party_sets/first_party_sets_policy_service.h" +#include "base/feature_list.h" #include "chrome/browser/first_party_sets/first_party_sets_pref_names.h" #include "chrome/browser/profiles/profile.h" #include "components/prefs/pref_service.h" @@ -175,6 +176,31 @@ weak_factory_.GetWeakPtr())); } +absl::optional<net::FirstPartySetEntry> FirstPartySetsPolicyService::FindEntry( + const net::SchemefulSite& site) const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + PrefService* prefs = + Profile::FromBrowserContext(browser_context_)->GetPrefs(); + if ((prefs && + !prefs->GetBoolean(prefs::kPrivacySandboxFirstPartySetsEnabled)) || + !config_.has_value()) { + return absl::nullopt; + } + return content::FirstPartySetsHandler::GetInstance()->FindEntry( + site, config_.value()); +} + +bool FirstPartySetsPolicyService::IsSiteInManagedSet( + const net::SchemefulSite& site) const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (!config_.has_value()) + return false; + + absl::optional<absl::optional<net::FirstPartySetEntry>> maybe_override = + config_->FindOverride(site); + return maybe_override.has_value() && maybe_override->has_value(); +} + void FirstPartySetsPolicyService::OnReadyToNotifyDelegates( net::FirstPartySetsContextConfig config) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/chrome/browser/first_party_sets/first_party_sets_policy_service.h b/chrome/browser/first_party_sets/first_party_sets_policy_service.h index 315cbaa..d1f86460 100644 --- a/chrome/browser/first_party_sets/first_party_sets_policy_service.h +++ b/chrome/browser/first_party_sets/first_party_sets_policy_service.h
@@ -6,21 +6,24 @@ #define CHROME_BROWSER_FIRST_PARTY_SETS_FIRST_PARTY_SETS_POLICY_SERVICE_H_ #include "base/memory/raw_ptr.h" -#include "base/scoped_observation.h" #include "base/sequence_checker.h" #include "base/thread_annotations.h" -#include "base/values.h" #include "components/keyed_service/core/keyed_service.h" -#include "components/privacy_sandbox/privacy_sandbox_settings.h" #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/remote_set.h" #include "net/first_party_sets/first_party_sets_context_config.h" #include "services/network/public/mojom/first_party_sets_access_delegate.mojom.h" +class PrefService; + namespace content { class BrowserContext; } // namespace content +namespace net { +class SchemefulSite; +} // namespace net + namespace first_party_sets { // A profile keyed service for per-BrowserContext First-Party Sets state. @@ -28,9 +31,7 @@ // This service always exists for a BrowserContext, regardless of whether the // First-Party Sets feature is enabled globally or for this particular // BrowserContext. -class FirstPartySetsPolicyService - : public KeyedService, - public privacy_sandbox::PrivacySandboxSettings::Observer { +class FirstPartySetsPolicyService : public KeyedService { public: explicit FirstPartySetsPolicyService(content::BrowserContext* context); FirstPartySetsPolicyService(const FirstPartySetsPolicyService&) = delete; @@ -53,8 +54,9 @@ mojo::Remote<network::mojom::FirstPartySetsAccessDelegate> access_delegate); - // PrivacySandboxSettings::Observer: - void OnFirstPartySetsEnabledChanged(bool enabled) override; + // Triggers changes to `access_delegates` that should occur when the + // First-Party Sets enabled pref changes. + void OnFirstPartySetsEnabledChanged(bool enabled); // KeyedService: void Shutdown() override; @@ -80,6 +82,23 @@ void ResetForTesting(); + // Looks up `site` in Chrome's list of First-Party Sets and returns its + // associated entry if `site` is found. + // + // This will return nullopt if: + // - First-Party Sets is disabled or + // - the list of First-Party Sets isn't initialized yet or + // - `site` isn't in Chrome's list of First-Party Sets or + // - this instance has not received the config yet + absl::optional<net::FirstPartySetEntry> FindEntry( + const net::SchemefulSite& site) const; + + // Checks if ownership of `site` is managed by an enterprise. + // + // Note: this doesn't consider `site` as managed if it was removed by an + // enterprise using policy. + bool IsSiteInManagedSet(const net::SchemefulSite& site) const; + content::BrowserContext* browser_context() const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return browser_context_; @@ -119,10 +138,6 @@ absl::optional<net::FirstPartySetsContextConfig> config_ GUARDED_BY_CONTEXT(sequence_checker_); - base::ScopedObservation<privacy_sandbox::PrivacySandboxSettings, - privacy_sandbox::PrivacySandboxSettings::Observer> - privacy_sandbox_settings_observer_{this}; - // Callback used by tests to wait for the ctor's initialization flow to // complete. absl::optional<base::OnceClosure> on_first_init_complete_for_testing_;
diff --git a/chrome/browser/first_party_sets/first_party_sets_policy_service_unittest.cc b/chrome/browser/first_party_sets/first_party_sets_policy_service_unittest.cc index a440b59d..2899653 100644 --- a/chrome/browser/first_party_sets/first_party_sets_policy_service_unittest.cc +++ b/chrome/browser/first_party_sets/first_party_sets_policy_service_unittest.cc
@@ -132,15 +132,15 @@ void SetUp() override { DefaultFirstPartySetsPolicyServiceTest::SetUp(); - + content::FirstPartySetsHandler::GetInstance()->ResetForTesting(); content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting({}); profile_manager_ = std::make_unique<TestingProfileManager>( TestingBrowserProcess::GetGlobal()); ASSERT_TRUE(profile_manager_->SetUp()); - - service_ = FirstPartySetsPolicyServiceFactory::GetForBrowserContext( - profile_manager_->CreateTestingProfile("TestProfile")); + profile_ = profile_manager_->CreateTestingProfile("TestProfile"); + service_ = + FirstPartySetsPolicyServiceFactory::GetForBrowserContext(profile_); ASSERT_NE(service_, nullptr); // We can't avoid eagerly initializing the service, due to @@ -166,15 +166,160 @@ } protected: + Profile* profile() { return profile_; } FirstPartySetsPolicyService* service() { return service_; } private: std::unique_ptr<TestingProfileManager> profile_manager_; + Profile* profile_; base::test::ScopedFeatureList features_; FirstPartySetsPolicyService* service_; }; +TEST_F(FirstPartySetsPolicyServiceTest, IsSiteInManagedSet_WithoutConfig) { + EXPECT_FALSE(service()->IsSiteInManagedSet( + net::SchemefulSite(GURL("https://example.test")))); +} + +TEST_F(FirstPartySetsPolicyServiceTest, IsSiteInManagedSet_SiteNotInConfig) { + service()->InitForTesting( + [](PrefService* prefs, + base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) { + std::move(callback).Run(net::FirstPartySetsContextConfig( + {{net::SchemefulSite(GURL("https://example.test")), + {net::FirstPartySetEntry( + net::SchemefulSite(GURL("https://primary.test")), + net::SiteType::kAssociated, absl::nullopt)}}})); + }); + + EXPECT_FALSE(service()->IsSiteInManagedSet( + net::SchemefulSite(GURL("https://not-example.test")))); + env().RunUntilIdle(); +} + TEST_F(FirstPartySetsPolicyServiceTest, + IsSiteInManagedSet_SiteInConfig_AsDeletion) { + net::SchemefulSite example_site = + net::SchemefulSite(GURL("https://example.test")); + service()->InitForTesting( + [example_site]( + PrefService* prefs, + base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) { + std::move(callback).Run(net::FirstPartySetsContextConfig( + {{example_site, {absl::nullopt}}})); + }); + EXPECT_FALSE(service()->IsSiteInManagedSet(example_site)); + env().RunUntilIdle(); +} + +TEST_F(FirstPartySetsPolicyServiceTest, + IsSiteInManagedSet_SiteInConfig_AsModification) { + net::SchemefulSite example_site = + net::SchemefulSite(GURL("https://example.test")); + service()->InitForTesting( + [example_site]( + PrefService* prefs, + base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) { + std::move(callback).Run(net::FirstPartySetsContextConfig( + {{example_site, + {net::FirstPartySetEntry( + net::SchemefulSite(GURL("https://primary.test")), + net::SiteType::kAssociated, absl::nullopt)}}})); + }); + EXPECT_TRUE(service()->IsSiteInManagedSet(example_site)); + env().RunUntilIdle(); +} + +TEST_F(FirstPartySetsPolicyServiceTest, FindEntry_FpsDisabled) { + base::test::ScopedFeatureList features; + net::SchemefulSite primary_site(GURL("https://primary.test")); + net::SchemefulSite associate1_site(GURL("https://associate1.test")); + + // Create Global First-Party Sets with the following set: + // { primary: "https://primary.test", + // associatedSites: ["https://associate1.test"} + content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting( + net::GlobalFirstPartySets( + {{associate1_site, + {net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated, + 0)}}}, + {})); + service()->InitForTesting( + [](PrefService* prefs, + base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) { + std::move(callback).Run(net::FirstPartySetsContextConfig()); + }); + + // Simulate First-Party Sets disabled by the preference. + features.InitAndEnableFeature(features::kFirstPartySets); + profile()->GetPrefs()->SetBoolean(prefs::kPrivacySandboxFirstPartySetsEnabled, + false); + + // Verify that FindEntry doesn't return associate1's entry when FPS is off. + EXPECT_FALSE(service()->FindEntry(associate1_site)); + + // Simulate First-Party Sets disabled by the feature. + features.Reset(); + features.InitAndDisableFeature(features::kFirstPartySets); + profile()->GetPrefs()->SetBoolean(prefs::kPrivacySandboxFirstPartySetsEnabled, + true); + // Verify that FindEntry doesn't return associate1's entry when FPS is off. + EXPECT_FALSE(service()->FindEntry(associate1_site)); + env().RunUntilIdle(); +} + +TEST_F(FirstPartySetsPolicyServiceTest, + FindEntry_FpsEnabled_ReturnsEmptyUntilAllSetsReady) { + base::test::ScopedFeatureList features; + net::SchemefulSite primary_site(GURL("https://primary.test")); + net::SchemefulSite associate1_site(GURL("https://associate1.test")); + net::FirstPartySetEntry associate1_entry( + net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated, 0)); + + // Fully enable First-Party Sets. + features.InitAndEnableFeature(features::kFirstPartySets); + profile()->GetPrefs()->SetBoolean(prefs::kPrivacySandboxFirstPartySetsEnabled, + true); + // Verify that FindEntry returns empty if the global sets and profile sets + // aren't ready yet. + EXPECT_FALSE(service()->FindEntry(associate1_site)); + + // Simulate the global First-Party Sets with the following set: + // { primary: "https://primary.test", + // associatedSites: ["https://associate1.test"} + content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting( + net::GlobalFirstPartySets({{associate1_site, {associate1_entry}}}, {})); + + // Verify that FindEntry returns empty if both sources of sets aren't ready + // yet. + EXPECT_FALSE(service()->FindEntry(associate1_site)); + + // Simulate the profile set overrides are empty. + service()->InitForTesting( + [](PrefService* prefs, + base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) { + std::move(callback).Run(net::FirstPartySetsContextConfig()); + }); + + // Verify that FindEntry finally returns associate1's entry. + EXPECT_EQ(service()->FindEntry(associate1_site).value(), associate1_entry); + env().RunUntilIdle(); +} + +class FirstPartySetsPolicyServicePrefObserverTest + : public FirstPartySetsPolicyServiceTest { + public: + FirstPartySetsPolicyServicePrefObserverTest() { + // Enable base::Feature for all tests since only the pref can change + // whether the service is enabled. + features_.InitAndEnableFeature(features::kFirstPartySets); + } + + private: + base::test::ScopedFeatureList features_; +}; + +TEST_F(FirstPartySetsPolicyServicePrefObserverTest, OnProfileConfigReady_InitDisabled_NotifiesReadyWithConfig) { net::SchemefulSite test_primary(GURL("https://a.test")); net::FirstPartySetEntry test_entry(test_primary, net::SiteType::kPrimary, @@ -193,7 +338,7 @@ env().RunUntilIdle(); } -TEST_F(FirstPartySetsPolicyServiceTest, +TEST_F(FirstPartySetsPolicyServicePrefObserverTest, OnFirstPartySetsEnabledChanged_Default_WithConfig) { service()->InitForTesting( [](PrefService* prefs, @@ -207,7 +352,7 @@ env().RunUntilIdle(); } -TEST_F(FirstPartySetsPolicyServiceTest, +TEST_F(FirstPartySetsPolicyServicePrefObserverTest, OnFirstPartySetsEnabledChanged_Default_WithoutConfig) { EXPECT_CALL(mock_delegate, SetEnabled(_)).Times(0); EXPECT_CALL(mock_delegate, NotifyReady(_)).Times(0); @@ -215,7 +360,7 @@ env().RunUntilIdle(); } -TEST_F(FirstPartySetsPolicyServiceTest, +TEST_F(FirstPartySetsPolicyServicePrefObserverTest, OnFirstPartySetsEnabledChanged_Disables_WithConfig) { service()->InitForTesting( [](PrefService* prefs, @@ -230,7 +375,7 @@ env().RunUntilIdle(); } -TEST_F(FirstPartySetsPolicyServiceTest, +TEST_F(FirstPartySetsPolicyServicePrefObserverTest, OnFirstPartySetsEnabledChanged_Disables_WithoutConfig) { service()->OnFirstPartySetsEnabledChanged(false); @@ -240,7 +385,7 @@ env().RunUntilIdle(); } -TEST_F(FirstPartySetsPolicyServiceTest, +TEST_F(FirstPartySetsPolicyServicePrefObserverTest, OnFirstPartySetsEnabledChanged_Enables_WithConfig) { net::SchemefulSite test_primary(GURL("https://a.test")); net::FirstPartySetEntry test_entry(test_primary, net::SiteType::kPrimary, @@ -264,7 +409,7 @@ env().RunUntilIdle(); } -TEST_F(FirstPartySetsPolicyServiceTest, +TEST_F(FirstPartySetsPolicyServicePrefObserverTest, OnFirstPartySetsEnabledChanged_Enables_WithoutConfig) { service()->OnFirstPartySetsEnabledChanged(true);
diff --git a/chrome/browser/hid/chrome_hid_delegate_unittest.cc b/chrome/browser/hid/chrome_hid_delegate_unittest.cc index b6850ac9..1cea438 100644 --- a/chrome/browser/hid/chrome_hid_delegate_unittest.cc +++ b/chrome/browser/hid/chrome_hid_delegate_unittest.cc
@@ -4,19 +4,25 @@ #include "chrome/browser/hid/chrome_hid_delegate.h" +#include <memory> + #include "base/guid.h" +#include "base/run_loop.h" +#include "base/strings/stringprintf.h" #include "base/test/repeating_test_future.h" #include "base/test/test_future.h" #include "build/build_config.h" #include "chrome/browser/hid/hid_chooser_context.h" #include "chrome/browser/hid/hid_chooser_context_factory.h" #include "chrome/browser/prefs/browser_prefs.h" +#include "chrome/common/chrome_features.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" #include "content/public/browser/web_contents.h" #include "content/public/test/back_forward_cache_util.h" +#include "content/public/test/embedded_worker_instance_test_harness.h" #include "content/public/test/web_contents_tester.h" #include "extensions/buildflags/buildflags.h" #include "services/device/public/cpp/test/fake_hid_manager.h" @@ -53,10 +59,12 @@ constexpr base::StringPiece kDefaultTestUrl{"https://www.google.com"}; constexpr base::StringPiece kCrossOriginTestUrl{"https://www.chromium.org"}; +constexpr char kTestUserEmail[] = "user@example.com"; #if BUILDFLAG(ENABLE_EXTENSIONS) constexpr base::StringPiece kPrivilegedExtensionId{ "ckcendljdlmgnhghiaomidhiiclmapok"}; +constexpr base::StringPiece kExtensionDocumentFileName{"index.html"}; #endif // BUILDFLAG(ENABLE_EXTENSIONS) MATCHER_P(HasGuid, matcher, "") { @@ -139,96 +147,8 @@ mojo::Receiver<device::mojom::HidConnectionClient> receiver_{this}; }; -class ChromeHidDelegateTest : public ChromeRenderViewHostTestHarness { +class ChromeHidTestHelper { public: - ChromeHidDelegateTest() = default; - ChromeHidDelegateTest(const ChromeHidDelegateTest&) = delete; - ChromeHidDelegateTest& operator=(const ChromeHidDelegateTest&) = delete; - ~ChromeHidDelegateTest() override = default; - - void SetUp() override { - ChromeRenderViewHostTestHarness::SetUp(); - - // On ChromeOS a user account is needed in order to check whether the user - // account is affiliated with the device owner for the purposes of applying - // enterprise policy. - constexpr char kTestUserEmail[] = "user@example.com"; -#if BUILDFLAG(IS_CHROMEOS_ASH) - constexpr char kTestUserGaiaId[] = "1111111111"; - auto fake_user_manager = std::make_unique<ash::FakeChromeUserManager>(); - auto* fake_user_manager_ptr = fake_user_manager.get(); - scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( - std::move(fake_user_manager)); - - auto account_id = - AccountId::FromUserEmailGaiaId(kTestUserEmail, kTestUserGaiaId); - fake_user_manager_ptr->AddUser(account_id); - fake_user_manager_ptr->LoginUser(account_id); -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - - profile_manager_ = std::make_unique<TestingProfileManager>( - TestingBrowserProcess::GetGlobal()); - ASSERT_TRUE(profile_manager_->SetUp()); - profile_ = profile_manager_->CreateTestingProfile(kTestUserEmail); - ASSERT_TRUE(profile_); - // Create a new web contents for `profile_`. - SetContents( - content::WebContentsTester::CreateTestWebContents(profile_, nullptr)); - - NavigateAndCommit(GURL(kDefaultTestUrl)); - BindHidManager(); - } - - void TearDown() override { - DeleteContents(); - profile_manager_->DeleteAllTestingProfiles(); - profile_manager_.reset(); - profile_ = nullptr; - -#if BUILDFLAG(IS_CHROMEOS_ASH) - scoped_user_manager_.reset(); -#endif - - ChromeRenderViewHostTestHarness::TearDown(); - } - - protected: -#if BUILDFLAG(ENABLE_EXTENSIONS) - // Creates a fake extension with the specified `extension_id` so that it can - // exercise behaviors that are only enabled for privileged extensions. - absl::optional<GURL> CreateExtensionWithId(base::StringPiece extension_id) { - extensions::DictionaryBuilder manifest; - manifest.Set("name", "Fake extension") - .Set("description", "For testing.") - .Set("version", "0.1") - .Set("manifest_version", 2) - .Set("web_accessible_resources", - extensions::ListBuilder().Append("index.html").Build()); - scoped_refptr<const extensions::Extension> extension = - extensions::ExtensionBuilder() - .SetManifest(manifest.Build()) - .SetID(std::string(extension_id)) - .Build(); - if (!extension) { - return absl::nullopt; - } - extensions::TestExtensionSystem* extension_system = - static_cast<extensions::TestExtensionSystem*>( - extensions::ExtensionSystem::Get(profile_)); - extensions::ExtensionService* extension_service = - extension_system->CreateExtensionService( - base::CommandLine::ForCurrentProcess(), base::FilePath(), false); - extension_service->AddExtension(extension.get()); - return extension->GetResourceURL("index.html"); - } -#endif // BUILDFLAG(ENABLE_EXTENSIONS) - - void ConnectToService( - mojo::PendingReceiver<blink::mojom::HidService> receiver) { - content::RenderFrameHostTester::For(main_rfh()) - ->CreateHidServiceForTesting(std::move(receiver)); - } - void SimulateDeviceServiceCrash() { hid_manager_->SimulateConnectionError(); hid_manager_.reset(); @@ -254,7 +174,9 @@ return HidChooserContextFactory::GetForProfile(profile_); } - private: + virtual void ConnectToService( + mojo::PendingReceiver<blink::mojom::HidService> receiver) = 0; + void BindHidManager() { EXPECT_FALSE(hid_manager_); hid_manager_ = std::make_unique<device::FakeHidManager>(); @@ -266,501 +188,851 @@ EXPECT_TRUE(devices_future.Wait()); } - std::unique_ptr<device::FakeHidManager> hid_manager_; - std::unique_ptr<TestingProfileManager> profile_manager_; - raw_ptr<Profile> profile_ = nullptr; +#if BUILDFLAG(IS_CHROMEOS_ASH) + void SetUpUserManager(TestingProfile* profile) { + // On ChromeOS a user account is needed in order to check whether the user + // account is affiliated with the device owner for the purposes of applying + // enterprise policy. + constexpr char kTestUserGaiaId[] = "1111111111"; + auto fake_user_manager = std::make_unique<ash::FakeChromeUserManager>(); + auto* fake_user_manager_ptr = fake_user_manager.get(); + scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( + std::move(fake_user_manager)); + auto account_id = + AccountId::FromUserEmailGaiaId(kTestUserEmail, kTestUserGaiaId); + fake_user_manager_ptr->AddUserWithAffiliationAndTypeAndProfile( + account_id, /*is_affiliated=*/false, user_manager::USER_TYPE_REGULAR, + profile); + fake_user_manager_ptr->LoginUser(account_id); + } + + void TearDownUserManager() { scoped_user_manager_.reset(); } +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + +#if BUILDFLAG(ENABLE_EXTENSIONS) + // Creates a fake extension with the specified `extension_id` so that it can + // exercise behaviors that are only enabled for privileged extensions. + scoped_refptr<const extensions::Extension> CreateExtensionWithId( + base::StringPiece extension_id) { + extensions::DictionaryBuilder manifest; + manifest.Set("name", "Fake extension") + .Set("description", "For testing.") + .Set("version", "0.1") + .Set("manifest_version", 2) + .Set("web_accessible_resources", extensions::ListBuilder() + .Append(kExtensionDocumentFileName) + .Build()); + scoped_refptr<const extensions::Extension> extension = + extensions::ExtensionBuilder() + .SetManifest(manifest.Build()) + .SetID(std::string(extension_id)) + .Build(); + if (!extension) { + return nullptr; + } + extensions::TestExtensionSystem* extension_system = + static_cast<extensions::TestExtensionSystem*>( + extensions::ExtensionSystem::Get(profile_)); + extensions::ExtensionService* extension_service = + extension_system->CreateExtensionService( + base::CommandLine::ForCurrentProcess(), base::FilePath(), false); + extension_service->AddExtension(extension.get()); + return extension; + } +#endif // BUILDFLAG(ENABLE_EXTENSIONS) + + void SetUpWebPageOriginUrl() { origin_url_ = GURL(kDefaultTestUrl); } + + void SetUpExtensionOriginUrl() { + extension_ = CreateExtensionWithId(kPrivilegedExtensionId); + origin_url_ = extension_->origin().GetURL(); + } + + virtual void SetUpOriginUrl() = 0; + + void TestHidServiceNotConnected() { + base::RunLoop run_loop; + mojo::Remote<blink::mojom::HidService> hid_service; + ConnectToService(hid_service.BindNewPipeAndPassReceiver()); + hid_service.set_disconnect_handler(run_loop.QuitClosure()); + run_loop.Run(); + EXPECT_FALSE(hid_service.is_connected()); + } + + void TestAddChangeRemoveDevice() { + const auto origin = url::Origin::Create(origin_url_); + // Connect a device with one of its collections missing. + auto incomplete_device = CreateIncompleteFakeDevice(); + AddDevice(incomplete_device); + + // Grant permission to access `incomplete_device` from `origin`. + GetChooserContext()->GrantDevicePermission(origin, *incomplete_device); + + // Create the HidService and register a `mock_client` to receive + // notifications on device connections and disconnections. + mojo::Remote<blink::mojom::HidService> hid_service; + ConnectToService(hid_service.BindNewPipeAndPassReceiver()); + NiceMock<MockHidManagerClient> mock_client; + hid_service->RegisterClient(mock_client.BindReceiverAndPassRemote()); + + // Call GetDevices to ensure the service is started and the client is set. + { + TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; + hid_service->GetDevices(devices_future.GetCallback()); + ASSERT_THAT(devices_future.Get(), + ElementsAre(HasGuid(incomplete_device->guid))); + EXPECT_EQ(devices_future.Get().front()->collections.size(), + incomplete_device->collections.size()); + } + + // Update the device with the missing collection. + auto complete_device = CreateFakeDevice(); + complete_device->guid = incomplete_device->guid; + complete_device->serial_number = incomplete_device->serial_number; + TestFuture<device::mojom::HidDeviceInfoPtr> device_changed_future; + EXPECT_CALL(mock_client, DeviceChanged).WillOnce([&](auto d) { + device_changed_future.SetValue(std::move(d)); + }); + ChangeDevice(complete_device); + EXPECT_EQ(device_changed_future.Get()->guid, complete_device->guid); + + // Call GetDevices and make sure there is still only one device with the + // same `guid` but the complete device info is returned. + { + TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; + hid_service->GetDevices(devices_future.GetCallback()); + ASSERT_THAT(devices_future.Get(), + ElementsAre(HasGuid(incomplete_device->guid))); + EXPECT_EQ(devices_future.Get().front()->collections.size(), + complete_device->collections.size()); + } + + // Disconnect the devices. The `mock_client` should be notified. + TestFuture<device::mojom::HidDeviceInfoPtr> device_removed_future; + EXPECT_CALL(mock_client, DeviceRemoved).WillOnce([&](auto d) { + device_removed_future.SetValue(std::move(d)); + }); + RemoveDevice(incomplete_device); + EXPECT_EQ(device_removed_future.Get()->guid, incomplete_device->guid); + + // Reconnect the device. The `mock_client` should be notified. + TestFuture<device::mojom::HidDeviceInfoPtr> device_added_future; + EXPECT_CALL(mock_client, DeviceAdded).WillOnce([&](auto d) { + device_added_future.SetValue(std::move(d)); + }); + AddDevice(complete_device); + EXPECT_EQ(device_added_future.Get()->guid, incomplete_device->guid); + } + + void TestNoPermissionDevice() { + const auto origin = url::Origin::Create(origin_url_); + + // Connect two devices. + auto allowed_device1 = CreateFakeDevice(); + AddDevice(allowed_device1); + auto other_device1 = CreateFakeDevice(); + AddDevice(other_device1); + + // Grant permission to access `allowed_device1` from `origin`. + GetChooserContext()->GrantDevicePermission(origin, *allowed_device1); + + // Create the HidService and register a `mock_client` to receive + // notifications on device connections and disconnections. + mojo::Remote<blink::mojom::HidService> hid_service; + ConnectToService(hid_service.BindNewPipeAndPassReceiver()); + NiceMock<MockHidManagerClient> mock_client; + hid_service->RegisterClient(mock_client.BindReceiverAndPassRemote()); + + // Call GetDevices to ensure the service is started and the client is set. + TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; + hid_service->GetDevices(devices_future.GetCallback()); + EXPECT_THAT(devices_future.Get(), + ElementsAre(HasGuid(allowed_device1->guid))); + + // Connect two more devices. + auto allowed_device2 = CreateFakeDevice(); + AddDevice(allowed_device2); + auto other_device2 = CreateFakeDevice(); + AddDevice(other_device2); + + // Grant permission to access `allowed_device2` from `origin`. + GetChooserContext()->GrantDevicePermission(origin, *allowed_device2); + + // Disconnect all four devices. The `mock_client` should be notified only + // for the devices it has permission to access. + RepeatingTestFuture<device::mojom::HidDeviceInfoPtr> device_removed_future; + EXPECT_CALL(mock_client, DeviceRemoved) + .Times(2) + .WillRepeatedly( + [&](auto d) { device_removed_future.AddValue(std::move(d)); }); + RemoveDevice(allowed_device1); + RemoveDevice(allowed_device2); + RemoveDevice(other_device1); + RemoveDevice(other_device2); + EXPECT_EQ(device_removed_future.Take()->guid, allowed_device1->guid); + EXPECT_EQ(device_removed_future.Take()->guid, allowed_device2->guid); + + // Reconnect all four devices. The `mock_client` should be notified only for + // the devices it has permission to access. + RepeatingTestFuture<device::mojom::HidDeviceInfoPtr> device_added_future; + EXPECT_CALL(mock_client, DeviceAdded).Times(2).WillRepeatedly([&](auto d) { + device_added_future.AddValue(std::move(d)); + }); + AddDevice(allowed_device1); + AddDevice(allowed_device2); + AddDevice(other_device1); + AddDevice(other_device2); + EXPECT_EQ(device_added_future.Take()->guid, allowed_device1->guid); + EXPECT_EQ(device_added_future.Take()->guid, allowed_device2->guid); + } + + void TestReconnectHidService() { + const auto origin = url::Origin::Create(origin_url_); + + // Connect two devices. Configure `ephemeral_device` with no serial number + // so it is not eligible for persistent permissions. + auto device = CreateFakeDevice(); + auto ephemeral_device = CreateFakeDevice(); + ephemeral_device->serial_number = ""; + AddDevice(device); + AddDevice(ephemeral_device); + + // Grant permission for `origin` to access both devices. `device` is + // eligible for persistent permissions and `ephemeral_device` is only + // eligible for ephemeral permissions. + GetChooserContext()->GrantDevicePermission(origin, *device); + GetChooserContext()->GrantDevicePermission(origin, *ephemeral_device); + + // Create the HidService and register a `mock_client` to receive + // notifications on device connections and disconnections. Call `GetDevices` + // to ensure the service is started and the client is set. + mojo::Remote<blink::mojom::HidService> hid_service; + ConnectToService(hid_service.BindNewPipeAndPassReceiver()); + NiceMock<MockHidManagerClient> mock_client; + hid_service->RegisterClient(mock_client.BindReceiverAndPassRemote()); + { + TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; + hid_service->GetDevices(devices_future.GetCallback()); + EXPECT_THAT(devices_future.Get(), + UnorderedElementsAre(HasGuid(device->guid), + HasGuid(ephemeral_device->guid))); + } + + // Both permissions are granted. + EXPECT_TRUE(GetChooserContext()->HasDevicePermission(origin, *device)); + EXPECT_TRUE( + GetChooserContext()->HasDevicePermission(origin, *ephemeral_device)); + + // Simulate a device service crash. + base::RunLoop loop; + EXPECT_CALL(mock_client, ConnectionError).WillOnce([&]() { loop.Quit(); }); + SimulateDeviceServiceCrash(); + loop.Run(); + + // The ephemeral permission is revoked. + EXPECT_TRUE(GetChooserContext()->HasDevicePermission(origin, *device)); + EXPECT_FALSE( + GetChooserContext()->HasDevicePermission(origin, *ephemeral_device)); + + // Add a new device eligible for persistent permissions. + auto another_device = CreateFakeDevice(); + AddDevice(another_device); + EXPECT_CALL(mock_client, DeviceAdded).Times(0); + base::RunLoop().RunUntilIdle(); + + // Grant the device permission while the service is off. + GetChooserContext()->GrantDevicePermission(origin, *another_device); + + // `mock_client` is not notified when `device` is removed because the + // service is off. + RemoveDevice(device); + EXPECT_CALL(mock_client, DeviceRemoved).Times(0); + base::RunLoop().RunUntilIdle(); + + // Reconnect the service. + hid_service.reset(); + ConnectToService(hid_service.BindNewPipeAndPassReceiver()); + hid_service->RegisterClient(mock_client.BindReceiverAndPassRemote()); + { + TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; + hid_service->GetDevices(devices_future.GetCallback()); + EXPECT_THAT(devices_future.Get(), + ElementsAre(HasGuid(another_device->guid))); + } + + // The persistent permissions are still granted. + EXPECT_TRUE(GetChooserContext()->HasDevicePermission(origin, *device)); + EXPECT_TRUE( + GetChooserContext()->HasDevicePermission(origin, *another_device)); + EXPECT_FALSE( + GetChooserContext()->HasDevicePermission(origin, *ephemeral_device)); + } + + void TestRevokeDevicePermission() { + const auto origin = url::Origin::Create(origin_url_); + + // Connect a device. + auto device = CreateFakeDevice(); + AddDevice(device); + + // Create the `HidService`. + mojo::Remote<blink::mojom::HidService> hid_service; + ConnectToService(hid_service.BindNewPipeAndPassReceiver()); + + // Call GetDevices to ensure the service is started. + TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; + hid_service->GetDevices(devices_future.GetCallback()); + EXPECT_TRUE(devices_future.Get().empty()); + + // Grant permission to access the connected device. + GetChooserContext()->GrantDevicePermission(origin, *device); + auto objects = GetChooserContext()->GetGrantedObjects(origin); + ASSERT_EQ(1u, objects.size()); + + // Open a connection to `device`. + FakeHidConnectionClient connection_client; + mojo::PendingRemote<device::mojom::HidConnectionClient> + hid_connection_client; + connection_client.Bind( + hid_connection_client.InitWithNewPipeAndPassReceiver()); + TestFuture<mojo::PendingRemote<device::mojom::HidConnection>> + pending_remote_future; + hid_service->Connect(device->guid, std::move(hid_connection_client), + pending_remote_future.GetCallback()); + mojo::Remote<device::mojom::HidConnection> connection; + connection.Bind(pending_remote_future.Take()); + ASSERT_TRUE(connection); + + // Revoke the permission. The device should be disconnected. + base::RunLoop disconnect_loop; + connection.set_disconnect_handler(disconnect_loop.QuitClosure()); + GetChooserContext()->RevokeDevicePermission(origin, *device); + disconnect_loop.Run(); + } + + void TestRevokeDevicePermissionEphemeral() { + const auto origin = url::Origin::Create(origin_url_); + + // Connect a device. Configure it with no serial number so it is not + // eligible for persistent permissions. + auto device = CreateFakeDevice(); + device->serial_number = ""; + AddDevice(device); + + // Create the `HidService`. + mojo::Remote<blink::mojom::HidService> hid_service; + ConnectToService(hid_service.BindNewPipeAndPassReceiver()); + + // Call GetDevices to ensure the service is started. + TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; + hid_service->GetDevices(devices_future.GetCallback()); + EXPECT_TRUE(devices_future.Get().empty()); + + // Grant permission to access the connected device. + GetChooserContext()->GrantDevicePermission(origin, *device); + auto objects = GetChooserContext()->GetGrantedObjects(origin); + ASSERT_EQ(1u, objects.size()); + + // Open a connection to `device`. + FakeHidConnectionClient connection_client; + mojo::PendingRemote<device::mojom::HidConnectionClient> + hid_connection_client; + connection_client.Bind( + hid_connection_client.InitWithNewPipeAndPassReceiver()); + TestFuture<mojo::PendingRemote<device::mojom::HidConnection>> + pending_remote_future; + hid_service->Connect(device->guid, std::move(hid_connection_client), + pending_remote_future.GetCallback()); + mojo::Remote<device::mojom::HidConnection> connection; + connection.Bind(pending_remote_future.Take()); + ASSERT_TRUE(connection); + + // Revoke the permission. The device should be disconnected. + base::RunLoop disconnect_loop; + connection.set_disconnect_handler(disconnect_loop.QuitClosure()); + GetChooserContext()->RevokeDevicePermission(origin, *device); + disconnect_loop.Run(); + } + + void TestConnectAndDisconnect(content::WebContents* web_contents) { + const auto origin = url::Origin::Create(origin_url_); + + // Create the `HidService`. + mojo::Remote<blink::mojom::HidService> hid_service; + ConnectToService(hid_service.BindNewPipeAndPassReceiver()); + + // Connect a device. + auto device = CreateFakeDevice(); + AddDevice(device); + + // Grant permission to access `device` from `origin`. + GetChooserContext()->GrantDevicePermission(origin, *device); + + // Call `GetDevices` and expect the device to be returned. + TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; + hid_service->GetDevices(devices_future.GetCallback()); + EXPECT_THAT(devices_future.Take(), ElementsAre(HasGuid(device->guid))); + + if (web_contents) { + // The `WebContents` should not indicate we are connected to a device. + EXPECT_FALSE(web_contents->IsConnectedToHidDevice()); + } + + // Open a connection to `device`. + FakeHidConnectionClient connection_client; + mojo::PendingRemote<device::mojom::HidConnectionClient> + hid_connection_client; + connection_client.Bind( + hid_connection_client.InitWithNewPipeAndPassReceiver()); + TestFuture<mojo::PendingRemote<device::mojom::HidConnection>> + pending_remote_future; + hid_service->Connect(device->guid, std::move(hid_connection_client), + pending_remote_future.GetCallback()); + mojo::Remote<device::mojom::HidConnection> connection; + connection.Bind(pending_remote_future.Take()); + ASSERT_TRUE(connection); + + if (web_contents) { + // Now the `WebContents` should indicate we are connected to a device. + EXPECT_TRUE(web_contents->IsConnectedToHidDevice()); + } + + // Close `connection` and check that the `WebContents` no longer indicates + // we are connected. + connection.reset(); + base::RunLoop().RunUntilIdle(); + + if (web_contents) { + EXPECT_FALSE(web_contents->IsConnectedToHidDevice()); + } + } + + void TestConnectAndRemove(content::WebContents* web_contents) { + const auto origin = url::Origin::Create(origin_url_); + + // Create the `HidService`. + mojo::Remote<blink::mojom::HidService> hid_service; + ConnectToService(hid_service.BindNewPipeAndPassReceiver()); + + // Connect a device. + auto device = CreateFakeDevice(); + AddDevice(device); + + // Grant permission to access `device` from `origin`. + GetChooserContext()->GrantDevicePermission(origin, *device); + + // Call `GetDevices` and expect the device to be returned. + TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; + hid_service->GetDevices(devices_future.GetCallback()); + EXPECT_THAT(devices_future.Take(), ElementsAre(HasGuid(device->guid))); + + if (web_contents) { + // The `WebContents` should not indicate we are connected to a device. + EXPECT_FALSE(web_contents->IsConnectedToHidDevice()); + } + + // Open a connection to `device`. + FakeHidConnectionClient connection_client; + mojo::PendingRemote<device::mojom::HidConnectionClient> + hid_connection_client; + connection_client.Bind( + hid_connection_client.InitWithNewPipeAndPassReceiver()); + TestFuture<mojo::PendingRemote<device::mojom::HidConnection>> + pending_remote_future; + hid_service->Connect(device->guid, std::move(hid_connection_client), + pending_remote_future.GetCallback()); + mojo::Remote<device::mojom::HidConnection> connection; + connection.Bind(pending_remote_future.Take()); + ASSERT_TRUE(connection); + + if (web_contents) { + // Now the `WebContents` should indicate we are connected to a device. + EXPECT_TRUE(web_contents->IsConnectedToHidDevice()); + } + + // Remove `device` and check that the `WebContents` no longer indicates we + // are connected. + RemoveDevice(device); + base::RunLoop().RunUntilIdle(); + + if (web_contents) { + EXPECT_FALSE(web_contents->IsConnectedToHidDevice()); + } + } + +#if BUILDFLAG(ENABLE_EXTENSIONS) + void TestFidoDeviceAllowedWithPrivilegedOrigin( + content::WebContents* web_contents) { + auto origin = url::Origin::Create(origin_url_); + // Connect a FIDO device. + auto device = CreateFakeFidoDevice(); + AddDevice(device); + + // Grant permission to access `device` from `privileged_origin`. + GetChooserContext()->GrantDevicePermission(origin, *device); + + // Create the `HidService`. + mojo::Remote<blink::mojom::HidService> hid_service; + ConnectToService(hid_service.BindNewPipeAndPassReceiver()); + + // Call `GetDevices` and expect the device to be returned. + TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; + hid_service->GetDevices(devices_future.GetCallback()); + EXPECT_THAT(devices_future.Take(), ElementsAre(HasGuid(device->guid))); + + if (web_contents) { + // The `WebContents` should not indicate we are connected to a device. + EXPECT_FALSE(web_contents->IsConnectedToHidDevice()); + } + + // Open a connection to `device`. + FakeHidConnectionClient connection_client; + mojo::PendingRemote<device::mojom::HidConnectionClient> + hid_connection_client; + connection_client.Bind( + hid_connection_client.InitWithNewPipeAndPassReceiver()); + TestFuture<mojo::PendingRemote<device::mojom::HidConnection>> + pending_remote_future; + hid_service->Connect(device->guid, std::move(hid_connection_client), + pending_remote_future.GetCallback()); + mojo::Remote<device::mojom::HidConnection> connection; + connection.Bind(pending_remote_future.Take()); + ASSERT_TRUE(connection); + + if (web_contents) { + // Now the `WebContents` should indicate we are connected to a device. + EXPECT_TRUE(web_contents->IsConnectedToHidDevice()); + } + } +#endif + + protected: + raw_ptr<TestingProfile> profile_ = nullptr; + GURL origin_url_; + + private: + std::unique_ptr<device::FakeHidManager> hid_manager_; #if BUILDFLAG(IS_CHROMEOS_ASH) std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; #endif + scoped_refptr<const extensions::Extension> extension_; }; +class ChromeHidDelegateRenderFrameTestBase + : public ChromeRenderViewHostTestHarness, + public ChromeHidTestHelper { + public: + void SetUp() override { + ChromeRenderViewHostTestHarness::SetUp(); + profile_manager_ = std::make_unique<TestingProfileManager>( + TestingBrowserProcess::GetGlobal()); + ASSERT_TRUE(profile_manager_->SetUp()); + profile_ = profile_manager_->CreateTestingProfile(kTestUserEmail); + ASSERT_TRUE(profile_); +#if BUILDFLAG(IS_CHROMEOS_ASH) + SetUpUserManager(profile_.get()); +#endif + // Create a new web contents for `profile_`. + SetContents( + content::WebContentsTester::CreateTestWebContents(profile_, nullptr)); + BindHidManager(); + SetUpOriginUrl(); + NavigateAndCommit(origin_url_); + } + + void TearDown() override { + DeleteContents(); +#if BUILDFLAG(IS_CHROMEOS_ASH) + TearDownUserManager(); +#endif + profile_manager_->DeleteAllTestingProfiles(); + profile_manager_.reset(); + profile_ = nullptr; + ChromeRenderViewHostTestHarness::TearDown(); + } + + // ChromeHidTestHelper + void ConnectToService( + mojo::PendingReceiver<blink::mojom::HidService> receiver) override { + content::RenderFrameHostTester::For(main_rfh()) + ->CreateHidServiceForTesting(std::move(receiver)); + } + + void TestConnectAndNavigateCrossDocument(content::WebContents* web_contents) { + // The test assumes the previous page gets deleted after navigation, + // disconnecting the device. Disable back/forward cache to ensure that it + // doesn't get preserved in the cache. + // TODO(crbug.com/1346021): Integrate WebHID with bfcache and remove this. + content::DisableBackForwardCacheForTesting( + web_contents, content::BackForwardCache::TEST_REQUIRES_NO_CACHING); + + const auto origin = url::Origin::Create(origin_url_); + + // Create the `HidService`. + mojo::Remote<blink::mojom::HidService> hid_service; + ConnectToService(hid_service.BindNewPipeAndPassReceiver()); + + // Connect a device. + auto device = CreateFakeDevice(); + AddDevice(device); + + // Grant permission to access `device` from `origin`. + GetChooserContext()->GrantDevicePermission(origin, *device); + + // Call `GetDevices` and expect the device to be returned. + TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; + hid_service->GetDevices(devices_future.GetCallback()); + EXPECT_THAT(devices_future.Take(), ElementsAre(HasGuid(device->guid))); + + // The `WebContents` should not indicate we are connected to a device. + EXPECT_FALSE(web_contents->IsConnectedToHidDevice()); + + // Open a connection to `device`. + FakeHidConnectionClient connection_client; + mojo::PendingRemote<device::mojom::HidConnectionClient> + hid_connection_client; + connection_client.Bind( + hid_connection_client.InitWithNewPipeAndPassReceiver()); + TestFuture<mojo::PendingRemote<device::mojom::HidConnection>> + pending_remote_future; + hid_service->Connect(device->guid, std::move(hid_connection_client), + pending_remote_future.GetCallback()); + mojo::Remote<device::mojom::HidConnection> connection; + connection.Bind(pending_remote_future.Take()); + ASSERT_TRUE(connection); + + // Now the `WebContents` should indicate we are connected to a device. + EXPECT_TRUE(web_contents->IsConnectedToHidDevice()); + + // Perform a cross-document navigation. The `WebContents` should no longer + // indicate we are connected. + NavigateAndCommit(GURL(kCrossOriginTestUrl)); + base::RunLoop().RunUntilIdle(); + + EXPECT_FALSE(web_contents->IsConnectedToHidDevice()); + } + + private: + std::unique_ptr<TestingProfileManager> profile_manager_; +}; + +class ChromeHidDelegateRenderFrameTest + : public ChromeHidDelegateRenderFrameTestBase { + // ChromeHidTestHelper + void SetUpOriginUrl() override { SetUpWebPageOriginUrl(); } +}; + +class ChromeHidDelegateServiceWorkerTestBase + : public content::EmbeddedWorkerInstanceTestHarness, + public ChromeHidTestHelper { + public: + void SetUp() override { + content::EmbeddedWorkerInstanceTestHarness::SetUp(); +#if BUILDFLAG(IS_CHROMEOS_ASH) + SetUpUserManager(profile_.get()); +#endif + BindHidManager(); + SetUpOriginUrl(); + StartWorker(); + } + + void TearDown() override { + StopWorker(); +#if BUILDFLAG(IS_CHROMEOS_ASH) + TearDownUserManager(); +#endif + content::EmbeddedWorkerInstanceTestHarness::TearDown(); + } + + // ChromeHidTestHelper + void ConnectToService( + mojo::PendingReceiver<blink::mojom::HidService> receiver) override { + BindHidServiceToWorker(origin_url_, std::move(receiver)); + } + + void StartWorker() { + auto worker_url = + GURL(base::StringPrintf("%s/worker.js", origin_url_.spec().c_str())); + CreateAndStartWorker(origin_url_, worker_url); + } + + void StopWorker() { StopAndResetWorker(); } + + // content::EmbeddedWorkerInstanceTestHarness + std::unique_ptr<content::BrowserContext> CreateBrowserContext() override { + auto testing_profile = TestingProfile::Builder().Build(); + profile_ = testing_profile.get(); + return testing_profile; + } + + private: + ScopedTestingLocalState testing_local_state_{ + TestingBrowserProcess::GetGlobal()}; +}; + +class ChromeHidDelegateServiceWorkerTest + : public ChromeHidDelegateServiceWorkerTestBase { + public: + // ChromeHidTestHelper + void SetUpOriginUrl() override { SetUpWebPageOriginUrl(); } +}; + +#if BUILDFLAG(ENABLE_EXTENSIONS) +class EnableWebHidOnExtensionServiceWorkerHelper { + public: + EnableWebHidOnExtensionServiceWorkerHelper() { + scoped_feature_list_.InitWithFeatures( + {features::kEnableWebHidOnExtensionServiceWorker}, {}); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +class ChromeHidDelegateExtensionServiceWorkerTest + : public ChromeHidDelegateServiceWorkerTestBase { + public: + // ChromeHidTestHelper + void SetUpOriginUrl() override { SetUpExtensionOriginUrl(); } +}; + +class ChromeHidDelegateExtensionServiceWorkerFeatureEnabledTest + : public ChromeHidDelegateExtensionServiceWorkerTest, + public EnableWebHidOnExtensionServiceWorkerHelper {}; + +class ChromeHidDelegateServiceWorkerTestFeatureEnabledTest + : public ChromeHidDelegateServiceWorkerTest, + public EnableWebHidOnExtensionServiceWorkerHelper {}; + +class ChromeHidDelegateExtensionRenderFrameTest + : public ChromeHidDelegateRenderFrameTestBase { + public: + // ChromeHidTestHelper + void SetUpOriginUrl() override { SetUpExtensionOriginUrl(); } +}; +#endif // BUILDFLAG(ENABLE_EXTENSIONS) + } // namespace -TEST_F(ChromeHidDelegateTest, AddChangeRemoveDevice) { - const auto origin = url::Origin::Create(GURL(kDefaultTestUrl)); - - // Connect a device with one of its collections missing. - auto incomplete_device = CreateIncompleteFakeDevice(); - AddDevice(incomplete_device); - - // Grant permission to access `incomplete_device` from `origin`. - GetChooserContext()->GrantDevicePermission(origin, *incomplete_device); - - // Create the HidService and register a `mock_client` to receive - // notifications on device connections and disconnections. - mojo::Remote<blink::mojom::HidService> hid_service; - ConnectToService(hid_service.BindNewPipeAndPassReceiver()); - NiceMock<MockHidManagerClient> mock_client; - hid_service->RegisterClient(mock_client.BindReceiverAndPassRemote()); - - // Call GetDevices to ensure the service is started and the client is set. - { - TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; - hid_service->GetDevices(devices_future.GetCallback()); - ASSERT_THAT(devices_future.Get(), - ElementsAre(HasGuid(incomplete_device->guid))); - EXPECT_EQ(devices_future.Get().front()->collections.size(), - incomplete_device->collections.size()); - } - - // Update the device with the missing collection. - auto complete_device = CreateFakeDevice(); - complete_device->guid = incomplete_device->guid; - complete_device->serial_number = incomplete_device->serial_number; - TestFuture<device::mojom::HidDeviceInfoPtr> device_changed_future; - EXPECT_CALL(mock_client, DeviceChanged).WillOnce([&](auto d) { - device_changed_future.SetValue(std::move(d)); - }); - ChangeDevice(complete_device); - EXPECT_EQ(device_changed_future.Get()->guid, complete_device->guid); - - // Call GetDevices and make sure there is still only one device with the same - // `guid` but the complete device info is returned. - { - TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; - hid_service->GetDevices(devices_future.GetCallback()); - ASSERT_THAT(devices_future.Get(), - ElementsAre(HasGuid(incomplete_device->guid))); - EXPECT_EQ(devices_future.Get().front()->collections.size(), - complete_device->collections.size()); - } - - // Disconnect the devices. The `mock_client` should be notified. - TestFuture<device::mojom::HidDeviceInfoPtr> device_removed_future; - EXPECT_CALL(mock_client, DeviceRemoved).WillOnce([&](auto d) { - device_removed_future.SetValue(std::move(d)); - }); - RemoveDevice(incomplete_device); - EXPECT_EQ(device_removed_future.Get()->guid, incomplete_device->guid); - - // Reconnect the device. The `mock_client` should be notified. - TestFuture<device::mojom::HidDeviceInfoPtr> device_added_future; - EXPECT_CALL(mock_client, DeviceAdded).WillOnce([&](auto d) { - device_added_future.SetValue(std::move(d)); - }); - AddDevice(complete_device); - EXPECT_EQ(device_added_future.Get()->guid, incomplete_device->guid); +TEST_F(ChromeHidDelegateRenderFrameTest, AddChangeRemoveDevice) { + TestAddChangeRemoveDevice(); } -TEST_F(ChromeHidDelegateTest, NoPermissionDevice) { - const auto origin = url::Origin::Create(GURL(kDefaultTestUrl)); - - // Connect two devices. - auto allowed_device1 = CreateFakeDevice(); - AddDevice(allowed_device1); - auto other_device1 = CreateFakeDevice(); - AddDevice(other_device1); - - // Grant permission to access `allowed_device1` from `origin`. - GetChooserContext()->GrantDevicePermission(origin, *allowed_device1); - - // Create the HidService and register a `mock_client` to receive - // notifications on device connections and disconnections. - mojo::Remote<blink::mojom::HidService> hid_service; - ConnectToService(hid_service.BindNewPipeAndPassReceiver()); - NiceMock<MockHidManagerClient> mock_client; - hid_service->RegisterClient(mock_client.BindReceiverAndPassRemote()); - - // Call GetDevices to ensure the service is started and the client is set. - TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; - hid_service->GetDevices(devices_future.GetCallback()); - EXPECT_THAT(devices_future.Get(), - ElementsAre(HasGuid(allowed_device1->guid))); - - // Connect two more devices. - auto allowed_device2 = CreateFakeDevice(); - AddDevice(allowed_device2); - auto other_device2 = CreateFakeDevice(); - AddDevice(other_device2); - - // Grant permission to access `allowed_device2` from `origin`. - GetChooserContext()->GrantDevicePermission(origin, *allowed_device2); - - // Disconnect all four devices. The `mock_client` should be notified only for - // the devices it has permission to access. - RepeatingTestFuture<device::mojom::HidDeviceInfoPtr> device_removed_future; - EXPECT_CALL(mock_client, DeviceRemoved).Times(2).WillRepeatedly([&](auto d) { - device_removed_future.AddValue(std::move(d)); - }); - RemoveDevice(allowed_device1); - RemoveDevice(allowed_device2); - RemoveDevice(other_device1); - RemoveDevice(other_device2); - EXPECT_EQ(device_removed_future.Take()->guid, allowed_device1->guid); - EXPECT_EQ(device_removed_future.Take()->guid, allowed_device2->guid); - - // Reconnect all four devices. The `mock_client` should be notified only for - // the devices it has permission to access. - RepeatingTestFuture<device::mojom::HidDeviceInfoPtr> device_added_future; - EXPECT_CALL(mock_client, DeviceAdded).Times(2).WillRepeatedly([&](auto d) { - device_added_future.AddValue(std::move(d)); - }); - AddDevice(allowed_device1); - AddDevice(allowed_device2); - AddDevice(other_device1); - AddDevice(other_device2); - EXPECT_EQ(device_added_future.Take()->guid, allowed_device1->guid); - EXPECT_EQ(device_added_future.Take()->guid, allowed_device2->guid); +TEST_F(ChromeHidDelegateRenderFrameTest, NoPermissionDevice) { + TestNoPermissionDevice(); } -TEST_F(ChromeHidDelegateTest, ReconnectHidService) { - const auto origin = url::Origin::Create(GURL(kDefaultTestUrl)); - - // Connect two devices. Configure `ephemeral_device` with no serial number so - // it is not eligible for persistent permissions. - auto device = CreateFakeDevice(); - auto ephemeral_device = CreateFakeDevice(); - ephemeral_device->serial_number = ""; - AddDevice(device); - AddDevice(ephemeral_device); - - // Grant permission for `origin` to access both devices. `device` is eligible - // for persistent permissions and `ephemeral_device` is only eligible for - // ephemeral permissions. - GetChooserContext()->GrantDevicePermission(origin, *device); - GetChooserContext()->GrantDevicePermission(origin, *ephemeral_device); - - // Create the HidService and register a `mock_client` to receive - // notifications on device connections and disconnections. Call `GetDevices` - // to ensure the service is started and the client is set. - mojo::Remote<blink::mojom::HidService> hid_service; - ConnectToService(hid_service.BindNewPipeAndPassReceiver()); - NiceMock<MockHidManagerClient> mock_client; - hid_service->RegisterClient(mock_client.BindReceiverAndPassRemote()); - { - TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; - hid_service->GetDevices(devices_future.GetCallback()); - EXPECT_THAT(devices_future.Get(), - UnorderedElementsAre(HasGuid(device->guid), - HasGuid(ephemeral_device->guid))); - } - - // Both permissions are granted. - EXPECT_TRUE(GetChooserContext()->HasDevicePermission(origin, *device)); - EXPECT_TRUE( - GetChooserContext()->HasDevicePermission(origin, *ephemeral_device)); - - // Simulate a device service crash. - base::RunLoop loop; - EXPECT_CALL(mock_client, ConnectionError).WillOnce([&]() { loop.Quit(); }); - SimulateDeviceServiceCrash(); - loop.Run(); - - // The ephemeral permission is revoked. - EXPECT_TRUE(GetChooserContext()->HasDevicePermission(origin, *device)); - EXPECT_FALSE( - GetChooserContext()->HasDevicePermission(origin, *ephemeral_device)); - - // Add a new device eligible for persistent permissions. - auto another_device = CreateFakeDevice(); - AddDevice(another_device); - EXPECT_CALL(mock_client, DeviceAdded).Times(0); - base::RunLoop().RunUntilIdle(); - - // Grant the device permission while the service is off. - GetChooserContext()->GrantDevicePermission(origin, *another_device); - - // `mock_client` is not notified when `device` is removed because the service - // is off. - RemoveDevice(device); - EXPECT_CALL(mock_client, DeviceRemoved).Times(0); - base::RunLoop().RunUntilIdle(); - - // Reconnect the service. - hid_service.reset(); - ConnectToService(hid_service.BindNewPipeAndPassReceiver()); - hid_service->RegisterClient(mock_client.BindReceiverAndPassRemote()); - { - TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; - hid_service->GetDevices(devices_future.GetCallback()); - EXPECT_THAT(devices_future.Get(), - ElementsAre(HasGuid(another_device->guid))); - } - - // The persistent permissions are still granted. - EXPECT_TRUE(GetChooserContext()->HasDevicePermission(origin, *device)); - EXPECT_TRUE( - GetChooserContext()->HasDevicePermission(origin, *another_device)); - EXPECT_FALSE( - GetChooserContext()->HasDevicePermission(origin, *ephemeral_device)); +TEST_F(ChromeHidDelegateRenderFrameTest, ReconnectHidService) { + TestReconnectHidService(); } -TEST_F(ChromeHidDelegateTest, RevokeDevicePermission) { - const auto origin = url::Origin::Create(GURL(kDefaultTestUrl)); - - // Connect a device. - auto device = CreateFakeDevice(); - AddDevice(device); - - // Create the `HidService`. - mojo::Remote<blink::mojom::HidService> hid_service; - ConnectToService(hid_service.BindNewPipeAndPassReceiver()); - - // Call GetDevices to ensure the service is started. - TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; - hid_service->GetDevices(devices_future.GetCallback()); - EXPECT_TRUE(devices_future.Get().empty()); - - // Grant permission to access the connected device. - GetChooserContext()->GrantDevicePermission(origin, *device); - auto objects = GetChooserContext()->GetGrantedObjects(origin); - ASSERT_EQ(1u, objects.size()); - - // Open a connection to `device`. - FakeHidConnectionClient connection_client; - mojo::PendingRemote<device::mojom::HidConnectionClient> hid_connection_client; - connection_client.Bind( - hid_connection_client.InitWithNewPipeAndPassReceiver()); - TestFuture<mojo::PendingRemote<device::mojom::HidConnection>> - pending_remote_future; - hid_service->Connect(device->guid, std::move(hid_connection_client), - pending_remote_future.GetCallback()); - mojo::Remote<device::mojom::HidConnection> connection; - connection.Bind(pending_remote_future.Take()); - ASSERT_TRUE(connection); - - // Revoke the permission. The device should be disconnected. - base::RunLoop disconnect_loop; - connection.set_disconnect_handler(disconnect_loop.QuitClosure()); - GetChooserContext()->RevokeDevicePermission(origin, *device); - disconnect_loop.Run(); +TEST_F(ChromeHidDelegateRenderFrameTest, RevokeDevicePermission) { + TestRevokeDevicePermission(); } -TEST_F(ChromeHidDelegateTest, RevokeDevicePermissionEphemeral) { - const auto origin = url::Origin::Create(GURL(kDefaultTestUrl)); - - // Connect a device. Configure it with no serial number so it is not eligible - // for persistent permissions. - auto device = CreateFakeDevice(); - device->serial_number = ""; - AddDevice(device); - - // Create the `HidService`. - mojo::Remote<blink::mojom::HidService> hid_service; - ConnectToService(hid_service.BindNewPipeAndPassReceiver()); - - // Call GetDevices to ensure the service is started. - TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; - hid_service->GetDevices(devices_future.GetCallback()); - EXPECT_TRUE(devices_future.Get().empty()); - - // Grant permission to access the connected device. - GetChooserContext()->GrantDevicePermission(origin, *device); - auto objects = GetChooserContext()->GetGrantedObjects(origin); - ASSERT_EQ(1u, objects.size()); - - // Open a connection to `device`. - FakeHidConnectionClient connection_client; - mojo::PendingRemote<device::mojom::HidConnectionClient> hid_connection_client; - connection_client.Bind( - hid_connection_client.InitWithNewPipeAndPassReceiver()); - TestFuture<mojo::PendingRemote<device::mojom::HidConnection>> - pending_remote_future; - hid_service->Connect(device->guid, std::move(hid_connection_client), - pending_remote_future.GetCallback()); - mojo::Remote<device::mojom::HidConnection> connection; - connection.Bind(pending_remote_future.Take()); - ASSERT_TRUE(connection); - - // Revoke the permission. The device should be disconnected. - base::RunLoop disconnect_loop; - connection.set_disconnect_handler(disconnect_loop.QuitClosure()); - GetChooserContext()->RevokeDevicePermission(origin, *device); - disconnect_loop.Run(); +TEST_F(ChromeHidDelegateRenderFrameTest, RevokeDevicePermissionEphemeral) { + TestRevokeDevicePermissionEphemeral(); } -TEST_F(ChromeHidDelegateTest, ConnectAndDisconnect) { - const auto origin = url::Origin::Create(GURL(kDefaultTestUrl)); - - // Create the `HidService`. - mojo::Remote<blink::mojom::HidService> hid_service; - ConnectToService(hid_service.BindNewPipeAndPassReceiver()); - - // Connect a device. - auto device = CreateFakeDevice(); - AddDevice(device); - - // Grant permission to access `device` from `origin`. - GetChooserContext()->GrantDevicePermission(origin, *device); - - // Call `GetDevices` and expect the device to be returned. - TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; - hid_service->GetDevices(devices_future.GetCallback()); - EXPECT_THAT(devices_future.Take(), ElementsAre(HasGuid(device->guid))); - - // The `WebContents` should not indicate we are connected to a device. - EXPECT_FALSE(web_contents()->IsConnectedToHidDevice()); - - // Open a connection to `device`. - FakeHidConnectionClient connection_client; - mojo::PendingRemote<device::mojom::HidConnectionClient> hid_connection_client; - connection_client.Bind( - hid_connection_client.InitWithNewPipeAndPassReceiver()); - TestFuture<mojo::PendingRemote<device::mojom::HidConnection>> - pending_remote_future; - hid_service->Connect(device->guid, std::move(hid_connection_client), - pending_remote_future.GetCallback()); - mojo::Remote<device::mojom::HidConnection> connection; - connection.Bind(pending_remote_future.Take()); - ASSERT_TRUE(connection); - - // Now the `WebContents` should indicate we are connected to a device. - EXPECT_TRUE(web_contents()->IsConnectedToHidDevice()); - - // Close `connection` and check that the `WebContents` no longer indicates we - // are connected. - connection.reset(); - base::RunLoop().RunUntilIdle(); - - EXPECT_FALSE(web_contents()->IsConnectedToHidDevice()); +TEST_F(ChromeHidDelegateRenderFrameTest, ConnectAndDisconnect) { + TestConnectAndDisconnect(web_contents()); } -TEST_F(ChromeHidDelegateTest, ConnectAndRemove) { - const auto origin = url::Origin::Create(GURL(kDefaultTestUrl)); - - // Create the `HidService`. - mojo::Remote<blink::mojom::HidService> hid_service; - ConnectToService(hid_service.BindNewPipeAndPassReceiver()); - - // Connect a device. - auto device = CreateFakeDevice(); - AddDevice(device); - - // Grant permission to access `device` from `origin`. - GetChooserContext()->GrantDevicePermission(origin, *device); - - // Call `GetDevices` and expect the device to be returned. - TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; - hid_service->GetDevices(devices_future.GetCallback()); - EXPECT_THAT(devices_future.Take(), ElementsAre(HasGuid(device->guid))); - - // The `WebContents` should not indicate we are connected to a device. - EXPECT_FALSE(web_contents()->IsConnectedToHidDevice()); - - // Open a connection to `device`. - FakeHidConnectionClient connection_client; - mojo::PendingRemote<device::mojom::HidConnectionClient> hid_connection_client; - connection_client.Bind( - hid_connection_client.InitWithNewPipeAndPassReceiver()); - TestFuture<mojo::PendingRemote<device::mojom::HidConnection>> - pending_remote_future; - hid_service->Connect(device->guid, std::move(hid_connection_client), - pending_remote_future.GetCallback()); - mojo::Remote<device::mojom::HidConnection> connection; - connection.Bind(pending_remote_future.Take()); - ASSERT_TRUE(connection); - - // Now the `WebContents` should indicate we are connected to a device. - EXPECT_TRUE(web_contents()->IsConnectedToHidDevice()); - - // Remove `device` and check that the `WebContents` no longer indicates we are - // connected. - RemoveDevice(device); - base::RunLoop().RunUntilIdle(); - - EXPECT_FALSE(web_contents()->IsConnectedToHidDevice()); +TEST_F(ChromeHidDelegateRenderFrameTest, ConnectAndRemove) { + TestConnectAndRemove(web_contents()); } -TEST_F(ChromeHidDelegateTest, ConnectAndNavigateCrossDocument) { - // The test assumes the previous page gets deleted after navigation, - // disconnecting the device. Disable back/forward cache to ensure that it - // doesn't get preserved in the cache. - // TODO(crbug.com/1346021): Integrate WebHID with bfcache and remove this. - content::DisableBackForwardCacheForTesting( - web_contents(), content::BackForwardCache::TEST_REQUIRES_NO_CACHING); +TEST_F(ChromeHidDelegateRenderFrameTest, ConnectAndNavigateCrossDocument) { + TestConnectAndNavigateCrossDocument(web_contents()); +} - const auto origin = url::Origin::Create(GURL(kDefaultTestUrl)); +TEST_F(ChromeHidDelegateExtensionServiceWorkerTest, HidServiceNotConnected) { + TestHidServiceNotConnected(); +} - // Create the `HidService`. - mojo::Remote<blink::mojom::HidService> hid_service; - ConnectToService(hid_service.BindNewPipeAndPassReceiver()); +TEST_F(ChromeHidDelegateServiceWorkerTest, HidServiceNotConnected) { + TestHidServiceNotConnected(); +} - // Connect a device. - auto device = CreateFakeDevice(); - AddDevice(device); - - // Grant permission to access `device` from `origin`. - GetChooserContext()->GrantDevicePermission(origin, *device); - - // Call `GetDevices` and expect the device to be returned. - TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; - hid_service->GetDevices(devices_future.GetCallback()); - EXPECT_THAT(devices_future.Take(), ElementsAre(HasGuid(device->guid))); - - // The `WebContents` should not indicate we are connected to a device. - EXPECT_FALSE(web_contents()->IsConnectedToHidDevice()); - - // Open a connection to `device`. - FakeHidConnectionClient connection_client; - mojo::PendingRemote<device::mojom::HidConnectionClient> hid_connection_client; - connection_client.Bind( - hid_connection_client.InitWithNewPipeAndPassReceiver()); - TestFuture<mojo::PendingRemote<device::mojom::HidConnection>> - pending_remote_future; - hid_service->Connect(device->guid, std::move(hid_connection_client), - pending_remote_future.GetCallback()); - mojo::Remote<device::mojom::HidConnection> connection; - connection.Bind(pending_remote_future.Take()); - ASSERT_TRUE(connection); - - // Now the `WebContents` should indicate we are connected to a device. - EXPECT_TRUE(web_contents()->IsConnectedToHidDevice()); - - // Perform a cross-document navigation. The `WebContents` should no longer - // indicate we are connected. - NavigateAndCommit(GURL(kCrossOriginTestUrl)); - base::RunLoop().RunUntilIdle(); - - EXPECT_FALSE(web_contents()->IsConnectedToHidDevice()); +TEST_F(ChromeHidDelegateServiceWorkerTestFeatureEnabledTest, + HidServiceNotConnected) { + TestHidServiceNotConnected(); } #if BUILDFLAG(ENABLE_EXTENSIONS) -TEST_F(ChromeHidDelegateTest, FidoDeviceAllowedWithPrivilegedOrigin) { - // Create an extension with an allowlisted extension ID. - absl::optional<GURL> privileged_url = - CreateExtensionWithId(kPrivilegedExtensionId); - ASSERT_TRUE(privileged_url); +TEST_F(ChromeHidDelegateExtensionRenderFrameTest, + FidoDeviceAllowedWithPrivilegedOrigin) { + TestFidoDeviceAllowedWithPrivilegedOrigin(web_contents()); +} - const auto privileged_origin = url::Origin::Create(*privileged_url); +TEST_F(ChromeHidDelegateExtensionRenderFrameTest, AddChangeRemoveDevice) { + TestAddChangeRemoveDevice(); +} - // Connect a FIDO device. - auto device = CreateFakeFidoDevice(); - AddDevice(device); +TEST_F(ChromeHidDelegateExtensionRenderFrameTest, NoPermissionDevice) { + TestNoPermissionDevice(); +} - // Grant permission to access `device` from `privileged_origin`. - GetChooserContext()->GrantDevicePermission(privileged_origin, *device); +TEST_F(ChromeHidDelegateExtensionRenderFrameTest, ReconnectHidService) { + TestReconnectHidService(); +} - // Navigate to `privileged_url` so the current frame is privileged. - NavigateAndCommit(*privileged_url); +TEST_F(ChromeHidDelegateExtensionRenderFrameTest, RevokeDevicePermission) { + TestRevokeDevicePermission(); +} - // Create the `HidService`. - mojo::Remote<blink::mojom::HidService> hid_service; - ConnectToService(hid_service.BindNewPipeAndPassReceiver()); +TEST_F(ChromeHidDelegateExtensionRenderFrameTest, + RevokeDevicePermissionEphemeral) { + TestRevokeDevicePermissionEphemeral(); +} - // Call `GetDevices` and expect the device to be returned. - TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future; - hid_service->GetDevices(devices_future.GetCallback()); - EXPECT_THAT(devices_future.Take(), ElementsAre(HasGuid(device->guid))); +TEST_F(ChromeHidDelegateExtensionRenderFrameTest, ConnectAndDisconnect) { + TestConnectAndDisconnect(web_contents()); +} - // The `WebContents` should not indicate we are connected to a device. - EXPECT_FALSE(web_contents()->IsConnectedToHidDevice()); +TEST_F(ChromeHidDelegateExtensionRenderFrameTest, ConnectAndRemove) { + TestConnectAndRemove(web_contents()); +} - // Open a connection to `device`. - FakeHidConnectionClient connection_client; - mojo::PendingRemote<device::mojom::HidConnectionClient> hid_connection_client; - connection_client.Bind( - hid_connection_client.InitWithNewPipeAndPassReceiver()); - TestFuture<mojo::PendingRemote<device::mojom::HidConnection>> - pending_remote_future; - hid_service->Connect(device->guid, std::move(hid_connection_client), - pending_remote_future.GetCallback()); - mojo::Remote<device::mojom::HidConnection> connection; - connection.Bind(pending_remote_future.Take()); - ASSERT_TRUE(connection); +TEST_F(ChromeHidDelegateExtensionRenderFrameTest, + ConnectAndNavigateCrossDocument) { + TestConnectAndNavigateCrossDocument(web_contents()); +} - // Now the `WebContents` should indicate we are connected to a device. - EXPECT_TRUE(web_contents()->IsConnectedToHidDevice()); +TEST_F(ChromeHidDelegateExtensionServiceWorkerFeatureEnabledTest, + AddChangeRemoveDevice) { + TestAddChangeRemoveDevice(); +} + +TEST_F(ChromeHidDelegateExtensionServiceWorkerFeatureEnabledTest, + NoPermissionDevice) { + TestNoPermissionDevice(); +} + +TEST_F(ChromeHidDelegateExtensionServiceWorkerFeatureEnabledTest, + ReconnectHidService) { + TestReconnectHidService(); +} + +TEST_F(ChromeHidDelegateExtensionServiceWorkerFeatureEnabledTest, + RevokeDevicePermission) { + TestRevokeDevicePermission(); +} + +TEST_F(ChromeHidDelegateExtensionServiceWorkerFeatureEnabledTest, + RevokeDevicePermissionEphemeral) { + TestRevokeDevicePermissionEphemeral(); +} + +TEST_F(ChromeHidDelegateExtensionServiceWorkerFeatureEnabledTest, + ConnectAndDisconnect) { + TestConnectAndDisconnect(/*web_contents=*/nullptr); +} + +TEST_F(ChromeHidDelegateExtensionServiceWorkerFeatureEnabledTest, + ConnectAndRemove) { + TestConnectAndRemove(/*web_contents=*/nullptr); } #endif // BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/browser/lacros/cert/cert_db_initializer_browsertest.cc b/chrome/browser/lacros/cert/cert_db_initializer_browsertest.cc index 360dc0ad..dcbf3390 100644 --- a/chrome/browser/lacros/cert/cert_db_initializer_browsertest.cc +++ b/chrome/browser/lacros/cert/cert_db_initializer_browsertest.cc
@@ -17,7 +17,7 @@ #include "chrome/common/chrome_paths.h" #include "chrome/test/base/in_process_browser_test.h" #include "chromeos/crosapi/cpp/keystore_service_util.h" -#include "chromeos/crosapi/mojom/cert_database.mojom.h" +#include "chromeos/crosapi/mojom/keystore_service.mojom.h" #include "chromeos/lacros/lacros_service.h" #include "chromeos/lacros/lacros_test_helper.h" #include "components/version_info/version_info.h" @@ -51,12 +51,6 @@ // |kRootCaCert|. constexpr char kServerCert[] = "ok_cert.pem"; -bool IsMojoCertDatabaseVersionAtLeast(int required_version) { - DCHECK(chromeos::LacrosService::Get()); - return (chromeos::LacrosService::Get()->GetInterfaceVersion( - crosapi::mojom::CertDatabase::Uuid_) >= required_version); -} - base::FilePath GetTestCertsPath() { base::FilePath test_data_dir; EXPECT_TRUE(base::PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir)); @@ -277,14 +271,6 @@ // Tests that when Ash imports a new certificate, Lacros receives a // notification about it. IN_PROC_BROWSER_TEST_F(CertDbInitializerTest, CertsChangedNotificationFromAsh) { - if (!IsMojoCertDatabaseVersionAtLeast( - crosapi::mojom::CertDatabase:: - kAddAshCertDatabaseObserverMinVersion) && - !chromeos::IsAshVersionAtLeastForTesting(base::Version({101, 0, 4917}))) { - LOG(WARNING) << "Ash is too old, skipping the test."; - return; - } - auto& keystore_crosapi = chromeos::LacrosService::Get() ->GetRemote<crosapi::mojom::KeystoreService>();
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java index fe84362..717d1ed 100644 --- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java +++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java
@@ -43,6 +43,7 @@ import java.util.HashMap; import java.util.LinkedHashSet; import java.util.Locale; +import java.util.Set; /** * Implements a modal dialog that prompts the user to change their UI language. Displayed once at @@ -419,8 +420,14 @@ */ private static LinkedHashSet<LanguageItem> getTopLanguages( Collection<LanguageItem> uiLanguages, LanguageItem currentOverrideLanguage) { - LinkedHashSet<String> topLanguageCodes = - new LinkedHashSet<>(GeoLanguageProviderBridge.getCurrentGeoLanguages()); + LinkedHashSet<String> topLanguageCodes = new LinkedHashSet<>(); + + if (ChromeFeatureList.isEnabled(ChromeFeatureList.APP_LANGUAGE_PROMPT_ULP)) { + topLanguageCodes.addAll(LanguageBridge.getULPFromPreference()); + } else { + topLanguageCodes.addAll(GeoLanguageProviderBridge.getCurrentGeoLanguages()); + } + // Add current Accept-Languages to bottom of top languages list. topLanguageCodes.addAll(TranslateBridge.getUserLanguageCodes()); Locale originalSystemLocale = @@ -432,9 +439,9 @@ } /** - * Helper function isolating the logic for making the top language list for testing. Adds the - * system default language to the top of the list if needed and only adds top languages that are - * possible UI languages. + * Helper function isolating the top language list logic for testing. + * The original system language is replaced by the system default language + * which is added to the top of the list. Languages that can not be UI languages are removed. * @param uiLanguages Collection of possible UI languages. * @param topLanguageCodes Ordered set of potential top languages tags. * @param currentOverrideLanguage The LanguageItem representing the current UI language. @@ -445,64 +452,67 @@ static LinkedHashSet<LanguageItem> getTopLanguagesHelper(Collection<LanguageItem> uiLanguages, LinkedHashSet<String> topLanguageCodes, LanguageItem currentOverrideLanguage, Locale originalSystemLocale) { - // Remove the exact language from top language codes if there are multiple UI languages - // with the same base, otherwise remove the base language. - if (AppLocaleUtils.hasMultipleUiLanguageVariants(originalSystemLocale.toLanguageTag())) { - topLanguageCodes.remove(originalSystemLocale.toLanguageTag()); - } else { - topLanguageCodes.remove(originalSystemLocale.getLanguage()); - } - - // The system default language should always be at the top of the list unless the current - // override language is equal to the original system language. In that case only the - // current override language is added to the top of the list. LinkedHashSet<LanguageItem> topLanguages = new LinkedHashSet<>(); - if (currentOverrideLanguage.isSystemDefault()) { - topLanguages.add(LanguageItem.makeFollowSystemLanguageItem()); - } else if (!isOverrideLanguageOriginalSystemLanguage( - currentOverrideLanguage, originalSystemLocale)) { - topLanguages.add(LanguageItem.makeFollowSystemLanguageItem()); - topLanguages.add(currentOverrideLanguage); - } else { - // The current override language can only be the original system language if it has - // already been changed in settings. The option to track the system language is not - // given in the app language promo - but can be reset from Language Settings. - topLanguages.add(currentOverrideLanguage); - } // Make a map of code -> LanguageItem for UI languages HashMap<String, LanguageItem> uiLanguagesMap = new HashMap<>(); for (LanguageItem item : uiLanguages) { uiLanguagesMap.put(item.getCode(), item); } - // Only add top languages that can be UI languages. + + String originalSystemLocalAsUILanguage = getPotentialUILanguage( + originalSystemLocale.toLanguageTag(), uiLanguagesMap.keySet()); + + // The system default language should always be at the top of the list unless the current + // override language is equal to the original system language. In that case only the + // current override language is added to the top of the list. + if (currentOverrideLanguage.isSystemDefault()) { + topLanguages.add(LanguageItem.makeFollowSystemLanguageItem()); + } else if (TextUtils.equals( + currentOverrideLanguage.getCode(), originalSystemLocalAsUILanguage)) { + // The override language is set to original system language, this can only happen if + // the App Language has been changed in settings. In this case the option to track the + // system language is not given in the app language promo - but can be reset from + // Language Settings. + topLanguages.add(currentOverrideLanguage); + } else { + topLanguages.add(LanguageItem.makeFollowSystemLanguageItem()); + topLanguages.add(currentOverrideLanguage); + } + + // Only add top languages that can be UI languages and are not the original system language. for (String code : topLanguageCodes) { + // Check for exact match LanguageItem item = uiLanguagesMap.get(code); - if (item != null) topLanguages.add(item); + if (item != null) { + if (!TextUtils.equals(item.getCode(), originalSystemLocalAsUILanguage)) { + topLanguages.add(item); + } + continue; + } + // Check for base match + item = uiLanguagesMap.get(LocaleUtils.toLanguage(code)); + if (item != null + && !LocaleUtils.isBaseLanguageEqual(code, originalSystemLocalAsUILanguage)) { + topLanguages.add(item); + } } return topLanguages; } /** - * Returns true if the current override language is the same as the original system language. - * For languages that have only one Chrome UI language variant the base languages are compared - * and for languages with multiple Chrome UI languages the full language tag is compared. - * @param overrideLanguage LanguageItem for the current override language. - * @param originalSystemLocale String language code for the original system locale. - * @return Whether or not the override language is the same as the original system language. + * If |language| is in |uiLanguages| return it otherwise return the base language. If the + * return value is a country specific language that means it is a UI variant. + * @param language ISO 639 language code (e.g. en-US or en). + * @param uiLanguages Set of ISO 639 languages that are potential UI languages. + * @return |language| converted to a potential UI language. */ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - static boolean isOverrideLanguageOriginalSystemLanguage( - LanguageItem overrideLanguage, Locale originalSystemLocale) { - if (overrideLanguage.isSystemDefault()) { - return false; + static String getPotentialUILanguage(String language, Set<String> uiLanguages) { + if (uiLanguages.contains(language)) { + return language; } - if (AppLocaleUtils.hasMultipleUiLanguageVariants(overrideLanguage.getCode())) { - return TextUtils.equals( - overrideLanguage.getCode(), originalSystemLocale.toLanguageTag()); - } - return LocaleUtils.isBaseLanguageEqual( - overrideLanguage.getCode(), originalSystemLocale.toLanguageTag()); + return LocaleUtils.toLanguage(language); } /**
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialogTest.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialogTest.java index 0fd66779..79424a4b 100644 --- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialogTest.java +++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialogTest.java
@@ -120,10 +120,10 @@ // Current override language is en-US, System Language is en-US topLanguages = AppLanguagePromoDialog.getTopLanguagesHelper(mUiLanguages, - new LinkedHashSet<>(Arrays.asList("zu", "af", "an", "en-AU", "en-US")), mLangEnUs, - LocaleUtils.forLanguageTag("en-US")); - Assert.assertEquals( - new ArrayList<>(topLanguages), Arrays.asList(mLangEnUs, mLangZu, mLangAf)); + new LinkedHashSet<>(Arrays.asList("zu", "af", "an", "en-AU", "en-US", "en-GB")), + mLangEnUs, LocaleUtils.forLanguageTag("en-US")); + Assert.assertEquals(new ArrayList<>(topLanguages), + Arrays.asList(mLangEnUs, mLangZu, mLangAf, mLangEnGb)); // Current override language is Afrikaans, System Language is Zulu topLanguages = AppLanguagePromoDialog.getTopLanguagesHelper(mUiLanguages, @@ -152,25 +152,32 @@ mFollowSystem, LocaleUtils.forLanguageTag("af-ZA")); Assert.assertEquals( new ArrayList<>(topLanguages), Arrays.asList(mFollowSystem, mLangEnUs, mLangZu)); + + // Test that country specific top languages are converted to their base language. + topLanguages = AppLanguagePromoDialog.getTopLanguagesHelper(mUiLanguages, + new LinkedHashSet<>( + Arrays.asList("af-ZA", "af-NA", "an", "as", "en-US", "en-AU", "zu-XX")), + mFollowSystem, LocaleUtils.forLanguageTag("en-US")); + Assert.assertEquals( + new ArrayList<>(topLanguages), Arrays.asList(mFollowSystem, mLangAf, mLangZu)); } // Test isOverrideLanguageOriginalSystemLanguage @Test @SmallTest - public void testIsOverrideLanguageOriginalSystemLanguage() { - // Only one UI variant: Afrikaans - Assert.assertTrue(AppLanguagePromoDialog.isOverrideLanguageOriginalSystemLanguage( - mLangAf, LocaleUtils.forLanguageTag("af-ZA"))); - - // Multiple UI variants: en-US - Assert.assertFalse(AppLanguagePromoDialog.isOverrideLanguageOriginalSystemLanguage( - mLangEnGb, LocaleUtils.forLanguageTag("en-US"))); - Assert.assertTrue(AppLanguagePromoDialog.isOverrideLanguageOriginalSystemLanguage( - mLangEnUs, LocaleUtils.forLanguageTag("en-US"))); - - // Follow system language - Assert.assertFalse(AppLanguagePromoDialog.isOverrideLanguageOriginalSystemLanguage( - mFollowSystem, LocaleUtils.forLanguageTag("zu"))); + public void testGetPotentialUILanguage() { + LinkedHashSet<String> uiLanguages = + new LinkedHashSet<>(Arrays.asList("af", "en-US", "en-GB", "es", "es-419")); + Assert.assertEquals( + AppLanguagePromoDialog.getPotentialUILanguage("af-ZA", uiLanguages), "af"); + Assert.assertEquals( + AppLanguagePromoDialog.getPotentialUILanguage("en-GB", uiLanguages), "en-GB"); + Assert.assertEquals( + AppLanguagePromoDialog.getPotentialUILanguage("en-ZA", uiLanguages), "en"); + Assert.assertEquals( + AppLanguagePromoDialog.getPotentialUILanguage("es-AR", uiLanguages), "es"); + Assert.assertEquals( + AppLanguagePromoDialog.getPotentialUILanguage("es-419", uiLanguages), "es-419"); } // Test LanguageItemAdapter
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtils.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtils.java index b209ef2..7a7be258 100644 --- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtils.java +++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtils.java
@@ -24,7 +24,6 @@ import java.util.Arrays; import java.util.Comparator; -import java.util.HashSet; import java.util.List; import java.util.Locale; @@ -228,28 +227,6 @@ } /** - * Return true if the base language of |languageCode| has multiple UI language variants (e.g. - * pt-BR and pt-PT). - * @param languageCode Language tag to look up. - * @return Whether or not |languageCode| has multiple UI language variants. - */ - public static boolean hasMultipleUiLanguageVariants(String languageCode) { - if (isFollowSystemLanguage(languageCode)) { - return false; - } - String baseLanguage = LocaleUtils.toLanguage(languageCode); - HashSet<String> baseLanguages = new HashSet<String>(); - for (String code : ResourceBundle.getAvailableLocales()) { - String base = LocaleUtils.toLanguage(code); - if (baseLanguages.contains(base) && TextUtils.equals(base, baseLanguage)) { - return true; - } - baseLanguages.add(LocaleUtils.toLanguage(code)); - } - return false; - } - - /** * Return true if the locale is an exact match for an available UI language. * Note: "en" and "en-AU" will return false since the available locales are "en-GB" and "en-US". * @param potentialUiLanguage BCP-47 language tag representing a locale (e.g. "en-US")
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtilsTest.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtilsTest.java index 2a2ef8f..02c2b0d 100644 --- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtilsTest.java +++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtilsTest.java
@@ -126,23 +126,6 @@ } } - @Test - @SmallTest - public void testHasMultipleUiLanguageVariants() { - Assert.assertTrue(AppLocaleUtils.hasMultipleUiLanguageVariants("en-US")); - Assert.assertTrue(AppLocaleUtils.hasMultipleUiLanguageVariants("en-AU")); - Assert.assertTrue(AppLocaleUtils.hasMultipleUiLanguageVariants("pt-BR")); - Assert.assertTrue(AppLocaleUtils.hasMultipleUiLanguageVariants("es")); - - Assert.assertFalse(AppLocaleUtils.hasMultipleUiLanguageVariants("af")); - Assert.assertFalse(AppLocaleUtils.hasMultipleUiLanguageVariants("af-ZA")); - Assert.assertFalse(AppLocaleUtils.hasMultipleUiLanguageVariants("fil")); - Assert.assertFalse(AppLocaleUtils.hasMultipleUiLanguageVariants("zu")); - - // Non existent UI language is false. - Assert.assertFalse(AppLocaleUtils.hasMultipleUiLanguageVariants("dne")); - } - // Helper function to manually get and check AppLanguagePref. private void assertLanguagePrefEquals(String language) { Assert.assertEquals(language,
diff --git a/chrome/browser/net/profile_network_context_service.cc b/chrome/browser/net/profile_network_context_service.cc index b344169..efebd1c7 100644 --- a/chrome/browser/net/profile_network_context_service.cc +++ b/chrome/browser/net/profile_network_context_service.cc
@@ -429,6 +429,14 @@ block_trust_tokens)); } +void ProfileNetworkContextService::OnFirstPartySetsEnabledChanged( + bool enabled) { + // Update all FPS Access Delegates on the FPS service to be `enabled`. + first_party_sets::FirstPartySetsPolicyServiceFactory::GetForBrowserContext( + profile_) + ->OnFirstPartySetsEnabledChanged(enabled); +} + std::string ProfileNetworkContextService::ComputeAcceptLanguage() const { // If reduce accept language is enabled, only return the first language // without expanding the language list.
diff --git a/chrome/browser/net/profile_network_context_service.h b/chrome/browser/net/profile_network_context_service.h index 792c6942..18e39251 100644 --- a/chrome/browser/net/profile_network_context_service.h +++ b/chrome/browser/net/profile_network_context_service.h
@@ -192,6 +192,7 @@ // PrivacySandboxSettings::Observer: void OnTrustTokenBlockingChanged(bool block_trust_tokens) override; + void OnFirstPartySetsEnabledChanged(bool enabled) override; const raw_ptr<Profile> profile_;
diff --git a/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper.cc b/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper.cc index 2de52a2..b4967c779 100644 --- a/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper.cc +++ b/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper.cc
@@ -7,8 +7,14 @@ #include "base/memory/raw_ptr.h" #include "base/scoped_observation.h" #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" +#include "components/content_settings/core/browser/content_settings_observer.h" +#include "components/content_settings/core/browser/content_settings_type_set.h" +#include "components/content_settings/core/browser/host_content_settings_map.h" +#include "components/content_settings/core/common/content_settings_pattern.h" +#include "components/content_settings/core/common/content_settings_types.h" #include "components/performance_manager/public/decorators/page_live_state_decorator.h" #include "components/performance_manager/public/performance_manager.h" +#include "components/permissions/permissions_client.h" #include "content/public/browser/web_contents_observer.h" #if !BUILDFLAG(IS_ANDROID) @@ -78,7 +84,8 @@ // and updates the PageLiveStateDecorator accordingly. Destroys itself when the // WebContents it observes is destroyed. class PageLiveStateDecoratorHelper::WebContentsObserver - : public content::WebContentsObserver { + : public content::WebContentsObserver, + public content_settings::Observer { public: explicit WebContentsObserver(content::WebContents* web_contents, PageLiveStateDecoratorHelper* outer) @@ -92,6 +99,10 @@ next_->prev_ = this; } outer_->first_web_contents_observer_ = this; + + content_settings_observation_.Observe( + permissions::PermissionsClient::Get()->GetSettingsMap( + web_contents->GetBrowserContext())); } WebContentsObserver(const WebContentsObserver&) = delete; @@ -101,6 +112,28 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); } + // content_settings::Observer: + void OnContentSettingChanged( + const ContentSettingsPattern& primary_pattern, + const ContentSettingsPattern& secondary_pattern, + ContentSettingsTypeSet content_type_set) override { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + GURL url = web_contents()->GetLastCommittedURL(); + if (content_type_set.Contains(ContentSettingsType::NOTIFICATIONS) && + primary_pattern.Matches(url)) { + // This web contents is affected by this content settings change, get the + // latest value and send it over to the PageLiveStateDecorator so it can + // be attached to the corresponding PageNode. + ContentSetting setting = + permissions::PermissionsClient::Get() + ->GetSettingsMap(web_contents()->GetBrowserContext()) + ->GetContentSetting(url, url, ContentSettingsType::NOTIFICATIONS); + + PageLiveStateDecorator::SetContentSettings( + web_contents(), {{ContentSettingsType::NOTIFICATIONS, setting}}); + } + } + // content::WebContentsObserver: void OnIsConnectedToBluetoothDeviceChanged( bool is_connected_to_bluetooth_device) override { @@ -144,6 +177,9 @@ raw_ptr<WebContentsObserver> prev_; raw_ptr<WebContentsObserver> next_; + base::ScopedObservation<HostContentSettingsMap, content_settings::Observer> + content_settings_observation_{this}; + SEQUENCE_CHECKER(sequence_checker_); };
diff --git a/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper_unittest.cc b/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper_unittest.cc index 419bb0c..ca63b7d 100644 --- a/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper_unittest.cc +++ b/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper_unittest.cc
@@ -6,9 +6,11 @@ #include "base/callback.h" #include "base/callback_helpers.h" +#include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" #include "chrome/browser/media/webrtc/media_stream_capture_indicator.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/performance_manager/embedder/performance_manager_registry.h" #include "components/performance_manager/performance_manager_impl.h" #include "components/performance_manager/public/decorators/page_live_state_decorator.h" @@ -196,6 +198,73 @@ &PageLiveStateDecorator::Data::IsConnectedToUSBDevice, false); } +TEST_F(PageLiveStateDecoratorHelperTest, ContentSettingsChanged) { + base::WeakPtr<PageNode> node = + PerformanceManager::GetPrimaryPageNodeForWebContents(web_contents()); + content::WebContentsTester::For(web_contents()) + ->NavigateAndCommit(GURL("https://www.example.com/path")); + + { + base::RunLoop run_loop; + PerformanceManager::CallOnGraph( + FROM_HERE, base::BindLambdaForTesting([&]() { + ASSERT_TRUE(node); + const PageLiveStateDecorator::Data* data = + PageLiveStateDecorator::Data::FromPageNode(node.get()); + ASSERT_TRUE(data); + EXPECT_EQ(data->IsContentSettingTypeAllowed( + ContentSettingsType::NOTIFICATIONS), + false); + run_loop.Quit(); + })); + run_loop.Run(); + } + + HostContentSettingsMap* host_content_settings_map = + HostContentSettingsMapFactory::GetForProfile( + web_contents()->GetBrowserContext()); + host_content_settings_map->SetContentSettingDefaultScope( + GURL("https://www.example.com/"), GURL(), + ContentSettingsType::NOTIFICATIONS, CONTENT_SETTING_ALLOW); + + { + base::RunLoop run_loop; + PerformanceManager::CallOnGraph( + FROM_HERE, base::BindLambdaForTesting([&]() { + ASSERT_TRUE(node); + const PageLiveStateDecorator::Data* data = + PageLiveStateDecorator::Data::FromPageNode(node.get()); + ASSERT_TRUE(data); + EXPECT_EQ(data->IsContentSettingTypeAllowed( + ContentSettingsType::NOTIFICATIONS), + true); + run_loop.Quit(); + })); + run_loop.Run(); + } + + // Changing content settings for a different URL doesn't affect this one. + host_content_settings_map->SetContentSettingDefaultScope( + GURL("https://other.url.com/"), GURL(), + ContentSettingsType::NOTIFICATIONS, CONTENT_SETTING_BLOCK); + + { + base::RunLoop run_loop; + PerformanceManager::CallOnGraph( + FROM_HERE, base::BindLambdaForTesting([&]() { + ASSERT_TRUE(node); + const PageLiveStateDecorator::Data* data = + PageLiveStateDecorator::Data::FromPageNode(node.get()); + ASSERT_TRUE(data); + EXPECT_EQ(data->IsContentSettingTypeAllowed( + ContentSettingsType::NOTIFICATIONS), + true); + run_loop.Quit(); + })); + run_loop.Run(); + } +} + // Create many WebContents to exercice the code that maintains the linked list // of PageLiveStateDecoratorHelper::WebContentsObservers. TEST_F(PageLiveStateDecoratorHelperTest, ManyPageNodes) {
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java index 535b2789..824a098 100644 --- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java +++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -1000,9 +1000,6 @@ public static final KeyPrefix WEB_FEED_INTRO_WEB_FEED_ID_SHOWN_COUNT_PREFIX = new KeyPrefix("Chrome.WebFeed.IntroWebFeedIdShownCount.*"); - public static final String LOCK_ICON_IN_ADDRESS_BAR_ENABLED = - "omnibox.lock_icon_in_address_bar_enabled"; - /** Cached Suggestions and Suggestion Headers. */ public static final String KEY_ZERO_SUGGEST_LIST_SIZE = "zero_suggest_list_size"; public static final KeyPrefix KEY_ZERO_SUGGEST_URL_PREFIX = new KeyPrefix("zero_suggest_url*");
diff --git a/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h b/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h index 4a7808b..276e493 100644 --- a/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h +++ b/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h
@@ -31,7 +31,7 @@ // Mock this method to enable opening the settings page in tests. MOCK_METHOD(bool, IsPrivacySandboxRestricted, (), (override)); MOCK_METHOD((base::flat_map<net::SchemefulSite, net::SchemefulSite>), - GetFirstPartySets, + GetSampleFirstPartySets, (), (override, const)); MOCK_METHOD(absl::optional<net::SchemefulSite>,
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc index 35f3727b..5d93e2d 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc
@@ -16,6 +16,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" +#include "base/types/optional_util.h" #include "chrome/common/webui_url_constants.h" #include "components/browsing_topics/browsing_topics_service.h" #include "components/content_settings/core/browser/cookie_settings.h" @@ -26,10 +27,14 @@ #include "components/strings/grit/components_strings.h" #include "content/public/browser/browsing_data_filter_builder.h" #include "content/public/browser/browsing_data_remover.h" +#include "content/public/browser/first_party_sets_handler.h" #include "content/public/browser/interest_group_manager.h" #include "content/public/common/content_features.h" #include "google_apis/gaia/google_service_auth_error.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" +#include "net/base/schemeful_site.h" +#include "net/first_party_sets/first_party_set_entry.h" +#include "net/first_party_sets/global_first_party_sets.h" #include "third_party/blink/public/common/features.h" #include "ui/base/l10n/l10n_util.h" @@ -98,7 +103,8 @@ #if !BUILDFLAG(IS_ANDROID) TrustSafetySentimentService* sentiment_service, #endif - browsing_topics::BrowsingTopicsService* browsing_topics_service) + browsing_topics::BrowsingTopicsService* browsing_topics_service, + first_party_sets::FirstPartySetsPolicyService* first_party_sets_service) : privacy_sandbox_settings_(privacy_sandbox_settings), cookie_settings_(cookie_settings), pref_service_(pref_service), @@ -108,7 +114,8 @@ #if !BUILDFLAG(IS_ANDROID) sentiment_service_(sentiment_service), #endif - browsing_topics_service_(browsing_topics_service) { + browsing_topics_service_(browsing_topics_service), + first_party_sets_policy_service_(first_party_sets_service) { DCHECK(privacy_sandbox_settings_); DCHECK(pref_service_); DCHECK(cookie_settings_); @@ -632,19 +639,7 @@ } base::flat_map<net::SchemefulSite, net::SchemefulSite> -PrivacySandboxService::GetFirstPartySets() const { - // If FPS is not affecting cookie access, then there are effectively no - // first party sets. - if (!(cookie_settings_->ShouldBlockThirdPartyCookies() && - cookie_settings_->GetDefaultCookieSetting(/*provider_id=*/nullptr) != - CONTENT_SETTING_BLOCK && - pref_service_->GetBoolean( - prefs::kPrivacySandboxFirstPartySetsEnabled) && - base::FeatureList::IsEnabled( - privacy_sandbox::kPrivacySandboxFirstPartySetsUI))) { - return {}; - } - +PrivacySandboxService::GetSampleFirstPartySets() const { if (privacy_sandbox::kPrivacySandboxFirstPartySetsUISampleSets.Get()) { return {{net::SchemefulSite(GURL("https://youtube.com")), net::SchemefulSite(GURL("https://google.com"))}, @@ -660,43 +655,66 @@ net::SchemefulSite(GURL("https://chromium.org"))}}; } - // TODO(crbug.com/1332513): Retrieve set information from FPS delegate. return {}; } absl::optional<net::SchemefulSite> PrivacySandboxService::GetFirstPartySetOwner( const GURL& site_url) const { - auto sets = GetFirstPartySets(); - auto schemeful_site = net::SchemefulSite(site_url); + // If FPS is not affecting cookie access, then there are effectively no + // first party sets. + if (!(cookie_settings_->ShouldBlockThirdPartyCookies() && + cookie_settings_->GetDefaultCookieSetting(/*provider_id=*/nullptr) != + CONTENT_SETTING_BLOCK && + base::FeatureList::IsEnabled( + privacy_sandbox::kPrivacySandboxFirstPartySetsUI))) { + return absl::nullopt; + } - if (!sets.count(schemeful_site)) + // Return the owner according to the sample sets if they're provided. + if (privacy_sandbox::kPrivacySandboxFirstPartySetsUISampleSets.Get()) { + const base::flat_map<net::SchemefulSite, net::SchemefulSite> sets = + GetSampleFirstPartySets(); + net::SchemefulSite schemeful_site(site_url); + + base::flat_map<net::SchemefulSite, net::SchemefulSite>::const_iterator + site_entry = sets.find(schemeful_site); + if (site_entry == sets.end()) + return absl::nullopt; + + return site_entry->second; + } + + absl::optional<net::FirstPartySetEntry> site_entry = + first_party_sets_policy_service_->FindEntry(net::SchemefulSite(site_url)); + if (!site_entry.has_value()) return absl::nullopt; - return sets[schemeful_site]; + return site_entry->primary(); } absl::optional<std::u16string> PrivacySandboxService::GetFirstPartySetOwnerForDisplay( const GURL& site_url) const { - auto fpsOwner = GetFirstPartySetOwner(site_url); - if (!fpsOwner.has_value()) { + absl::optional<net::SchemefulSite> site_owner = + GetFirstPartySetOwner(site_url); + if (!site_owner.has_value()) { return absl::nullopt; } // TODO(crbug.com/1332513): Apply formatting that correctly displays unicode // domains. - return base::UTF8ToUTF16(fpsOwner->GetURL().host()); + return base::UTF8ToUTF16(site_owner->GetURL().host()); } bool PrivacySandboxService::IsPartOfManagedFirstPartySet( const net::SchemefulSite& site) const { if (privacy_sandbox::kPrivacySandboxFirstPartySetsUISampleSets.Get()) { return IsFirstPartySetsDataAccessManaged() || - GetFirstPartySets()[site] == + GetSampleFirstPartySets()[site] == net::SchemefulSite(GURL("https://chromium.org")); } - // TODO(crbug.com/1332513): Retrieve set information from FPS delegate. - return IsFirstPartySetsDataAccessManaged(); + + return first_party_sets_policy_service_->IsSiteInManagedSet(site); } /*static*/ PrivacySandboxService::PromptType
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h index d97b3e9..6b01016 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
@@ -9,9 +9,7 @@ #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" -#include "base/scoped_observation.h" -#include "base/time/time.h" -#include "components/content_settings/core/common/content_settings.h" +#include "chrome/browser/first_party_sets/first_party_sets_policy_service.h" #include "components/keyed_service/core/keyed_service.h" #include "components/prefs/pref_change_registrar.h" #include "components/privacy_sandbox/canonical_topic.h" @@ -99,7 +97,8 @@ #if !BUILDFLAG(IS_ANDROID) TrustSafetySentimentService* sentiment_service, #endif - browsing_topics::BrowsingTopicsService* browsing_topics_service); + browsing_topics::BrowsingTopicsService* browsing_topics_service, + first_party_sets::FirstPartySetsPolicyService* first_party_sets_service); ~PrivacySandboxService() override; @@ -215,17 +214,11 @@ virtual void SetTopicAllowed(privacy_sandbox::CanonicalTopic topic, bool allowed); - // DEPRECATED - Do not use in new code. It will be replaced with the in-memory - // FPS map. - // Returns the first party sets recognised by the current profile. If FPS is - // disabled, or if sets have not been loaded yet, an empty map is returned. - // Encapsulates logic about whether FPS information should be shown, if it - // should not, an empty map is always returned. + // DEPRECATED - Do not use in new code. It will be replaced with queries to + // the First-Party Sets that are in the browser-process. // Virtual for mocking in tests. - // TODO (crbug.com/1350062): Reconsider whether ignoring async FPS information - // is appropriate. virtual base::flat_map<net::SchemefulSite, net::SchemefulSite> - GetFirstPartySets() const; + GetSampleFirstPartySets() const; // Returns the owner domain of the first party set that `site_url` is a member // of, or absl::nullopt if `site_url` is not recognised as a member of an FPS. @@ -241,6 +234,11 @@ // Returns true if `site`'s membership in an FPS is being managed by policy or // if FirstPartySets preference is managed. Virtual for mocking in tests. + // + // Note: Enterprises can use the First-Party Set Overrides policy to either + // add or remove a site from a First-Party Set. This method returns true only + // if `site` is being added into a First-Party Set since there's no UI use for + // whether `site` is being removed by an enterprise yet. virtual bool IsPartOfManagedFirstPartySet( const net::SchemefulSite& site) const; @@ -415,6 +413,8 @@ raw_ptr<TrustSafetySentimentService> sentiment_service_; #endif raw_ptr<browsing_topics::BrowsingTopicsService> browsing_topics_service_; + raw_ptr<first_party_sets::FirstPartySetsPolicyService> + first_party_sets_policy_service_; PrefChangeRegistrar user_prefs_registrar_;
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc index bf87496b..74af31d 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc
@@ -7,6 +7,7 @@ #include "base/memory/singleton.h" #include "chrome/browser/browsing_topics/browsing_topics_service_factory.h" #include "chrome/browser/content_settings/cookie_settings_factory.h" +#include "chrome/browser/first_party_sets/first_party_sets_policy_service_factory.h" #include "chrome/browser/privacy_sandbox/privacy_sandbox_service.h" #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h" #include "chrome/browser/profiles/profile.h" @@ -41,6 +42,8 @@ #if !BUILDFLAG(IS_ANDROID) DependsOn(TrustSafetySentimentServiceFactory::GetInstance()); #endif + DependsOn( + first_party_sets::FirstPartySetsPolicyServiceFactory::GetInstance()); } KeyedService* PrivacySandboxServiceFactory::BuildServiceInstanceFor( @@ -57,5 +60,7 @@ #if !BUILDFLAG(IS_ANDROID) TrustSafetySentimentServiceFactory::GetForProfile(profile), #endif - browsing_topics::BrowsingTopicsServiceFactory::GetForProfile(profile)); + browsing_topics::BrowsingTopicsServiceFactory::GetForProfile(profile), + first_party_sets::FirstPartySetsPolicyServiceFactory:: + GetForBrowserContext(context)); }
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc index 6238add4..a992b690 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc
@@ -13,6 +13,7 @@ #include "base/test/scoped_feature_list.h" #include "chrome/browser/content_settings/cookie_settings_factory.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" +#include "chrome/browser/first_party_sets/first_party_sets_policy_service.h" #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/common/chrome_features.h" @@ -35,9 +36,14 @@ #include "components/sync/test/test_sync_service.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "content/public/browser/browsing_data_remover.h" +#include "content/public/browser/first_party_sets_handler.h" #include "content/public/browser/interest_group_manager.h" #include "content/public/common/content_features.h" #include "content/public/test/browser_task_environment.h" +#include "net/base/schemeful_site.h" +#include "net/first_party_sets/first_party_set_entry.h" +#include "net/first_party_sets/first_party_sets_context_config.h" +#include "net/first_party_sets/global_first_party_sets.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/features.h" #include "ui/base/l10n/l10n_util.h" @@ -675,7 +681,10 @@ : browser_task_environment_( base::test::TaskEnvironment::TimeSource::MOCK_TIME) {} - void SetUp() override { CreateService(); } + void SetUp() override { + CreateService(); + SetGlobalFirstPartySetsAndWait(); + } virtual std::unique_ptr< privacy_sandbox_test_util::MockPrivacySandboxSettingsDelegate> @@ -703,7 +712,7 @@ #if !BUILDFLAG(IS_ANDROID) mock_sentiment_service(), #endif - mock_browsing_topics_service()); + mock_browsing_topics_service(), first_party_sets_policy_service()); } virtual profile_metrics::BrowserProfileType GetProfileType() { @@ -743,12 +752,26 @@ browsing_topics::MockBrowsingTopicsService* mock_browsing_topics_service() { return &mock_browsing_topics_service_; } + first_party_sets::FirstPartySetsPolicyService* + first_party_sets_policy_service() { + return &first_party_sets_policy_service_; + } #if !BUILDFLAG(IS_ANDROID) MockTrustSafetySentimentService* mock_sentiment_service() { return mock_sentiment_service_.get(); } #endif + void SetGlobalFirstPartySetsAndWait() { + content::FirstPartySetsHandler::GetInstance()->ResetForTesting(); + content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting({}); + base::RunLoop run_loop; + first_party_sets_policy_service_.WaitForFirstInitCompleteForTesting( + run_loop.QuitClosure()); + run_loop.Run(); + first_party_sets_policy_service_.ResetForTesting(); + } + private: content::BrowserTaskEnvironment browser_task_environment_; @@ -756,6 +779,10 @@ base::test::ScopedFeatureList feature_list_; TestInterestGroupManager test_interest_group_manager_; browsing_topics::MockBrowsingTopicsService mock_browsing_topics_service_; + first_party_sets::FirstPartySetsPolicyService + first_party_sets_policy_service_ = + first_party_sets::FirstPartySetsPolicyService( + profile_.GetOriginalProfile()); #if !BUILDFLAG(IS_ANDROID) std::unique_ptr<MockTrustSafetySentimentService> mock_sentiment_service_; #endif @@ -2072,6 +2099,355 @@ GURL("https://example.com"))); } +TEST_F(PrivacySandboxServiceTest, + GetFirstPartySetOwner_SimulatedFpsData_DisabledWhen3pcAllowed) { + GURL associate1_gurl("https://associate1.test"); + net::SchemefulSite primary_site(GURL("https://primary.test")); + net::SchemefulSite associate1_site(associate1_gurl); + + // Create Global First-Party Sets with the following set: + // { primary: "https://primary.test", + // associatedSites: ["https://associate1.test"} + net::GlobalFirstPartySets global_sets( + {{associate1_site, + {net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated, + 0)}}}, + {}); + + // Simulate 3PC are allowed while: + // - FPS pref is enabled + // - FPS backend Feature is enabled + // - FPS UI Feature is enabled + feature_list()->InitWithFeatures( + {privacy_sandbox::kPrivacySandboxFirstPartySetsUI, + features::kFirstPartySets}, + {}); + CreateService(); + ClearFpsUserPrefs(prefs()); + prefs()->SetUserPref(prefs::kCookieControlsMode, + std::make_unique<base::Value>(static_cast<int>( + content_settings::CookieControlsMode::kOff))); + prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled, + std::make_unique<base::Value>(true)); + // Reset test state to reflect required state above. + content::FirstPartySetsHandler::GetInstance()->ResetForTesting(); + + content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting( + global_sets.Clone()); + first_party_sets_policy_service()->InitForTesting( + [](PrefService* prefs, + base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) { + std::move(callback).Run(net::FirstPartySetsContextConfig()); + }); + // We shouldn't get associate1's owner since FPS is disabled. + EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(associate1_gurl), + absl::nullopt); +} + +TEST_F(PrivacySandboxServiceTest, + GetFirstPartySetOwner_SimulatedFpsData_DisabledWhenAllCookiesBlocked) { + GURL associate1_gurl("https://associate1.test"); + net::SchemefulSite primary_site(GURL("https://primary.test")); + net::SchemefulSite associate1_site(associate1_gurl); + + // Create Global First-Party Sets with the following set: + // { primary: "https://primary.test", + // associatedSites: ["https://associate1.test"} + net::GlobalFirstPartySets global_sets( + {{associate1_site, + {net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated, + 0)}}}, + {}); + + // Simulate all cookies are blocked while: + // - FPS pref is enabled + // - FPS backend Feature is enabled + // - FPS UI Feature is enabled + feature_list()->InitWithFeatures( + {privacy_sandbox::kPrivacySandboxFirstPartySetsUI, + features::kFirstPartySets}, + {}); + prefs()->SetUserPref( + prefs::kCookieControlsMode, + std::make_unique<base::Value>(static_cast<int>( + content_settings::CookieControlsMode::kBlockThirdParty))); + cookie_settings()->SetDefaultCookieSetting(CONTENT_SETTING_BLOCK); + CreateService(); + ClearFpsUserPrefs(prefs()); + prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled, + std::make_unique<base::Value>(true)); + + // Reset test state to reflect required state above. + content::FirstPartySetsHandler::GetInstance()->ResetForTesting(); + + content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting( + global_sets.Clone()); + first_party_sets_policy_service()->InitForTesting( + [](PrefService* prefs, + base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) { + std::move(callback).Run(net::FirstPartySetsContextConfig()); + }); + // We shouldn't get associate1's owner since FPS is disabled. + EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(associate1_gurl), + absl::nullopt); +} + +TEST_F(PrivacySandboxServiceTest, + GetFirstPartySetOwner_SimulatedFpsData_DisabledByFpsUiFeature) { + GURL associate1_gurl("https://associate1.test"); + net::SchemefulSite primary_site(GURL("https://primary.test")); + net::SchemefulSite associate1_site(associate1_gurl); + + // Create Global First-Party Sets with the following set: + // { primary: "https://primary.test", + // associatedSites: ["https://associate1.test"} + net::GlobalFirstPartySets global_sets( + {{associate1_site, + {net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated, + 0)}}}, + {}); + + // Simulate FPS UI feature disabled while: + // - FPS pref is enabled + // - FPS backend Feature is enabled + // - 3PC are being blocked + feature_list()->InitWithFeatures( + {features::kFirstPartySets}, + {privacy_sandbox::kPrivacySandboxFirstPartySetsUI}); + privacy_sandbox_test_util::SetupTestState( + prefs(), host_content_settings_map(), + /*privacy_sandbox_enabled=*/true, + /*block_third_party_cookies=*/true, + /*default_cookie_setting=*/ContentSetting::CONTENT_SETTING_ALLOW, + /*user_cookie_exceptions=*/{}, + /*managed_cookie_setting=*/privacy_sandbox_test_util::kNoSetting, + /*managed_cookie_exceptions=*/{}); + CreateService(); + ClearFpsUserPrefs(prefs()); + prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled, + std::make_unique<base::Value>(true)); + + // Reset test state to reflect required state above. + content::FirstPartySetsHandler::GetInstance()->ResetForTesting(); + + content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting( + global_sets.Clone()); + first_party_sets_policy_service()->InitForTesting( + [](PrefService* prefs, + base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) { + std::move(callback).Run(net::FirstPartySetsContextConfig()); + }); + + // We shouldn't get associate1's owner since FPS is disabled. + EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(associate1_gurl), + absl::nullopt); +} + +TEST_F(PrivacySandboxServiceTest, + GetFirstPartySetOwner_SimulatedFpsData_DisabledByFpsFeature) { + GURL associate1_gurl("https://associate1.test"); + net::SchemefulSite primary_site(GURL("https://primary.test")); + net::SchemefulSite associate1_site(associate1_gurl); + + // Create Global First-Party Sets with the following set: + // { primary: "https://primary.test", + // associatedSites: ["https://associate1.test"} + net::GlobalFirstPartySets global_sets( + {{associate1_site, + {net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated, + 0)}}}, + {}); + + // Simulate FPS backend feature disabled while: + // - FPS pref is enabled + // - FPS UI Feature is enabled + // - 3PC are being blocked + feature_list()->InitWithFeatures( + {privacy_sandbox::kPrivacySandboxFirstPartySetsUI}, + {features::kFirstPartySets}); + privacy_sandbox_test_util::SetupTestState( + prefs(), host_content_settings_map(), + /*privacy_sandbox_enabled=*/true, + /*block_third_party_cookies=*/true, + /*default_cookie_setting=*/ContentSetting::CONTENT_SETTING_ALLOW, + /*user_cookie_exceptions=*/{}, + /*managed_cookie_setting=*/privacy_sandbox_test_util::kNoSetting, + /*managed_cookie_exceptions=*/{}); + CreateService(); + ClearFpsUserPrefs(prefs()); + prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled, + std::make_unique<base::Value>(true)); + + // Reset test state to reflect required state above. + content::FirstPartySetsHandler::GetInstance()->ResetForTesting(); + + content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting( + global_sets.Clone()); + first_party_sets_policy_service()->InitForTesting( + [](PrefService* prefs, + base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) { + std::move(callback).Run(net::FirstPartySetsContextConfig()); + }); + + // We shouldn't get associate1's owner since FPS is disabled. + EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(associate1_gurl), + absl::nullopt); +} + +TEST_F(PrivacySandboxServiceTest, + GetFirstPartySetOwner_SimulatedFpsData_DisabledByFpsPref) { + GURL associate1_gurl("https://associate1.test"); + net::SchemefulSite primary_site(GURL("https://primary.test")); + net::SchemefulSite associate1_site(associate1_gurl); + + // Create Global First-Party Sets with the following set: + // { primary: "https://primary.test", + // associatedSites: ["https://associate1.test"} + net::GlobalFirstPartySets global_sets( + {{associate1_site, + {net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated, + 0)}}}, + {}); + + // Simulate FPS pref disabled while: + // - FPS UI Feature is enabled + // - FPS backend Feature is enabled + // - 3PC are being blocked + feature_list()->InitWithFeatures( + {features::kFirstPartySets, + privacy_sandbox::kPrivacySandboxFirstPartySetsUI}, + {}); + privacy_sandbox_test_util::SetupTestState( + prefs(), host_content_settings_map(), + /*privacy_sandbox_enabled=*/true, + /*block_third_party_cookies=*/true, + /*default_cookie_setting=*/ContentSetting::CONTENT_SETTING_ALLOW, + /*user_cookie_exceptions=*/{}, + /*managed_cookie_setting=*/privacy_sandbox_test_util::kNoSetting, + /*managed_cookie_exceptions=*/{}); + CreateService(); + ClearFpsUserPrefs(prefs()); + prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled, + std::make_unique<base::Value>(false)); + + // Reset test state to reflect required state above. + content::FirstPartySetsHandler::GetInstance()->ResetForTesting(); + + content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting( + global_sets.Clone()); + first_party_sets_policy_service()->InitForTesting( + [](PrefService* prefs, + base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) { + std::move(callback).Run(net::FirstPartySetsContextConfig()); + }); + + // We shouldn't get associate1's owner since FPS is disabled. + EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(associate1_gurl), + absl::nullopt); +} + +TEST_F(PrivacySandboxServiceTest, + SimulatedFpsData_FpsEnabled_WithoutGlobalSets) { + GURL primary_gurl("https://primary.test"); + GURL associate1_gurl("https://associate1.test"); + GURL associate2_gurl("https://associate2.test"); + net::SchemefulSite primary_site(primary_gurl); + net::SchemefulSite associate1_site(associate1_gurl); + net::SchemefulSite associate2_site(associate2_gurl); + + // Set up state that fully enables the First-Party Sets for UI; blocking 3PC, + // and enabling the FPS UI and backend features and the FPS enabled pref. + feature_list()->InitWithFeatures( + {features::kFirstPartySets, + privacy_sandbox::kPrivacySandboxFirstPartySetsUI}, + {}); + privacy_sandbox_test_util::SetupTestState( + prefs(), host_content_settings_map(), + /*privacy_sandbox_enabled=*/true, + /*block_third_party_cookies=*/true, + /*default_cookie_setting=*/ContentSetting::CONTENT_SETTING_ALLOW, + /*user_cookie_exceptions=*/{}, + /*managed_cookie_setting=*/privacy_sandbox_test_util::kNoSetting, + /*managed_cookie_exceptions=*/{}); + CreateService(); + ClearFpsUserPrefs(prefs()); + prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled, + std::make_unique<base::Value>(true)); + + // Reset test state to reflect required state above. + content::FirstPartySetsHandler::GetInstance()->ResetForTesting(); + + // Verify `GetFirstPartySetOwner` returns empty if FPS is enabled but the + // Global sets are not ready yet. + EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(associate1_gurl), + absl::nullopt); + EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(associate2_gurl), + absl::nullopt); +} + +TEST_F(PrivacySandboxServiceTest, + SimulatedFpsData_FpsEnabled_WithGlobalSetsAndProfileSets) { + GURL primary_gurl("https://primary.test"); + GURL associate1_gurl("https://associate1.test"); + GURL associate2_gurl("https://associate2.test"); + net::SchemefulSite primary_site(primary_gurl); + net::SchemefulSite associate1_site(associate1_gurl); + net::SchemefulSite associate2_site(associate2_gurl); + + // Set up state that fully enables the First-Party Sets for UI; blocking 3PC, + // and enabling the FPS UI and backend features and the FPS enabled pref. + feature_list()->InitWithFeatures( + {features::kFirstPartySets, + privacy_sandbox::kPrivacySandboxFirstPartySetsUI}, + {}); + privacy_sandbox_test_util::SetupTestState( + prefs(), host_content_settings_map(), + /*privacy_sandbox_enabled=*/true, + /*block_third_party_cookies=*/true, + /*default_cookie_setting=*/ContentSetting::CONTENT_SETTING_ALLOW, + /*user_cookie_exceptions=*/{}, + /*managed_cookie_setting=*/privacy_sandbox_test_util::kNoSetting, + /*managed_cookie_exceptions=*/{}); + CreateService(); + ClearFpsUserPrefs(prefs()); + prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled, + std::make_unique<base::Value>(true)); + + // Reset test state to reflect required state above. + content::FirstPartySetsHandler::GetInstance()->ResetForTesting(); + + // Simulate that the Global First-Party Sets are ready with the following set: + // { primary: "https://primary.test", + // associatedSites: ["https://associate1.test", "https://associate2.test"] } + content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting( + net::GlobalFirstPartySets( + {{associate1_site, + {net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated, + 0)}}, + {associate2_site, + {net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated, + 1)}}}, + {})); + + // Simulate that associate2 is removed from the Global First-Party Sets for + // this profile. + first_party_sets_policy_service()->InitForTesting( + [](PrefService* prefs, + base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) { + std::move(callback).Run(net::FirstPartySetsContextConfig( + net::FirstPartySetsContextConfig::OverrideSets{ + {net::SchemefulSite(GURL("https://associate2.test")), + {absl::nullopt}}})); + }); + + // Verify that primary owns associate1, but no longer owns associate2. + EXPECT_EQ( + privacy_sandbox_service()->GetFirstPartySetOwner(associate1_gurl).value(), + primary_site); + EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(associate2_gurl), + absl::nullopt); +} + TEST_F(PrivacySandboxServiceTest, FpsPrefInit) { // Check that the init of the FPS pref occurs correctly. ClearFpsUserPrefs(prefs()); @@ -2137,51 +2513,101 @@ prefs::kPrivacySandboxFirstPartySetsDataAccessAllowedInitialized)); } -TEST_F(PrivacySandboxServiceTest, NoFpsWhileNotAffected) { - // Confirm that when FPS is not involved in access decisions, that the set - // of returned First Party Sets is empty. - // TODO(crbug.com/1332513): Move away from this demo parameter. - feature_list()->InitAndEnableFeatureWithParameters( - privacy_sandbox::kPrivacySandboxFirstPartySetsUI, - {{"use-sample-sets", "true"}}); +TEST_F(PrivacySandboxServiceTest, UsesFpsSampleSetsWhenProvided) { + // Confirm that when the FPS sample sets are provided, they are used to answer + // First-Party Sets queries instead of the actual sets. - // When 3PC are blocked, and FPS is enabled, sets should be returned. - prefs()->SetUserPref( - prefs::kCookieControlsMode, - std::make_unique<base::Value>(static_cast<int>( - content_settings::CookieControlsMode::kBlockThirdParty))); - cookie_settings()->SetDefaultCookieSetting(CONTENT_SETTING_ALLOW); - prefs()->SetBoolean(prefs::kPrivacySandboxFirstPartySetsEnabled, true); - EXPECT_GT(privacy_sandbox_service()->GetFirstPartySets().size(), 0u); + // Set up state that fully enables the First-Party Sets for UI; blocking + // 3PC, and enabling the FPS UI and backend features and the FPS enabled pref. + // + // Note: this indicates that the sample sets should be used. + feature_list()->InitWithFeaturesAndParameters( + /*enabled_features=*/{{features::kFirstPartySets, {}}, + {privacy_sandbox::kPrivacySandboxFirstPartySetsUI, + {{"use-sample-sets", "true"}}}}, + /*disabled_features=*/{}); + privacy_sandbox_test_util::SetupTestState( + prefs(), host_content_settings_map(), + /*privacy_sandbox_enabled=*/true, + /*block_third_party_cookies=*/true, + /*default_cookie_setting=*/ContentSetting::CONTENT_SETTING_ALLOW, + /*user_cookie_exceptions=*/{}, + /*managed_cookie_setting=*/privacy_sandbox_test_util::kNoSetting, + /*managed_cookie_exceptions=*/{}); + CreateService(); + ClearFpsUserPrefs(prefs()); + prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled, + std::make_unique<base::Value>(true)); - // When 3PC are enabled, no sets should be returned. - prefs()->SetUserPref(prefs::kCookieControlsMode, - std::make_unique<base::Value>(static_cast<int>( - content_settings::CookieControlsMode::kOff))); - EXPECT_EQ(0u, privacy_sandbox_service()->GetFirstPartySets().size()); + // Reset test state to reflect required state above. + content::FirstPartySetsHandler::GetInstance()->ResetForTesting(); - // When all cookies are blocked, no sets should be returned. - prefs()->SetUserPref( - prefs::kCookieControlsMode, - std::make_unique<base::Value>(static_cast<int>( - content_settings::CookieControlsMode::kBlockThirdParty))); - cookie_settings()->SetDefaultCookieSetting(CONTENT_SETTING_BLOCK); + // Simulate that the Global First-Party Sets are ready with the following + // set: + // { primary: "https://youtube-primary.test", + // associatedSites: ["https://youtube.com"] + // } + net::SchemefulSite youtube_primary_site(GURL("https://youtube-primary.test")); + GURL youtube_gurl("https://youtube.com"); + net::SchemefulSite youtube_site(youtube_gurl); - EXPECT_EQ(0u, privacy_sandbox_service()->GetFirstPartySets().size()); + content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting( + net::GlobalFirstPartySets( + {{youtube_site, + {net::FirstPartySetEntry(youtube_primary_site, + net::SiteType::kAssociated, 0)}}}, + {})); - // When FPS is disabled, no sets should be returned. - cookie_settings()->SetDefaultCookieSetting(CONTENT_SETTING_ALLOW); - prefs()->SetBoolean(prefs::kPrivacySandboxFirstPartySetsEnabled, false); + // Simulate that https://google.de is moved into a new First-Party Set for + // this profile. + first_party_sets_policy_service()->InitForTesting( + [](PrefService* prefs, + base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) { + std::move(callback).Run( + net::FirstPartySetsContextConfig(net::FirstPartySetsContextConfig( + net::FirstPartySetsContextConfig::OverrideSets{ + {net::SchemefulSite(GURL("https://google.de")), + {net::FirstPartySetEntry( + net::SchemefulSite(GURL("https://new-primary.test")), + net::SiteType::kAssociated, 0)}}}))); + }); - EXPECT_EQ(0u, privacy_sandbox_service()->GetFirstPartySets().size()); + // Expect queries to be resolved based on the FPS sample sets. + EXPECT_GT(privacy_sandbox_service()->GetSampleFirstPartySets().size(), 0u); + EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner( + GURL("https://youtube.com")), + net::SchemefulSite(GURL("https://google.com"))); + EXPECT_TRUE(privacy_sandbox_service()->IsPartOfManagedFirstPartySet( + net::SchemefulSite(GURL("https://googlesource.com")))); + EXPECT_FALSE(privacy_sandbox_service()->IsPartOfManagedFirstPartySet( + net::SchemefulSite(GURL("https://google.de")))); - // When the UI feature is disabled, no sets should be returned. feature_list()->Reset(); - feature_list()->InitAndDisableFeature( - privacy_sandbox::kPrivacySandboxFirstPartySetsUI); - prefs()->SetBoolean(prefs::kPrivacySandboxFirstPartySetsEnabled, true); + feature_list()->InitWithFeatures( + {features::kFirstPartySets, + privacy_sandbox::kPrivacySandboxFirstPartySetsUI}, + {}); + privacy_sandbox_test_util::SetupTestState( + prefs(), host_content_settings_map(), + /*privacy_sandbox_enabled=*/true, + /*block_third_party_cookies=*/true, + /*default_cookie_setting=*/ContentSetting::CONTENT_SETTING_ALLOW, + /*user_cookie_exceptions=*/{}, + /*managed_cookie_setting=*/privacy_sandbox_test_util::kNoSetting, + /*managed_cookie_exceptions=*/{}); + CreateService(); + ClearFpsUserPrefs(prefs()); + prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled, + std::make_unique<base::Value>(true)); - EXPECT_EQ(0u, privacy_sandbox_service()->GetFirstPartySets().size()); + // Expect queries to be resolved based on the FPS backend. + EXPECT_EQ(privacy_sandbox_service()->GetSampleFirstPartySets().size(), 0u); + EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(youtube_gurl), + youtube_primary_site); + EXPECT_FALSE(privacy_sandbox_service()->IsPartOfManagedFirstPartySet( + net::SchemefulSite(GURL("https://googlesource.com")))); + EXPECT_TRUE(privacy_sandbox_service()->IsPartOfManagedFirstPartySet( + net::SchemefulSite(GURL("https://google.de")))); } class PrivacySandboxServiceTestNonRegularProfile
diff --git a/chrome/browser/profiles/profile_manager_unittest.cc b/chrome/browser/profiles/profile_manager_unittest.cc index 8e2958c5..b51a7d6 100644 --- a/chrome/browser/profiles/profile_manager_unittest.cc +++ b/chrome/browser/profiles/profile_manager_unittest.cc
@@ -53,6 +53,7 @@ #include "content/public/common/content_switches.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/test_utils.h" +#include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/l10n/l10n_util.h" @@ -169,9 +170,13 @@ session_type_ = extensions::ScopedCurrentFeatureSessionType( extensions::GetCurrentFeatureSessionType()); #endif + + in_process_data_decoder_ = + std::make_unique<data_decoder::test::InProcessDataDecoder>(); } void TearDown() override { + in_process_data_decoder_.reset(); TestingBrowserProcess::GetGlobal()->SetProfileManager(nullptr); content::RunAllTasksUntilIdle(); #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -315,6 +320,9 @@ base::ScopedTempDir temp_dir_; ScopedTestingLocalState local_state_; + std::unique_ptr<data_decoder::test::InProcessDataDecoder> + in_process_data_decoder_; + content::BrowserTaskEnvironment task_environment_; #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc index 23c39692..a4c41a8 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -3286,7 +3286,7 @@ if (!service) return false; -// Region selection is broken in PWAs on Mac +// Region selection is broken in PWAs on Mac b/250074889 #if BUILDFLAG(IS_MAC) if (IsInProgressiveWebApp()) return false;
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc index f7d8c8a..c856b79 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
@@ -1363,8 +1363,17 @@ } // Verify that the Lens Region Search menu item is enabled for Progressive Web -// Apps -TEST_F(RenderViewContextMenuPrefsTest, LensRegionSearchProgressiveWebApp) { +// Apps. Region Search on PWAs is currently broken and therefore disabled on +// Mac. b/250074889 +#if BUILDFLAG(IS_MAC) +#define MAYBE_LensRegionSearchProgressiveWebApp \ + DISABLED_LensRegionSearchProgressiveWebApp +#else +#define MAYBE_LensRegionSearchProgressiveWebApp \ + LensRegionSearchProgressiveWebApp +#endif +TEST_F(RenderViewContextMenuPrefsTest, + MAYBE_LensRegionSearchProgressiveWebApp) { base::test::ScopedFeatureList features; features.InitAndEnableFeature(lens::features::kLensStandalone); SetUserSelectedDefaultSearchProvider("https://www.google.com",
diff --git a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn index 088aef7..4b8cea7 100644 --- a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn +++ b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn
@@ -72,8 +72,8 @@ js_library("bluetooth_pairing_dialog") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/bluetooth:bluetooth_pairing_ui", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:cr.m", ] externs_list = chrome_extension_public_externs + [
diff --git a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js index 3c1af0a..a95a76a 100644 --- a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js +++ b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js
@@ -8,7 +8,7 @@ import 'chrome://resources/cr_elements/cr_page_host_style.css.js'; import './strings.m.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; /**
diff --git a/chrome/browser/resources/chromeos/edu_coexistence/BUILD.gn b/chrome/browser/resources/chromeos/edu_coexistence/BUILD.gn index 4532321..fa87468 100644 --- a/chrome/browser/resources/chromeos/edu_coexistence/BUILD.gn +++ b/chrome/browser/resources/chromeos/edu_coexistence/BUILD.gn
@@ -33,10 +33,10 @@ ":edu_coexistence_error", ":edu_coexistence_offline", ":edu_coexistence_ui", + "//ash/webui/common/resources:web_ui_listener_behavior", "//chrome/browser/resources/chromeos/arc_account_picker:arc_account_picker_app", "//chrome/browser/resources/chromeos/arc_account_picker:arc_util", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:assert", ] @@ -45,8 +45,8 @@ js_library("edu_coexistence_button") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:util", ] } @@ -73,8 +73,8 @@ ":edu_coexistence_button", ":edu_coexistence_controller", ":edu_coexistence_template", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] externs_list = [ "$externs_path/chrome_extensions.js", @@ -84,8 +84,8 @@ js_library("edu_coexistence_template") { deps = [ + "//ash/webui/common/resources:cr_scrollable_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:cr_scrollable_behavior", ] }
diff --git a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_app.js b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_app.js index c23c36a..e160b0e 100644 --- a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_app.js +++ b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_app.js
@@ -14,7 +14,7 @@ import {assert} from 'chrome://resources/js/assert.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {getAccountAdditionOptionsFromJSON} from './arc_account_picker/arc_util.js'; import {EduCoexistenceBrowserProxyImpl} from './edu_coexistence_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_button.js b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_button.js index d00d3983..52b8eb9 100644 --- a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_button.js +++ b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_button.js
@@ -8,7 +8,7 @@ import './strings.m.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {isRTL} from 'chrome://resources/js/util.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_template.js b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_template.js index f903968..8e83eeb 100644 --- a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_template.js +++ b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_template.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {CrScrollableBehavior} from 'chrome://resources/cr_elements/cr_scrollable_behavior.js'; +import {CrScrollableBehavior} from 'chrome://resources/ash/common/cr_scrollable_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; Polymer({
diff --git a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_ui.js b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_ui.js index 2c67441..907d409 100644 --- a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_ui.js +++ b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_ui.js
@@ -8,7 +8,7 @@ import './gaia_action_buttons/gaia_action_buttons.js'; import 'chrome://resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js'; -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {AuthParams} from '../../gaia_auth_host/authenticator.js';
diff --git a/chrome/browser/resources/chromeos/emulator/BUILD.gn b/chrome/browser/resources/chromeos/emulator/BUILD.gn index 62db60e5..d5b215c 100644 --- a/chrome/browser/resources/chromeos/emulator/BUILD.gn +++ b/chrome/browser/resources/chromeos/emulator/BUILD.gn
@@ -26,24 +26,24 @@ js_library("bluetooth_settings") { deps = [ + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] externs_list = [ "$externs_path/chrome_send.js" ] } js_library("battery_settings") { deps = [ + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] externs_list = [ "$externs_path/chrome_send.js" ] } js_library("input_device_settings") { deps = [ + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] externs_list = [ "$externs_path/chrome_send.js" ] }
diff --git a/chrome/browser/resources/chromeos/emulator/battery_settings.js b/chrome/browser/resources/chromeos/emulator/battery_settings.js index a67a7da..25a7585 100644 --- a/chrome/browser/resources/chromeos/emulator/battery_settings.js +++ b/chrome/browser/resources/chromeos/emulator/battery_settings.js
@@ -15,7 +15,7 @@ import './icons.js'; import './shared_styles.js'; -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; Polymer({
diff --git a/chrome/browser/resources/chromeos/emulator/bluetooth_settings.js b/chrome/browser/resources/chromeos/emulator/bluetooth_settings.js index 2a9478ee..717d799 100644 --- a/chrome/browser/resources/chromeos/emulator/bluetooth_settings.js +++ b/chrome/browser/resources/chromeos/emulator/bluetooth_settings.js
@@ -14,7 +14,7 @@ import './icons.js'; import './shared_styles.js'; -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/chromeos/emulator/input_device_settings.js b/chrome/browser/resources/chromeos/emulator/input_device_settings.js index be34f719..e80c749be 100644 --- a/chrome/browser/resources/chromeos/emulator/input_device_settings.js +++ b/chrome/browser/resources/chromeos/emulator/input_device_settings.js
@@ -9,7 +9,7 @@ import './icons.js'; import './shared_styles.js'; -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; Polymer({
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn b/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn index 1b86ac6a..64c1568 100644 --- a/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn +++ b/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn
@@ -67,10 +67,10 @@ js_library("internet_config_dialog") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:cr_policy_network_behavior_mojo", "//ash/webui/common/resources/network:network_config", "//ash/webui/common/resources/network:onc_mojo", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", ]
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js index 1edd2710..71d6eeb 100644 --- a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js +++ b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
@@ -11,7 +11,7 @@ import 'chrome://resources/cr_elements/cr_shared_style.css.js'; import './strings.m.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn b/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn index 9088dd9..6e49416 100644 --- a/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn +++ b/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
@@ -89,10 +89,10 @@ js_library("internet_detail_dialog") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:cr_policy_network_behavior_mojo", "//ash/webui/common/resources/network:network_listener_behavior", "//ash/webui/common/resources/network:onc_mojo", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", ] externs_list = [ "$externs_path/chrome_send.js" ]
diff --git a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js index bc46452..751ce6b 100644 --- a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js +++ b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js
@@ -23,7 +23,7 @@ import {MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js'; import {NetworkListenerBehavior} from 'chrome://resources/ash/common/network/network_listener_behavior.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {ApnProperties, ConfigProperties, CrosNetworkConfigRemote, GlobalPolicy, IPConfigProperties, ManagedProperties, NetworkStateProperties, ProxySettings, StartConnectResult} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/chrome/browser/resources/chromeos/login/components/behaviors/BUILD.gn b/chrome/browser/resources/chromeos/login/components/behaviors/BUILD.gn index 198dd6f..f9ba77d 100644 --- a/chrome/browser/resources/chromeos/login/components/behaviors/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/components/behaviors/BUILD.gn
@@ -52,8 +52,8 @@ js_library("oobe_i18n_behavior.m") { sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.m.js" ] deps = [ + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:parse_html_subset", ] extra_deps = [ ":modulize" ]
diff --git a/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js b/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js index 9801deb..35a819e 100644 --- a/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js +++ b/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js
@@ -3,7 +3,7 @@ // found in the LICENSE file. // clang-format off -// #import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +// #import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; // #import {SanitizeInnerHtmlOpts} from 'chrome://resources/js/parse_html_subset.js'; // #import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; // clang-format on
diff --git a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog.html b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog.html index 2eed68c0..93fa23e 100644 --- a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog.html +++ b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog.html
@@ -7,7 +7,7 @@ <link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> <link rel="import" href="chrome://resources/cr_elements/cr_shared_style.css.html"> -<link rel="import" href="chrome://resources/cr_elements/cr_scrollable_behavior.html"> +<link rel="import" href="chrome://resources/ash/common/cr_scrollable_behavior.html"> <link rel="import" href="chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.html"> <link rel="import" href="../behaviors/oobe_focus_behavior.html">
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_apps_list.html b/chrome/browser/resources/chromeos/login/components/oobe_apps_list.html index 05efd69e..de92369e 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_apps_list.html +++ b/chrome/browser/resources/chromeos/login/components/oobe_apps_list.html
@@ -9,7 +9,7 @@ <link rel="import" href="chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html"> <link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_expand_button/cr_expand_button.html"> -<link rel="import" href="chrome://resources/cr_elements/cr_scrollable_behavior.html"> +<link rel="import" href="chrome://resources/ash/common/cr_scrollable_behavior.html"> <link rel="import" href="chrome://resources/cr_elements/icons.html"> <link rel="import" href="./behaviors/oobe_i18n_behavior.html">
diff --git a/chrome/browser/resources/chromeos/login/oobe_auto_imports.gni b/chrome/browser/resources/chromeos/login/oobe_auto_imports.gni index 199ca20..0ed2209f 100644 --- a/chrome/browser/resources/chromeos/login/oobe_auto_imports.gni +++ b/chrome/browser/resources/chromeos/login/oobe_auto_imports.gni
@@ -91,6 +91,9 @@ oobe_migrated_imports = [ "chrome/browser/resources/gaia_auth_host/authenticator.html", + "ash/webui/common/resources/cr_scrollable_behavior.html", + "ash/webui/common/resources/i18n_behavior.html", + "ash/webui/common/resources/web_ui_listener_behavior.html", "ash/webui/common/resources/bluetooth/bluetooth_pairing_enter_code_page.html", "ash/webui/common/resources/multidevice_setup/button_bar.html", "ash/webui/common/resources/multidevice_setup/fake_mojo_service.html", @@ -130,13 +133,10 @@ "ui/webui/resources/cr_elements/cr_lottie/cr_lottie.html", "ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.html", "ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.html", - "ui/webui/resources/cr_elements/cr_scrollable_behavior.html", "ui/webui/resources/cr_elements/cr_shared_style.css.html", "ui/webui/resources/cr_elements/cr_shared_vars.css.html", "ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html", "ui/webui/resources/cr_elements/md_select.css.html", - "ui/webui/resources/cr_elements/i18n_behavior.html", - "ui/webui/resources/cr_elements/web_ui_listener_behavior.html", "ui/webui/resources/html/assert.html", "ui/webui/resources/html/parse_html_subset.html", "ui/webui/resources/html/util.html",
diff --git a/chrome/browser/resources/chromeos/login/screens/common/family_link_notice.html b/chrome/browser/resources/chromeos/login/screens/common/family_link_notice.html index e562a2e..1b2afc26 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/family_link_notice.html +++ b/chrome/browser/resources/chromeos/login/screens/common/family_link_notice.html
@@ -7,7 +7,7 @@ <link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/cr_elements/cr_shared_vars.css.html"> -<link rel="import" href="chrome://resources/cr_elements/i18n_behavior.html"> +<link rel="import" href="chrome://resources/ash/common/i18n_behavior.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="../../components/oobe_icons.html">
diff --git a/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js b/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js index ffe3575..1fa25a4 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js +++ b/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js
@@ -14,7 +14,7 @@ import '../../components/common_styles/oobe_dialog_host_styles.m.js'; import '../../components/dialogs/oobe_adaptive_dialog.m.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {loadTimeData} from '//resources/js/load_time_data.m.js'; import {afterNextRender, dom, flush, html, mixinBehaviors, Polymer, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/chromeos/login/screens/common/managed_terms_of_service.js b/chrome/browser/resources/chromeos/login/screens/common/managed_terms_of_service.js index d9247f7..045eacb 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/managed_terms_of_service.js +++ b/chrome/browser/resources/chromeos/login/screens/common/managed_terms_of_service.js
@@ -16,7 +16,7 @@ import '../../components/dialogs/oobe_adaptive_dialog.m.js'; import '../../components/dialogs/oobe_loading_dialog.m.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.m.js';
diff --git a/chrome/browser/resources/chromeos/login/screens/common/multidevice_setup.html b/chrome/browser/resources/chromeos/login/screens/common/multidevice_setup.html index 8fb808c..b0680c3 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/multidevice_setup.html +++ b/chrome/browser/resources/chromeos/login/screens/common/multidevice_setup.html
@@ -11,8 +11,8 @@ <link rel="import" href="chrome://resources/ash/common/multidevice_setup/multidevice_setup.html"> <link rel="import" href="chrome://resources/ash/common/multidevice_setup/multidevice_setup_delegate.html"> <link rel="import" href="chrome://resources/html/assert.html"> -<link rel="import" href="chrome://resources/cr_elements/i18n_behavior.html"> -<link rel="import" href="chrome://resources/cr_elements/web_ui_listener_behavior.html"> +<link rel="import" href="chrome://resources/ash/common/i18n_behavior.html"> +<link rel="import" href="chrome://resources/ash/common/web_ui_listener_behavior.html"> <link rel="import" href="../../components/behaviors/login_screen_behavior.html"> <link rel="import" href="../../components/behaviors/multi_step_behavior.html">
diff --git a/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js b/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js index 6070607..5304f1c 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js +++ b/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js
@@ -19,7 +19,7 @@ import '../../components/common_styles/oobe_dialog_host_styles.m.js'; import '../../components/dialogs/oobe_adaptive_dialog.m.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {loadTimeData} from '//resources/js/load_time_data.m.js'; import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/chromeos/login/screens/common/pin_setup.js b/chrome/browser/resources/chromeos/login/screens/common/pin_setup.js index d876f70..8cfe6fbc 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/pin_setup.js +++ b/chrome/browser/resources/chromeos/login/screens/common/pin_setup.js
@@ -15,7 +15,7 @@ import '../../components/buttons/oobe_text_button.m.js'; import {recordLockScreenProgress} from '//resources/ash/common/quick_unlock/lock_screen_constants.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {assert, assertNotReached} from '//resources/js/assert.js'; import {dom, html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.js b/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.js index faa52c5..9b1b76d 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.js +++ b/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.js
@@ -11,7 +11,7 @@ import '../../components/common_styles/oobe_dialog_host_styles.m.js'; import '../../components/dialogs/oobe_adaptive_dialog.m.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {assert} from '//resources/js/assert.js'; import {loadTimeData} from '//resources/js/load_time_data.m.js'; import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.js b/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.js index 6e4d1291..f3137c3a 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.js +++ b/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.js
@@ -16,7 +16,7 @@ import '../../components/dialogs/oobe_adaptive_dialog.m.js'; import {NetworkList} from '//resources/ash/common/network/network_list_types.js'; -import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js'; import {assert} from '//resources/js/assert.js'; import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/packaged_license.html b/chrome/browser/resources/chromeos/login/screens/oobe/packaged_license.html index 10dd9c6..3ae7692 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/packaged_license.html +++ b/chrome/browser/resources/chromeos/login/screens/oobe/packaged_license.html
@@ -7,7 +7,7 @@ <link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/cr_elements/cr_shared_vars.css.html"> -<link rel="import" href="chrome://resources/cr_elements/i18n_behavior.html"> +<link rel="import" href="chrome://resources/ash/common/i18n_behavior.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="../../components/oobe_icons.html">
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/welcome.html b/chrome/browser/resources/chromeos/login/screens/oobe/welcome.html index 4ce8b11..559d9327 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/welcome.html +++ b/chrome/browser/resources/chromeos/login/screens/oobe/welcome.html
@@ -8,7 +8,7 @@ <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html"> <link rel="import" href="chrome://resources/cr_elements/cr_shared_vars.css.html"> -<link rel="import" href="chrome://resources/cr_elements/i18n_behavior.html"> +<link rel="import" href="chrome://resources/ash/common/i18n_behavior.html"> <link rel="import" href="chrome://resources/html/load_time_data.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.html b/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.html index 2229977..259bc10c 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.html +++ b/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.html
@@ -9,7 +9,7 @@ <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> <link rel="import" href="chrome://resources/html/action_link.html"> <link rel="import" href="chrome://resources/html/assert.html"> -<link rel="import" href="chrome://resources/cr_elements/i18n_behavior.html"> +<link rel="import" href="chrome://resources/ash/common/i18n_behavior.html"> <link rel="import" href="chrome://resources/html/load_time_data.html"> <link rel="import" href="chrome://resources/cr_elements/cr_shared_style.css.html">
diff --git a/chrome/browser/resources/chromeos/multidevice_internals/BUILD.gn b/chrome/browser/resources/chromeos/multidevice_internals/BUILD.gn index 257e006f..20db57bd 100644 --- a/chrome/browser/resources/chromeos/multidevice_internals/BUILD.gn +++ b/chrome/browser/resources/chromeos/multidevice_internals/BUILD.gn
@@ -96,7 +96,7 @@ deps = [ ":multidevice_phonehub_browser_proxy", ":types", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", ] } @@ -134,8 +134,8 @@ ":log_object", ":multidevice_logs_browser_proxy", ":types", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:cr.m", ] } @@ -180,7 +180,7 @@ deps = [ ":multidevice_phonehub_browser_proxy", ":types", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", ] } @@ -194,7 +194,7 @@ ":phone_status_model_form", ":quick_action_controller_form", ":types", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//ui/webui/resources/js:load_time_data.m", ] }
diff --git a/chrome/browser/resources/chromeos/multidevice_internals/camera_roll_manager_form.js b/chrome/browser/resources/chromeos/multidevice_internals/camera_roll_manager_form.js index 40294d2..ae8ef62 100644 --- a/chrome/browser/resources/chromeos/multidevice_internals/camera_roll_manager_form.js +++ b/chrome/browser/resources/chromeos/multidevice_internals/camera_roll_manager_form.js
@@ -8,7 +8,7 @@ import 'chrome://resources/cr_elements/cr_input/cr_input.js'; import './shared_style.js'; -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {MultidevicePhoneHubBrowserProxy} from './multidevice_phonehub_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/multidevice_internals/logging_tab.js b/chrome/browser/resources/chromeos/multidevice_internals/logging_tab.js index cf35d0d..14b13f6d 100644 --- a/chrome/browser/resources/chromeos/multidevice_internals/logging_tab.js +++ b/chrome/browser/resources/chromeos/multidevice_internals/logging_tab.js
@@ -8,7 +8,7 @@ import './log_object.js'; import './shared_style.js'; -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {MultideviceLogsBrowserProxy} from './multidevice_logs_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/multidevice_internals/notification_form.js b/chrome/browser/resources/chromeos/multidevice_internals/notification_form.js index 35eee5d6..a8c427b 100644 --- a/chrome/browser/resources/chromeos/multidevice_internals/notification_form.js +++ b/chrome/browser/resources/chromeos/multidevice_internals/notification_form.js
@@ -7,7 +7,7 @@ import 'chrome://resources/cr_elements/cr_input/cr_input.js'; import './shared_style.js'; -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {MultidevicePhoneHubBrowserProxy} from './multidevice_phonehub_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/multidevice_internals/phonehub_tab.js b/chrome/browser/resources/chromeos/multidevice_internals/phonehub_tab.js index 29f1cd5..56454d10 100644 --- a/chrome/browser/resources/chromeos/multidevice_internals/phonehub_tab.js +++ b/chrome/browser/resources/chromeos/multidevice_internals/phonehub_tab.js
@@ -16,7 +16,7 @@ import './quick_action_controller_form.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {flush, html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {MultidevicePhoneHubBrowserProxy} from './multidevice_phonehub_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/multidevice_internals/quick_action_controller_form.js b/chrome/browser/resources/chromeos/multidevice_internals/quick_action_controller_form.js index 719546b3..25fce37 100644 --- a/chrome/browser/resources/chromeos/multidevice_internals/quick_action_controller_form.js +++ b/chrome/browser/resources/chromeos/multidevice_internals/quick_action_controller_form.js
@@ -7,7 +7,7 @@ import 'chrome://resources/cr_elements/md_select.css.js'; import './shared_style.js'; -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {MultidevicePhoneHubBrowserProxy} from './multidevice_phonehub_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js index 1e4e230..a16cc56 100644 --- a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js +++ b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js
@@ -8,7 +8,7 @@ import {loadTimeData} from '//resources/js/load_time_data.m.js'; import {PageName} from 'chrome://resources/ash/common/multidevice_setup/multidevice_setup.js'; import {MultiDeviceSetupDelegate} from 'chrome://resources/ash/common/multidevice_setup/multidevice_setup_delegate.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {PostOobeDelegate} from './post_oobe_delegate.js';
diff --git a/chrome/browser/resources/chromeos/multidevice_setup/post_oobe_delegate.js b/chrome/browser/resources/chromeos/multidevice_setup/post_oobe_delegate.js index ab60f5e..fbc037d8 100644 --- a/chrome/browser/resources/chromeos/multidevice_setup/post_oobe_delegate.js +++ b/chrome/browser/resources/chromeos/multidevice_setup/post_oobe_delegate.js
@@ -4,7 +4,7 @@ import {MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/multidevice_setup/mojo_api.js'; import {MultiDeviceSetupDelegate} from 'chrome://resources/ash/common/multidevice_setup/multidevice_setup_delegate.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/chromeos/network_ui/BUILD.gn b/chrome/browser/resources/chromeos/network_ui/BUILD.gn index 5cc0f78..0833a758 100644 --- a/chrome/browser/resources/chromeos/network_ui/BUILD.gn +++ b/chrome/browser/resources/chromeos/network_ui/BUILD.gn
@@ -84,9 +84,9 @@ js_library("network_ui") { deps = [ ":network_ui_browser_proxy", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:onc_mojo", "//ash/webui/common/resources/network_health:network_diagnostics", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:load_time_data.m", ] } @@ -94,14 +94,14 @@ js_library("network_logs_ui") { deps = [ ":network_ui_browser_proxy", - "//ui/webui/resources/cr_elements:i18n_behavior", + "//ash/webui/common/resources:i18n_behavior", ] } js_library("network_metrics_ui") { deps = [ ":network_ui_browser_proxy", - "//ui/webui/resources/cr_elements:i18n_behavior", + "//ash/webui/common/resources:i18n_behavior", ] }
diff --git a/chrome/browser/resources/chromeos/network_ui/network_logs_ui.js b/chrome/browser/resources/chromeos/network_ui/network_logs_ui.js index 1b7f91bf6..4b76556 100644 --- a/chrome/browser/resources/chromeos/network_ui/network_logs_ui.js +++ b/chrome/browser/resources/chromeos/network_ui/network_logs_ui.js
@@ -8,7 +8,7 @@ import 'chrome://resources/cr_elements/cr_radio_group/cr_radio_group.js'; import 'chrome://resources/cr_elements/cr_shared_style.css.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {NetworkUIBrowserProxy, NetworkUIBrowserProxyImpl} from './network_ui_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/network_ui/network_metrics_ui.js b/chrome/browser/resources/chromeos/network_ui/network_metrics_ui.js index d79f5ee..99da00f 100644 --- a/chrome/browser/resources/chromeos/network_ui/network_metrics_ui.js +++ b/chrome/browser/resources/chromeos/network_ui/network_metrics_ui.js
@@ -6,7 +6,7 @@ import 'chrome://resources/cr_elements/cr_radio_button/cr_radio_button.js'; import 'chrome://resources/cr_elements/cr_shared_style.css.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {NetworkUIBrowserProxy, NetworkUIBrowserProxyImpl} from './network_ui_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/network_ui/network_ui.js b/chrome/browser/resources/chromeos/network_ui/network_ui.js index 414deeea..d101029 100644 --- a/chrome/browser/resources/chromeos/network_ui/network_ui.js +++ b/chrome/browser/resources/chromeos/network_ui/network_ui.js
@@ -18,7 +18,7 @@ import './network_metrics_ui.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {CrosNetworkConfig, CrosNetworkConfigRemote, StartConnectResult} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/chromeos/parent_access/BUILD.gn b/chrome/browser/resources/chromeos/parent_access/BUILD.gn index 8462fd3..1e128fe 100644 --- a/chrome/browser/resources/chromeos/parent_access/BUILD.gn +++ b/chrome/browser/resources/chromeos/parent_access/BUILD.gn
@@ -6,10 +6,7 @@ import("//tools/polymer/html_to_js.gni") group("closure_compile") { - deps = [ - ":closure_compile_local", - "flows:closure_compile", - ] + deps = [ ":closure_compile_local" ] } js_type_check("closure_compile_local") { @@ -27,6 +24,7 @@ ":parent_access_ui", ":parent_access_ui_handler", ":webview_manager", + "flows:local_web_approvals_after", ] } @@ -43,6 +41,8 @@ deps = [ ":parent_access_after", ":parent_access_ui", + ":parent_access_ui_handler", + "//chrome/browser/ui/webui/chromeos/parent_access:mojo_bindings_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_view_manager/cr_view_manager_externs.js" ]
diff --git a/chrome/browser/resources/chromeos/parent_access/flows/BUILD.gn b/chrome/browser/resources/chromeos/parent_access/flows/BUILD.gn index 89a8c4db..ee56b3d 100644 --- a/chrome/browser/resources/chromeos/parent_access/flows/BUILD.gn +++ b/chrome/browser/resources/chromeos/parent_access/flows/BUILD.gn
@@ -5,15 +5,11 @@ import("//third_party/closure_compiler/compile_js.gni") import("//tools/polymer/html_to_js.gni") -js_type_check("closure_compile") { - is_polymer3 = true - deps = [ ":local_web_approvals_after" ] -} - js_library("local_web_approvals_after") { deps = [ + "//ash/webui/common/resources:i18n_behavior", + "//chrome/browser/ui/webui/chromeos/parent_access:mojo_bindings_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] }
diff --git a/chrome/browser/resources/chromeos/parent_access/flows/local_web_approvals_after.html b/chrome/browser/resources/chromeos/parent_access/flows/local_web_approvals_after.html index 82c58c2..9af60e8 100644 --- a/chrome/browser/resources/chromeos/parent_access/flows/local_web_approvals_after.html +++ b/chrome/browser/resources/chromeos/parent_access/flows/local_web_approvals_after.html
@@ -17,8 +17,6 @@ } .favicon { - /* TODO(b/199753545) remove bg color once favicon available. */ - background-color: var(--google-grey-400); height: 28px; margin: 0 16px; width: 28px; @@ -28,11 +26,9 @@ <div class="after-screen-content"> <!-- TODO(b/199753545): Replace the hardcoded content when it's available. --> - <div class="subtitle"> - [[i18n('localWebApprovalsAfterSubtitle', 'Child')]] - </div> + <div class="subtitle"></div> <div class="details"> - <div class="favicon"></div> - <span>[[i18n('localWebApprovalsAfterDetails', 'google.com')]]</span> + <image class="favicon"></image> + <div class="details-text"></div> </div> -</div> \ No newline at end of file +</div>
diff --git a/chrome/browser/resources/chromeos/parent_access/flows/local_web_approvals_after.js b/chrome/browser/resources/chromeos/parent_access/flows/local_web_approvals_after.js index 5b37757ab..3c5607f 100644 --- a/chrome/browser/resources/chromeos/parent_access/flows/local_web_approvals_after.js +++ b/chrome/browser/resources/chromeos/parent_access/flows/local_web_approvals_after.js
@@ -4,9 +4,13 @@ import 'chrome://resources/cr_elements/cr_shared_vars.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {String16} from 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-webui.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {WebApprovalsParams} from '../parent_access_ui.mojom-webui.js'; +import {getParentAccessParams} from '../parent_access_ui_handler.js'; + /** * @constructor * @extends {PolymerElement} @@ -15,7 +19,7 @@ const LocalWebApprovalsAfterBase = mixinBehaviors([I18nBehavior], PolymerElement); -class LocalWebApprovalsAfterElement extends LocalWebApprovalsAfterBase { +export class LocalWebApprovalsAfterElement extends LocalWebApprovalsAfterBase { static get is() { return 'local-web-approvals-after'; } @@ -23,6 +27,55 @@ static get template() { return html`{__html_template__}`; } + + constructor() { + super(); + this.attachShadow({mode: 'open', delegatesFocus: true}); + } + + /** @override */ + ready() { + super.ready(); + this.configureWithParams_(); + } + + /** @private */ + async configureWithParams_() { + const response = await getParentAccessParams(); + const params = response.params.flowTypeParams.webApprovalsParams; + if (params) { + this.renderDetails_(params); + } else { + console.error('Failed to fetch web approvals params.'); + } + } + + /** + * Renders local approvals specific information from the WebApprovalsParams + * @param {!WebApprovalsParams} params + * @private + */ + renderDetails_(params) { + const childName = this.decodeMojoString16_(params.childDisplayName); + const url = params.url.url; + // Convert the PNG bytes to a Base64 encoded string. + const favicon = btoa(String.fromCharCode(...params.faviconPngBytes)); + + this.shadowRoot.querySelector('.subtitle').innerText = + this.i18n('localWebApprovalsAfterSubtitle', childName); + this.shadowRoot.querySelector('.details-text').innerText = + this.i18n('localWebApprovalsAfterDetails', url); + this.shadowRoot.querySelector('.favicon').src = + 'data:image/png;base64,' + favicon; + } + + /** + * @param {!String16} str + * @private + */ + decodeMojoString16_(str) { + return str.data.map((ch) => String.fromCodePoint(ch)).join(''); + } } customElements.define(
diff --git a/chrome/browser/resources/chromeos/parent_access/parent_access_after.html b/chrome/browser/resources/chromeos/parent_access/parent_access_after.html index b706fd1..b0375fa 100644 --- a/chrome/browser/resources/chromeos/parent_access/parent_access_after.html +++ b/chrome/browser/resources/chromeos/parent_access/parent_access_after.html
@@ -28,9 +28,7 @@ <img class="google-logo" src="chrome://theme/IDR_LOGO_GOOGLE_COLOR_90" alt="Google"> </img> - <template is="dom-if" if="[[isLocalWebApprovalsFlow_]]"> - <local-web-approvals-after></local-web-approvals-after> - </template> + <div id="after-screen-body"></div> <div id="after-screen-buttons"> <cr-button>$i18n{denyButtonText}</cr-button> <cr-button class="action-button">$i18n{approveButtonText}</cr-button>
diff --git a/chrome/browser/resources/chromeos/parent_access/parent_access_after.js b/chrome/browser/resources/chromeos/parent_access/parent_access_after.js index 2a9a34e3..b07593fe9 100644 --- a/chrome/browser/resources/chromeos/parent_access/parent_access_after.js +++ b/chrome/browser/resources/chromeos/parent_access/parent_access_after.js
@@ -7,6 +7,10 @@ import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {LocalWebApprovalsAfterElement} from './flows/local_web_approvals_after.js'; +import {ParentAccessParams, ParentAccessParams_FlowType} from './parent_access_ui.mojom-webui.js'; +import {getParentAccessParams} from './parent_access_ui_handler.js'; + class ParentAccessAfter extends PolymerElement { static get is() { return 'parent-access-after'; @@ -19,17 +23,25 @@ /** @override */ ready() { super.ready(); + this.renderFlowSpecificContent_(); // TODO(b/199753153): Implement handlers for deny and approve buttons. } /** + * Renders the correct after screen based on the ParentAccessParams flowtype. * @private - * @return {boolean} */ - isLocalWebApprovalsFlow_() { - // TODO(b/199753545): Use the passed in loadTimeData value for the flowtype - // when it is available. - return true; + async renderFlowSpecificContent_() { + const response = await getParentAccessParams(); + switch (response.params.flowType) { + case ParentAccessParams_FlowType.kWebsiteAccess: + this.shadowRoot.querySelector('#after-screen-body') + .appendChild(new LocalWebApprovalsAfterElement()); + return; + default: + return; + } } } -customElements.define(ParentAccessAfter.is, ParentAccessAfter); \ No newline at end of file + +customElements.define(ParentAccessAfter.is, ParentAccessAfter);
diff --git a/chrome/browser/resources/chromeos/parent_access/parent_access_ui_handler.js b/chrome/browser/resources/chromeos/parent_access/parent_access_ui_handler.js index e17d4324..76205e9 100644 --- a/chrome/browser/resources/chromeos/parent_access/parent_access_ui_handler.js +++ b/chrome/browser/resources/chromeos/parent_access/parent_access_ui_handler.js
@@ -2,15 +2,32 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {ParentAccessUIHandler, ParentAccessUIHandlerRemote} from './parent_access_ui.mojom-webui.js'; +import {ParentAccessParams, ParentAccessUIHandler, ParentAccessUIHandlerRemote} from './parent_access_ui.mojom-webui.js'; /** @type {?ParentAccessUIHandlerRemote} */ let parentAccessUIHandler = null; +/** @type {?{params: !ParentAccessParams}} */ +let parentAccessParams = null; + /** @return {!ParentAccessUIHandlerRemote} */ export function getParentAccessUIHandler() { if (!parentAccessUIHandler) { parentAccessUIHandler = ParentAccessUIHandler.getRemote(); } return parentAccessUIHandler; +} + +/** @return {!Promise<{params: !ParentAccessParams}>} */ +export async function getParentAccessParams() { + if (!parentAccessParams) { + parentAccessParams = + await getParentAccessUIHandler().getParentAccessParams(); + } + return parentAccessParams; +} + +/** @param {!{params: !ParentAccessParams}} params*/ +export function setParentAccessParamsForTest(params) { + parentAccessParams = params; } \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/password_change/BUILD.gn b/chrome/browser/resources/chromeos/password_change/BUILD.gn index efe1ab7c..92c6424 100644 --- a/chrome/browser/resources/chromeos/password_change/BUILD.gn +++ b/chrome/browser/resources/chromeos/password_change/BUILD.gn
@@ -96,9 +96,9 @@ js_library("password_change") { sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/password_change/password_change.js" ] deps = [ + "//ash/webui/common/resources:i18n_behavior", "//chrome/browser/resources/gaia_auth_host:password_change_authenticator", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:load_time_data.m", ] externs_list = [ "$externs_path/webview_tag.js" ] @@ -108,9 +108,9 @@ js_library("lock_screen_network") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:network_select", "//ash/webui/common/resources/network:onc_mojo", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:load_time_data.m", ] externs_list = [
diff --git a/chrome/browser/resources/chromeos/password_change/confirm_password_change.js b/chrome/browser/resources/chromeos/password_change/confirm_password_change.js index ec5efb3b..def2e92f 100644 --- a/chrome/browser/resources/chromeos/password_change/confirm_password_change.js +++ b/chrome/browser/resources/chromeos/password_change/confirm_password_change.js
@@ -23,9 +23,9 @@ import 'chrome://resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js'; import {sendWithPromise} from 'chrome://resources/js/cr.m.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; /** @enum{number} */
diff --git a/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.js b/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.js index 2918610e2..1882ba46 100644 --- a/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.js +++ b/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.js
@@ -15,7 +15,7 @@ import 'chrome://resources/cr_elements/cr_shared_vars.css.js'; import './components/oobe_icons.m.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {$} from 'chrome://resources/js/util.js';
diff --git a/chrome/browser/resources/chromeos/password_change/password_change.js b/chrome/browser/resources/chromeos/password_change/password_change.js index 440adfd..2466f418 100644 --- a/chrome/browser/resources/chromeos/password_change/password_change.js +++ b/chrome/browser/resources/chromeos/password_change/password_change.js
@@ -11,7 +11,7 @@ import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js'; import 'chrome://resources/cr_elements/icons.html.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/chromeos/password_change/urgent_password_expiry_notification_app.js b/chrome/browser/resources/chromeos/password_change/urgent_password_expiry_notification_app.js index 76d87af..bd6538c 100644 --- a/chrome/browser/resources/chromeos/password_change/urgent_password_expiry_notification_app.js +++ b/chrome/browser/resources/chromeos/password_change/urgent_password_expiry_notification_app.js
@@ -16,9 +16,9 @@ import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; import './strings.m.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; const ONE_SECOND_IN_MS = 1000;
diff --git a/chrome/browser/resources/chromeos/set_time_dialog/BUILD.gn b/chrome/browser/resources/chromeos/set_time_dialog/BUILD.gn index 8a6fbf49..f9daecf 100644 --- a/chrome/browser/resources/chromeos/set_time_dialog/BUILD.gn +++ b/chrome/browser/resources/chromeos/set_time_dialog/BUILD.gn
@@ -16,8 +16,8 @@ js_library("set_time_dialog") { deps = [ ":set_time_browser_proxy", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:cr.m", "//ui/webui/resources/js:load_time_data.m",
diff --git a/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js b/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js index 5a90a31a..e91c4a8 100644 --- a/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js +++ b/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js
@@ -21,7 +21,7 @@ import {assert} from 'chrome://resources/js/assert.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {SetTimeBrowserProxy, SetTimeBrowserProxyImpl} from './set_time_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/smb_shares/BUILD.gn b/chrome/browser/resources/chromeos/smb_shares/BUILD.gn index bf7283c6..de13b6cb 100644 --- a/chrome/browser/resources/chromeos/smb_shares/BUILD.gn +++ b/chrome/browser/resources/chromeos/smb_shares/BUILD.gn
@@ -15,17 +15,17 @@ js_library("smb_share_dialog") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/smb_shares:add_smb_share_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("smb_credentials_dialog") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/smb_shares:smb_browser_proxy", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:cr.m", "//ui/webui/resources/js:load_time_data.m",
diff --git a/chrome/browser/resources/chromeos/smb_shares/DIR_METADATA b/chrome/browser/resources/chromeos/smb_shares/DIR_METADATA index 5b8d7cd..e9400b87 100644 --- a/chrome/browser/resources/chromeos/smb_shares/DIR_METADATA +++ b/chrome/browser/resources/chromeos/smb_shares/DIR_METADATA
@@ -1,3 +1 @@ -monorail { - component: "Platform>Apps>FileManager" -} +mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chrome/browser/resources/chromeos/smb_shares/smb_credentials_dialog.js b/chrome/browser/resources/chromeos/smb_shares/smb_credentials_dialog.js index 2604315b..925ce5e 100644 --- a/chrome/browser/resources/chromeos/smb_shares/smb_credentials_dialog.js +++ b/chrome/browser/resources/chromeos/smb_shares/smb_credentials_dialog.js
@@ -8,7 +8,7 @@ import './strings.m.js'; import {SmbBrowserProxy, SmbBrowserProxyImpl} from 'chrome://resources/ash/common/smb_shares/smb_browser_proxy.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/chromeos/smb_shares/smb_share_dialog.js b/chrome/browser/resources/chromeos/smb_shares/smb_share_dialog.js index f43df8334..87e09dd 100644 --- a/chrome/browser/resources/chromeos/smb_shares/smb_share_dialog.js +++ b/chrome/browser/resources/chromeos/smb_shares/smb_share_dialog.js
@@ -5,7 +5,7 @@ import 'chrome://resources/ash/common/smb_shares/add_smb_share_dialog.js'; import './strings.m.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; /**
diff --git a/chrome/browser/resources/nearby_internals/BUILD.gn b/chrome/browser/resources/nearby_internals/BUILD.gn index bdf31a99..820df5e 100644 --- a/chrome/browser/resources/nearby_internals/BUILD.gn +++ b/chrome/browser/resources/nearby_internals/BUILD.gn
@@ -128,8 +128,8 @@ ":nearby_logs_browser_proxy", ":nearby_prefs_browser_proxy", ":types", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:cr.m", ] }
diff --git a/chrome/browser/resources/nearby_internals/contact_tab.js b/chrome/browser/resources/nearby_internals/contact_tab.js index 699f3cf..5b618cb1 100644 --- a/chrome/browser/resources/nearby_internals/contact_tab.js +++ b/chrome/browser/resources/nearby_internals/contact_tab.js
@@ -8,7 +8,7 @@ import './contact_object.js'; import './shared_style.js'; -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {NearbyContactBrowserProxy} from './nearby_contact_browser_proxy.js';
diff --git a/chrome/browser/resources/nearby_internals/http_tab.js b/chrome/browser/resources/nearby_internals/http_tab.js index eea423b..57211823 100644 --- a/chrome/browser/resources/nearby_internals/http_tab.js +++ b/chrome/browser/resources/nearby_internals/http_tab.js
@@ -8,7 +8,7 @@ import './http_message_object.js'; import './shared_style.js'; -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {NearbyHttpBrowserProxy} from './nearby_http_browser_proxy.js';
diff --git a/chrome/browser/resources/nearby_internals/logging_tab.js b/chrome/browser/resources/nearby_internals/logging_tab.js index 46d445c..5b1fb46 100644 --- a/chrome/browser/resources/nearby_internals/logging_tab.js +++ b/chrome/browser/resources/nearby_internals/logging_tab.js
@@ -8,7 +8,7 @@ import './log_object.js'; import './shared_style.js'; -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {NearbyLogsBrowserProxy} from './nearby_logs_browser_proxy.js';
diff --git a/chrome/browser/resources/nearby_internals/ui_trigger_tab.js b/chrome/browser/resources/nearby_internals/ui_trigger_tab.js index c815f32..708f7243 100644 --- a/chrome/browser/resources/nearby_internals/ui_trigger_tab.js +++ b/chrome/browser/resources/nearby_internals/ui_trigger_tab.js
@@ -7,7 +7,7 @@ import './ui_trigger_list_object.js'; import './shared_style.js'; -import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {NearbyPrefsBrowserProxy} from './nearby_prefs_browser_proxy.js';
diff --git a/chrome/browser/resources/nearby_share/BUILD.gn b/chrome/browser/resources/nearby_share/BUILD.gn index 2e685bf..85bfd0f1 100644 --- a/chrome/browser/resources/nearby_share/BUILD.gn +++ b/chrome/browser/resources/nearby_share/BUILD.gn
@@ -179,10 +179,10 @@ "./shared:nearby_preview", "./shared:nearby_progress", "./shared:types", + "//ash/webui/common/resources:i18n_behavior", "//chrome/browser/ui/webui/nearby_share:mojom_js_library_for_compile", "//chrome/browser/ui/webui/nearby_share:share_type_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js" ]
diff --git a/chrome/browser/resources/nearby_share/nearby_confirmation_page.js b/chrome/browser/resources/nearby_share/nearby_confirmation_page.js index e0f34ce..538ae630 100644 --- a/chrome/browser/resources/nearby_share/nearby_confirmation_page.js +++ b/chrome/browser/resources/nearby_share/nearby_confirmation_page.js
@@ -23,7 +23,7 @@ import './shared/nearby_progress.js'; import './strings.m.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getDiscoveryManager} from './discovery_manager.js';
diff --git a/chrome/browser/resources/nearby_share/nearby_discovery_page.js b/chrome/browser/resources/nearby_share/nearby_discovery_page.js index d3d6a96..e302fa63 100644 --- a/chrome/browser/resources/nearby_share/nearby_discovery_page.js +++ b/chrome/browser/resources/nearby_share/nearby_discovery_page.js
@@ -23,7 +23,7 @@ import './strings.m.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getDiscoveryManager, observeDiscoveryManager} from './discovery_manager.js';
diff --git a/chrome/browser/resources/nearby_share/shared/BUILD.gn b/chrome/browser/resources/nearby_share/shared/BUILD.gn index 83bd133..4610169d 100644 --- a/chrome/browser/resources/nearby_share/shared/BUILD.gn +++ b/chrome/browser/resources/nearby_share/shared/BUILD.gn
@@ -123,8 +123,8 @@ deps = [ ":nearby_contact_manager", ":nearby_share_settings_behavior", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:cr.m", "//ui/webui/resources/js:load_time_data.m", @@ -153,8 +153,8 @@ ":nearby_metrics_logger", ":nearby_page_template", ":nearby_share_settings_behavior", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -163,8 +163,8 @@ ":nearby_metrics_logger", ":nearby_page_template", ":nearby_share_settings_behavior", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -174,11 +174,11 @@ js_library("nearby_preview") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//chrome/browser/ui/webui/nearby_share:mojom_js_library_for_compile", "//chrome/browser/ui/webui/nearby_share:share_type_js_library_for_compile", "//chromeos/ash/services/nearby/public/mojom:nearby_share_target_types_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", ] } @@ -210,8 +210,8 @@ ":nearby_contact_visibility", ":nearby_page_template", ":nearby_share_settings_behavior", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:load_time_data.m", ] }
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.js b/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.js index 46066140..db058d9 100644 --- a/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.js +++ b/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.js
@@ -20,7 +20,7 @@ import {assert, assertNotReached} from 'chrome://resources/js/assert.js'; import {sendWithPromise} from 'chrome://resources/js/cr.m.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_onboarding_one_page.js b/chrome/browser/resources/nearby_share/shared/nearby_onboarding_one_page.js index c6b2152..16963d89 100644 --- a/chrome/browser/resources/nearby_share/shared/nearby_onboarding_one_page.js +++ b/chrome/browser/resources/nearby_share/shared/nearby_onboarding_one_page.js
@@ -16,7 +16,7 @@ import 'chrome://resources/polymer/v3_0/iron-media-query/iron-media-query.js'; import './nearby_page_template.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {NearbyShareOnboardingFinalState, processOnePageOnboardingCancelledMetrics, processOnePageOnboardingCompleteMetrics, processOnePageOnboardingInitiatedMetrics, processOnePageOnboardingVisibilityButtonOnInitialPageClickedMetrics} from './nearby_metrics_logger.js';
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.js b/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.js index 33c3cae..dda4e45 100644 --- a/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.js +++ b/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.js
@@ -15,7 +15,7 @@ import 'chrome://resources/polymer/v3_0/iron-media-query/iron-media-query.js'; import './nearby_page_template.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {NearbyShareOnboardingFinalState, processOnboardingCancelledMetrics, processOnboardingInitiatedMetrics} from './nearby_metrics_logger.js';
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_preview.js b/chrome/browser/resources/nearby_share/shared/nearby_preview.js index 53d4da6b..17191f30 100644 --- a/chrome/browser/resources/nearby_share/shared/nearby_preview.js +++ b/chrome/browser/resources/nearby_share/shared/nearby_preview.js
@@ -14,7 +14,7 @@ import './nearby_shared_share_type_icons.html.js'; import {assertNotReached} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './nearby_preview.html.js';
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.js b/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.js index 49a7bbb..f1695ca 100644 --- a/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.js +++ b/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.js
@@ -15,7 +15,7 @@ import 'chrome://resources/cr_elements/cr_shared_style.css.js'; import 'chrome://resources/cr_elements/cr_icons.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/ntp4/new_tab.js b/chrome/browser/resources/ntp4/new_tab.js index c8dc19bf..d873b0f 100644 --- a/chrome/browser/resources/ntp4/new_tab.js +++ b/chrome/browser/resources/ntp4/new_tab.js
@@ -6,9 +6,7 @@ import {assert} from 'chrome://resources/js/assert.js'; import {addWebUIListener} from 'chrome://resources/js/cr.m.js'; -import {getUrlForCss} from 'chrome://resources/js/icon.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {parseHtmlSubset} from 'chrome://resources/js/parse_html_subset.js'; import {$, appendParam, getRequiredElement} from 'chrome://resources/js/util.js'; import {AppInfo} from './app_info.js';
diff --git a/chrome/browser/resources/pdf/pdf_viewer.ts b/chrome/browser/resources/pdf/pdf_viewer.ts index faa76a4..12173c9 100644 --- a/chrome/browser/resources/pdf/pdf_viewer.ts +++ b/chrome/browser/resources/pdf/pdf_viewer.ts
@@ -500,39 +500,53 @@ this.currentController.setDisplayAnnotations(e.detail); } - private onPresentClick_() { + private async enterPresentationMode_(): Promise<void> { const scroller = this.$.scroller; - Promise - .all([ - eventToPromise('fullscreenchange', scroller), - scroller.requestFullscreen(), - ]) - .then(() => { - this.forceFit(FittingType.FIT_TO_HEIGHT); + this.viewport.saveZoomState(); - // Switch viewport's wheel behavior. - this.viewport.setPresentationMode(true); + await Promise.all([ + eventToPromise('fullscreenchange', scroller), + scroller.requestFullscreen(), + ]); - // Set presentation mode, which restricts the content to read only - // (e.g. disable forms and links). - this.pluginController_!.setPresentationMode(true); + this.forceFit(FittingType.FIT_TO_HEIGHT); - // Revert back to the normal state when exiting Presentation mode. - eventToPromise('fullscreenchange', scroller).then(() => { - assert(document.fullscreenElement === null); - this.viewport.setPresentationMode(false); - this.pluginController_!.setPresentationMode(false); + // Switch viewport's wheel behavior. + this.viewport.setPresentationMode(true); - // Ensure that directional keys still work after exiting. - this.shadowRoot!.querySelector('embed')!.focus(); - }); + // Set presentation mode, which restricts the content to read only + // (e.g. disable forms and links). + this.pluginController_!.setPresentationMode(true); - // Nothing else to do here. The viewport will be updated as a result - // of a 'resize' event callback. - }); + // Nothing else to do here. The viewport will be updated as a result + // of a 'resize' event callback. } + private exitPresentationMode_(): void { + // Revert back to the normal state when exiting Presentation mode. + assert(document.fullscreenElement === null); + this.viewport.setPresentationMode(false); + this.pluginController_!.setPresentationMode(false); + + // Ensure that directional keys still work after exiting. + this.shadowRoot!.querySelector('embed')!.focus(); + + // Set zoom back to original zoom before presentation mode. + this.viewport.restoreZoomState(); + } + + private async onPresentClick_() { + await this.enterPresentationMode_(); + + // When fullscreen changes, it means that the user exited Presentation + // mode. + await eventToPromise('fullscreenchange', this.$.scroller); + + this.exitPresentationMode_(); + } + + private onPropertiesClick_() { assert(!this.showPropertiesDialog_); this.showPropertiesDialog_ = true;
diff --git a/chrome/browser/resources/pdf/viewport.ts b/chrome/browser/resources/pdf/viewport.ts index f334ef2..edbfc3e 100644 --- a/chrome/browser/resources/pdf/viewport.ts +++ b/chrome/browser/resources/pdf/viewport.ts
@@ -77,6 +77,13 @@ private internalZoom_: number = 1; /** + * Zoom state used to change zoom and fitting type to what it was + * originally when saved. + */ + private savedZoom_: number|null = null; + private savedFittingType_: FittingType|null = null; + + /** * Predefined zoom factors to be used when zooming in/out. These are in * ascending order. */ @@ -591,6 +598,30 @@ }); } + /** + * Save the current zoom and fitting type. + */ + saveZoomState() { + this.savedZoom_ = this.internalZoom_; + this.savedFittingType_ = this.fittingType_; + } + + /** + * Set zoom and fitting type to what it was when saved. See saveZoomState(). + */ + restoreZoomState() { + assert( + this.savedZoom_ !== null && this.savedFittingType_ !== null, + 'No saved zoom state exists'); + if (this.savedFittingType_ === FittingType.NONE) { + this.setZoom(this.savedZoom_); + } else { + this.setFittingType(this.savedFittingType_); + } + this.savedZoom_ = null; + this.savedFittingType_ = null; + } + /** @param e Event containing the old browser zoom. */ private updateZoomFromBrowserChange_(e: CustomEvent<number>) { const oldBrowserZoom = e.detail;
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn index 8a6ad10..30ae4a57 100644 --- a/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn
@@ -37,9 +37,9 @@ "..:os_route", "..:route_observer_behavior", "../..:router", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", - "//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior", + "//ash/webui/common/resources:cr_policy_indicator_behavior", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//ui/webui/resources/js:load_time_data.m", ] externs_list = [ @@ -52,7 +52,7 @@ deps = [ ":crostini_browser_proxy", "..:metrics_recorder", - "//ui/webui/resources/cr_elements:i18n_behavior", + "//ash/webui/common/resources:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js", @@ -81,9 +81,9 @@ js_library("crostini_disk_resize_dialog") { deps = [ ":crostini_browser_proxy", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js", @@ -95,8 +95,8 @@ js_library("crostini_disk_resize_confirmation_dialog") { deps = [ ":crostini_browser_proxy", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js", @@ -114,8 +114,8 @@ "../..:router", "../guest_os:guest_os_browser_proxy", "../guest_os:guest_os_container_select", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js" ] @@ -125,7 +125,7 @@ deps = [ ":crostini_browser_proxy", "../guest_os:guest_os_browser_proxy", - "//ui/webui/resources/cr_elements:i18n_behavior", + "//ash/webui/common/resources:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js", @@ -150,8 +150,8 @@ "../..:router", "../guest_os:guest_os_shared_paths", "../guest_os:guest_os_shared_usb_devices", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js", @@ -167,9 +167,9 @@ "..:prefs_behavior", "../guest_os:guest_os_browser_proxy", "../guest_os:guest_os_container_select", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:load_time_data.m", ] @@ -185,7 +185,7 @@ "..:metrics_recorder", "../guest_os:guest_os_browser_proxy", "../guest_os:guest_os_container_select", - "//ui/webui/resources/cr_elements:i18n_behavior", + "//ash/webui/common/resources:i18n_behavior", "//ui/webui/resources/js:cr.m", "//ui/webui/resources/js:load_time_data.m", ] @@ -203,9 +203,9 @@ "..:metrics_recorder", "..:prefs_behavior", "../guest_os:guest_os_browser_proxy", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:load_time_data.m", ] @@ -219,8 +219,8 @@ ":crostini_browser_proxy", "..:metrics_recorder", "../guest_os:guest_os_browser_proxy", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:cr.m", ] } @@ -240,8 +240,8 @@ "..:route_observer_behavior", "..:route_origin_behavior", "../..:router", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//ui/webui/resources/js:load_time_data.m", ] externs_list = [ @@ -267,8 +267,8 @@ "..:route_observer_behavior", "..:route_origin_behavior", "../..:router", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//ui/webui/resources/js:load_time_data.m", ] externs_list = [
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_arc_adb.js b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_arc_adb.js index b8379274..151fe1d9d 100644 --- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_arc_adb.js +++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_arc_adb.js
@@ -13,10 +13,10 @@ import 'chrome://resources/cr_components/localized_link/localized_link.js'; import '../../settings_shared.css.js'; -import {CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {CrPolicyIndicatorType} from 'chrome://resources/ash/common/cr_policy_indicator_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_export_import.js b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_export_import.js index 4b2e036..9d8283c 100644 --- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_export_import.js +++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_export_import.js
@@ -12,7 +12,7 @@ import './crostini_import_confirmation_dialog.js'; import '../../settings_shared.css.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_extra_containers.js b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_extra_containers.js index 4f32236..0f95e95d 100644 --- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_extra_containers.js +++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_extra_containers.js
@@ -17,7 +17,7 @@ import {assert} from 'chrome://resources/js/assert.js'; import {hexColorToSkColor} from 'chrome://resources/js/color_utils.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ContainerInfo, GuestId} from '../guest_os/guest_os_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.js b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.js index e5fa2160..89fcd3b 100644 --- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.js +++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.js
@@ -26,9 +26,9 @@ import './crostini_subpage.js'; import './bruschetta_subpage.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_port_forwarding.js b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_port_forwarding.js index 13191e4..3e70443 100644 --- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_port_forwarding.js +++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_port_forwarding.js
@@ -20,7 +20,7 @@ import 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ContainerInfo, GuestId} from '../guest_os/guest_os_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.js b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.js index 152dd5b..6a1f99c 100644 --- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.js +++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.js
@@ -19,7 +19,7 @@ import './crostini_extra_containers.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn index 973a769..34bb216 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn
@@ -33,8 +33,8 @@ "..:os_route", "..:route_observer_behavior", "../..:router", + "//ash/webui/common/resources:i18n_behavior", "//chromeos/ash/components/audio/public/mojom:mojom_webui_js", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = @@ -123,8 +123,8 @@ "..:os_route", "..:route_observer_behavior", "../..:router", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", ] } @@ -136,7 +136,7 @@ "..:route_origin_behavior", "../..:router", "//ash/webui/common/resources:focus_without_ink_js", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:load_time_data.m", ] @@ -145,15 +145,15 @@ js_library("storage_external") { deps = [ ":device_page_browser_proxy", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", ] } js_library("storage_external_entry") { deps = [ "..:prefs_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", ] }
diff --git a/chrome/browser/resources/settings/chromeos/device_page/audio.js b/chrome/browser/resources/settings/chromeos/device_page/audio.js index 7de7efd..312760ac 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/audio.js +++ b/chrome/browser/resources/settings/chromeos/device_page/audio.js
@@ -6,7 +6,7 @@ import '../../icons.html.js'; import '../../settings_shared.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {AudioSystemProperties, AudioSystemPropertiesObserverInterface, AudioSystemPropertiesObserverReceiver, CrosAudioConfigInterface, MuteState} from '../../mojom-webui/audio/cros_audio_config.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/display.js b/chrome/browser/resources/settings/chromeos/device_page/display.js index 49d3927..ad711a4 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/display.js +++ b/chrome/browser/resources/settings/chromeos/device_page/display.js
@@ -24,7 +24,7 @@ import 'chrome://resources/cr_elements/cr_slider/cr_slider.js'; import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {flush, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/keyboard.js b/chrome/browser/resources/settings/chromeos/device_page/keyboard.js index 220fc5db9..03b45b3 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/keyboard.js +++ b/chrome/browser/resources/settings/chromeos/device_page/keyboard.js
@@ -10,7 +10,7 @@ import '../../controls/settings_dropdown_menu.js'; import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/power.js b/chrome/browser/resources/settings/chromeos/device_page/power.js index 2d1d7b8e..6209bca4 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/power.js +++ b/chrome/browser/resources/settings/chromeos/device_page/power.js
@@ -15,9 +15,9 @@ import '../../settings_shared.css.js'; import {assertNotReached} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {SettingChangeValue} from '../../mojom-webui/search/user_action_recorder.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/storage.js b/chrome/browser/resources/settings/chromeos/device_page/storage.js index 17176e9..705cc7a 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/storage.js +++ b/chrome/browser/resources/settings/chromeos/device_page/storage.js
@@ -12,7 +12,7 @@ import '../../settings_shared.css.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Route, Router} from '../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/storage_external.js b/chrome/browser/resources/settings/chromeos/device_page/storage_external.js index 2377ece..83f39d5 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/storage_external.js +++ b/chrome/browser/resources/settings/chromeos/device_page/storage_external.js
@@ -13,8 +13,8 @@ import '../../prefs/prefs.js'; import '../../settings_shared.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {DevicePageBrowserProxy, DevicePageBrowserProxyImpl, ExternalStorage} from './device_page_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/storage_external_entry.js b/chrome/browser/resources/settings/chromeos/device_page/storage_external_entry.js index c8d0ab4..d282fec 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/storage_external_entry.js +++ b/chrome/browser/resources/settings/chromeos/device_page/storage_external_entry.js
@@ -11,7 +11,7 @@ import '../../prefs/prefs.js'; import '../../settings_shared.css.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {PrefsBehavior, PrefsBehaviorInterface} from '../prefs_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/stylus.ts b/chrome/browser/resources/settings/chromeos/device_page/stylus.ts index 910977a..8987d02 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/stylus.ts +++ b/chrome/browser/resources/settings/chromeos/device_page/stylus.ts
@@ -15,7 +15,7 @@ import '../../controls/settings_toggle_button.js'; import '../../settings_shared.css.js'; -import {CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.js'; +import {CrPolicyIndicatorType} from 'chrome://resources/ash/common/cr_policy_indicator_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {microTask, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/guest_os/BUILD.gn b/chrome/browser/resources/settings/chromeos/guest_os/BUILD.gn index dc95e10..adf4f89 100644 --- a/chrome/browser/resources/settings/chromeos/guest_os/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/guest_os/BUILD.gn
@@ -39,8 +39,8 @@ ":guest_os_container_select", ":guest_os_shared_usb_devices_add_dialog", "..:metrics_recorder", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_toggle/cr_toggle_externs.js" ] @@ -51,7 +51,7 @@ ":guest_os_browser_proxy", ":guest_os_container_select", "..:metrics_recorder", - "//ui/webui/resources/cr_elements:i18n_behavior", + "//ash/webui/common/resources:i18n_behavior", "//ui/webui/resources/js:cr.m", "//ui/webui/resources/js:load_time_data.m", ] @@ -65,8 +65,8 @@ deps = [ ":guest_os_browser_proxy", "..:metrics_recorder", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] }
diff --git a/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_paths.js b/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_paths.js index e696b9e..9dd3666 100644 --- a/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_paths.js +++ b/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_paths.js
@@ -12,7 +12,7 @@ import '../../settings_shared.css.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {recordSettingChange} from '../metrics_recorder.js';
diff --git a/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_usb_devices.js b/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_usb_devices.js index a447cc7..cba48e6 100644 --- a/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_usb_devices.js +++ b/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_usb_devices.js
@@ -11,8 +11,8 @@ import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.js'; import './guest_os_shared_usb_devices_add_dialog.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {recordSettingChange} from '../metrics_recorder.js';
diff --git a/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_usb_devices_add_dialog.js b/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_usb_devices_add_dialog.js index e125939..f9e86ee 100644 --- a/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_usb_devices_add_dialog.js +++ b/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_usb_devices_add_dialog.js
@@ -14,7 +14,7 @@ import './guest_os_container_select.js'; import {assert} from 'chrome://resources/js/assert_ts.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, microTask, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {recordSettingChange} from '../metrics_recorder.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn index 35e5fc3..64ea135 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
@@ -37,10 +37,10 @@ js_library("cellular_setup_dialog") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/cellular_setup:cellular_setup", "//ash/webui/common/resources/cellular_setup:cellular_setup_delegate", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_dialog/cr_dialog_externs.js" ] @@ -49,6 +49,7 @@ js_library("internet_config") { deps = [ ":internet_shared_css", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:network_config", "//ash/webui/common/resources/network:onc_mojo", "//chrome/browser/resources/settings:router", @@ -56,7 +57,6 @@ "//chrome/browser/resources/settings/chromeos:route_observer_behavior", "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:util", ] externs_list = [ @@ -67,6 +67,8 @@ js_library("internet_detail_menu") { deps = [ + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//ash/webui/common/resources/cellular_setup:esim_manager_listener_behavior", "//ash/webui/common/resources/network:mojo_interface_provider", "//ash/webui/common/resources/network:onc_mojo", @@ -75,8 +77,6 @@ "//chrome/browser/resources/settings/chromeos:route_observer_behavior", "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] externs_list = [ @@ -92,6 +92,8 @@ ":network_proxy_section", ":settings_traffic_counters", ":tether_connection_dialog", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//ash/webui/common/resources/network:cr_policy_network_behavior_mojo", "//ash/webui/common/resources/network:cr_policy_network_indicator_mojo", "//ash/webui/common/resources/network:mojo_interface_provider", @@ -117,8 +119,6 @@ "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon", "//third_party/polymer/v3_0/components-chromium/paper-spinner:paper-spinner-lite", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:assert", ] externs_list = [ @@ -132,6 +132,7 @@ js_library("internet_known_networks_page") { deps = [ ":internet_shared_css", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:cr_policy_network_behavior_mojo", "//ash/webui/common/resources/network:mojo_interface_provider", "//ash/webui/common/resources/network:network_listener_behavior", @@ -142,7 +143,6 @@ "//chrome/browser/resources/settings/chromeos:os_route", "//chrome/browser/resources/settings/chromeos:route_observer_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", ] @@ -162,6 +162,8 @@ ":internet_page_browser_proxy", ":internet_subpage", ":network_summary", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//ash/webui/common/resources/cellular_setup:cellular_types", "//ash/webui/common/resources/cellular_setup:esim_manager_utils", "//ash/webui/common/resources/network:cellular_utils", @@ -176,8 +178,6 @@ "//chrome/browser/resources/settings/chromeos:route_observer_behavior", "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_toast/cr_toast_externs.js", @@ -203,6 +203,7 @@ ":cellular_networks_list", ":internet_page_browser_proxy", ":network_always_on_vpn", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/cellular_setup:cellular_types", "//ash/webui/common/resources/network:cr_policy_network_behavior_mojo", "//ash/webui/common/resources/network:network_list", @@ -217,7 +218,6 @@ "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes", "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_toggle/cr_toggle_externs.js", @@ -228,9 +228,9 @@ js_library("network_always_on_vpn") { deps = [ ":internet_shared_css", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:onc_mojo", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", ] } @@ -238,6 +238,7 @@ js_library("network_proxy_section") { deps = [ ":internet_shared_css", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:cr_policy_network_behavior_mojo", "//ash/webui/common/resources/network:cr_policy_network_indicator_mojo", "//ash/webui/common/resources/network:network_proxy", @@ -247,7 +248,6 @@ "//chrome/browser/resources/settings/chromeos:route_observer_behavior", "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "../settings_controls_types.js", @@ -268,6 +268,8 @@ js_library("network_summary_item") { deps = [ + "//ash/webui/common/resources:cr_policy_indicator_behavior", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:cellular_utils", "//ash/webui/common/resources/network:cr_policy_network_behavior_mojo", "//ash/webui/common/resources/network:network_icon", @@ -276,8 +278,6 @@ "//ash/webui/common/resources/traffic_counters:traffic_counters", "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior", "//ui/webui/resources/js:assert", ] externs_list = @@ -286,6 +286,7 @@ js_library("tether_connection_dialog") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:network_icon", "//ash/webui/common/resources/network:onc_mojo", "//chrome/browser/resources/settings/chromeos:os_route", @@ -293,7 +294,6 @@ "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes", "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js", @@ -306,6 +306,8 @@ ":esim_install_error_dialog", "../multidevice_page:multidevice_browser_proxy", "../multidevice_page:multidevice_constants", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//ash/webui/common/resources/cellular_setup:cellular_types", "//ash/webui/common/resources/cellular_setup:esim_manager_listener_behavior", "//ash/webui/common/resources/cellular_setup:esim_manager_utils", @@ -313,8 +315,6 @@ "//ash/webui/common/resources/network:network_list_types", "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:assert", ] @@ -326,12 +326,12 @@ js_library("cellular_roaming_toggle_button") { deps = [ ":internet_shared_css", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:mojo_interface_provider", "//ash/webui/common/resources/network:onc_mojo", "//chrome/browser/resources/settings/chromeos:metrics_recorder", "//chrome/browser/resources/settings/chromeos:prefs_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:load_time_data.m", ] @@ -343,10 +343,10 @@ js_library("esim_install_error_dialog") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/cellular_setup:esim_manager_utils", "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/paper-spinner:paper-spinner-lite", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_dialog/cr_dialog_externs.js", @@ -356,9 +356,9 @@ js_library("esim_rename_dialog") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/cellular_setup:esim_manager_utils", "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_dialog/cr_dialog_externs.js", @@ -368,13 +368,13 @@ js_library("esim_remove_profile_dialog") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/cellular_setup:esim_manager_utils", "//ash/webui/common/resources/network:onc_mojo", "//chrome/browser/resources/settings:router", "//chrome/browser/resources/settings/chromeos:os_route", "//chrome/browser/resources/settings/chromeos:route_observer_behavior", "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_dialog/cr_dialog_externs.js", @@ -385,13 +385,13 @@ js_library("settings_traffic_counters") { deps = [ ":internet_shared_css", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:onc_mojo", "//ash/webui/common/resources/traffic_counters:traffic_counters", "//ash/webui/common/resources/traffic_counters:traffic_counters_adapter", "//chromeos/services/network_config/public/mojom:mojom_webui_js", "//chromeos/services/network_config/public/mojom:network_types_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js" ]
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/cellular_networks_list.js b/chrome/browser/resources/settings/chromeos/internet_page/cellular_networks_list.js index cfc460a..8e97943a3 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/cellular_networks_list.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/cellular_networks_list.js
@@ -25,8 +25,8 @@ import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js'; import {NetworkList} from 'chrome://resources/ash/common/network/network_list_types.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert.js'; import {ESimProfileProperties, ESimProfileRemote, EuiccRemote, ProfileInstallResult, ProfileState} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js'; import {CrosNetworkConfigRemote, GlobalPolicy, InhibitReason} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/cellular_roaming_toggle_button.js b/chrome/browser/resources/settings/chromeos/internet_page/cellular_roaming_toggle_button.js index ae89227b..f4d4ae7 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/cellular_roaming_toggle_button.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/cellular_roaming_toggle_button.js
@@ -18,7 +18,7 @@ import {CrPolicyNetworkBehaviorMojo} from 'chrome://resources/ash/common/network/cr_policy_network_behavior_mojo.js'; import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {CrosNetworkConfigRemote, ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/cellular_setup_dialog.js b/chrome/browser/resources/settings/chromeos/internet_page/cellular_setup_dialog.js index 8811762..eaf6c28 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/cellular_setup_dialog.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/cellular_setup_dialog.js
@@ -13,7 +13,7 @@ import {CellularSetupDelegate} from 'chrome://resources/ash/common/cellular_setup/cellular_setup_delegate.js'; import {CellularSetupPageName} from 'chrome://resources/ash/common/cellular_setup/cellular_types.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {CellularSetupSettingsDelegate} from './cellular_setup_settings_delegate.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/esim_install_error_dialog.js b/chrome/browser/resources/settings/chromeos/internet_page/esim_install_error_dialog.js index 35a23d49..a365357 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/esim_install_error_dialog.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/esim_install_error_dialog.js
@@ -11,7 +11,7 @@ import 'chrome://resources/cr_elements/cr_input/cr_input.js'; import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {ESimOperationResult, ESimProfileRemote, ProfileInstallResult} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/esim_remove_profile_dialog.js b/chrome/browser/resources/settings/chromeos/internet_page/esim_remove_profile_dialog.js index 9375481..2ad55c7 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/esim_remove_profile_dialog.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/esim_remove_profile_dialog.js
@@ -12,7 +12,7 @@ import {getESimProfile} from 'chrome://resources/ash/common/cellular_setup/esim_manager_utils.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {ESimOperationResult, ESimProfileRemote} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js'; import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js b/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js index a1dec3a5..f3dc16f5 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js
@@ -13,7 +13,7 @@ import {getESimProfile} from 'chrome://resources/ash/common/cellular_setup/esim_manager_utils.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {ESimOperationResult, ESimProfileRemote} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js'; import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_config.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_config.js index f69755f..40f71bd 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/internet_config.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_config.js
@@ -13,7 +13,7 @@ import './internet_shared_css.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {HTMLEscape} from 'chrome://resources/js/util.js'; import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js index 0539adc..134bf35 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js
@@ -40,8 +40,8 @@ import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js'; import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/ash/common/network/network_listener_behavior.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {ActivationStateType, ApnProperties, ConfigProperties, CrosNetworkConfigRemote, FilterType, GlobalPolicy, HiddenSsidMode, IPConfigProperties, ManagedProperties, NetworkStateProperties, NO_LIMIT, ProxySettings, SecurityType, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.js index 6897736..8e735ef 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.js
@@ -18,7 +18,7 @@ import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js'; import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/ash/common/network/network_listener_behavior.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {ConfigProperties, CrosNetworkConfigRemote, FilterType, NO_LIMIT} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js index b170e81..919fd80 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js
@@ -36,8 +36,8 @@ import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js'; import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/ash/common/network/network_listener_behavior.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {CrosNetworkConfigRemote, GlobalPolicy, NetworkStateProperties, StartConnectResult, VpnProvider} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.js index 3ea85379..3c7a8df 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.js
@@ -27,7 +27,7 @@ import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js'; import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/ash/common/network/network_listener_behavior.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {AlwaysOnVpnMode, AlwaysOnVpnProperties, CrosNetworkConfigRemote, FilterType, GlobalPolicy, NO_LIMIT, VpnProvider, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/network_always_on_vpn.js b/chrome/browser/resources/settings/chromeos/internet_page/network_always_on_vpn.js index 17ca825..282d8c973 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/network_always_on_vpn.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/network_always_on_vpn.js
@@ -11,7 +11,7 @@ import 'chrome://resources/ash/common/network/network_shared.css.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {AlwaysOnVpnMode} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js b/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js index 3dbc85e7..e8d97ce 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js
@@ -22,7 +22,7 @@ import {CrPolicyNetworkBehaviorMojo, CrPolicyNetworkBehaviorMojoInterface} from 'chrome://resources/ash/common/network/cr_policy_network_behavior_mojo.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {ManagedProperties, ManagedString} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {OncSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/network_summary_item.js b/chrome/browser/resources/settings/chromeos/internet_page/network_summary_item.js index 7021bb4..aefb75b 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/network_summary_item.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/network_summary_item.js
@@ -19,8 +19,8 @@ import {getSimSlotCount} from 'chrome://resources/ash/common/network/cellular_utils.js'; import {CrPolicyNetworkBehaviorMojo, CrPolicyNetworkBehaviorMojoInterface} from 'chrome://resources/ash/common/network/cr_policy_network_behavior_mojo.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {CrPolicyIndicatorType} from 'chrome://resources/ash/common/cr_policy_indicator_behavior.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {GlobalPolicy, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/settings_traffic_counters.js b/chrome/browser/resources/settings/chromeos/internet_page/settings_traffic_counters.js index 72bec6bb..a7e0e203 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/settings_traffic_counters.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/settings_traffic_counters.js
@@ -14,7 +14,7 @@ import 'chrome://resources/ash/common/traffic_counters/traffic_counters.js'; import {Network, TrafficCountersAdapter} from 'chrome://resources/ash/common/traffic_counters/traffic_counters_adapter.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; /**
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/tether_connection_dialog.js b/chrome/browser/resources/settings/chromeos/internet_page/tether_connection_dialog.js index cf9434e..ae1566f 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/tether_connection_dialog.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/tether_connection_dialog.js
@@ -12,7 +12,7 @@ import '../../settings_shared.css.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {HTMLEscape} from 'chrome://resources/js/util.js'; import {ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/kerberos_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/kerberos_page/BUILD.gn index 554d42b..bd13cbd 100644 --- a/chrome/browser/resources/settings/chromeos/kerberos_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/kerberos_page/BUILD.gn
@@ -26,9 +26,9 @@ "..:route_observer_behavior", "../..:router", "../os_people_page:account_manager_browser_proxy", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:cr.m", "//ui/webui/resources/js:icon", ] @@ -49,9 +49,9 @@ deps = [ ":kerberos_accounts_browser_proxy", "..:metrics_recorder", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:cr.m", ] @@ -66,9 +66,9 @@ "..:os_route", "..:route_observer_behavior", "../..:router", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:assert", ] }
diff --git a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_accounts.js b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_accounts.js index 3b8213e..767cf48 100644 --- a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_accounts.js +++ b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_accounts.js
@@ -18,9 +18,9 @@ import '../../settings_shared.css.js'; import './kerberos_add_account_dialog.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {getImage} from 'chrome://resources/js/icon.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_add_account_dialog.js b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_add_account_dialog.js index 6127453d..90b40bc 100644 --- a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_add_account_dialog.js +++ b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_add_account_dialog.js
@@ -20,7 +20,7 @@ import '../../settings_shared.css.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {flush, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_page.js b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_page.js index 528115d..8596117 100644 --- a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_page.js +++ b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_page.js
@@ -16,8 +16,8 @@ import '../../settings_shared.css.js'; import './kerberos_accounts.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Router} from '../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn index bbea957f..c86a2e5 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
@@ -46,8 +46,8 @@ js_library("multidevice_feature_behavior") { deps = [ ":multidevice_constants", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -86,9 +86,9 @@ "..:prefs_behavior", "..:route_observer_behavior", "../..:router", + "//ash/webui/common/resources:web_ui_listener_behavior", "//chrome/browser/resources/nearby_share/shared:nearby_share_settings_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:assert", ] } @@ -96,8 +96,8 @@ js_library("multidevice_notification_access_setup_dialog") { deps = [ ":multidevice_constants", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//ui/webui/resources/js:load_time_data.m", ] } @@ -105,8 +105,8 @@ js_library("multidevice_permissions_setup_dialog") { deps = [ ":multidevice_constants", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", ] } @@ -130,8 +130,8 @@ "..:prefs_behavior", "..:route_observer_behavior", "../..:router", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] externs_list = [ "$externs_path/quick_unlock_private.js", @@ -161,8 +161,8 @@ ":multidevice_constants", ":multidevice_feature_behavior", ":multidevice_feature_item", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] externs_list = [ "../settings_controls_types.js" ] } @@ -185,8 +185,8 @@ ":multidevice_feature_behavior", ":multidevice_feature_item", ":multidevice_task_continuation_disabled_link", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] externs_list = [ "../settings_controls_types.js" ] } @@ -200,9 +200,9 @@ "..:route_origin_behavior", "../..:router", "../os_people_page:os_sync_browser_proxy", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:load_time_data.m", ] externs_list = [ "../settings_controls_types.js" ] @@ -212,8 +212,8 @@ deps = [ "..:os_route", "../..:router", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:load_time_data.m", ] } @@ -224,8 +224,8 @@ "..:os_route", "..:route_origin_behavior", "../..:router", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:load_time_data.m", ] } @@ -235,9 +235,9 @@ "../os_people_page:lock_screen_password_prompt_dialog", "../os_people_page:lock_state_behavior", "//ash/webui/common/resources:focus_without_ink_js", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/quick_unlock:lock_screen_constants", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:load_time_data.m", ] @@ -251,8 +251,8 @@ ":multidevice_feature_behavior", ":multidevice_feature_item", "..:metrics_recorder", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] }
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_combined_setup_item.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_combined_setup_item.js index 1ae7162a..c0b6c04 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_combined_setup_item.js +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_combined_setup_item.js
@@ -11,7 +11,7 @@ import 'chrome://resources/cr_elements/cr_button/cr_button.js'; import './multidevice_feature_item.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {MultiDeviceBrowserProxy, MultiDeviceBrowserProxyImpl} from './multidevice_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_behavior.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_behavior.js index 701fb37..4a1e5d0 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_behavior.js +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_behavior.js
@@ -8,7 +8,7 @@ * cleanly and concisely. It includes some constants and utility methods. */ -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {MultiDeviceFeature, MultiDeviceFeatureState, MultiDevicePageContentData, MultiDeviceSettingsMode, PhoneHubFeatureAccessStatus} from './multidevice_constants.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_notification_access_setup_dialog.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_notification_access_setup_dialog.js index b75bb1f2..8b228c28 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_notification_access_setup_dialog.js +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_notification_access_setup_dialog.js
@@ -17,8 +17,8 @@ import '../os_icons.js'; import '../../settings_shared.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {MultiDeviceBrowserProxy, MultiDeviceBrowserProxyImpl} from './multidevice_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.js index 051c9019..b90a89f 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.js +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.js
@@ -19,8 +19,8 @@ import './multidevice_subpage.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {beforeNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_permissions_setup_dialog.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_permissions_setup_dialog.js index ecc5cd1..1ed9732 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_permissions_setup_dialog.js +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_permissions_setup_dialog.js
@@ -20,9 +20,9 @@ import '../../settings_shared.css.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {LockStateBehavior, LockStateBehaviorInterface} from '../os_people_page/lock_state_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_screen_lock_subpage.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_screen_lock_subpage.html index d33b0251..928eb9b6 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_screen_lock_subpage.html +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_screen_lock_subpage.html
@@ -82,10 +82,10 @@ selected="{{selectedUnlockType}}" deep-link-focus-id$="[[Setting.kChangeAuthPinV2]]"> <cr-radio-button id="passwordRadioButton" name="password" - label=$i18n{lockScreenPasswordOnly}> + label="$i18n{lockScreenPasswordOnly}"> </cr-radio-button> <cr-radio-button id="pinRadioButton" name="pin+password" - label=$i18n{lockScreenPinOrPassword}> + label="$i18n{lockScreenPinOrPassword}"> </cr-radio-button> </cr-radio-group> </template>
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_screen_lock_subpage.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_screen_lock_subpage.js index 8368d6b..95a742f9 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_screen_lock_subpage.js +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_screen_lock_subpage.js
@@ -13,7 +13,7 @@ import '../os_people_page/setup_pin_dialog.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_item.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_item.js index 750e991a..8de043f4 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_item.js +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_item.js
@@ -12,7 +12,7 @@ import './multidevice_feature_item.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.js index 727ff958..0f82566 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.js +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.js
@@ -8,7 +8,7 @@ import './multidevice_radio_button.js'; import '../../settings_shared.css.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_subpage.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_subpage.js index 15adc69..72e30d65 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_subpage.js +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_subpage.js
@@ -20,7 +20,7 @@ import './multidevice_tether_item.js'; import './multidevice_wifi_sync_item.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_disabled_link.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_disabled_link.js index f1b3dc23..3b313387 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_disabled_link.js +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_disabled_link.js
@@ -15,7 +15,7 @@ import '../../settings_shared.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_item.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_item.js index d7840b0..64b6d11c 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_item.js +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_item.js
@@ -22,7 +22,7 @@ import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.js'; import '../../settings_shared.css.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {SyncBrowserProxyImpl} from '../../people_page/sync_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js index ad382159..50ecd82 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js
@@ -14,7 +14,7 @@ import '../../settings_shared.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js index 54f22a54..2acc0d1b 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js
@@ -21,7 +21,7 @@ import '../../settings_shared.css.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {SyncBrowserProxyImpl} from '../../people_page/sync_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/nearby_share_page/BUILD.gn index 9c696e1..67265a9 100644 --- a/chrome/browser/resources/settings/chromeos/nearby_share_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/BUILD.gn
@@ -27,11 +27,11 @@ js_library("nearby_share_confirm_page") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//chrome/browser/resources/nearby_share/shared:nearby_device", "//chrome/browser/resources/nearby_share/shared:nearby_page_template", "//chrome/browser/resources/nearby_share/shared:nearby_preview", "//chrome/browser/resources/nearby_share/shared:nearby_progress", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -49,9 +49,9 @@ js_library("nearby_share_data_usage_dialog") { deps = [ ":types", + "//ash/webui/common/resources:i18n_behavior", "//chrome/browser/resources/nearby_share/shared:nearby_share_settings", "//chrome/browser/resources/nearby_share/shared:nearby_share_settings_behavior", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js", @@ -62,8 +62,8 @@ js_library("nearby_share_device_name_dialog") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//chrome/browser/resources/nearby_share/shared:nearby_share_settings_behavior", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js", @@ -74,8 +74,8 @@ js_library("nearby_share_high_visibility_page") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//chrome/browser/resources/nearby_share/shared:nearby_page_template", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_lottie/cr_lottie_externs.js" ] @@ -86,11 +86,11 @@ ":nearby_share_confirm_page", ":nearby_share_high_visibility_page", ":nearby_share_receive_manager", + "//ash/webui/common/resources:i18n_behavior", "//chrome/browser/resources/nearby_share/shared:nearby_onboarding_one_page", "//chrome/browser/resources/nearby_share/shared:nearby_onboarding_page", "//chrome/browser/resources/nearby_share/shared:nearby_share_settings_behavior", "//chrome/browser/resources/nearby_share/shared:nearby_visibility_page", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:load_time_data.m", ] @@ -105,9 +105,9 @@ deps = [ ":nearby_share_confirm_page", ":nearby_share_high_visibility_page", + "//ash/webui/common/resources:i18n_behavior", "//chrome/browser/resources/nearby_share/shared:nearby_share_settings_behavior", "//chrome/browser/ui/webui/nearby_share:mojom_js_library_for_compile", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js", @@ -129,11 +129,11 @@ "..:prefs_behavior", "..:route_observer_behavior", "../..:router", + "//ash/webui/common/resources:i18n_behavior", "//chrome/browser/resources/nearby_share/shared:nearby_onboarding_one_page", "//chrome/browser/resources/nearby_share/shared:nearby_onboarding_page", "//chrome/browser/resources/nearby_share/shared:nearby_share_settings_behavior", "//chrome/browser/resources/nearby_share/shared:nearby_visibility_page", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:cr.m", "//ui/webui/resources/js:load_time_data.m", ]
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.js index fafa9dc..54a0f715e 100644 --- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.js +++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.js
@@ -14,7 +14,7 @@ import '../../shared/nearby_preview.js'; import '../../shared/nearby_progress.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; /**
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.js index dfe816b..f9ddd82 100644 --- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.js +++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.js
@@ -13,7 +13,7 @@ import 'chrome://resources/cr_elements/cr_radio_button/cr_radio_button.js'; import 'chrome://resources/cr_elements/cr_radio_group/cr_radio_group.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getNearbyShareSettings} from '../../shared/nearby_share_settings.js';
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.js index b7cd9ed..785d3e42 100644 --- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.js +++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.js
@@ -12,7 +12,7 @@ import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import 'chrome://resources/cr_elements/cr_input/cr_input.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getNearbyShareSettings} from '../../shared/nearby_share_settings.js';
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.js index ba4edf5..fe64ff6 100644 --- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.js +++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.js
@@ -14,7 +14,7 @@ import '../../shared/nearby_page_template.js'; import '../../shared/nearby_shared_icons.html.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; /**
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js index cac07bb..72e1191 100644 --- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js +++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js
@@ -19,7 +19,7 @@ import './nearby_share_data_usage_dialog.js'; import './nearby_share_receive_dialog.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {flush, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn index 8ce4e94d..90c8c80 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
@@ -43,11 +43,11 @@ js_library("change_dictation_locale_dialog") { deps = [ + "//ash/webui/common/resources:cr_scrollable_behavior", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//chrome/browser/resources/settings/chromeos:prefs_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:cr_scrollable_behavior", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:load_time_data.m", ] externs_list = [ @@ -60,14 +60,14 @@ js_library("manage_a11y_page") { deps = [ ":manage_a11y_page_browser_proxy", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//chrome/browser/resources/settings:router", "//chrome/browser/resources/settings/chromeos:deep_linking_behavior", "//chrome/browser/resources/settings/chromeos:os_route", "//chrome/browser/resources/settings/chromeos:route_observer_behavior", "//chrome/browser/resources/settings/chromeos:route_origin_behavior", "//chrome/browser/resources/settings/chromeos/device_page:device_page_browser_proxy", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:load_time_data.m", ] } @@ -80,14 +80,14 @@ js_library("text_to_speech_page") { deps = [ ":text_to_speech_page_browser_proxy", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//chrome/browser/resources/settings:router", "//chrome/browser/resources/settings/chromeos:deep_linking_behavior", "//chrome/browser/resources/settings/chromeos:os_route", "//chrome/browser/resources/settings/chromeos:route_observer_behavior", "//chrome/browser/resources/settings/chromeos:route_origin_behavior", "//chrome/browser/resources/settings/chromeos/device_page:device_page_browser_proxy", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] } @@ -98,28 +98,28 @@ js_library("display_and_magnification_page") { deps = [ + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//chrome/browser/resources/settings:router", "//chrome/browser/resources/settings/chromeos:deep_linking_behavior", "//chrome/browser/resources/settings/chromeos:os_route", "//chrome/browser/resources/settings/chromeos:route_observer_behavior", "//chrome/browser/resources/settings/chromeos:route_origin_behavior", "//chrome/browser/resources/settings/chromeos/device_page:device_page_browser_proxy", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] } js_library("keyboard_and_text_input_page") { deps = [ ":keyboard_and_text_input_page_browser_proxy", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//chrome/browser/resources/settings:router", "//chrome/browser/resources/settings/chromeos:deep_linking_behavior", "//chrome/browser/resources/settings/chromeos:os_route", "//chrome/browser/resources/settings/chromeos:route_observer_behavior", "//chrome/browser/resources/settings/chromeos:route_origin_behavior", "//chrome/browser/resources/settings/chromeos/device_page:device_page_browser_proxy", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] } @@ -131,14 +131,14 @@ js_library("cursor_and_touchpad_page") { deps = [ ":cursor_and_touchpad_page_browser_proxy", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//chrome/browser/resources/settings:router", "//chrome/browser/resources/settings/chromeos:deep_linking_behavior", "//chrome/browser/resources/settings/chromeos:os_route", "//chrome/browser/resources/settings/chromeos:route_observer_behavior", "//chrome/browser/resources/settings/chromeos:route_origin_behavior", "//chrome/browser/resources/settings/chromeos/device_page:device_page_browser_proxy", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] } @@ -150,14 +150,14 @@ js_library("audio_and_captions_page") { deps = [ ":audio_and_captions_page_browser_proxy", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//chrome/browser/resources/settings:router", "//chrome/browser/resources/settings/chromeos:deep_linking_behavior", "//chrome/browser/resources/settings/chromeos:os_route", "//chrome/browser/resources/settings/chromeos:route_observer_behavior", "//chrome/browser/resources/settings/chromeos:route_origin_behavior", "//chrome/browser/resources/settings/chromeos/device_page:device_page_browser_proxy", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] } @@ -169,12 +169,12 @@ js_library("os_a11y_page") { deps = [ ":os_a11y_page_browser_proxy", + "//ash/webui/common/resources:web_ui_listener_behavior", "//chrome/browser/resources/settings:router", "//chrome/browser/resources/settings/chromeos:deep_linking_behavior", "//chrome/browser/resources/settings/chromeos:os_route", "//chrome/browser/resources/settings/chromeos:route_observer_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:load_time_data.m", ] externs_list = [ "../settings_controls_types.js" ] @@ -187,10 +187,10 @@ js_library("switch_access_action_assignment_dialog") { deps = [ ":switch_access_constants", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//chrome/browser/resources/settings/chromeos:prefs_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:load_time_data.m", ] externs_list = [ @@ -202,9 +202,9 @@ js_library("switch_access_action_assignment_pane") { deps = [ ":switch_access_constants", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:load_time_data.m", ] externs_list = [ @@ -222,10 +222,10 @@ js_library("switch_access_setup_guide_dialog") { deps = [ ":switch_access_constants", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//chrome/browser/resources/settings/chromeos:prefs_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:load_time_data.m", ] externs_list = [ @@ -237,8 +237,8 @@ js_library("switch_access_setup_guide_warning_dialog") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js", @@ -250,13 +250,13 @@ deps = [ ":switch_access_constants", ":switch_access_subpage_browser_proxy", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//chrome/browser/resources/settings:router", "//chrome/browser/resources/settings/chromeos:deep_linking_behavior", "//chrome/browser/resources/settings/chromeos:os_route", "//chrome/browser/resources/settings/chromeos:prefs_behavior", "//chrome/browser/resources/settings/chromeos:route_observer_behavior", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:load_time_data.m", ] externs_list = @@ -271,14 +271,14 @@ js_library("tts_subpage") { deps = [ ":tts_subpage_browser_proxy", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//chrome/browser/resources/settings:router", "//chrome/browser/resources/settings/chromeos:deep_linking_behavior", "//chrome/browser/resources/settings/chromeos:os_route", "//chrome/browser/resources/settings/chromeos:route_observer_behavior", "//chrome/browser/resources/settings/chromeos/os_languages_page:languages_browser_proxy", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/audio_and_captions_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/audio_and_captions_page.js index 97a341c..fc534e2 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/audio_and_captions_page.js +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/audio_and_captions_page.js
@@ -17,9 +17,9 @@ import '../../settings_shared.css.js'; import 'chrome://resources/cr_components/localized_link/localized_link.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/change_dictation_locale_dialog.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/change_dictation_locale_dialog.js index fec1eac..fb708cc 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/change_dictation_locale_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/change_dictation_locale_dialog.js
@@ -9,7 +9,7 @@ import 'chrome://resources/cr_elements/cr_button/cr_button.js'; import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; -import 'chrome://resources/cr_elements/cr_scrollable_behavior.js'; +import 'chrome://resources/ash/common/cr_scrollable_behavior.js'; import 'chrome://resources/cr_elements/cr_search_field/cr_search_field.js'; import 'chrome://resources/cr_elements/cr_shared_style.css.js'; import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js'; @@ -17,7 +17,7 @@ import 'chrome://resources/polymer/v3_0/paper-ripple/paper-ripple.js'; import '../../settings_shared.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; /**
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/cursor_and_touchpad_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/cursor_and_touchpad_page.js index 4d3ea2d..b758743 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/cursor_and_touchpad_page.js +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/cursor_and_touchpad_page.js
@@ -17,9 +17,9 @@ import '../../settings_shared.css.js'; import 'chrome://resources/cr_components/localized_link/localized_link.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.js index a395909..9a3f08d 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.js +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.js
@@ -17,9 +17,9 @@ import '../../settings_shared.css.js'; import 'chrome://resources/cr_components/localized_link/localized_link.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/keyboard_and_text_input_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/keyboard_and_text_input_page.js index 35ba4b40..32c2556 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/keyboard_and_text_input_page.js +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/keyboard_and_text_input_page.js
@@ -17,9 +17,9 @@ import '../../settings_shared.css.js'; import 'chrome://resources/cr_components/localized_link/localized_link.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js index cfa1d7b..012cb81 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
@@ -17,9 +17,9 @@ import '../../settings_shared.css.js'; import 'chrome://resources/cr_components/localized_link/localized_link.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.js index 027c956..055d0a3 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.js +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.js
@@ -23,7 +23,7 @@ import './tts_subpage.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_dialog.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_dialog.js index af8baed..35681ff8 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_dialog.js
@@ -13,7 +13,7 @@ import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import 'chrome://resources/cr_elements/cr_shared_style.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {SwitchAccessCommand} from './switch_access_constants.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_pane.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_pane.js index a818098..bc258f4 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_pane.js +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_pane.js
@@ -14,8 +14,8 @@ import 'chrome://resources/cr_elements/cr_shared_style.css.js'; import '../os_icons.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {actionToPref, AssignmentContext, SwitchAccessCommand, SwitchAccessDeviceType} from './switch_access_constants.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_setup_guide_dialog.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_setup_guide_dialog.js index be13384..43de5a4 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_setup_guide_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_setup_guide_dialog.js
@@ -13,7 +13,7 @@ import '../../controls/settings_slider.js'; import '../os_icons.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Router} from '../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js index 72a03b4..38983af6 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js
@@ -15,9 +15,9 @@ import './switch_access_setup_guide_dialog.js'; import './switch_access_setup_guide_warning_dialog.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/text_to_speech_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/text_to_speech_page.js index 570d1a03..2fee5753b 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/text_to_speech_page.js +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/text_to_speech_page.js
@@ -12,8 +12,8 @@ import '../../controls/settings_toggle_button.js'; import '../../settings_shared.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.js index 00d546fa..aa61cbd 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.js +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.js
@@ -15,8 +15,8 @@ import '../../controls/settings_slider.js'; import '../../settings_shared.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn index b015517..750def5 100644 --- a/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn
@@ -29,8 +29,8 @@ "..:route_observer_behavior", "../..:router", "//ash/webui/common/resources:focus_without_ink_js", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", ] } @@ -45,8 +45,8 @@ "../../:router", "./app_management_page:store_client", "./app_notifications_page:mojo_interface_provider", + "//ash/webui/common/resources:i18n_behavior", "//chrome/browser/ui/webui/settings/ash/os_apps_page/mojom:mojom_js_library_for_compile", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:cr.m", ] externs_list = [
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.js b/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.js index 9d55ceb..0c28d457 100644 --- a/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.js +++ b/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.js
@@ -13,7 +13,7 @@ import '../../settings_shared.css.js'; import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn index 48747b7..14729d63 100644 --- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn
@@ -77,7 +77,7 @@ ":actions", ":store_client", ":util", - "//ui/webui/resources/cr_elements:i18n_behavior", + "//ash/webui/common/resources:i18n_behavior", "//ui/webui/resources/js:load_time_data.m", ] externs_list = [ "./types.js" ] @@ -229,7 +229,7 @@ js_library("supported_links_overlapping_apps_dialog") { deps = [ ":store_client", - "//ui/webui/resources/cr_elements:i18n_behavior", + "//ash/webui/common/resources:i18n_behavior", "//ui/webui/resources/js:assert", ] externs_list = [
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/app_details_item.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/app_details_item.js index eb244bb..37c0d202 100644 --- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/app_details_item.js +++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/app_details_item.js
@@ -6,7 +6,7 @@ import 'chrome://resources/cr_elements/policy/cr_tooltip_icon.js'; import {AppType, InstallSource} from 'chrome://resources/cr_components/app_management/constants.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/BUILD.gn index c72cb0b..a004f0d 100644 --- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/BUILD.gn
@@ -26,8 +26,8 @@ "../:util", "../../..:os_route", "../../../..:router", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:load_time_data.m", ]
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_detail_view.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_detail_view.js index 7b8205b8..cacb3abe 100644 --- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_detail_view.js +++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_detail_view.js
@@ -12,7 +12,7 @@ import {getSelectedApp} from 'chrome://resources/cr_components/app_management/util.js'; import {assertNotReached} from 'chrome://resources/js/assert.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Router} from '../../../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_dialog.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_dialog.js index 33cb2437..f6caef7 100644 --- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_dialog.js
@@ -5,7 +5,7 @@ import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; /**
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_item.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_item.js index 009cc01e..cddc496 100644 --- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_item.js +++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_item.js
@@ -11,7 +11,7 @@ import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js'; import {AppManagementUserAction, AppType, WindowMode} from 'chrome://resources/cr_components/app_management/constants.js'; import {recordAppManagementUserAction} from 'chrome://resources/cr_components/app_management/util.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_overlapping_apps_dialog.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_overlapping_apps_dialog.js index 1d9b964..17a4a8f 100644 --- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_overlapping_apps_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_overlapping_apps_dialog.js
@@ -5,7 +5,7 @@ import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {AppManagementStoreClient, AppManagementStoreClientInterface} from './store_client.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.js b/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.js index 78ccf7c..628150a 100644 --- a/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.js +++ b/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.js
@@ -28,7 +28,7 @@ import {AppManagementEntryPoint, AppManagementEntryPointsHistogramName} from 'chrome://resources/cr_components/app_management/constants.js'; import {getAppIcon, getSelectedApp} from 'chrome://resources/cr_components/app_management/util.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/BUILD.gn index 7226ab7..4d515a9 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/BUILD.gn
@@ -33,10 +33,10 @@ ":os_bluetooth_devices_subpage", ":os_bluetooth_pairing_dialog", ":os_bluetooth_summary", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/bluetooth:cros_bluetooth_config", "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -49,12 +49,12 @@ "..:os_route", "..:route_observer_behavior", "../..:router", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//ash/webui/common/resources/bluetooth:bluetooth_metrics_utils", "//ash/webui/common/resources/bluetooth:cros_bluetooth_config", "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer_externs.js" ] } @@ -70,21 +70,21 @@ "..:route_observer_behavior", "..:route_origin_behavior", "../..:router", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/bluetooth:bluetooth_utils", "//ash/webui/common/resources/bluetooth:cros_bluetooth_config", "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("os_paired_bluetooth_list") { deps = [ ":os_paired_bluetooth_list_item", + "//ash/webui/common/resources:cr_scrollable_behavior", "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:cr_scrollable_behavior", ] } @@ -92,21 +92,21 @@ deps = [ "..:os_route", "../..:router", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/bluetooth:bluetooth_device_battery_info", "//ash/webui/common/resources/bluetooth:bluetooth_icon", "//ash/webui/common/resources/bluetooth:bluetooth_utils", "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("os_bluetooth_true_wireless_images") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/bluetooth:bluetooth_utils", "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -119,12 +119,12 @@ "..:route_observer_behavior", "..:route_origin_behavior", "../..:router", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/bluetooth:bluetooth_device_battery_info", "//ash/webui/common/resources/bluetooth:bluetooth_metrics_utils", "//ash/webui/common/resources/bluetooth:bluetooth_utils", "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -138,22 +138,22 @@ "..:route_observer_behavior", "..:route_origin_behavior", "../..:router", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/bluetooth:bluetooth_device_battery_info", "//ash/webui/common/resources/bluetooth:bluetooth_metrics_utils", "//ash/webui/common/resources/bluetooth:bluetooth_utils", "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } js_library("os_bluetooth_change_device_name_dialog") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/bluetooth:bluetooth_utils", "//ash/webui/common/resources/bluetooth:cros_bluetooth_config", "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -196,9 +196,9 @@ deps = [ ":os_saved_devices_list_item", ":settings_fast_pair_constants", + "//ash/webui/common/resources:cr_scrollable_behavior", "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:cr_scrollable_behavior", ] } @@ -206,9 +206,9 @@ deps = [ ":os_remove_saved_device_dialog", ":settings_fast_pair_constants", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/bluetooth:bluetooth_utils", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu_externs.js",
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_change_device_name_dialog.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_change_device_name_dialog.js index 30618eae..6b527fa 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_change_device_name_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_change_device_name_dialog.js
@@ -12,7 +12,7 @@ import {getDeviceName} from 'chrome://resources/ash/common/bluetooth/bluetooth_utils.js'; import {getBluetoothConfig} from 'chrome://resources/ash/common/bluetooth/cros_bluetooth_config.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {PairedBluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js index fae7d3c..1890fb30 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js
@@ -19,8 +19,8 @@ import {BatteryType} from 'chrome://resources/ash/common/bluetooth/bluetooth_types.js'; import {getBatteryPercentage, getDeviceName, hasAnyDetailedBatteryInfo, hasDefaultImage, hasTrueWirelessImages} from 'chrome://resources/ash/common/bluetooth/bluetooth_utils.js'; import {getBluetoothConfig} from 'chrome://resources/ash/common/bluetooth/cros_bluetooth_config.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {assertNotReached} from 'chrome://resources/js/assert.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {AudioOutputCapability, BluetoothSystemProperties, DeviceConnectionState, DeviceType, PairedBluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_devices_subpage.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_devices_subpage.js index 7db03172..9b924f89 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_devices_subpage.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_devices_subpage.js
@@ -14,9 +14,9 @@ import {BluetoothUiSurface, recordBluetoothUiSurfaceMetrics} from 'chrome://resources/ash/common/bluetooth/bluetooth_metrics_utils.js'; import {getBluetoothConfig} from 'chrome://resources/ash/common/bluetooth/cros_bluetooth_config.js'; import {getInstance as getAnnouncerInstance} from 'chrome://resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {BluetoothSystemProperties, BluetoothSystemState, DeviceConnectionState, PairedBluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_forget_device_dialog.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_forget_device_dialog.js index c9d74f8..db08ad7d 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_forget_device_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_forget_device_dialog.js
@@ -10,7 +10,7 @@ import 'chrome://resources/cr_elements/cr_input/cr_input.js'; import {getDeviceName} from 'chrome://resources/ash/common/bluetooth/bluetooth_utils.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {PairedBluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.js index 6287ec29..a3fbaff 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.js
@@ -18,7 +18,7 @@ import './os_bluetooth_pairing_dialog.js'; import {getBluetoothConfig} from 'chrome://resources/ash/common/bluetooth/cros_bluetooth_config.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {BluetoothSystemProperties, BluetoothSystemState, SystemPropertiesObserverInterface, SystemPropertiesObserverReceiver} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js index ae10bf2..82ca01a 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js
@@ -12,9 +12,9 @@ import {FastPairSavedDevicesUiEvent, recordSavedDevicesUiEventMetrics} from 'chrome://resources/ash/common/bluetooth/bluetooth_metrics_utils.js'; import {assertNotReached} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Route, Router} from '../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_summary.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_summary.js index 9f98491..bb6e829 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_summary.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_summary.js
@@ -15,7 +15,7 @@ import {getDeviceName} from 'chrome://resources/ash/common/bluetooth/bluetooth_utils.js'; import {getBluetoothConfig} from 'chrome://resources/ash/common/bluetooth/cros_bluetooth_config.js'; import {getInstance as getAnnouncerInstance} from 'chrome://resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {BluetoothSystemProperties, BluetoothSystemState, DeviceConnectionState, PairedBluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_true_wireless_images.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_true_wireless_images.js index cfcfa36..f331df95 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_true_wireless_images.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_true_wireless_images.js
@@ -14,7 +14,7 @@ import {BatteryType} from 'chrome://resources/ash/common/bluetooth/bluetooth_types.js'; import {getBatteryPercentage, hasAnyDetailedBatteryInfo, hasDefaultImage, hasTrueWirelessImages} from 'chrome://resources/ash/common/bluetooth/bluetooth_utils.js'; import {assertNotReached} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {BluetoothDeviceProperties, DeviceConnectionState} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list.js index 37c3b9e..2ee011b5 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list.js
@@ -11,7 +11,7 @@ import './os_paired_bluetooth_list_item.js'; import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js'; -import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/cr_elements/cr_scrollable_behavior.js'; +import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/ash/common/cr_scrollable_behavior.js'; import {PairedBluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js index 88f021a..d0b46b7 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js
@@ -18,7 +18,7 @@ import {BatteryType} from 'chrome://resources/ash/common/bluetooth/bluetooth_types.js'; import {getBatteryPercentage, getDeviceName, hasAnyDetailedBatteryInfo} from 'chrome://resources/ash/common/bluetooth/bluetooth_utils.js'; import {FocusRowBehavior, FocusRowBehaviorInterface} from 'chrome://resources/ash/common/focus_row_behavior.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert.js'; import {DeviceConnectionState, DeviceType, PairedBluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_remove_saved_device_dialog.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_remove_saved_device_dialog.js index b19774ee..87ec463 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_remove_saved_device_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_remove_saved_device_dialog.js
@@ -12,8 +12,8 @@ import {FastPairSavedDevicesUiEvent, recordSavedDevicesUiEventMetrics} from 'chrome://resources/ash/common/bluetooth/bluetooth_metrics_utils.js'; import {getDeviceName} from 'chrome://resources/ash/common/bluetooth/bluetooth_utils.js'; import {addWebUIListener, removeWebUIListener, WebUIListener} from 'chrome://resources/js/cr.m.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list.js index 9742fc3..1eaa774 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list.js
@@ -11,9 +11,9 @@ import './os_saved_devices_list_item.js'; import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js'; -import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/cr_elements/cr_scrollable_behavior.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/ash/common/cr_scrollable_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {OsBluetoothDevicesSubpageBrowserProxy, OsBluetoothDevicesSubpageBrowserProxyImpl} from './os_bluetooth_devices_subpage_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list_item.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list_item.js index dbc8167a..6ae1897 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list_item.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list_item.js
@@ -15,8 +15,8 @@ import {FastPairSavedDevicesUiEvent, recordSavedDevicesUiEventMetrics} from 'chrome://resources/ash/common/bluetooth/bluetooth_metrics_utils.js'; import {FocusRowBehavior, FocusRowBehaviorInterface} from 'chrome://resources/ash/common/focus_row_behavior.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {addWebUIListener, removeWebUIListener, WebUIListener} from 'chrome://resources/js/cr.m.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn index 893d77c1..0d3ed8eb 100644 --- a/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
@@ -44,8 +44,8 @@ ":languages_browser_proxy", ":languages_types", "..:prefs_behavior", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:cr.m", "//ui/webui/resources/js:load_time_data.m", @@ -93,9 +93,9 @@ deps = [ ":cr_checkbox_with_policy", "..:find_shortcut_behavior", + "//ash/webui/common/resources:cr_scrollable_behavior", "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:cr_scrollable_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js", @@ -117,8 +117,8 @@ js_library("change_device_language_dialog") { deps = [ ":languages", + "//ash/webui/common/resources:cr_scrollable_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:cr_scrollable_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_search_field/cr_search_field_externs.js", @@ -155,7 +155,7 @@ js_library("input_method_options_page") { deps = [ ":input_method_util", - "//ui/webui/resources/cr_elements:i18n_behavior", + "//ash/webui/common/resources:i18n_behavior", ] } @@ -172,7 +172,7 @@ "..:route_observer_behavior", "../..:router", "//ash/webui/common/resources:focus_without_ink_js", - "//ui/webui/resources/cr_elements:i18n_behavior", + "//ash/webui/common/resources:i18n_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:load_time_data.m", ] @@ -243,7 +243,7 @@ "..:os_route", "../..:router", "//ash/webui/common/resources:focus_without_ink_js", - "//ui/webui/resources/cr_elements:i18n_behavior", + "//ash/webui/common/resources:i18n_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:cr.m", "//ui/webui/resources/js:load_time_data.m",
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/add_items_dialog.js b/chrome/browser/resources/settings/chromeos/os_languages_page/add_items_dialog.js index 193eef61..22f0f7c 100644 --- a/chrome/browser/resources/settings/chromeos/os_languages_page/add_items_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/add_items_dialog.js
@@ -16,7 +16,7 @@ import './shared_style.css.js'; import '../../settings_shared.css.js'; -import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/cr_elements/cr_scrollable_behavior.js'; +import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/ash/common/cr_scrollable_behavior.js'; import {FindShortcutBehavior, FindShortcutBehaviorInterface} from '../find_shortcut_behavior.js'; import {afterNextRender, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/change_device_language_dialog.js b/chrome/browser/resources/settings/chromeos/os_languages_page/change_device_language_dialog.js index 0cff5ad..30da5f2 100644 --- a/chrome/browser/resources/settings/chromeos/os_languages_page/change_device_language_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/change_device_language_dialog.js
@@ -17,9 +17,9 @@ import './languages.js'; import '../../settings_shared.css.js'; -import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/cr_elements/cr_scrollable_behavior.js'; +import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/ash/common/cr_scrollable_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {LifetimeBrowserProxyImpl} from '../../lifetime_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.js b/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.js index 9ecfb77a..c1ce2a17 100644 --- a/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.js +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.js
@@ -13,7 +13,7 @@ import './os_japanese_clear_ime_data_dialog.js'; import './os_japanese_manage_user_dictionary_page.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert.js'; import {afterNextRender, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/input_page.js b/chrome/browser/resources/settings/chromeos/os_languages_page/input_page.js index 5a0732f9..c9a49fc6 100644 --- a/chrome/browser/resources/settings/chromeos/os_languages_page/input_page.js +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/input_page.js
@@ -21,7 +21,7 @@ import '../../settings_page/settings_animated_pages.js'; import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_edit_dictionary_page.js b/chrome/browser/resources/settings/chromeos/os_languages_page/os_edit_dictionary_page.js index 105ea6d8..9c2656ec 100644 --- a/chrome/browser/resources/settings/chromeos/os_languages_page/os_edit_dictionary_page.js +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_edit_dictionary_page.js
@@ -15,7 +15,7 @@ import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js'; import '../../settings_shared.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Route} from '../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_japanese_manage_user_dictionary_page.js b/chrome/browser/resources/settings/chromeos/os_languages_page/os_japanese_manage_user_dictionary_page.js index 8ce55ed..9a52c29 100644 --- a/chrome/browser/resources/settings/chromeos/os_languages_page/os_japanese_manage_user_dictionary_page.js +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_japanese_manage_user_dictionary_page.js
@@ -10,7 +10,7 @@ import '../../settings_shared.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Route} from '../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page_v2.js b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page_v2.js index 2b60d86..3c4c8d2 100644 --- a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page_v2.js +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page_v2.js
@@ -23,7 +23,7 @@ import '../../settings_shared.css.js'; import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.js b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.js index 5f10371..5dd1a865 100644 --- a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.js +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.js
@@ -21,7 +21,7 @@ import '../../settings_shared.css.js'; import '../../settings_vars.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.js b/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.js index 9866d2d..432f04ac8 100644 --- a/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.js +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.js
@@ -11,7 +11,7 @@ import '../../controls/settings_toggle_button.js'; import '../../settings_shared.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn index 8927136e..944d364 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn
@@ -40,9 +40,9 @@ "..:os_route", "..:route_observer_behavior", "../..:router", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:cr.m", "//ui/webui/resources/js:icon", ] @@ -68,11 +68,11 @@ "..:route_observer_behavior", "../..:router", "//ash/webui/common/resources:focus_without_ink_js", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/iron-resizable-behavior:iron-resizable-behavior", "//third_party/polymer/v3_0/components-chromium/paper-ripple:paper-ripple", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:cr.m", ] @@ -89,11 +89,11 @@ "../..:router", "../multidevice_page:multidevice_smartlock_item", "//ash/webui/common/resources:focus_without_ink_js", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//ash/webui/common/resources/quick_unlock:lock_screen_constants", "//chromeos/ash/services/auth_factor_config/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:load_time_data.m", ] @@ -111,10 +111,10 @@ js_library("lock_state_behavior") { deps = [ "../..:router", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//chromeos/ash/services/auth_factor_config/public/mojom:mojom_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:load_time_data.m", ] externs_list = [ "$externs_path/quick_unlock_private.js" ] @@ -133,11 +133,11 @@ "..:route_observer_behavior", "../..:router", "//ash/webui/common/resources:focus_without_ink_js", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//ash/webui/common/resources/cr_picture:png", "//ash/webui/common/resources/quick_unlock:lock_screen_constants", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:icon", "//ui/webui/resources/js:load_time_data.m", @@ -161,8 +161,8 @@ "..:metrics_recorder", "..:os_route", "../../:router", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:load_time_data.m", ] @@ -174,9 +174,9 @@ deps = [ ":fingerprint_browser_proxy", "..:metrics_recorder", + "//ash/webui/common/resources:i18n_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc_externs.js", @@ -188,9 +188,9 @@ deps = [ ":lock_screen_password_prompt_dialog", "../..:router", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/quick_unlock:setup_pin_keyboard", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] } @@ -199,9 +199,9 @@ "..:os_route", "..:route_observer_behavior", "../..:router", + "//ash/webui/common/resources:cr_scrollable_behavior", + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:cr_scrollable_behavior", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "$externs_path/settings_private.js", @@ -212,8 +212,8 @@ js_library("users_add_user_dialog") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", "//ui/webui/resources/js:assert", ] externs_list = [
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js index 69462e7e..53c5a53 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js +++ b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js
@@ -17,9 +17,9 @@ import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js'; import '../../settings_shared.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {getImage} from 'chrome://resources/js/icon.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.js b/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.js index 4181eb5..19b04b7 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.js +++ b/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.js
@@ -15,8 +15,8 @@ import '../../settings_shared.css.js'; import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.js b/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.js index 499300d..861121a8 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.js +++ b/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.js
@@ -29,8 +29,8 @@ import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js'; import {LockScreenProgress, recordLockScreenProgress} from 'chrome://resources/ash/common/quick_unlock/lock_screen_constants.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert.js'; import {AuthFactor, FactorObserverInterface, FactorObserverReceiver, ManagementType, RecoveryFactorEditor_ConfigureResult} from 'chrome://resources/mojo/chromeos/ash/services/auth_factor_config/public/mojom/auth_factor_config.mojom-webui.js'; import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/lock_state_behavior.js b/chrome/browser/resources/settings/chromeos/os_people_page/lock_state_behavior.js index aed6c33..0b89cfb3 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/lock_state_behavior.js +++ b/chrome/browser/resources/settings/chromeos/os_people_page/lock_state_behavior.js
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {AuthFactorConfig, AuthFactorConfigInterface, RecoveryFactorEditor, RecoveryFactorEditorInterface} from 'chrome://resources/mojo/chromeos/ash/services/auth_factor_config/public/mojom/auth_factor_config.mojom-webui.js'; /**
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.js b/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.js index 41c2d74..1d46ef6 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.js +++ b/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.js
@@ -29,8 +29,8 @@ import {convertImageSequenceToPng} from 'chrome://resources/ash/common/cr_picture/png.js'; import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {sendWithPromise} from 'chrome://resources/js/cr.m.js'; import {getImage} from 'chrome://resources/js/icon.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.js b/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.js index ef1e3e4..e51a38c 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.js +++ b/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.js
@@ -9,9 +9,9 @@ import '../../settings_shared.css.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/pin_autosubmit_dialog.js b/chrome/browser/resources/settings/chromeos/os_people_page/pin_autosubmit_dialog.js index 592e85fd..c583f30 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/pin_autosubmit_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_people_page/pin_autosubmit_dialog.js
@@ -17,7 +17,7 @@ import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; import '../../settings_shared.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; // Maximum length supported by auto submit
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/setup_fingerprint_dialog.js b/chrome/browser/resources/settings/chromeos/os_people_page/setup_fingerprint_dialog.js index 987cba8..47e2c490 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/setup_fingerprint_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_people_page/setup_fingerprint_dialog.js
@@ -9,8 +9,8 @@ import '../../settings_shared.css.js'; import {assertNotReached} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {recordSettingChange} from '../metrics_recorder.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/setup_pin_dialog.js b/chrome/browser/resources/settings/chromeos/os_people_page/setup_pin_dialog.js index 54f84e9..70f871e 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/setup_pin_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_people_page/setup_pin_dialog.js
@@ -16,7 +16,7 @@ import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import '../../settings_shared.css.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; /**
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/user_list.js b/chrome/browser/resources/settings/chromeos/os_people_page/user_list.js index 886cb84..803233a 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/user_list.js +++ b/chrome/browser/resources/settings/chromeos/os_people_page/user_list.js
@@ -21,8 +21,8 @@ import '../../settings_vars.css.js'; import {getInstance as getAnnouncerInstance} from 'chrome://resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.js'; -import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/cr_elements/cr_scrollable_behavior.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/ash/common/cr_scrollable_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Router} from '../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/users_add_user_dialog.js b/chrome/browser/resources/settings/chromeos/os_people_page/users_add_user_dialog.js index 114e27e..6668d1d 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/users_add_user_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_people_page/users_add_user_dialog.js
@@ -16,7 +16,7 @@ import {getInstance as getAnnouncerInstance} from 'chrome://resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.js'; import {assert} from 'chrome://resources/js/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; /**
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn index c399e3d..ccadb0d 100644 --- a/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn
@@ -73,7 +73,7 @@ js_library("cups_edit_printer_dialog") { deps = [ ":cups_printer_dialog_util", - "//ui/webui/resources/cr_elements:i18n_behavior", + "//ash/webui/common/resources:i18n_behavior", ] } @@ -108,9 +108,9 @@ "..:os_route", "..:route_observer_behavior", "../..:router", + "//ash/webui/common/resources:web_ui_listener_behavior", "//ash/webui/common/resources/network:network_listener_behavior", "//ash/webui/common/resources/network:onc_mojo", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:cr.m", "//ui/webui/resources/js:load_time_data.m", @@ -146,7 +146,7 @@ ":cups_printer_types", ":cups_printers_browser_proxy", "//ash/webui/common/resources:list_property_update_behavior", - "//ui/webui/resources/cr_elements:web_ui_listener_behavior", + "//ash/webui/common/resources:web_ui_listener_behavior", ] externs_list = [
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.js index 53135cc..86541b4 100644 --- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.js
@@ -20,7 +20,7 @@ import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js'; import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/ash/common/network/network_listener_behavior.js'; import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {CrosNetworkConfigRemote, FilterType, NetworkStateProperties, NO_LIMIT} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.html b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.html index acdab94e..c9ecdca4 100644 --- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.html +++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.html
@@ -61,7 +61,7 @@ <cr-icon-button class="action-button" id="show-more-icon" iron-icon="cr:expand-more" on-click="onShowMoreTap_" - title=$i18n{showMorePrinters}> + title="$i18n{showMorePrinters}"> </cr-icon-button> </div> </template>
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.js index 2165fd31..aa0a081d 100644 --- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.js +++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.js
@@ -15,7 +15,7 @@ import '../../settings_shared.css.js'; import {ListPropertyUpdateBehavior, ListPropertyUpdateBehaviorInterface} from 'chrome://resources/ash/common/list_property_update_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {matchesSearchTerm, sortPrinters} from './cups_printer_dialog_util.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_nearby_printers.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_nearby_printers.js index 69bf363..1540244a 100644 --- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_nearby_printers.js +++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_nearby_printers.js
@@ -11,7 +11,7 @@ import '../../settings_shared.css.js'; import {ListPropertyUpdateBehavior, ListPropertyUpdateBehaviorInterface} from 'chrome://resources/ash/common/list_property_update_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {recordSettingChange} from '../metrics_recorder.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js index bed7d1b..a538503 100644 --- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js +++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js
@@ -30,7 +30,7 @@ import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js'; import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js'; import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/ash/common/network/network_listener_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert.js'; import {addWebUIListener, removeWebUIListener, sendWithPromise, WebUIListener} from 'chrome://resources/js/cr.m.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.html b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.html index bc4d59c..0c5317a 100644 --- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.html +++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.html
@@ -61,7 +61,7 @@ <cr-icon-button class="action-button" id="show-more-icon" iron-icon="cr:expand-more" on-click="onShowMoreTap_" - title=$i18n{showMorePrinters}> + title="$i18n{showMorePrinters}"> </cr-icon-button> </div> </template>
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.js index 7c80805..2dd6d02 100644 --- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.js +++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.js
@@ -15,7 +15,7 @@ import '../../settings_shared.css.js'; import {ListPropertyUpdateBehavior, ListPropertyUpdateBehaviorInterface} from 'chrome://resources/ash/common/list_property_update_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {recordSettingChange} from '../metrics_recorder.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_privacy_page/privacy_hub_page.js b/chrome/browser/resources/settings/chromeos/os_privacy_page/privacy_hub_page.js index e0097ef..71f4b80a5 100644 --- a/chrome/browser/resources/settings/chromeos/os_privacy_page/privacy_hub_page.js +++ b/chrome/browser/resources/settings/chromeos/os_privacy_page/privacy_hub_page.js
@@ -13,8 +13,8 @@ import '../../controls/settings_toggle_button.js'; import './metrics_consent_toggle_button.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js'; -import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js'; import {assert} from 'chrome://resources/js/assert.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.ts b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.ts index 6eb071e..22543a4 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.ts +++ b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.ts
@@ -22,7 +22,7 @@ import '../../prefs/prefs.js'; import '../../settings_vars.css.js'; -import {CrContainerShadowBehavior} from 'chrome://resources/cr_elements/cr_container_shadow_behavior.js'; +import {CrContainerShadowBehavior} from 'chrome://resources/ash/common/cr_container_shadow_behavior.js'; import {CrDrawerElement} from 'chrome://resources/cr_elements/cr_drawer/cr_drawer.js'; import {FindShortcutMixin, FindShortcutMixinInterface} from 'chrome://resources/cr_elements/find_shortcut_mixin.js'; import {assert} from 'chrome://resources/js/assert_ts.js';
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.html b/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.html index 07b82501..1f3fb51 100644 --- a/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.html +++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.html
@@ -110,7 +110,8 @@ <div id="container" role="treeitem"> <button id="rowButton" class="row" title="[[bookmark.title]]" - data-bookmark="[[bookmark]]"> + data-bookmark="[[bookmark]]" + on-click="onRowClicked_"> <div id="bookmarkImage" class="bookmark-image"></div> <div class="text-container"> <div class="content">[[bookmark.title]]</div>
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.ts index cbc86a5..8effb1f 100644 --- a/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.ts +++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.ts
@@ -73,6 +73,22 @@ this.$.bookmarkImage.style.backgroundColor = 'red'; } } + + /** + * Dispatches a custom click event when the user clicks anywhere on the row. + */ + private onRowClicked_(event: MouseEvent) { + event.preventDefault(); + event.stopPropagation(); + this.dispatchEvent(new CustomEvent('row-clicked', { + bubbles: true, + composed: true, + detail: { + bookmark: this.bookmark, + event: event, + }, + })); + } }
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html index a49bb70..e8dd296 100644 --- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html +++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html
@@ -36,11 +36,13 @@ } </style> -<template is="dom-repeat" items="[[topLevelBookmarks_]]" +<template is="dom-repeat" + items="[[getShownBookmarks_(topLevelBookmarks_, activeFolder_)]]" id="powerBookmarksContainer"> <power-bookmark-row id="bookmark-[[item.id]]" bookmark="[[item]]" description="[[getBookmarkDescription_(item, descriptions_.*)]]" - compact="[[compact_]]"> + compact="[[compact_]]" + on-row-clicked="onRowClicked_"> <div slot="extra-content-container"> <template is="dom-if" if="[[isPriceTracked_(item, showPriceTracking_)]]" restamp>
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts index 774cf44..d6872fce 100644 --- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts +++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
@@ -10,6 +10,7 @@ import {listenOnce} from 'chrome://resources/js/util.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {ActionSource} from './bookmarks.mojom-webui.js'; import {BookmarksApiProxy, BookmarksApiProxyImpl} from './bookmarks_api_proxy.js'; import {BookmarkProductInfo} from './commerce/shopping_list.mojom-webui.js'; import {ShoppingListApiProxy, ShoppingListApiProxyImpl} from './commerce/shopping_list_api_proxy.js'; @@ -42,6 +43,15 @@ value: true, }, + activeFolder_: { + type: Object, + }, + + depth_: { + type: Number, + value: 0, + }, + showPriceTracking_: { type: Boolean, value: false, @@ -57,6 +67,8 @@ private productInfos_ = new Map<string, BookmarkProductInfo>(); private shoppingListenerIds_: number[] = []; private compact_: boolean; + private activeFolder_: chrome.bookmarks.BookmarkTreeNode|undefined; + private depth_: number; private descriptions_ = new Map<string, string>(); private showPriceTracking_: boolean; @@ -135,6 +147,42 @@ } /** + * Returns a list of bookmarks and folders to display to the user. + */ + private getShownBookmarks_(): chrome.bookmarks.BookmarkTreeNode[] { + if (this.activeFolder_) { + return this.activeFolder_.children!; + } + return this.topLevelBookmarks_; + } + + /** + * Invoked when the user clicks a power bookmarks row. This will either + * display children in the case of a folder row, or open the URL in the case + * of a bookmark row. + */ + private onRowClicked_( + event: CustomEvent< + {bookmark: chrome.bookmarks.BookmarkTreeNode, event: MouseEvent}>) { + event.preventDefault(); + event.stopPropagation(); + if (event.detail.bookmark.children) { + this.activeFolder_ = event.detail.bookmark; + this.depth_++; + } else { + this.bookmarksApi_.openBookmark( + event.detail.bookmark.id, this.depth_, { + middleButton: false, + altKey: event.detail.event.altKey, + ctrlKey: event.detail.event.ctrlKey, + metaKey: event.detail.event.metaKey, + shiftKey: event.detail.event.shiftKey, + }, + ActionSource.kBookmark); + } + } + + /** * Whether the given price-tracked bookmark should display as if discounted. */ private showDiscountedPrice_(bookmark: chrome.bookmarks.BookmarkTreeNode):
diff --git a/chrome/browser/resources/webui_gallery/app.html b/chrome/browser/resources/webui_gallery/app.html index 9800ac1..846de72 100644 --- a/chrome/browser/resources/webui_gallery/app.html +++ b/chrome/browser/resources/webui_gallery/app.html
@@ -7,6 +7,7 @@ #sidebar { border-inline-end: 1px solid black; box-sizing: border-box; + overflow: auto; width: 256px; }
diff --git a/chrome/browser/speech/speech_recognition_service_browsertest.cc b/chrome/browser/speech/speech_recognition_service_browsertest.cc index bba88cb3..fd4fef2 100644 --- a/chrome/browser/speech/speech_recognition_service_browsertest.cc +++ b/chrome/browser/speech/speech_recognition_service_browsertest.cc
@@ -5,11 +5,13 @@ #include <algorithm> #include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" #include "base/notreached.h" #include "base/path_service.h" #include "base/sync_socket.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" +#include "base/threading/thread_restrictions.h" #include "base/timer/timer.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" @@ -269,7 +271,8 @@ speech_recognition_client_receiver_.BindNewPipeAndPassRemote(), media::mojom::SpeechRecognitionOptions::New( media::mojom::SpeechRecognitionMode::kCaption, - /*enable_formatting=*/true, "en-US", /* is_server_based=*/false, + /*enable_formatting=*/true, kUsEnglishLocale, + /*is_server_based=*/false, media::mojom::RecognizerClientType::kLiveCaption), base::BindOnce( [](bool* p_is_multichannel_supported, base::RunLoop* run_loop, @@ -300,7 +303,7 @@ speech_recognition_client_receiver_.BindNewPipeAndPassRemote(), media::mojom::SpeechRecognitionOptions::New( media::mojom::SpeechRecognitionMode::kIme, - /*enable_formatting=*/false, "en-US"), + /*enable_formatting=*/false, kUsEnglishLocale), base::BindOnce( [](bool* p_is_multichannel_supported, base::RunLoop* run_loop, bool is_multichannel_supported) { @@ -507,4 +510,51 @@ base::RunLoop().RunUntilIdle(); } +IN_PROC_BROWSER_TEST_F(SpeechRecognitionServiceTest, CompromisedRenderer) { + // Create temporary SODA files. + SetUpPrefs(); + base::ScopedAllowBlockingForTesting allow_blocking; + base::FilePath config_dir = + GetSodaLanguagePacksDirectory() + .AppendASCII(kUsEnglishLocale) + .Append("1.1.1") + .Append(kSodaLanguagePackDirectoryRelativePath); + base::CreateDirectory(config_dir); + ASSERT_TRUE(base::PathExists(config_dir)); + base::FilePath config_file_path = config_dir.Append("config_file"); + ASSERT_EQ(base::WriteFile(config_file_path, nullptr, 0), 0); + ASSERT_TRUE(base::PathExists(config_file_path)); + g_browser_process->local_state()->SetFilePath(prefs::kSodaEnUsConfigPath, + config_file_path); + + // Launch the Speech Recognition service. + auto* browser_context = + static_cast<content::BrowserContext*>(browser()->profile()); + auto* service = new ChromeSpeechRecognitionService(browser_context); + service->BindSpeechRecognitionContext( + speech_recognition_context_.BindNewPipeAndPassReceiver()); + + // Bind the recognizer pipes used to send audio and receive results. + auto run_loop = std::make_unique<base::RunLoop>(); + speech_recognition_context_->BindRecognizer( + speech_recognition_recognizer_.BindNewPipeAndPassReceiver(), + speech_recognition_client_receiver_.BindNewPipeAndPassRemote(), + media::mojom::SpeechRecognitionOptions::New( + media::mojom::SpeechRecognitionMode::kCaption, + /*enable_formatting=*/true, kUsEnglishLocale, + /*is_server_based=*/false, + media::mojom::RecognizerClientType::kLiveCaption), + base::BindOnce([](base::RunLoop* run_loop, + bool is_multichannel_supported) { run_loop->Quit(); }, + run_loop.get())); + run_loop->Run(); + + // Simulate a compromised renderer by changing the language and immediately + // resetting the recognizer and verify that the subsequent callbacks do not + // cause any crashes. + speech_recognition_recognizer_->OnLanguageChanged(kUsEnglishLocale); + speech_recognition_recognizer_.reset(); + base::RunLoop().RunUntilIdle(); +} + } // namespace speech
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java index 3d81d52..65b7276 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java
@@ -22,7 +22,8 @@ * Provides a trusted CDN publisher URL for the current web contents in a Tab. */ public class TrustedCdn extends TabWebContentsUserData { - private static final Class<TrustedCdn> USER_DATA_KEY = TrustedCdn.class; + @VisibleForTesting + public static final Class<TrustedCdn> USER_DATA_KEY = TrustedCdn.class; private final Tab mTab; private final long mNativeTrustedCdn; @@ -141,7 +142,8 @@ } @Nullable - private String getPublisherUrl() { + @VisibleForTesting + public String getPublisherUrl() { WebContents webContents = mTab.getWebContents(); if (webContents == null) return null;
diff --git a/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml b/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml index 6e149f14..4640f52 100644 --- a/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml +++ b/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml
@@ -14,6 +14,8 @@ <dimen name="toolbar_identity_disc_size">24dp</dimen> <dimen name="toolbar_identity_disc_size_duet">32dp</dimen> <dimen name="toolbar_url_focus_translation_x">10dp</dimen> + <dimen name="toolbar_url_focus_height_increase">16dp</dimen> + <dimen name="toolbar_url_focus_bottom_padding_increase">8dp</dimen> <!-- Bottom Toolbar --> <dimen name="split_toolbar_button_height">56dp</dimen> @@ -42,6 +44,7 @@ <dimen name="location_bar_url_action_padding">8dp</dimen> <dimen name="location_bar_status_view_left_space_width">8dp</dimen> + <dimen name="location_bar_vertical_padding_phase2_active_color">4dp</dimen> <dimen name="tablet_toolbar_start_padding">4dp</dimen>
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java index a6237d473..508b429 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -312,13 +312,15 @@ } /** - * Set the url focus change percent, expand the left and right space besides the status view. + * Expand the left and right space besides the status view, and increase the location bar + * vertical padding based on current animation progress percent. * - * @param percent The current focus percent. + * @param percent The current animation progress percent. */ - public void setUrlFocusChangePercent(float percent) { + protected void setUrlFocusChangePercent(float percent) { setStatusViewLeftSpacePercent(percent); - setStatusViewRightSpacePrecent(percent); + setStatusViewRightSpacePercent(percent); + setLocationBarPaddingPercent(percent); } /** @@ -326,7 +328,7 @@ * * @param percent The animation progress percent. */ - public void setStatusViewLeftSpacePercent(float percent) { + protected void setStatusViewLeftSpacePercent(float percent) { if (!OmniboxFeatures.shouldShowModernizeVisualUpdate(getContext())) { return; } @@ -344,7 +346,7 @@ * * @param percent The animation progress percent. */ - public void setStatusViewRightSpacePrecent(float percent) { + protected void setStatusViewRightSpacePercent(float percent) { // Status view's right space does not need to expand for tablets. if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(getContext())) { return; @@ -356,5 +358,26 @@ mStatusViewRightSpace.setLayoutParams(rightSpacingParams); } + /** + * Set the location bar's padding based on current animation progress percent. + * + * @param percent The current animation progress percent. + */ + protected void setLocationBarPaddingPercent(float percent) { + // The height increase should only be applied to omnibox phase 2 feature enabled and active + // color parameter enabled at the same time + if (!(OmniboxFeatures.shouldShowModernizeVisualUpdate(getContext()) + && OmniboxFeatures.shouldShowActiveColorOnOmnibox())) { + return; + } + + int verticalPadding = + (int) (getResources().getDimensionPixelSize( + R.dimen.location_bar_vertical_padding_phase2_active_color) + * percent); + + setPaddingRelative(getPaddingStart(), verticalPadding, getPaddingEnd(), verticalPadding); + } + public void notifyVoiceRecognitionCanceled() {} }
diff --git a/chrome/browser/ui/android/toolbar/OWNERS b/chrome/browser/ui/android/toolbar/OWNERS index ac87d1f..8f52270 100644 --- a/chrome/browser/ui/android/toolbar/OWNERS +++ b/chrome/browser/ui/android/toolbar/OWNERS
@@ -1,4 +1,5 @@ mdjones@chromium.org +pnoland@chromium.org tedchoc@chromium.org twellington@chromium.org
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 cfdddbb..ab82ed2 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
@@ -31,7 +31,6 @@ import org.chromium.chrome.browser.omnibox.UrlBarData; import org.chromium.chrome.browser.omnibox.styles.OmniboxResourceProvider; import org.chromium.chrome.browser.paint_preview.TabbedPaintPreview; -import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TrustedCdn; @@ -45,10 +44,8 @@ import org.chromium.components.omnibox.AutocompleteSchemeClassifier; import org.chromium.components.omnibox.OmniboxUrlEmphasizer; import org.chromium.components.omnibox.SecurityStatusIcon; -import org.chromium.components.prefs.PrefService; import org.chromium.components.security_state.ConnectionSecurityLevel; import org.chromium.components.security_state.SecurityStateModel; -import org.chromium.components.user_prefs.UserPrefs; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.base.WindowAndroid; import org.chromium.url.GURL; @@ -335,45 +332,47 @@ } String url = gurl.getSpec().trim(); + boolean isOfflinePage = isOfflinePage(); String formattedUrl = getFormattedFullUrl(); - if (mTab.isFrozen()) return buildUrlBarData(url, formattedUrl); + if (mTab.isFrozen()) return buildUrlBarData(url, isOfflinePage, formattedUrl); if (DomDistillerUrlUtils.isDistilledPage(url)) { GURL originalUrl = DomDistillerUrlUtils.getOriginalUrlFromDistillerUrl(new GURL(url)); - return buildUrlBarData(mUrlFormatter.format(originalUrl)); + return buildUrlBarData(mUrlFormatter.format(originalUrl), isOfflinePage); } - if (isOfflinePage()) { + if (isOfflinePage) { GURL originalUrl = mTab.getOriginalUrl(); formattedUrl = UrlUtilities.stripScheme(mUrlFormatter.format(originalUrl)); // Clear the editing text for untrusted offline pages. if (!mOfflineStatus.isShowingTrustedOfflinePage(mTab)) { - return buildUrlBarData(url, formattedUrl, ""); + return buildUrlBarData(url, true, formattedUrl, ""); } - return buildUrlBarData(url, formattedUrl); + return buildUrlBarData(url, true, formattedUrl); } String urlForDisplay = getUrlForDisplay(); if (!urlForDisplay.equals(formattedUrl)) { - return buildUrlBarData(url, urlForDisplay, formattedUrl); + return buildUrlBarData(url, false, urlForDisplay, formattedUrl); } - return buildUrlBarData(url, formattedUrl); + return buildUrlBarData(url, false, formattedUrl); } } - private UrlBarData buildUrlBarData(String url) { - return buildUrlBarData(url, url, url); + private UrlBarData buildUrlBarData(String url, boolean isOfflinePage) { + return buildUrlBarData(url, isOfflinePage, url, url); } - private UrlBarData buildUrlBarData(String url, String displayText) { - return buildUrlBarData(url, displayText, displayText); + private UrlBarData buildUrlBarData(String url, boolean isOfflinePage, String displayText) { + return buildUrlBarData(url, isOfflinePage, displayText, displayText); } - private UrlBarData buildUrlBarData(String url, String displayText, String editingText) { + private UrlBarData buildUrlBarData( + String url, boolean isOfflinePage, String displayText, String editingText) { SpannableStringBuilder spannableDisplayText = new SpannableStringBuilder(displayText); if (mNativeLocationBarModelAndroid != 0 && spannableDisplayText.length() > 0 && shouldEmphasizeUrl()) { @@ -391,8 +390,9 @@ OmniboxResourceProvider.getUrlBarSecureColor(mContext, brandedColorScheme); AutocompleteSchemeClassifier autocompleteSchemeClassifier; + int securityLevel = getSecurityLevel(getTab(), isOfflinePage); SpannableDisplayTextCacheKey cacheKey = - new SpannableDisplayTextCacheKey(url, displayText, getSecurityLevel(), + new SpannableDisplayTextCacheKey(url, displayText, securityLevel, nonEmphasizedColor, emphasizedColor, dangerColor, secureColor); SpannableStringBuilder cachedSpannableDisplayText = null; if (mOptimizationsEnabled) { @@ -573,9 +573,7 @@ @Override public int getSecurityLevel() { - Tab tab = getTab(); - String publisherUrl = tab != null ? TrustedCdn.getPublisherUrl(tab) : null; - return getSecurityLevel(tab, isOfflinePage(), publisherUrl); + return getSecurityLevel(getTab(), isOfflinePage()); } @Override @@ -592,8 +590,9 @@ @Override public @DrawableRes int getSecurityIconResource(boolean isTablet) { - return getSecurityIconResource( - getSecurityLevel(), !isTablet, isOfflinePage(), isPaintPreview()); + boolean isOfflinePage = isOfflinePage(); + return getSecurityIconResource(getSecurityLevel(getTab(), isOfflinePage), !isTablet, + isOfflinePage, isPaintPreview()); } @Override @@ -604,11 +603,14 @@ @VisibleForTesting @ConnectionSecurityLevel - int getSecurityLevel(Tab tab, boolean isOfflinePage, @Nullable String publisherUrl) { + int getSecurityLevel(Tab tab, boolean isOfflinePage) { if (tab == null || isOfflinePage || isInOverviewAndShowingOmnibox()) { return ConnectionSecurityLevel.NONE; } + @Nullable + String publisherUrl = TrustedCdn.getPublisherUrl(tab); + if (publisherUrl != null) { assert getSecurityLevelFromStateModel(tab.getWebContents()) != ConnectionSecurityLevel.DANGEROUS; @@ -627,11 +629,6 @@ } @VisibleForTesting - PrefService getPrefService() { - return UserPrefs.get(Profile.getLastUsedRegularProfile()); - } - - @VisibleForTesting @DrawableRes int getSecurityIconResource(int securityLevel, boolean isSmallDevice, boolean isOfflinePage, boolean isPaintPreview) { @@ -656,20 +653,10 @@ !mSearchEngineLogoUtils.shouldShowSearchEngineLogo(isIncognito()) || mNtpDelegate.isCurrentlyVisible() || isInOverviewAndShowingOmnibox(); - boolean useLockIconEnabled = false; - if (mNativeLocationBarModelAndroid != 0) { - PrefService prefService = getPrefService(); - if (prefService.isManagedPreference( - ChromePreferenceKeys.LOCK_ICON_IN_ADDRESS_BAR_ENABLED)) { - useLockIconEnabled = prefService.getBoolean( - ChromePreferenceKeys.LOCK_ICON_IN_ADDRESS_BAR_ENABLED); - } - } - boolean useUpdatedConnectionSecurityIndicators = FeatureList.isInitialized() && ChromeFeatureList.isEnabled( ChromeFeatureList.OMNIBOX_UPDATED_CONNECTION_SECURITY_INDICATORS) - && !useLockIconEnabled && !(hasTab() && mTab.isCustomTab()); + && !(hasTab() && mTab.isCustomTab()); return SecurityStatusIcon.getSecurityIconResource(securityLevel, isSmallDevice, skipIconForNeutralState, useUpdatedConnectionSecurityIndicators);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java index e9656e3..5c92c4f 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
@@ -972,6 +972,7 @@ mHomeButton.setVisibility(toolbarButtonVisibility); } + updateToolbarLayoutForExpansionAnimationOnActiveColor(); updateLocationBarLayoutForExpansionAnimation(); } @@ -1098,6 +1099,33 @@ } /** + * Updates the toolbar height and bottom padding, as the result of either a focus change or + * scrolling the New Tab Page. + */ + private void updateToolbarLayoutForExpansionAnimationOnActiveColor() { + if (!(OmniboxFeatures.shouldShowModernizeVisualUpdate(getContext()) + && OmniboxFeatures.shouldShowActiveColorOnOmnibox())) { + return; + } + + int heightIncrease = (int) (getResources().getDimensionPixelSize( + R.dimen.toolbar_url_focus_height_increase) + * mUrlExpansionFraction); + int bottomPaddingIncrease = + (int) (getResources().getDimensionPixelSize( + R.dimen.toolbar_url_focus_bottom_padding_increase) + * mUrlExpansionFraction); + + var layoutParams = getLayoutParams(); + layoutParams.height = getResources().getDimensionPixelSize(R.dimen.toolbar_height_no_shadow) + + heightIncrease; + setLayoutParams(layoutParams); + + setPaddingRelative( + getPaddingStart(), getPaddingTop(), getPaddingEnd(), bottomPaddingIncrease); + } + + /** * Calculates the translation X for the URL actions container for use in the URL expansion * animation. *
diff --git a/chrome/browser/ui/app_list/search/chrome_search_result.cc b/chrome/browser/ui/app_list/search/chrome_search_result.cc index f6481449..a441c62 100644 --- a/chrome/browser/ui/app_list/search/chrome_search_result.cc +++ b/chrome/browser/ui/app_list/search/chrome_search_result.cc
@@ -80,6 +80,11 @@ SetSearchResultMetadata(); } +void ChromeSearchResult::SetMultilineTitle(bool multiline_title) { + metadata_->multiline_title = multiline_title; + SetSearchResultMetadata(); +} + void ChromeSearchResult::SetDetailsTextVector(const TextVector& text_vector) { metadata_->details_vector = text_vector; explicit_details_vector_ = true;
diff --git a/chrome/browser/ui/app_list/search/chrome_search_result.h b/chrome/browser/ui/app_list/search/chrome_search_result.h index 226a904..5de33fc 100644 --- a/chrome/browser/ui/app_list/search/chrome_search_result.h +++ b/chrome/browser/ui/app_list/search/chrome_search_result.h
@@ -66,6 +66,7 @@ const TextVector& title_text_vector() const { return metadata_->title_vector; } + bool multiline_title() const { return metadata_->multiline_title; } const TextVector& details_text_vector() const { return metadata_->details_vector; } @@ -116,6 +117,7 @@ void SetDetailsTags(const Tags& tags); void MaybeUpdateDetailsVector(); void SetTitleTextVector(const TextVector& text_vector); + void SetMultilineTitle(bool multiline_title); void SetDetailsTextVector(const TextVector& text_vector); void SetMultilineDetails(bool multiline_details); void SetBigTitleTextVector(const TextVector& text_vector);
diff --git a/chrome/browser/ui/app_list/search/ranking/answer_ranker.cc b/chrome/browser/ui/app_list/search/ranking/answer_ranker.cc index e0e960f..a7f39e1b0 100644 --- a/chrome/browser/ui/app_list/search/ranking/answer_ranker.cc +++ b/chrome/browser/ui/app_list/search/ranking/answer_ranker.cc
@@ -138,6 +138,7 @@ return; chosen_answer_->SetDisplayType(DisplayType::kAnswerCard); + chosen_answer_->SetMultilineTitle(true); chosen_answer_->SetIconDimension(GetAnswerCardIconDimension()); chosen_answer_->scoring().filter = false; }
diff --git a/chrome/browser/ui/app_list/search/ranking/answer_ranker_unittest.cc b/chrome/browser/ui/app_list/search/ranking/answer_ranker_unittest.cc index f57c0f4..dc08e5e2 100644 --- a/chrome/browser/ui/app_list/search/ranking/answer_ranker_unittest.cc +++ b/chrome/browser/ui/app_list/search/ranking/answer_ranker_unittest.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/app_list/search/ranking/answer_ranker.h" #include "chrome/browser/ui/app_list/search/chrome_search_result.h" +#include "chrome/browser/ui/app_list/search/common/icon_constants.h" #include "chrome/browser/ui/app_list/search/ranking/types.h" #include "chrome/browser/ui/app_list/search/test/ranking_test_util.h" #include "testing/gmock/include/gmock/gmock.h" @@ -13,7 +14,7 @@ namespace app_list { namespace { -Results make_omnibox_candidates(std::vector<double> relevances) { +Results MakeOmniboxCandidates(std::vector<double> relevances) { Results results; for (const double relevance : relevances) { // |id| and |normalized_relevance| must be set but are not used. @@ -25,7 +26,7 @@ return results; } -Results make_shortcut_candidates(std::vector<bool> best_matches) { +Results MakeShortcutCandidates(std::vector<bool> best_matches) { Results results; for (const double best_match : best_matches) { // |id| and |normalized_relevance| must be set but are not used. @@ -37,13 +38,20 @@ return results; } +bool AnswerFieldsAreSet(const std::unique_ptr<ChromeSearchResult>& result) { + return result->display_type() == ash::SearchResultDisplayType::kAnswerCard && + result->multiline_title() && + result->icon().dimension == GetAnswerCardIconDimension() && + !result->scoring().filter; +} + } // namespace // Tests that the best Omnibox answer is selected and all others are filtered // out. TEST(AnswerRankerTest, SelectAndFilterOmnibox) { ResultsMap results_map; - results_map[ResultType::kOmnibox] = make_omnibox_candidates({0.3, 0.5, 0.4}); + results_map[ResultType::kOmnibox] = MakeOmniboxCandidates({0.3, 0.5, 0.4}); AnswerRanker ranker; ranker.UpdateResultRanks(results_map, ProviderType::kOmnibox); @@ -53,9 +61,7 @@ ASSERT_EQ(results.size(), 3u); // The highest scoring Omnibox answer is selected. - EXPECT_EQ(results[1]->display_type(), - ash::SearchResultDisplayType::kAnswerCard); - EXPECT_FALSE(results[1]->scoring().filter); + EXPECT_TRUE(AnswerFieldsAreSet(results[1])); // Others are filtered out. EXPECT_TRUE(results[0]->scoring().filter); @@ -66,7 +72,7 @@ TEST(AnswerRankerTest, SelectBestShortcut) { ResultsMap results_map; results_map[ResultType::kKeyboardShortcut] = - make_shortcut_candidates({false, true}); + MakeShortcutCandidates({false, true}); AnswerRanker ranker; ranker.UpdateResultRanks(results_map, ProviderType::kKeyboardShortcut); @@ -76,9 +82,7 @@ ASSERT_EQ(results.size(), 2u); // The best match shortcut is selected. - EXPECT_EQ(results[1]->display_type(), - ash::SearchResultDisplayType::kAnswerCard); - EXPECT_FALSE(results[1]->scoring().filter); + EXPECT_TRUE(AnswerFieldsAreSet(results[1])); EXPECT_NE(results[0]->display_type(), ash::SearchResultDisplayType::kAnswerCard); @@ -89,7 +93,7 @@ TEST(AnswerRankerTest, OnlySelectIfOneBestShortcut) { ResultsMap results_map; results_map[ResultType::kKeyboardShortcut] = - make_shortcut_candidates({true, true}); + MakeShortcutCandidates({true, true}); AnswerRanker ranker; ranker.UpdateResultRanks(results_map, ProviderType::kKeyboardShortcut); @@ -108,8 +112,8 @@ // Tests that Omnibox answers take priority over Shortcuts. TEST(AnswerRankerTest, OmniboxOverShortcuts) { ResultsMap results_map; - results_map[ResultType::kOmnibox] = make_omnibox_candidates({0.4}); - results_map[ResultType::kKeyboardShortcut] = make_shortcut_candidates({true}); + results_map[ResultType::kOmnibox] = MakeOmniboxCandidates({0.4}); + results_map[ResultType::kKeyboardShortcut] = MakeShortcutCandidates({true}); AnswerRanker ranker; ranker.UpdateResultRanks(results_map, ProviderType::kKeyboardShortcut); @@ -125,15 +129,13 @@ // Omnibox candidate should be selected. const auto& omnibox_results = results_map[ResultType::kOmnibox]; ASSERT_EQ(omnibox_results.size(), 1u); - EXPECT_EQ(omnibox_results[0]->display_type(), - ash::SearchResultDisplayType::kAnswerCard); - EXPECT_FALSE(omnibox_results[0]->scoring().filter); + EXPECT_TRUE(AnswerFieldsAreSet(omnibox_results[0])); } // Tests that a chosen answer is not changed after burn-in. TEST(AnswerRankerTest, SelectedAnswerNotChangedAfterBurnIn) { ResultsMap results_map; - results_map[ResultType::kKeyboardShortcut] = make_shortcut_candidates({true}); + results_map[ResultType::kKeyboardShortcut] = MakeShortcutCandidates({true}); AnswerRanker ranker; ranker.UpdateResultRanks(results_map, ProviderType::kKeyboardShortcut); @@ -142,11 +144,10 @@ // The shortcut answer is selected. const auto& shortcut_results = results_map[ResultType::kKeyboardShortcut]; ASSERT_EQ(shortcut_results.size(), 1u); - EXPECT_EQ(shortcut_results[0]->display_type(), - ash::SearchResultDisplayType::kAnswerCard); + EXPECT_TRUE(AnswerFieldsAreSet(shortcut_results[0])); // New Omnibox candidates should still be filtered out. - results_map[ResultType::kOmnibox] = make_omnibox_candidates({0.5}); + results_map[ResultType::kOmnibox] = MakeOmniboxCandidates({0.5}); ranker.UpdateResultRanks(results_map, ProviderType::kOmnibox); const auto& omnibox_results = results_map[ResultType::kOmnibox];
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_file_system_delegate.cc b/chrome/browser/ui/ash/holding_space/holding_space_file_system_delegate.cc index 1032607..f40997206 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_file_system_delegate.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_file_system_delegate.cc
@@ -502,38 +502,34 @@ profile(), /*base_path=*/base::FilePath()); } - // Resolve conflicts with existing items that arise from the move. + // Mark items that were moved to an enabled Trash location for removal. std::set<std::string> item_ids_to_remove; - for (auto& item : model()->items()) { - if (dst == item->file_path() || dst.IsParent(item->file_path())) { - item_ids_to_remove.insert(item->id()); - continue; - } - - // Files that are sent to the Trash are actually moved to a folder, e.g. - // My files/.Trash/files. This means the files still appear in holding space - // despite the user intending to delete them. These should be removed from - // the model. - if (base::ranges::any_of(enabled_trash_locations, [&dst](const auto& it) { - const base::FilePath trash_location = - it.first.Append(it.second.relative_folder_path); - return trash_location.IsParent(dst); - })) { - item_ids_to_remove.insert(item->id()); + for (const auto& it : enabled_trash_locations) { + const base::FilePath& trash_location = + it.first.Append(it.second.relative_folder_path); + for (const auto& [id, file_path] : items_to_move) { + if (trash_location.IsParent(file_path)) + item_ids_to_remove.insert(id); } } + + // Mark conflicts with existing items that arise from the move for removal. + for (auto& item : model()->items()) { + if (dst == item->file_path() || dst.IsParent(item->file_path())) + item_ids_to_remove.insert(item->id()); + } + + // Remove items which have been marked for removal. model()->RemoveItems(item_ids_to_remove); // Finally, update the files that have been moved. - for (const auto& to_move : items_to_move) { - if (item_ids_to_remove.count(to_move.first)) + for (const auto& [id, file_path] : items_to_move) { + if (item_ids_to_remove.count(id)) continue; - model() - ->UpdateItem(/*id=*/to_move.first) - ->SetBackingFile(/*file_path=*/to_move.second, - holding_space_util::ResolveFileSystemUrl( - profile(), /*file_path=*/to_move.second)); + model()->UpdateItem(id)->SetBackingFile( + file_path, + holding_space_util::ResolveFileSystemUrl(profile(), file_path)); } // If a backing file update occurred, it's possible that there are no longer
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc index ee5cf01..2965e206 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc
@@ -22,15 +22,15 @@ #include "base/files/file_util.h" #include "base/scoped_observation.h" #include "base/test/bind.h" -#include "base/test/gmock_callback_support.h" #include "base/test/metrics/histogram_tester.h" -#include "base/test/mock_callback.h" +#include "base/test/test_future.h" #include "base/time/time.h" #include "base/time/time_override.h" #include "chrome/browser/ash/arc/fileapi/arc_file_system_bridge.h" #include "chrome/browser/ash/file_manager/fake_disk_mount_manager.h" #include "chrome/browser/ash/file_manager/fileapi_util.h" #include "chrome/browser/ash/file_manager/path_util.h" +#include "chrome/browser/ash/file_manager/trash_common_util.h" #include "chrome/browser/ash/file_manager/trash_io_task.h" #include "chrome/browser/ash/file_manager/volume_manager.h" #include "chrome/browser/ash/file_manager/volume_manager_factory.h" @@ -146,12 +146,6 @@ return deserialized_item_ptr; } -base::FilePath MakeRelativePath(const base::FilePath& absolute_path, - const base::FilePath& parent) { - return base::FilePath(absolute_path.value().substr( - parent.AsEndingWithSeparator().value().size())); -} - // Utility class which can wait until a `HoldingSpaceModel` for a given profile // is attached to the `HoldingSpaceController`. class HoldingSpaceModelAttachedWaiter : public HoldingSpaceControllerObserver { @@ -1090,6 +1084,14 @@ ScopedTestMountPoint::CreateAndMountDownloads(GetProfile()); ASSERT_TRUE(downloads_mount->IsValid()); + // Ensure that required trash folders exist for the `downloads_mount`. + const base::FilePath trash_path = downloads_mount->GetRootPath().Append( + file_manager::trash::kTrashFolderName); + ASSERT_TRUE(base::CreateDirectory( + trash_path.Append(file_manager::trash::kFilesFolderName))); + ASSERT_TRUE(base::CreateDirectory( + trash_path.Append(file_manager::trash::kInfoFolderName))); + // Cache the holding space model for the primary profile. HoldingSpaceKeyedService* const primary_holding_space_service = HoldingSpaceKeyedServiceFactory::GetInstance()->GetService(GetProfile()); @@ -1117,10 +1119,11 @@ primary_holding_space_model->AddItem(std::move(holding_space_item)); } - // Create a context for testing. - scoped_refptr<storage::FileSystemContext> file_system_context = - storage::CreateFileSystemContextForTesting( - nullptr, downloads_mount->GetRootPath()); + // Use the File Manager's context for testing. Note that we specifically do + // not use a test context since we want a production context which uses file + // system operations that notify the `FileChangeService` on completion. + storage::FileSystemContext* file_system_context = + file_manager::util::GetFileManagerFileSystemContext(GetProfile()); const blink::StorageKey kTestStorageKey = blink::StorageKey::CreateFromStringForTesting("chrome-extension://abc"); @@ -1132,25 +1135,15 @@ base::FilePath file_path = holding_space_item->file_path(); ItemRemovedWaiter waiter(primary_holding_space_model, holding_space_item); - base::MockOnceCallback<void(file_manager::io_task::ProgressStatus)> - complete_callback; - EXPECT_CALL(complete_callback, - Run(Field(&file_manager::io_task::ProgressStatus::state, - file_manager::io_task::State::kSuccess))); + base::test::TestFuture<file_manager::io_task::ProgressStatus> status; + file_manager::io_task::TrashIOTask task( + {file_system_context->CrackURLInFirstPartyContext( + GetFileSystemUrl(GetProfile(), file_path))}, + GetProfile(), file_system_context, /*base_path=*/base::FilePath()); + task.Execute(base::DoNothing(), status.GetCallback()); + EXPECT_EQ(status.Get().state, file_manager::io_task::State::kSuccess); - // Paths sent to the test `FileSystemContext` must be relative to the base - // path supplied when the context was setup. - base::FilePath relative_path = - MakeRelativePath(file_path, downloads_mount->GetRootPath()); - std::vector<storage::FileSystemURL> source_urls = { - file_system_context->CreateCrackedFileSystemURL( - kTestStorageKey, storage::kFileSystemTypeTest, relative_path), - }; - file_manager::io_task::TrashIOTask task(source_urls, GetProfile(), - file_system_context, - downloads_mount->GetRootPath()); - task.Execute(base::DoNothing(), complete_callback.Get()); waiter.Wait(); } @@ -3254,6 +3247,38 @@ EXPECT_EQ(expected, GetSuggestionsInModel(model)); } +TEST_P(HoldingSpaceSuggestionsDelegateTest, DownloadsFolderNotSuggested) { + auto downloads_mount = mount_point()->CreateAndMountDownloads(profile()); + auto downloads_path = + file_manager::util::GetDownloadsFolderForProfile(GetProfile()); + auto other_folder_path = downloads_path.Append("contained_folder"); + ASSERT_TRUE(base::CreateDirectory(other_folder_path)); + const base::FilePath file_path = mount_point()->CreateArbitraryFile(); + + GetFileSuggestKeyedService()->SetSuggestionsForType( + app_list::FileSuggestionType::kLocalFile, + /*suggestions=*/std::vector<app_list::FileSuggestData>{ + {app_list::FileSuggestionType::kLocalFile, downloads_path, + /*new_prediction_reason=*/absl::nullopt, + /*new_score=*/absl::nullopt}, + {app_list::FileSuggestionType::kLocalFile, other_folder_path, + /*new_prediction_reason=*/absl::nullopt, + /*new_score=*/absl::nullopt}, + {app_list::FileSuggestionType::kLocalFile, file_path, + /*new_prediction_reason=*/absl::nullopt, + /*new_score=*/absl::nullopt}}); + task_environment()->FastForwardBy(base::Seconds(1)); + + std::vector<std::pair<HoldingSpaceItem::Type, base::FilePath>> expected; + if (features::IsHoldingSpaceSuggestionsEnabled()) { + expected = {{HoldingSpaceItem::Type::kLocalSuggestion, file_path}, + {HoldingSpaceItem::Type::kLocalSuggestion, other_folder_path}}; + } + + EXPECT_EQ(GetSuggestionsInModel(HoldingSpaceController::Get()->model()), + expected); +} + TEST_P(HoldingSpaceSuggestionsDelegateTest, PinAndUnpinSuggestions) { const base::FilePath file_path_1 = mount_point()->CreateArbitraryFile();
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.cc b/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.cc index c8499d6..719725f7 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.h" #include "ash/constants/ash_features.h" +#include "chrome/browser/ash/file_manager/path_util.h" #include "chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_factory.h" namespace ash { @@ -131,10 +132,13 @@ void HoldingSpaceSuggestionsDelegate::UpdateSuggestionsInModel() { std::vector<std::pair<HoldingSpaceItem::Type, base::FilePath>> suggestion_items; + base::FilePath downloads_folder = + file_manager::util::GetDownloadsFolderForProfile(profile()); for (const auto& [type, raw_suggestions] : suggestions_by_type_) { HoldingSpaceItem::Type item_type = GetItemTypeFromSuggestionType(type); for (const auto& suggestion : raw_suggestions) { - if (!model()->ContainsItem(HoldingSpaceItem::Type::kPinnedFile, + if (suggestion.file_path != downloads_folder && + !model()->ContainsItem(HoldingSpaceItem::Type::kPinnedFile, suggestion.file_path)) { suggestion_items.emplace_back(item_type, suggestion.file_path); }
diff --git a/chrome/browser/ui/cocoa/accelerators_cocoa.h b/chrome/browser/ui/cocoa/accelerators_cocoa.h index b873e56..8346a63 100644 --- a/chrome/browser/ui/cocoa/accelerators_cocoa.h +++ b/chrome/browser/ui/cocoa/accelerators_cocoa.h
@@ -52,6 +52,8 @@ friend struct base::DefaultSingletonTraits<AcceleratorsCocoa>; FRIEND_TEST_ALL_PREFIXES(AcceleratorsCocoaBrowserTest, MappingAcceleratorsInMainMenu); + FRIEND_TEST_ALL_PREFIXES(AcceleratorsCocoaBrowserTestRTL, + HistoryAcceleratorsReversedForRTL); AcceleratorsCocoa(); ~AcceleratorsCocoa();
diff --git a/chrome/browser/ui/cocoa/accelerators_cocoa.mm b/chrome/browser/ui/cocoa/accelerators_cocoa.mm index 57421ffb..53f4ce6 100644 --- a/chrome/browser/ui/cocoa/accelerators_cocoa.mm +++ b/chrome/browser/ui/cocoa/accelerators_cocoa.mm
@@ -10,6 +10,7 @@ #include <utility> #include "base/cxx17_backports.h" +#include "base/i18n/rtl.h" #include "base/mac/mac_util.h" #include "base/memory/singleton.h" #include "build/branding_buildflags.h" @@ -143,6 +144,17 @@ ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN))); DCHECK(result.second); } + + if (!base::i18n::IsRTL()) + return; + + // If running in RTL, swap the keyboard shortcuts for History -> Forward + // and Back. + ui::Accelerator history_forward = accelerators_[IDC_FORWARD]; + ui::Accelerator history_back = accelerators_[IDC_BACK]; + + accelerators_[IDC_FORWARD] = history_back; + accelerators_[IDC_BACK] = history_forward; } AcceleratorsCocoa::~AcceleratorsCocoa() {}
diff --git a/chrome/browser/ui/cocoa/accelerators_cocoa_browsertest.mm b/chrome/browser/ui/cocoa/accelerators_cocoa_browsertest.mm index 724157086..87392078 100644 --- a/chrome/browser/ui/cocoa/accelerators_cocoa_browsertest.mm +++ b/chrome/browser/ui/cocoa/accelerators_cocoa_browsertest.mm
@@ -4,6 +4,7 @@ #import <Cocoa/Cocoa.h> +#include "base/i18n/base_i18n_switches.h" #include "chrome/app/chrome_command_ids.h" #import "chrome/browser/ui/cocoa/accelerators_cocoa.h" #include "chrome/grit/generated_resources.h" @@ -80,6 +81,16 @@ } // namespace +class AcceleratorsCocoaBrowserTestRTL : public AcceleratorsCocoaBrowserTest { + public: + void SetUpCommandLine(base::CommandLine* command_line) override { + command_line->AppendSwitchASCII(::switches::kForceUIDirection, + ::switches::kForceDirectionRTL); + command_line->AppendSwitchASCII(::switches::kForceTextDirection, + ::switches::kForceDirectionRTL); + } +}; + // Checks that each NSMenuItem in the main menu has a corresponding accelerator, // and the keyEquivalent/modifiers match. IN_PROC_BROWSER_TEST_F(AcceleratorsCocoaBrowserTest, @@ -145,3 +156,14 @@ EXPECT_EQ(item.tag, it.first); } } + +IN_PROC_BROWSER_TEST_F(AcceleratorsCocoaBrowserTestRTL, + HistoryAcceleratorsReversedForRTL) { + AcceleratorsCocoa* keymap = AcceleratorsCocoa::GetInstance(); + ui::Accelerator history_forward = keymap->accelerators_[IDC_FORWARD]; + ui::Accelerator history_back = keymap->accelerators_[IDC_BACK]; + + // In LTR, History -> Forward is VKEY_OEM_6 and Back is VKEY_OEM_4. + EXPECT_EQ(ui::VKEY_OEM_4, history_forward.key_code()); + EXPECT_EQ(ui::VKEY_OEM_6, history_back.key_code()); +}
diff --git a/chrome/browser/ui/commerce/price_tracking/shopping_list_ui_tab_helper.cc b/chrome/browser/ui/commerce/price_tracking/shopping_list_ui_tab_helper.cc index 61b849a..a9638a9 100644 --- a/chrome/browser/ui/commerce/price_tracking/shopping_list_ui_tab_helper.cc +++ b/chrome/browser/ui/commerce/price_tracking/shopping_list_ui_tab_helper.cc
@@ -15,6 +15,7 @@ #include "components/commerce/core/price_tracking_utils.h" #include "components/image_fetcher/core/image_fetcher_service.h" #include "components/prefs/pref_service.h" +#include "content/public/browser/navigation_details.h" #include "content/public/browser/web_contents.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "url/gurl.h" @@ -85,6 +86,12 @@ void ShoppingListUiTabHelper::NavigationEntryCommitted( const content::LoadCommittedDetails& load_details) { + if (!load_details.is_in_active_page || + web_contents()->GetLastCommittedURL() == + load_details.previous_main_frame_url) { + return; + } + last_fetched_image_ = gfx::Image(); last_fetched_image_url_ = GURL();
diff --git a/chrome/browser/ui/views/commerce/price_tracking_icon_view_integration_test.cc b/chrome/browser/ui/views/commerce/price_tracking_icon_view_integration_test.cc index e6b490a..bb22901c 100644 --- a/chrome/browser/ui/views/commerce/price_tracking_icon_view_integration_test.cc +++ b/chrome/browser/ui/views/commerce/price_tracking_icon_view_integration_test.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ui/views/commerce/price_tracking_icon_view.h" +#include "base/test/metrics/user_action_tester.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" #include "chrome/browser/bookmarks/managed_bookmark_service_factory.h" #include "chrome/browser/ui/browser_element_identifiers.h" @@ -110,6 +111,7 @@ protected: raw_ptr<MockShoppingListUiTabHelper> mock_tab_helper_; + base::UserActionTester user_action_tester_; private: base::test::ScopedFeatureList test_features_; @@ -129,10 +131,17 @@ ON_CALL(*GetTabHelper(), ShouldShowPriceTrackingIconView) .WillByDefault(testing::Return(true)); + EXPECT_EQ(user_action_tester_.GetActionCount( + "Commerce.PriceTracking.OmniboxChipShown"), + 0); + NavigateAndCommitActiveTab(GURL(kTrackableUrl)); auto* icon_view = GetChip(); VerifyIconState(icon_view, /*is_price_tracked=*/true); + EXPECT_EQ(user_action_tester_.GetActionCount( + "Commerce.PriceTracking.OmniboxChipShown"), + 1); } TEST_F(PriceTrackingIconViewIntegrationTest,
diff --git a/chrome/browser/ui/webauthn/sheet_models.cc b/chrome/browser/ui/webauthn/sheet_models.cc index 89a8d935b..a78d3bff 100644 --- a/chrome/browser/ui/webauthn/sheet_models.cc +++ b/chrome/browser/ui/webauthn/sheet_models.cc
@@ -410,16 +410,30 @@ const gfx::VectorIcon& AuthenticatorAlreadyRegisteredErrorModel::GetStepIllustration( ImageColorScheme color_scheme) const { + if (base::FeatureList::IsEnabled( + device::kWebAuthnNewDiscoverableCredentialsUi)) { + return color_scheme == ImageColorScheme::kDark ? kPasskeyErrorDarkIcon + : kPasskeyErrorIcon; + } return color_scheme == ImageColorScheme::kDark ? kWebauthnErrorDarkIcon : kWebauthnErrorIcon; } std::u16string AuthenticatorAlreadyRegisteredErrorModel::GetStepTitle() const { + if (base::FeatureList::IsEnabled( + device::kWebAuthnNewDiscoverableCredentialsUi)) { + return l10n_util::GetStringUTF16(IDS_WEBAUTHN_ERROR_WRONG_DEVICE_TITLE); + } return l10n_util::GetStringUTF16(IDS_WEBAUTHN_ERROR_WRONG_KEY_TITLE); } std::u16string AuthenticatorAlreadyRegisteredErrorModel::GetStepDescription() const { + if (base::FeatureList::IsEnabled( + device::kWebAuthnNewDiscoverableCredentialsUi)) { + return l10n_util::GetStringUTF16( + IDS_WEBAUTHN_ERROR_WRONG_DEVICE_REGISTER_DESCRIPTION); + } return l10n_util::GetStringUTF16( IDS_WEBAUTHN_ERROR_WRONG_KEY_REGISTER_DESCRIPTION); }
diff --git a/chrome/browser/ui/webui/chrome_untrusted_web_ui_configs_chromeos.cc b/chrome/browser/ui/webui/chrome_untrusted_web_ui_configs_chromeos.cc index 860200b..b8b6eec 100644 --- a/chrome/browser/ui/webui/chrome_untrusted_web_ui_configs_chromeos.cc +++ b/chrome/browser/ui/webui/chrome_untrusted_web_ui_configs_chromeos.cc
@@ -62,7 +62,7 @@ } map.AddUntrustedWebUIConfig( std::make_unique<ash::DemoModeAppUntrustedUIConfig>(base::BindRepeating( - [] { return ash::DemoSession::Get()->DemoAppComponentPath(); }))); + [] { return ash::DemoSession::Get()->GetDemoAppComponentPath(); }))); #if !defined(OFFICIAL_BUILD) map.AddUntrustedWebUIConfig( std::make_unique<ash::SampleSystemWebAppUntrustedUIConfig>());
diff --git a/chrome/browser/ui/webui/chromeos/user_image_source.cc b/chrome/browser/ui/webui/chromeos/user_image_source.cc index 7afcfe1..705fa24 100644 --- a/chrome/browser/ui/webui/chromeos/user_image_source.cc +++ b/chrome/browser/ui/webui/chromeos/user_image_source.cc
@@ -140,7 +140,8 @@ !user->HasDefaultImage() || user->has_image_bytes()); if (user->has_image_bytes()) { - if (user->image_format() == user_manager::UserImage::FORMAT_PNG) { + if (user->image_format() == user_manager::UserImage::FORMAT_PNG || + user->image_format() == user_manager::UserImage::FORMAT_WEBP) { return GetUserImageFrame(user->image_bytes(), user->image_format(), frame); } else {
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc b/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc index cfaae49..6e44fa51 100644 --- a/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc +++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
@@ -70,13 +70,15 @@ PrinterHandler::DefaultPrinterCallback callback, mojom::DefaultPrinterNameResultPtr printer_name) { if (printer_name->is_result_code()) { - PRINTER_LOG(ERROR) << "Failure getting default printer, result: " - << printer_name->get_result_code(); + PRINTER_LOG(ERROR) + << "Failure getting default printer via service, result: " + << printer_name->get_result_code(); std::move(callback).Run(std::string()); return; } - VLOG(1) << "Default Printer: " << printer_name->get_default_printer_name(); + PRINTER_LOG(EVENT) << "Default Printer from service: " + << printer_name->get_default_printer_name(); std::move(callback).Run(printer_name->get_default_printer_name()); } @@ -85,8 +87,9 @@ PrinterHandler::GetPrintersDoneCallback done_callback, mojom::PrinterListResultPtr printer_list) { if (printer_list->is_result_code()) { - PRINTER_LOG(ERROR) << "Failure enumerating local printers, result: " - << printer_list->get_result_code(); + PRINTER_LOG(ERROR) + << "Failure enumerating local printers via service, result: " + << printer_list->get_result_code(); } ConvertPrinterListForCallback( @@ -102,8 +105,10 @@ PrinterHandler::GetCapabilityCallback callback, mojom::PrinterCapsAndInfoResultPtr printer_caps_and_info) { if (printer_caps_and_info->is_result_code()) { - LOG(WARNING) << "Failure fetching printer capabilities for " << device_name - << " - error " << printer_caps_and_info->get_result_code(); + PRINTER_LOG(ERROR) + << "Failure fetching printer capabilities via service for " + << device_name + << ", result: " << printer_caps_and_info->get_result_code(); // If we failed because of access denied then we could retry at an elevated // privilege (if not already elevated). @@ -130,7 +135,8 @@ return; } - VLOG(1) << "Received printer info & capabilities for " << device_name; + PRINTER_LOG(EVENT) << "Received printer info & capabilities via service for " + << device_name; const mojom::PrinterCapsAndInfoPtr& caps_and_info = printer_caps_and_info->get_printer_caps_and_info(); base::Value::Dict settings = AssemblePrinterSettings( @@ -186,9 +192,11 @@ VLOG(1) << "Get printer capabilities start for " << device_name; PrinterBasicInfo basic_info; - if (print_backend->GetPrinterBasicInfo(device_name, &basic_info) != - mojom::ResultCode::kSuccess) { - LOG(WARNING) << "Invalid printer " << device_name; + mojom::ResultCode result = + print_backend->GetPrinterBasicInfo(device_name, &basic_info); + if (result != mojom::ResultCode::kSuccess) { + PRINTER_LOG(ERROR) << "Invalid printer when getting basic info for " + << device_name << ", result: " << result; return base::Value::Dict(); } @@ -217,7 +225,7 @@ << result; return std::string(); } - VLOG(1) << "Default Printer: " << default_printer; + PRINTER_LOG(EVENT) << "Default Printer: " << default_printer; return default_printer; }
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index e7d6174..30fac55 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1665575931-7a7f321e27b06315460f8a75b7bd9d32f53b4987.profdata +chrome-linux-main-1665597506-69424600cd8ac8ad57eee50de5f83fc641d993fb.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index d20ea79d..d816e01 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1665575931-b54eb498dd4b0589c6ea03c084015f8d82b54bad.profdata +chrome-mac-main-1665597506-38a49e6c5f2d58a0a4894c1acd49bcb7b8d3fb60.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 72b586a..5c1fa16 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1665586466-c7cc31370b6807fde1cf26a4051835f758f5374d.profdata +chrome-win64-main-1665597506-133eabc042ccf9f1157cba488b723bcca2cfd73d.profdata
diff --git a/chrome/common/extensions/api/file_browser_handlers/DIR_METADATA b/chrome/common/extensions/api/file_browser_handlers/DIR_METADATA new file mode 100644 index 0000000..e9400b87 --- /dev/null +++ b/chrome/common/extensions/api/file_browser_handlers/DIR_METADATA
@@ -0,0 +1 @@ +mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chrome/common/extensions/api/file_system_provider/DIR_METADATA b/chrome/common/extensions/api/file_system_provider/DIR_METADATA new file mode 100644 index 0000000..e9400b87 --- /dev/null +++ b/chrome/common/extensions/api/file_system_provider/DIR_METADATA
@@ -0,0 +1 @@ +mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chrome/common/extensions/api/file_system_provider_capabilities/DIR_METADATA b/chrome/common/extensions/api/file_system_provider_capabilities/DIR_METADATA new file mode 100644 index 0000000..e9400b87 --- /dev/null +++ b/chrome/common/extensions/api/file_system_provider_capabilities/DIR_METADATA
@@ -0,0 +1 @@ +mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chrome/services/speech/speech_recognition_recognizer_impl.cc b/chrome/services/speech/speech_recognition_recognizer_impl.cc index cc78088..142ba9b 100644 --- a/chrome/services/speech/speech_recognition_recognizer_impl.cc +++ b/chrome/services/speech/speech_recognition_recognizer_impl.cc
@@ -12,6 +12,7 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/metrics/histogram_functions.h" +#include "base/task/task_runner.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h" #include "build/build_config.h" @@ -190,7 +191,6 @@ &SpeechRecognitionRecognizerImpl::OnRecognitionStoppedCallback, weak_factory_.GetWeakPtr())); - // Unretained is safe because |this| owns the mojo::Remote. client_remote_.set_disconnect_handler( base::BindOnce(&SpeechRecognitionRecognizerImpl::OnClientHostDisconnected, weak_factory_.GetWeakPtr())); @@ -293,25 +293,6 @@ void SpeechRecognitionRecognizerImpl::OnLanguageChanged( const std::string& language) { - if (!task_runner_) { - task_runner_ = base::ThreadPool::CreateSequencedTaskRunner( - {base::MayBlock(), base::TaskPriority::BEST_EFFORT, - base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); - } - - // Changing the language requires a blocking call to check if the language - // pack exists on the device. - scoped_refptr<base::SequencedTaskRunner> current_task_runner = - base::SequencedTaskRunnerHandle::Get(); - task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&SpeechRecognitionRecognizerImpl::ChangeLanguage, - base::Unretained(this), language, current_task_runner)); -} - -void SpeechRecognitionRecognizerImpl::ChangeLanguage( - const std::string& language, - scoped_refptr<base::SequencedTaskRunner> main_sequence) { absl::optional<speech::SodaLanguagePackComponentConfig> language_component_config = GetLanguageComponentConfig(language); if (!language_component_config.has_value()) @@ -322,17 +303,40 @@ if (language_code == language_ || language_code == LanguageCode::kNone) return; - // Only change the language if the new language pack is installed. - base::FilePath config_path = GetLatestSodaLanguagePackDirectory(language); - if (base::PathExists(config_path)) { - config_path_ = config_path; - language_ = language_component_config.value().language_code; + if (!task_runner_) { + task_runner_ = base::ThreadPool::CreateSequencedTaskRunner( + {base::MayBlock(), base::TaskPriority::BEST_EFFORT, + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); + } - // SODA must be reset on the same sequence where it's actively used in order - // to avoid race conditions. - main_sequence->PostTask( - FROM_HERE, base::BindOnce(&SpeechRecognitionRecognizerImpl::ResetSoda, - base::Unretained(this))); + // Changing the language requires a blocking call to check if the language + // pack exists on the device. + scoped_refptr<base::SequencedTaskRunner> current_task_runner = + base::SequencedTaskRunnerHandle::Get(); + + base::FilePath config_file_path = + GetLatestSodaLanguagePackDirectory(language); + + task_runner_->PostTaskAndReplyWithResult( + FROM_HERE, + base::BindOnce( + [](base::FilePath config_path) { + return base::PathExists(config_path); + }, + config_file_path), + base::BindOnce(&SpeechRecognitionRecognizerImpl::ResetSodaWithNewLanguage, + weak_factory_.GetWeakPtr(), config_file_path, + language_code)); +} + +void SpeechRecognitionRecognizerImpl::ResetSodaWithNewLanguage( + base::FilePath config_path, + speech::LanguageCode language_code, + bool config_exists) { + if (config_exists) { + config_path_ = config_path; + language_ = language_code; + ResetSoda(); } }
diff --git a/chrome/services/speech/speech_recognition_recognizer_impl.h b/chrome/services/speech/speech_recognition_recognizer_impl.h index 0c8dcd1..5edbbff 100644 --- a/chrome/services/speech/speech_recognition_recognizer_impl.h +++ b/chrome/services/speech/speech_recognition_recognizer_impl.h
@@ -102,8 +102,9 @@ private: void OnLanguageChanged(const std::string& language) final; - void ChangeLanguage(const std::string& language, - scoped_refptr<base::SequencedTaskRunner> main_sequence); + void ResetSodaWithNewLanguage(base::FilePath config_path, + speech::LanguageCode language_code, + bool config_exists); void RecordDuration(); // Called as a response to sending a SpeechRecognitionEvent to the client
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/BUILD.gn b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/BUILD.gn index e580d72..eb6b658 100644 --- a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/BUILD.gn +++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/BUILD.gn
@@ -18,6 +18,8 @@ sources = [ "big_file/sw.js", "big_file/test.js", + "configure/sw.js", + "configure/test.js", "copy_entry/sw.js", "copy_entry/test.js", "create_file/sw.js", @@ -27,6 +29,8 @@ "get_all/sw.js", "get_all/test.js", "helpers.js", + "move_entry/sw.js", + "move_entry/test.js", "provider.js", "read_directory/sw.js", "read_directory/test.js",
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/manifest.json b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/manifest.json new file mode 100644 index 0000000..d63a398 --- /dev/null +++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/manifest.json
@@ -0,0 +1,24 @@ +{ + // chrome-extension://pkplfbidichfdicaijlchgnapepdginl + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtDfX9dHNh948bt00YhZBm3P6E5QLaOt+v8kXVtibQfiPtOD2FTScB/f0wX/EQWVO7BkaSOsRkTPcPIgocyMPYr2FLgqGLFlYT9nQpKJZUFNF5oJ5rG6Nv7ppf4zEB3j6da1IBRTz2yOZ+6O1TMZxol/V62/QcqrJeggsHTEPGLdr9Ua4b1Ka0xKJnJngZljsbw93FI1o+P9dAh5BS6wTPiZI/vmJVjvMTkSTnaZ3n9Go2t7A0XLcSxLcVyuLAd2mAvSN0mIviOukdM66wr7llif71nKuUt+4qvlr/r9HfwzN6pA4jkwhtS1UD+3CmB+wsHwsnohNcuu4FIQ6rgq/7QIDAQAB", + "name": "chrome.fileSystemProvider.onConfigureRequested", + "version": "0.1", + "manifest_version": 3, + "description": + "Test for chrome.fileSystemProvider.onConfigureRequested() for service workers.", + "permissions": [ + "fileSystemProvider", + { + "fileSystem": ["requestFileSystem", "write"] + }, + "fileManagerPrivate" + ], + "file_system_provider_capabilities": { + "configurable": true, + "source": "device" + }, + "background": { + "service_worker": "sw.js", + "type": "module" + } +}
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/sw.js b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/sw.js new file mode 100644 index 0000000..ac074135 --- /dev/null +++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/sw.js
@@ -0,0 +1,7 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {serviceWorkerMain} from '/_test_resources/api_test/file_system_provider/service_worker/provider.js'; + +serviceWorkerMain(self);
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/test.html b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/test.html new file mode 100644 index 0000000..9980fda0 --- /dev/null +++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/test.html
@@ -0,0 +1 @@ +<script type="module" src="test.js"></script>
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/test.js b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/test.js new file mode 100644 index 0000000..0ced1b3 --- /dev/null +++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/test.js
@@ -0,0 +1,81 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {mountTestFileSystem, promisifyWithLastError, remoteProvider} from '/_test_resources/api_test/file_system_provider/service_worker/helpers.js'; +// For shared constants. +import {TestFileSystemProvider} from '/_test_resources/api_test/file_system_provider/service_worker/provider.js'; + + +async function main() { + await navigator.serviceWorker.ready; + + const fileSystem = await mountTestFileSystem(); + + chrome.test.runTests([ + // Verify that the configuration flag is propagated properly. + async function configureConfigurable() { + try { + let providers = await promisifyWithLastError( + chrome.fileManagerPrivate.getProviders); + // Filter out native providers. + providers = providers.filter( + provider => provider.providerId.length == 0 || + provider.providerId[0] != '@'); + chrome.test.assertEq(providers.length, 1); + // For extension based providers, provider id is the same as + // extension id. + chrome.test.assertEq(chrome.runtime.id, providers[0].providerId); + chrome.test.assertEq( + chrome.runtime.getManifest().name, providers[0].name); + chrome.test.assertTrue(providers[0].configurable); + chrome.test.assertFalse(providers[0].multipleMounts); + chrome.test.assertEq('device', providers[0].source); + await new Promise( + resolve => chrome.fileManagerPrivate.configureVolume( + fileSystem.volumeInfo.volumeId, resolve)); + chrome.test.succeed(); + } catch (e) { + chrome.test.fail(e); + } + }, + + // Verify that chrome.fileManager.configureVolume is well wired + // to onConfigureRequested(). + async function configureSuccess() { + try { + await promisifyWithLastError( + chrome.fileManagerPrivate.configureVolume, + fileSystem.volumeInfo.volumeId); + await remoteProvider.waitForEvent('onConfigureRequested'); + chrome.test.succeed(); + } catch (e) { + chrome.test.fail(e); + } + }, + + // Verify that a failure is propagated properly. + async function configureFailure() { + try { + // Next call to configure should return error. + await remoteProvider.setConfig( + 'onConfigureRequestedError', + chrome.fileSystemProvider.ProviderError.FAILED, + ); + try { + await promisifyWithLastError( + chrome.fileManagerPrivate.configureVolume, + fileSystem.volumeInfo.volumeId); + chrome.test.fail('Configuration should have failed.'); + } catch (e) { + chrome.test.assertEq('Failed to complete configuration.', e.message); + chrome.test.succeed(); + } + } catch (e) { + chrome.test.fail(e); + } + } + ]); +} + +main();
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/helpers.js b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/helpers.js index 94e9737..a265b8a 100644 --- a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/helpers.js +++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/helpers.js
@@ -8,7 +8,7 @@ * @param {...?} args * @returns {!Promise<?>} */ -async function promisifyWithLastError(fn, ...args) { +export async function promisifyWithLastError(fn, ...args) { return new Promise((resolve, reject) => { fn(...args, (result) => { if (chrome.runtime.lastError) {
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/manifest.json b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/manifest.json new file mode 100644 index 0000000..d7d9ed8 --- /dev/null +++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/manifest.json
@@ -0,0 +1,25 @@ +{ + // chrome-extension://pkplfbidichfdicaijlchgnapepdginl + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtDfX9dHNh948bt00YhZBm3P6E5QLaOt+v8kXVtibQfiPtOD2FTScB/f0wX/EQWVO7BkaSOsRkTPcPIgocyMPYr2FLgqGLFlYT9nQpKJZUFNF5oJ5rG6Nv7ppf4zEB3j6da1IBRTz2yOZ+6O1TMZxol/V62/QcqrJeggsHTEPGLdr9Ua4b1Ka0xKJnJngZljsbw93FI1o+P9dAh5BS6wTPiZI/vmJVjvMTkSTnaZ3n9Go2t7A0XLcSxLcVyuLAd2mAvSN0mIviOukdM66wr7llif71nKuUt+4qvlr/r9HfwzN6pA4jkwhtS1UD+3CmB+wsHwsnohNcuu4FIQ6rgq/7QIDAQAB", + "name": "chrome.fileSystemProvider.onMoveEntryRequested", + "version": "0.1", + "manifest_version": 3, + "description": "Test for chrome.fileSystemProvider.onMoveEntryRequested() in service worker.", + "permissions": [ + "fileSystemProvider", + { + "fileSystem": [ + "requestFileSystem", + "write" + ] + }, + "fileManagerPrivate" + ], + "file_system_provider_capabilities": { + "source": "device" + }, + "background": { + "service_worker": "sw.js", + "type": "module" + } +} \ No newline at end of file
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/sw.js b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/sw.js new file mode 100644 index 0000000..120fa1fc --- /dev/null +++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/sw.js
@@ -0,0 +1,7 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {serviceWorkerMain} from '/_test_resources/api_test/file_system_provider/service_worker/provider.js'; + +serviceWorkerMain(self); \ No newline at end of file
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/test.html b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/test.html new file mode 100644 index 0000000..766f17d --- /dev/null +++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/test.html
@@ -0,0 +1 @@ +<script type="module" src="test.js"></script> \ No newline at end of file
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/test.js b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/test.js new file mode 100644 index 0000000..ee1db1ac --- /dev/null +++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/test.js
@@ -0,0 +1,76 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {mountTestFileSystem, remoteProvider} from '/_test_resources/api_test/file_system_provider/service_worker/helpers.js'; +// For shared constants. +import {TestFileSystemProvider} from '/_test_resources/api_test/file_system_provider/service_worker/provider.js'; + +async function main() { + await navigator.serviceWorker.ready; + const fileSystem = await mountTestFileSystem(); + + const srcPath = TestFileSystemProvider.FILE_READ_SUCCESS; + const dstPath = srcPath + '-moved'; + const FILE_MOVE_FAIL = 'move-fail.txt' + + await remoteProvider.addFiles({ + // Moving this file to a location which already holds a file will fail. + [`/${FILE_MOVE_FAIL}`]: { + metadata: { + isDirectory: false, + name: FILE_MOVE_FAIL, + modificationTime: new Date(2014, 4, 28, 10, 39, 15), + }, + }, + }); + + chrome.test.runTests([ + // Move an existing file to a non-existing destination. Should succeed. + async function moveEntrySuccess() { + try { + const sourceEntry = + await fileSystem.getFileEntry(srcPath, {create: false}); + chrome.test.assertFalse(sourceEntry.isDirectory); + const targetEntry = await new Promise( + (resolve, reject) => sourceEntry.moveTo( + fileSystem.fileSystem.root, dstPath, resolve, reject)); + chrome.test.assertEq(dstPath, targetEntry.name); + chrome.test.assertFalse(targetEntry.isDirectory); + // The source file should be deleted. + try { + await fileSystem.getFileEntry(srcPath, {create: false}); + chrome.test.fail('Source file not deleted.'); + } catch (e) { + chrome.test.assertEq('NotFoundError', e.name); + chrome.test.succeed(); + } + } catch (e) { + chrome.test.fail(e); + } + }, + + // Move an existing file to a location which already holds a file. Should + // fail. + async function moveEntryExistsError() { + try { + const sourceEntry = + await fileSystem.getFileEntry(FILE_MOVE_FAIL, {create: false}); + chrome.test.assertFalse(sourceEntry.isDirectory); + try { + await new Promise( + (resolve, reject) => sourceEntry.moveTo( + fileSystem.fileSystem.root, dstPath, resolve, reject)); + chrome.test.fail('Succeeded, but should fail.'); + } catch (e) { + chrome.test.assertEq('InvalidModificationError', e.name); + chrome.test.succeed(); + } + } catch (e) { + chrome.test.fail(e); + } + }, + ]); +} + +main(); \ No newline at end of file
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/provider.js b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/provider.js index d8918c1a..51d33250 100644 --- a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/provider.js +++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/provider.js
@@ -202,10 +202,12 @@ this.setHandlerEnabled('onAbortRequested', true); this.setHandlerEnabled('onAddWatcherRequested', true); this.setHandlerEnabled('onCloseFileRequested', true); + this.setHandlerEnabled('onConfigureRequested', true); this.setHandlerEnabled('onCopyEntryRequested', true); this.setHandlerEnabled('onCreateFileRequested', true); this.setHandlerEnabled('onDeleteEntryRequested', true); this.setHandlerEnabled('onGetMetadataRequested', true); + this.setHandlerEnabled('onMoveEntryRequested', true); this.setHandlerEnabled('onOpenFileRequested', true); this.setHandlerEnabled('onReadDirectoryRequested', true); this.setHandlerEnabled('onReadFileRequested', true); @@ -456,6 +458,23 @@ }; /** + * + * @param {!chrome.fileSystemProvider.ConfigureRequestedOptions} options + * @param {function()} onSuccess + * @param {function(chrome.fileSystemProvider.ProviderError)} onError Error + * callback. + */ + onConfigureRequested(options, onSuccess, onError) { + this.recordEvent('onConfigureRequested', options); + const error = this.testConfig['onConfigureRequestedError']; + if (error) { + onError(error); + } else { + onSuccess(); + } + } + + /** * FSP: implementation of copying an entry within the same file system. * * @param {!chrome.fileSystemProvider.CopyEntryRequestedOptions} options @@ -594,6 +613,58 @@ }; /** + * FSP: implementation of moving an entry within the same file system. + * + * @param {!chrome.fileSystemProvider.MoveEntryRequestedOptions} options + * Options. + * @param {function()} onSuccess Success callback + * @param {function(chrome.fileSystemProvider.ProviderError)} onError Error + * callback with an error code. + */ + onMoveEntryRequested(options, onSuccess, onError) { + if (options.fileSystemId !== this.fileSystemId) { + onError(chrome.fileSystemProvider.ProviderError.SECURITY); + return; + } + + if (options.sourcePath === '/') { + onError(chrome.fileSystemProvider.ProviderError.INVALID_OPERATION); + return; + } + + const source = this.findEntryByPath(options.sourcePath); + if (!source) { + onError(chrome.fileSystemProvider.ProviderError.NOT_FOUND); + return; + } + + if (this.findEntryByPath(options.targetPath)) { + onError(chrome.fileSystemProvider.ProviderError.EXISTS); + return; + } + + // Move the metadata with changing the 'name' field. + let {dirPath, fileName} = splitPath(options.targetPath); + const dir = this.findEntryByPath(dirPath); + if (!dir) { + onError(chrome.fileSystemProvider.ProviderError.NOT_FOUND); + return; + } + if (!dir.metadata.isDirectory) { + onError(chrome.fileSystemProvider.ProviderError.NOT_A_DIRECTORY); + return; + } + source.metadata.name = fileName; + dir.children[fileName] = source; + + // Remove the source file. + ({dirPath, fileName} = splitPath(options.sourcePath)); + delete this.findEntryByPath(dirPath).children[fileName]; + + onSuccess(); + } + + /** * Returns entries in the requested directory. * * @param {!chrome.fileSystemProvider.ReadDirectoryRequestedOptions} options
diff --git a/chrome/test/data/pdf/fullscreen_test.ts b/chrome/test/data/pdf/fullscreen_test.ts index 3fa33f9..bf41392 100644 --- a/chrome/test/data/pdf/fullscreen_test.ts +++ b/chrome/test/data/pdf/fullscreen_test.ts
@@ -23,6 +23,35 @@ await eventToPromise('fullscreenchange', scroller); } +async function enterAndExitFullscreen(): Promise<void> { + // Subsequent calls to requestFullScreen() fail with an "API can only be + // initiated by a user gesture" error, so we need to run with user + // gesture. + function enterFullscreenWithUserGesture(): Promise<void> { + return new Promise(res => { + chrome.test.runWithUserGesture(() => { + ensureFullscreen().then(res); + }); + }); + } + + await enterFullscreenWithUserGesture(); + document.exitFullscreen(); + await eventToPromise('fullscreenchange', scroller); +} + +async function assertEnterAndExitFullscreenWithType(fittingType: FittingType): + Promise<void> { + // Fullscreen must be exited at the start of this test in order for it to + // function properly. + chrome.test.assertTrue(document.fullscreenElement === null); + + viewer.viewport.setFittingType(fittingType); + await enterAndExitFullscreen(); + chrome.test.assertTrue(document.fullscreenElement === null); + chrome.test.assertEq(fittingType, viewer.viewport.fittingType); +} + const tests = [ async function testFullscreen() { chrome.test.assertTrue(scroller !== null); @@ -138,9 +167,6 @@ chrome.test.succeed(); }); }, - // Note: The following test needs to be the last one, because subsequent calls - // to requestFullScreen() fail with an "API can only be initiated by a user - // gesture" error. async function testFocusAfterExiting() { await ensureFullscreen(); document.exitFullscreen(); @@ -148,6 +174,32 @@ chrome.test.assertEq('EMBED', getDeepActiveElement()!.nodeName); chrome.test.succeed(); }, + async function testZoomAfterExiting() { + // Fullscreen must be exited at the start of this test in order for it to + // function properly. + chrome.test.assertTrue(document.fullscreenElement === null); + + // Zoom before fullscreen should be restored after entering and exiting + // fullscreen. + viewer.viewport.setZoom(0.5); + await enterAndExitFullscreen(); + chrome.test.assertEq(0.5, viewer.viewport.getZoom()); + chrome.test.assertEq(FittingType.NONE, viewer.viewport.fittingType); + + chrome.test.succeed(); + }, + async function testEnterAndExitFullscreenWithType_FitToPage() { + assertEnterAndExitFullscreenWithType(FittingType.FIT_TO_PAGE); + chrome.test.succeed(); + }, + async function testEnterAndExitFullscreenWithType_FitToWidth() { + assertEnterAndExitFullscreenWithType(FittingType.FIT_TO_WIDTH); + chrome.test.succeed(); + }, + async function testEnterAndExitFullscreenWithType_FitToHeight() { + assertEnterAndExitFullscreenWithType(FittingType.FIT_TO_HEIGHT); + chrome.test.succeed(); + }, ]; chrome.test.runTests(tests);
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn index c530c5f..bef3c3d 100644 --- a/chrome/test/data/webui/BUILD.gn +++ b/chrome/test/data/webui/BUILD.gn
@@ -444,10 +444,7 @@ ] if (is_chromeos_ash) { - in_files += [ - "cr_focus_row_behavior_test.ts", - "chromeos/ash_common/list_property_update_behavior_tests.ts", - ] + in_files += [ "cr_focus_row_behavior_test.ts" ] } deps = [ "//ui/webui/resources:library" ] @@ -483,7 +480,10 @@ ] if (is_chromeos_ash) { - input_files += [ "chromeos/arc_account_picker/test_util.js" ] + input_files += [ + "chromeos/arc_account_picker/test_util.js", + "chromeos/ash_common/i18n_behavior_test.js", + ] } if (enable_webui_certificate_viewer) { @@ -609,6 +609,7 @@ if (is_chromeos_ash) { input_files += [ "chromeos/test_store.js" ] deps += [ + "chromeos/ash_common:build_grdp", "chromeos/cloud_upload:build_grdp", "chromeos/manage_mirrorsync:build_grdp", "chromeos/personalization_app:build_grdp", @@ -619,6 +620,7 @@ "//ui/file_manager:build_tests_grdp", ] grdp_files += [ + "$target_gen_dir/chromeos/ash_common/resources.grdp", "$target_gen_dir/chromeos/cloud_upload/resources.grdp", "$target_gen_dir/chromeos/personalization_app/resources.grdp", "$target_gen_dir/chromeos/shortcut_customization/resources.grdp",
diff --git a/chrome/test/data/webui/chromeos/ash_common/BUILD.gn b/chrome/test/data/webui/chromeos/ash_common/BUILD.gn index d93cc88..90584a2 100644 --- a/chrome/test/data/webui/chromeos/ash_common/BUILD.gn +++ b/chrome/test/data/webui/chromeos/ash_common/BUILD.gn
@@ -3,6 +3,39 @@ # found in the LICENSE file. import("//third_party/closure_compiler/compile_js.gni") +import("//tools/typescript/ts_library.gni") +import("//ui/webui/resources/tools/generate_grd.gni") + +ts_library("build_ts") { + root_dir = "." + out_dir = "$target_gen_dir/tsc" + tsconfig_base = "tsconfig_base.json" + path_mappings = [ "chrome://webui-test/*|" + + rebase_path("$root_gen_dir/chrome/test/data/webui/tsc/*", + target_gen_dir) ] + in_files = [ + "cr_container_shadow_behavior_test.ts", + "cr_policy_indicator_behavior_tests.ts", + "cr_policy_strings.ts", + "cr_scrollable_behavior_tests.ts", + "list_property_update_behavior_tests.ts", + ] + deps = [ + "../..:build_ts", + "//ui/webui/resources:library", + ] + extra_deps = [ "//ash/webui/common/resources:generate_definitions" ] +} + +generate_grd("build_grdp") { + grd_prefix = "webui_chromeos_ash_common" + out_grd = "$target_gen_dir/resources.grdp" + + deps = [ ":build_ts" ] + manifest_files = + filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ]) + resource_path_prefix = "chromeos/ash_common" +} js_type_check("closure_compile") { is_polymer3 = true
diff --git a/chrome/test/data/webui/chromeos/ash_common/ash_common_resources_browsertest.js b/chrome/test/data/webui/chromeos/ash_common/ash_common_resources_browsertest.js index bb8c23e8..c9bbc6b2c 100644 --- a/chrome/test/data/webui/chromeos/ash_common/ash_common_resources_browsertest.js +++ b/chrome/test/data/webui/chromeos/ash_common/ash_common_resources_browsertest.js
@@ -32,3 +32,52 @@ TEST_F('AshCommonResourcesListPropertyUpdateBehaviorTest', 'All', function() { mocha.run(); }); + +var AshCommonResourcesI18nBehaviorTest = + class extends AshCommonResourcesBrowserTest { + /** @override */ + get browsePreload() { + return 'chrome://webui-test/test_loader.html?module=chromeos/ash_common/i18n_behavior_test.js'; + } +}; + +TEST_F('AshCommonResourcesI18nBehaviorTest', 'All', function() { + mocha.run(); +}); + +var AshCommonResourcesContainerShadowBehaviorTest = + class extends AshCommonResourcesBrowserTest { + /** @override */ + get browsePreload() { + return 'chrome://webui-test/test_loader.html?module=chromeos/ash_common/cr_container_shadow_behavior_test.js'; + } +}; + +TEST_F('AshCommonResourcesContainerShadowBehaviorTest', 'All', function() { + mocha.run(); +}); + + +var AshCommonResourcesPolicyIndicatorBehaviorTest = + class extends AshCommonResourcesBrowserTest { + /** @override */ + get browsePreload() { + return 'chrome://webui-test/test_loader.html?module=chromeos/ash_common/cr_policy_indicator_behavior_tests.js'; + } +}; + +TEST_F('AshCommonResourcesPolicyIndicatorBehaviorTest', 'All', function() { + mocha.run(); +}); + +var AshCommonResourcesScrollableBehaviorTest = + class extends AshCommonResourcesBrowserTest { + /** @override */ + get browsePreload() { + return 'chrome://webui-test/test_loader.html?module=chromeos/ash_common/cr_scrollable_behavior_tests.js'; + } +}; + +TEST_F('AshCommonResourcesScrollableBehaviorTest', 'All', function() { + mocha.run(); +});
diff --git a/chrome/test/data/webui/cr_elements/cr_container_shadow_behavior_test.ts b/chrome/test/data/webui/chromeos/ash_common/cr_container_shadow_behavior_test.ts similarity index 95% rename from chrome/test/data/webui/cr_elements/cr_container_shadow_behavior_test.ts rename to chrome/test/data/webui/chromeos/ash_common/cr_container_shadow_behavior_test.ts index 1779a109..0f8401c 100644 --- a/chrome/test/data/webui/cr_elements/cr_container_shadow_behavior_test.ts +++ b/chrome/test/data/webui/chromeos/ash_common/cr_container_shadow_behavior_test.ts
@@ -3,7 +3,7 @@ // found in the LICENSE file. // clang-format off -import {CrContainerShadowBehavior} from 'chrome://resources/cr_elements/cr_container_shadow_behavior.js'; +import {CrContainerShadowBehavior} from 'chrome://resources/ash/common/cr_container_shadow_behavior.js'; import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
diff --git a/chrome/test/data/webui/cr_elements/cr_policy_indicator_behavior_tests.ts b/chrome/test/data/webui/chromeos/ash_common/cr_policy_indicator_behavior_tests.ts similarity index 98% rename from chrome/test/data/webui/cr_elements/cr_policy_indicator_behavior_tests.ts rename to chrome/test/data/webui/chromeos/ash_common/cr_policy_indicator_behavior_tests.ts index a11ba88f..733ec13 100644 --- a/chrome/test/data/webui/cr_elements/cr_policy_indicator_behavior_tests.ts +++ b/chrome/test/data/webui/chromeos/ash_common/cr_policy_indicator_behavior_tests.ts
@@ -7,7 +7,7 @@ // clang-format off import './cr_policy_strings.js'; -import {CrPolicyIndicatorBehavior, CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.js'; +import {CrPolicyIndicatorBehavior, CrPolicyIndicatorType} from 'chrome://resources/ash/common/cr_policy_indicator_behavior.js'; import {isChromeOS} from 'chrome://resources/js/cr.m.js'; import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
diff --git a/chrome/test/data/webui/chromeos/ash_common/cr_policy_strings.ts b/chrome/test/data/webui/chromeos/ash_common/cr_policy_strings.ts new file mode 100644 index 0000000..2be4e3a --- /dev/null +++ b/chrome/test/data/webui/chromeos/ash_common/cr_policy_strings.ts
@@ -0,0 +1,22 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {CrPolicyStringsType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_mixin.js'; + +/** @fileoverview Sets up strings used by policy indicator elements. */ +export const CrPolicyStrings: CrPolicyStringsType = { + controlledSettingExtension: 'extension: $1', + controlledSettingExtensionWithoutName: 'extension', + controlledSettingPolicy: 'policy', + controlledSettingRecommendedMatches: 'matches', + controlledSettingRecommendedDiffers: 'differs', + controlledSettingShared: 'shared: $1', + controlledSettingWithOwner: 'owner: $1', + controlledSettingNoOwner: 'owner', + controlledSettingParent: 'parent', + controlledSettingChildRestriction: 'Restricted for child', +}; + +// Necessary for tests residing within a JS module. +Object.assign(window, {CrPolicyStrings});
diff --git a/chrome/test/data/webui/cr_elements/cr_scrollable_behavior_tests.ts b/chrome/test/data/webui/chromeos/ash_common/cr_scrollable_behavior_tests.ts similarity index 97% rename from chrome/test/data/webui/cr_elements/cr_scrollable_behavior_tests.ts rename to chrome/test/data/webui/chromeos/ash_common/cr_scrollable_behavior_tests.ts index c29525f..e15160bb 100644 --- a/chrome/test/data/webui/cr_elements/cr_scrollable_behavior_tests.ts +++ b/chrome/test/data/webui/chromeos/ash_common/cr_scrollable_behavior_tests.ts
@@ -5,7 +5,7 @@ // clang-format off import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js'; -import {CrScrollableBehavior} from 'chrome://resources/cr_elements/cr_scrollable_behavior.js'; +import {CrScrollableBehavior} from 'chrome://resources/ash/common/cr_scrollable_behavior.js'; import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js'; import {flush, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
diff --git a/chrome/test/data/webui/cr_elements/i18n_behavior_test.js b/chrome/test/data/webui/chromeos/ash_common/i18n_behavior_test.js similarity index 95% rename from chrome/test/data/webui/cr_elements/i18n_behavior_test.js rename to chrome/test/data/webui/chromeos/ash_common/i18n_behavior_test.js index 559a296..b0af9d7 100644 --- a/chrome/test/data/webui/cr_elements/i18n_behavior_test.js +++ b/chrome/test/data/webui/chromeos/ash_common/i18n_behavior_test.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; suite('I18nBehaviorModuleTest', function() { const allowedByDefault = '<a href="https://google.com">Google!</a>';
diff --git a/chrome/test/data/webui/chromeos/ash_common/tsconfig_base.json b/chrome/test/data/webui/chromeos/ash_common/tsconfig_base.json new file mode 100644 index 0000000..5d3097c9 --- /dev/null +++ b/chrome/test/data/webui/chromeos/ash_common/tsconfig_base.json
@@ -0,0 +1,10 @@ +{ + "extends": "../../../../../../tools/typescript/tsconfig_base.json", + "compilerOptions": { + "allowJs": true, + "typeRoots": [ + "./../../../../../../third_party/node/node_modules/@types" + ], + "types": ["mocha", "trusted-types"] + } +}
diff --git a/chrome/test/data/webui/chromeos/diagnostics/drawing_provider_test.js b/chrome/test/data/webui/chromeos/diagnostics/drawing_provider_test.js index 9a16475..8a7a6f6 100644 --- a/chrome/test/data/webui/chromeos/diagnostics/drawing_provider_test.js +++ b/chrome/test/data/webui/chromeos/diagnostics/drawing_provider_test.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {CanvasDrawingProvider, DESTINATION_OVER, LINE_CAP, LINE_WIDTH, MARK_COLOR, MARK_RADIUS, TRAIL_COLOR} from 'chrome://diagnostics/drawing_provider.js'; +import {CanvasDrawingProvider, DESTINATION_OVER, LINE_CAP, LINE_WIDTH, MARK_COLOR, MARK_RADIUS, MAX_TOUCH_PRESSURE, TRAIL_COLOR, TRAIL_MAX_OPACITY} from 'chrome://diagnostics/drawing_provider.js'; import {assertDeepEquals, assertEquals} from '../../chai_assert.js'; @@ -61,18 +61,21 @@ const y0 = 15; const x1 = 20; const y1 = 25; + const pressure = 100; const expectedMock = [ 'beginPath', `moveTo:${x0}~${y0}`, `lineTo:${x1}~${y1}`, 'stroke', ]; + const expectedStrokeStyle = `rgba(${TRAIL_COLOR}, ${ + TRAIL_MAX_OPACITY * (pressure / MAX_TOUCH_PRESSURE)})`; const drawingProvider = initializeDrawingProvider(); - drawingProvider.drawTrail(x0, y0, x1, y1); + drawingProvider.drawTrail(x0, y0, x1, y1, pressure); assertDeepEquals(expectedMock, drawingProvider.getCtx().getMock()); - assertEquals(TRAIL_COLOR, drawingProvider.getStrokeStyle()); + assertEquals(expectedStrokeStyle, drawingProvider.getStrokeStyle()); }); test('TestDrawTrailMark', () => {
diff --git a/chrome/test/data/webui/chromeos/parent_access/parent_access_app_test.js b/chrome/test/data/webui/chromeos/parent_access/parent_access_app_test.js index 3a264f90c..e9114937 100644 --- a/chrome/test/data/webui/chromeos/parent_access/parent_access_app_test.js +++ b/chrome/test/data/webui/chromeos/parent_access/parent_access_app_test.js
@@ -6,29 +6,59 @@ import 'chrome://parent-access/parent_access_app.js'; import {Screens} from 'chrome://parent-access/parent_access_app.js'; -import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {ParentAccessParams, ParentAccessParams_FlowType, WebApprovalsParams} from 'chrome://parent-access/parent_access_ui.mojom-webui.js'; +import {setParentAccessParamsForTest} from 'chrome://parent-access/parent_access_ui_handler.js'; +import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; window.parent_access_app_tests = {}; parent_access_app_tests.suiteName = 'ParentAccessAppTest'; /** @enum {string} */ parent_access_app_tests.TestNames = { - TestShowAfterFlow: 'Tests that the after flow is shown', + TestShowWebApprovalsAfterFlow: + 'Tests that the web approvals after flow is shown', }; -suite(parent_access_app_tests.suiteName, function() { - let parentAccessApp; +function strToMojoString16(str) { + return {data: str.split('').map(ch => ch.charCodeAt(0))}; +} +suite(parent_access_app_tests.suiteName, function() { setup(function() { PolymerTest.clearBody(); - parentAccessApp = document.createElement('parent-access-app'); - document.body.appendChild(parentAccessApp); - flush(); }); - test(parent_access_app_tests.TestNames.TestShowAfterFlow, function() { - assertEquals(parentAccessApp.currentScreen_, Screens.ONLINE_FLOW); - parentAccessApp.dispatchEvent(new CustomEvent('show-after')); - assertEquals(parentAccessApp.currentScreen_, Screens.AFTER_FLOW); - }); + test( + parent_access_app_tests.TestNames.TestShowWebApprovalsAfterFlow, + async () => { + // Set up the ParentAccessParams for the web approvals flow. + const parentAccessParams = new ParentAccessParams(); + parentAccessParams.flowType = + ParentAccessParams_FlowType.kWebsiteAccess; + const webApprovalsParams = new WebApprovalsParams(); + webApprovalsParams.url = {url: 'https://testing.com'}; + webApprovalsParams.childDisplayName = strToMojoString16('Child Name'); + webApprovalsParams.faviconPngBytes = []; + parentAccessParams.flowTypeParams = {webApprovalsParams}; + setParentAccessParamsForTest({params: parentAccessParams}); + + // Create app element. + const parentAccessApp = document.createElement('parent-access-app'); + document.body.appendChild(parentAccessApp); + await flushTasks(); + + // Verify online flow is showing and switch to the after screen. + assertEquals(parentAccessApp.currentScreen_, Screens.ONLINE_FLOW); + parentAccessApp.dispatchEvent(new CustomEvent('show-after')); + await flushTasks(); + + // Verify after flow is showing. + assertEquals(parentAccessApp.currentScreen_, Screens.AFTER_FLOW); + // Verify the local web approvals after screen is showing. + const parentAccessAfter = + parentAccessApp.shadowRoot.querySelector('parent-access-after'); + const webApprovalsAfter = parentAccessAfter.shadowRoot.querySelector( + 'local-web-approvals-after'); + assertNotEquals(null, webApprovalsAfter); + }); });
diff --git a/chrome/test/data/webui/chromeos/parent_access/parent_access_browsertest.js b/chrome/test/data/webui/chromeos/parent_access/parent_access_browsertest.js index a5797d1..8b3070c 100644 --- a/chrome/test/data/webui/chromeos/parent_access/parent_access_browsertest.js +++ b/chrome/test/data/webui/chromeos/parent_access/parent_access_browsertest.js
@@ -23,8 +23,9 @@ } }; -TEST_F('ParentAccessAppTest', 'TestShowAfterFlow', function() { - this.runMochaTest(parent_access_app_tests.TestNames.TestShowAfterFlow); +TEST_F('ParentAccessAppTest', 'TestShowWebApprovalsAfterFlow', function() { + this.runMochaTest( + parent_access_app_tests.TestNames.TestShowWebApprovalsAfterFlow); }); var ParentAccessControllerTest = class extends testing.Test {
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js b/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js index 3422732..e5f60933 100644 --- a/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js +++ b/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js
@@ -13,7 +13,7 @@ import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js'; -import {isVisible} from '../../test_util.js'; +import {eventToPromise, isVisible} from '../../test_util.js'; export function shimlessRMAAppTest() { /** @type {?ShimlessRma} */ @@ -795,4 +795,28 @@ assertTrue(!!logsDialog); assertFalse(logsDialog.open); }); + + test('KeyboardShortcutOpensLogsDialog', async () => { + await initializeShimlessRMAApp(fakeStates, fakeChromeVersion[0]); + + // Confirm logs dialog starts closed. + const logsDialog = component.shadowRoot.querySelector('#logsDialog'); + assertTrue(!!logsDialog); + assertFalse(logsDialog.open); + + const keydownEventPromise = eventToPromise('keydown', component); + component.dispatchEvent(new KeyboardEvent( + 'keydown', + { + bubbles: true, + composed: true, + key: 'L', + altKey: true, + shiftKey: true, + }, + )); + + await keydownEventPromise; + assertTrue(logsDialog.open); + }); }
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/BUILD.gn b/chrome/test/data/webui/chromeos/shortcut_customization/BUILD.gn index 9eee6b1..b1bdc5ba 100644 --- a/chrome/test/data/webui/chromeos/shortcut_customization/BUILD.gn +++ b/chrome/test/data/webui/chromeos/shortcut_customization/BUILD.gn
@@ -26,6 +26,7 @@ "accelerator_subsection_test.ts", "accelerator_view_test.ts", "fake_shortcut_provider_test.ts", + "input_key_test.ts", "shortcut_customization_test.ts", "shortcut_customization_test_util.ts", "shortcut_utils_test.ts",
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/input_key_test.ts b/chrome/test/data/webui/chromeos/shortcut_customization/input_key_test.ts new file mode 100644 index 0000000..cd9ccd8 --- /dev/null +++ b/chrome/test/data/webui/chromeos/shortcut_customization/input_key_test.ts
@@ -0,0 +1,58 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'chrome://shortcut-customization/js/input_key.js'; +import 'chrome://webui-test/mojo_webui_test_support.js'; + +import {IronIconElement} from '//resources/polymer/v3_0/iron-icon/iron-icon.js'; +import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {InputKeyElement} from 'chrome://shortcut-customization/js/input_key.js'; +import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; +import {isVisible} from 'chrome://webui-test/test_util.js'; + +function initInputKeyElement(): InputKeyElement { + const element = document.createElement('input-key'); + document.body.appendChild(element); + flush(); + return element; +} + +suite('inputKeyTest', function() { + let inputKeyElement: InputKeyElement|null = null; + + teardown(() => { + if (inputKeyElement) { + inputKeyElement.remove(); + } + inputKeyElement = null; + }); + + test('BasicKeys', async () => { + inputKeyElement = initInputKeyElement(); + inputKeyElement.key = 'a'; + await flush(); + + const keyElement = inputKeyElement.shadowRoot!.querySelector('#key-text'); + assertTrue(!!keyElement); + assertTrue(isVisible(keyElement)); + assertEquals('a', keyElement.textContent); + + const iconElement = inputKeyElement.shadowRoot!.querySelector('#key-icon'); + assertFalse(isVisible(iconElement)); + }); + + test('IconKeys', async () => { + inputKeyElement = initInputKeyElement(); + inputKeyElement.key = 'PrintScreen'; + await flush(); + + const iconElement = inputKeyElement.shadowRoot!.querySelector( + '#key-icon') as IronIconElement; + assertTrue(isVisible(iconElement)); + assertEquals('shortcut-customization:overview', iconElement.icon); + + const keyElement = inputKeyElement.shadowRoot!.querySelector('#key-text'); + assertFalse(isVisible(keyElement)); + }); +}); \ No newline at end of file
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_browsertest.js b/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_browsertest.js index 0a83e5e13..16d14459 100644 --- a/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_browsertest.js +++ b/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_browsertest.js
@@ -39,6 +39,7 @@ ['AcceleratorEditDialogTest', 'accelerator_edit_dialog_test.js'], ['AcceleratorSubsectionTest', 'accelerator_subsection_test.js'], ['FakeShortcutProviderTest', 'fake_shortcut_provider_test.js'], + ['InputKeyTest', 'input_key_test.js'], ['ShortcutCustomizationApp', 'shortcut_customization_test.js'], ['ShortcutUtils', 'shortcut_utils_test.js'], ];
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/cr_policy_network_behavior_mojo_tests.js b/chrome/test/data/webui/cr_components/chromeos/network/cr_policy_network_behavior_mojo_tests.js index 95efc76..b5e2f9b8 100644 --- a/chrome/test/data/webui/cr_components/chromeos/network/cr_policy_network_behavior_mojo_tests.js +++ b/chrome/test/data/webui/cr_components/chromeos/network/cr_policy_network_behavior_mojo_tests.js
@@ -4,8 +4,8 @@ /** @fileoverview Suite of tests for CrPolicyIndicatorBehavior. */ +import {CrPolicyIndicatorType} from 'chrome://resources/ash/common/cr_policy_indicator_behavior.js'; import {CrPolicyNetworkBehaviorMojo} from 'chrome://resources/ash/common/network/cr_policy_network_behavior_mojo.js'; -import {CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.js'; import {PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js'; import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/test/data/webui/cr_components/chromeos/traffic_counters/BUILD.gn b/chrome/test/data/webui/cr_components/chromeos/traffic_counters/BUILD.gn index 062f8fa..d36a6894 100644 --- a/chrome/test/data/webui/cr_components/chromeos/traffic_counters/BUILD.gn +++ b/chrome/test/data/webui/cr_components/chromeos/traffic_counters/BUILD.gn
@@ -21,6 +21,7 @@ js_library("traffic_counters_test") { deps = [ "../../..:chai_assert", + "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources/network:mojo_interface_provider", "//ash/webui/common/resources/network:onc_mojo", "//ash/webui/common/resources/network_health:network_health_container", @@ -29,7 +30,6 @@ "//chromeos/services/network_config/public/mojom:mojom_webui_js", "//chromeos/services/network_config/public/mojom:network_types_webui_js", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "$externs_path/mocha-2.5.js" ] }
diff --git a/chrome/test/data/webui/cr_elements/BUILD.gn b/chrome/test/data/webui/cr_elements/BUILD.gn index cefacd9a..ae86822e 100644 --- a/chrome/test/data/webui/cr_elements/BUILD.gn +++ b/chrome/test/data/webui/cr_elements/BUILD.gn
@@ -55,7 +55,6 @@ "cr_tree_test.ts", "cr_view_manager_test.ts", "find_shortcut_mixin_test.ts", - "i18n_behavior_test.js", "i18n_mixin_test.ts", "iron_list_focus_test.ts", "list_property_update_mixin_tests.ts", @@ -63,12 +62,7 @@ ] if (is_chromeos_ash) { - non_preprocessed_files += [ - "cr_container_shadow_behavior_test.ts", - "cr_policy_indicator_behavior_tests.ts", - "cr_scrollable_behavior_tests.ts", - "cr_searchable_drop_down_tests.ts", - ] + non_preprocessed_files += [ "cr_searchable_drop_down_tests.ts" ] } preprocessed_folder = "$target_gen_dir/preprocessed"
diff --git a/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js b/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js index 3aaa4fbf..541b441 100644 --- a/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js +++ b/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js
@@ -47,20 +47,6 @@ mocha.run(); }); -GEN('#if BUILDFLAG(IS_CHROMEOS_ASH)'); -var CrElementsContainerShadowBehaviorTest = - class extends CrElementsBrowserTest { - /** @override */ - get browsePreload() { - return 'chrome://webui-test/test_loader.html?module=cr_elements/cr_container_shadow_behavior_test.js'; - } -}; - -TEST_F('CrElementsContainerShadowBehaviorTest', 'All', function() { - mocha.run(); -}); -GEN('#endif'); - var CrElementsContainerShadowMixinTest = class extends CrElementsBrowserTest { /** @override */ get browsePreload() { @@ -146,17 +132,6 @@ mocha.run(); }); -var CrElementsI18nBehaviorTest = class extends CrElementsBrowserTest { - /** @override */ - get browsePreload() { - return 'chrome://webui-test/test_loader.html?module=cr_elements/i18n_behavior_test.js'; - } -}; - -TEST_F('CrElementsI18nBehaviorTest', 'All', function() { - mocha.run(); -}); - var CrElementsI18nMixinTest = class extends CrElementsBrowserTest { /** @override */ get browsePreload() { @@ -247,19 +222,6 @@ mocha.run(); }); -GEN('#if BUILDFLAG(IS_CHROMEOS_ASH)'); -var CrElementsScrollableBehaviorTest = class extends CrElementsBrowserTest { - /** @override */ - get browsePreload() { - return 'chrome://webui-test/test_loader.html?module=cr_elements/cr_scrollable_behavior_tests.js'; - } -}; - -TEST_F('CrElementsScrollableBehaviorTest', 'All', function() { - mocha.run(); -}); -GEN('#endif'); - var CrElementsScrollableMixinTest = class extends CrElementsBrowserTest { /** @override */ get browsePreload() { @@ -373,20 +335,6 @@ mocha.run(); }); -GEN('#if BUILDFLAG(IS_CHROMEOS_ASH)'); -var CrElementsPolicyIndicatorBehaviorTest = - class extends CrElementsBrowserTest { - /** @override */ - get browsePreload() { - return 'chrome://webui-test/test_loader.html?module=cr_elements/cr_policy_indicator_behavior_tests.js'; - } -}; - -TEST_F('CrElementsPolicyIndicatorBehaviorTest', 'All', function() { - mocha.run(); -}); -GEN('#endif'); - var CrElementsPolicyIndicatorMixinTest = class extends CrElementsBrowserTest { /** @override */ get browsePreload() {
diff --git a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js index 3fa519e..3476cace 100644 --- a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js +++ b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {CrPolicyIndicatorType} from '//resources/cr_elements/policy/cr_policy_indicator_behavior.js'; +import {CrPolicyIndicatorType} from '//resources/ash/common/cr_policy_indicator_behavior.js'; import {AboutPageBrowserProxyImpl, BrowserChannel, DeviceNameBrowserProxyImpl, DeviceNameState, LifetimeBrowserProxyImpl, Router, routes, SetDeviceNameResult, UpdateStatus} from 'chrome://os-settings/chromeos/os_settings.js'; import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js'; import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
diff --git a/chromecast/media/cma/backend/mixer/mixer_input.cc b/chromecast/media/cma/backend/mixer/mixer_input.cc index 67dcc5a..6233606 100644 --- a/chromecast/media/cma/backend/mixer/mixer_input.cc +++ b/chromecast/media/cma/backend/mixer/mixer_input.cc
@@ -146,6 +146,7 @@ filter_group_tag_ = filter_group->tag(); prerender_pipeline_ = filter_group->CreatePrerenderPipeline(num_channels_); + playout_channel_ = source_->playout_channel(); AudioPostProcessor2::Config config; config.output_sample_rate = output_samples_per_second_; @@ -154,23 +155,13 @@ config.output_frames_per_write = filter_group->input_frames_per_write(); CHECK(prerender_pipeline_->SetOutputConfig(config)); prerender_pipeline_->SetContentType(content_type_); - prerender_pipeline_->UpdatePlayoutChannel(source_->playout_channel()); + prerender_pipeline_->UpdatePlayoutChannel(playout_channel_); DCHECK_EQ(prerender_pipeline_->GetInputSampleRate(), output_samples_per_second_); DCHECK_EQ(prerender_pipeline_->NumOutputChannels(), num_channels_); prerender_delay_seconds_ = prerender_pipeline_->GetDelaySeconds(); - int effective_channels = num_channels_; - ::media::ChannelLayout channel_layout = channel_layout_; - const int playout_channel = source_->playout_channel(); - if (playout_channel != kChannelAll && playout_channel < num_channels_) { - effective_channels = 1; - channel_layout = ::media::CHANNEL_LAYOUT_MONO; - } - channel_mixer_ = std::make_unique<InterleavedChannelMixer>( - channel_layout, effective_channels, - mixer::GuessChannelLayout(filter_group->num_channels()), - filter_group->num_channels(), filter_group->input_frames_per_write()); + CreateChannelMixer(playout_channel_, filter_group); } filter_group_ = filter_group; return (filter_group != nullptr); @@ -181,6 +172,20 @@ prerender_pipeline_->SetPostProcessorConfig(name, config); } +void MixerInput::CreateChannelMixer(int playout_channel, + FilterGroup* filter_group) { + int effective_channels = num_channels_; + ::media::ChannelLayout channel_layout = channel_layout_; + if (playout_channel != kChannelAll && playout_channel < num_channels_) { + effective_channels = 1; + channel_layout = ::media::CHANNEL_LAYOUT_MONO; + } + channel_mixer_ = std::make_unique<InterleavedChannelMixer>( + channel_layout, effective_channels, + mixer::GuessChannelLayout(filter_group->num_channels()), + filter_group->num_channels(), filter_group->input_frames_per_write()); +} + void MixerInput::AddAudioOutputRedirector( AudioOutputRedirectorInput* redirector) { AUDIO_LOG(INFO) << "Add redirector to " << device_id_ << "(" << source_ @@ -240,6 +245,13 @@ num_output_frames, num_channels_, interleaved_.data()); + const int playout_channel = source_->playout_channel(); + if (playout_channel != playout_channel_) { + prerender_pipeline_->UpdatePlayoutChannel(playout_channel); + CreateChannelMixer(playout_channel, filter_group_); + playout_channel_ = playout_channel; + } + const bool is_silence = (filled == 0); prerender_pipeline_->ProcessFrames(interleaved_.data(), num_output_frames, InstantaneousVolume(), TargetVolume(), @@ -257,12 +269,12 @@ // bother doing channel selection since the result would be the same as // doing nothing anyway. float* data = prerender_pipeline_->GetOutputBuffer(); - const int playout_channel = source_->playout_channel(); - if (playout_channel != kChannelAll && playout_channel < num_channels_) { + + if (playout_channel_ != kChannelAll && playout_channel_ < num_channels_) { // Keep only the samples from the selected channel. float* dest = interleaved_.data(); for (int f = 0; f < num_output_frames; ++f) { - dest[f] = data[f * num_channels_ + playout_channel]; + dest[f] = data[f * num_channels_ + playout_channel_]; } data = dest; }
diff --git a/chromecast/media/cma/backend/mixer/mixer_input.h b/chromecast/media/cma/backend/mixer/mixer_input.h index d3a0835c..01508fe 100644 --- a/chromecast/media/cma/backend/mixer/mixer_input.h +++ b/chromecast/media/cma/backend/mixer/mixer_input.h
@@ -183,6 +183,7 @@ private: bool SetFilterGroupInternal(FilterGroup* filter_group); + void CreateChannelMixer(int playout_channel, FilterGroup* filter_group); // Reads data from the source. Returns the number of frames actually filled // (<= |num_frames|). int FillAudioData(int num_frames, @@ -204,6 +205,7 @@ const std::string device_id_; const AudioContentType content_type_; int source_read_size_ = 0; + int playout_channel_ = 0; FilterGroup* filter_group_ = nullptr; scoped_refptr<FilterGroupTag> filter_group_tag_;
diff --git a/chromeos/ash/components/disks/DIR_METADATA b/chromeos/ash/components/disks/DIR_METADATA index 5b8d7cd..e9400b87 100644 --- a/chromeos/ash/components/disks/DIR_METADATA +++ b/chromeos/ash/components/disks/DIR_METADATA
@@ -1,3 +1 @@ -monorail { - component: "Platform>Apps>FileManager" -} +mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chromeos/ash/components/drivefs/DIR_METADATA b/chromeos/ash/components/drivefs/DIR_METADATA index 5b8d7cd..e9400b87 100644 --- a/chromeos/ash/components/drivefs/DIR_METADATA +++ b/chromeos/ash/components/drivefs/DIR_METADATA
@@ -1,3 +1 @@ -monorail { - component: "Platform>Apps>FileManager" -} +mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chromeos/ash/components/smbfs/DIR_METADATA b/chromeos/ash/components/smbfs/DIR_METADATA index 5b8d7cd..e9400b87 100644 --- a/chromeos/ash/components/smbfs/DIR_METADATA +++ b/chromeos/ash/components/smbfs/DIR_METADATA
@@ -1,3 +1 @@ -monorail { - component: "Platform>Apps>FileManager" -} +mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chromeos/ash/services/libassistant/libassistant_loader_impl_unittest.cc b/chromeos/ash/services/libassistant/libassistant_loader_impl_unittest.cc index d13381b..d551669 100644 --- a/chromeos/ash/services/libassistant/libassistant_loader_impl_unittest.cc +++ b/chromeos/ash/services/libassistant/libassistant_loader_impl_unittest.cc
@@ -57,24 +57,25 @@ EXPECT_TRUE(loader); // Should fail without dlcservice client. - base::RunLoop run_loop; + base::RunLoop run_loop1; loader->Load(base::BindOnce( [](base::RunLoop* run_loop, bool success) { EXPECT_FALSE(success); run_loop->Quit(); }, - &run_loop)); - run_loop.Run(); + &run_loop1)); + run_loop1.Run(); // Should success with dlcservice client. + base::RunLoop run_loop2; DlcserviceClient::InitializeFake(); loader->Load(base::BindOnce( [](base::RunLoop* run_loop, bool success) { EXPECT_TRUE(success); run_loop->Quit(); }, - &run_loop)); - run_loop.Run(); + &run_loop2)); + run_loop2.Run(); DlcserviceClient::Shutdown(); }
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn index 565039d6..dd36057 100644 --- a/components/autofill/core/browser/BUILD.gn +++ b/components/autofill/core/browser/BUILD.gn
@@ -195,6 +195,8 @@ "form_parsing/merchant_promo_code_field.h", "form_parsing/name_field.cc", "form_parsing/name_field.h", + "form_parsing/numeric_quantity_field.cc", + "form_parsing/numeric_quantity_field.h", "form_parsing/phone_field.cc", "form_parsing/phone_field.h", "form_parsing/price_field.cc", @@ -841,6 +843,7 @@ "form_parsing/iban_field_unittest.cc", "form_parsing/merchant_promo_code_field_unittest.cc", "form_parsing/name_field_unittest.cc", + "form_parsing/numeric_quantity_field_unittest.cc", "form_parsing/parsing_test_utils.cc", "form_parsing/parsing_test_utils.h", "form_parsing/phone_field_unittest.cc",
diff --git a/components/autofill/core/browser/autofill_field.cc b/components/autofill/core/browser/autofill_field.cc index 5db7dd7e..2c24430 100644 --- a/components/autofill/core/browser/autofill_field.cc +++ b/components/autofill/core/browser/autofill_field.cc
@@ -204,6 +204,16 @@ // predictions get precedence over the server predictions. believe_server = believe_server && (heuristic_type() != IBAN_VALUE); + // The numeric quanity heuristic should get granted precedence over the + // server prediction since it tries to catch false-positive server + // predictions. + believe_server = + believe_server && + !(heuristic_type() == NUMERIC_QUANTITY && + server_type() != UNKNOWN_TYPE && + base::FeatureList::IsEnabled( + features::kAutofillGivePrecedenceToNumericQuantitites)); + if (believe_server) return AutofillType(server_type()); }
diff --git a/components/autofill/core/browser/autofill_type.cc b/components/autofill/core/browser/autofill_type.cc index 12ba1841..9210bee 100644 --- a/components/autofill/core/browser/autofill_type.cc +++ b/components/autofill/core/browser/autofill_type.cc
@@ -116,6 +116,7 @@ case PRICE: case SEARCH_TERM: + case NUMERIC_QUANTITY: return FieldTypeGroup::kUnfillable; case UNKNOWN_TYPE:
diff --git a/components/autofill/core/browser/field_types.cc b/components/autofill/core/browser/field_types.cc index 92392e0e..bfbdf55 100644 --- a/components/autofill/core/browser/field_types.cc +++ b/components/autofill/core/browser/field_types.cc
@@ -141,6 +141,7 @@ case FIELD_WITH_DEFAULT_VALUE: case MERCHANT_EMAIL_SIGNUP: case PRICE: + case NUMERIC_QUANTITY: case SEARCH_TERM: case BIRTHDATE_DAY: case BIRTHDATE_MONTH: @@ -293,6 +294,8 @@ return "SEARCH_TERM"; case PRICE: return "PRICE"; + case NUMERIC_QUANTITY: + return "NUMERIC_QUANTITY"; case NOT_PASSWORD: return "NOT_PASSWORD"; case SINGLE_USERNAME:
diff --git a/components/autofill/core/browser/field_types.h b/components/autofill/core/browser/field_types.h index 332c19b..7c26d70d 100644 --- a/components/autofill/core/browser/field_types.h +++ b/components/autofill/core/browser/field_types.h
@@ -348,11 +348,16 @@ // Reserved for a server-side-only use: 127 + // Type of a field that asks for a numeric quantity. Not fillable by Autofill. + // The purpose is to ignore false positive server classification for numeric + // types that a prone to false-positive votes. + NUMERIC_QUANTITY = 128, + // No new types can be added without a corresponding change to the Autofill // server. // Please update enum `AutofillServerFieldType` in // `tools/metrics/histogram/enums.xml` for metrics tracking. - MAX_VALID_FIELD_TYPE = 128, + MAX_VALID_FIELD_TYPE = 129, }; enum class FieldTypeGroup {
diff --git a/components/autofill/core/browser/field_types_unittest.cc b/components/autofill/core/browser/field_types_unittest.cc index 7b194dad..a29050d 100644 --- a/components/autofill/core/browser/field_types_unittest.cc +++ b/components/autofill/core/browser/field_types_unittest.cc
@@ -92,6 +92,7 @@ BIRTHDATE_DAY, BIRTHDATE_MONTH, BIRTHDATE_4_DIGIT_YEAR, + NUMERIC_QUANTITY, }; ServerFieldType kInvalidValue = static_cast<ServerFieldType>(123456); ASSERT_FALSE(kValidFieldTypes.count(kInvalidValue));
diff --git a/components/autofill/core/browser/form_parsing/address_field.cc b/components/autofill/core/browser/form_parsing/address_field.cc index 6fc42efe..1415214 100644 --- a/components/autofill/core/browser/form_parsing/address_field.cc +++ b/components/autofill/core/browser/form_parsing/address_field.cc
@@ -11,7 +11,6 @@ #include <utility> #include "base/check.h" -#include "base/strings/string_util.h" #include "components/autofill/core/browser/autofill_field.h" #include "components/autofill/core/browser/field_types.h" #include "components/autofill/core/browser/form_parsing/autofill_scanner.h"
diff --git a/components/autofill/core/browser/form_parsing/form_field.cc b/components/autofill/core/browser/form_parsing/form_field.cc index 9a3bfe9..7e89349 100644 --- a/components/autofill/core/browser/form_parsing/form_field.cc +++ b/components/autofill/core/browser/form_parsing/form_field.cc
@@ -28,14 +28,15 @@ #include "components/autofill/core/browser/form_parsing/iban_field.h" #include "components/autofill/core/browser/form_parsing/merchant_promo_code_field.h" #include "components/autofill/core/browser/form_parsing/name_field.h" +#include "components/autofill/core/browser/form_parsing/numeric_quantity_field.h" #include "components/autofill/core/browser/form_parsing/phone_field.h" #include "components/autofill/core/browser/form_parsing/price_field.h" #include "components/autofill/core/browser/form_parsing/search_field.h" #include "components/autofill/core/browser/form_parsing/standalone_cvc_field.h" #include "components/autofill/core/browser/form_parsing/travel_field.h" -#include "components/autofill/core/common/autocomplete_parsing_util.h" #include "components/autofill/core/browser/form_structure.h" #include "components/autofill/core/browser/logging/log_manager.h" +#include "components/autofill/core/common/autocomplete_parsing_util.h" #include "components/autofill/core/common/autofill_constants.h" #include "components/autofill/core/common/autofill_features.h" #include "components/autofill/core/common/autofill_internals/log_message.h" @@ -104,6 +105,11 @@ log_manager); } + // Numeric quantity pass. + ParseFormFieldsPass(NumericQuantityField::Parse, processed_fields, + field_candidates, page_language, pattern_source, + log_manager); + // Credit card pass. ParseFormFieldsPass(CreditCardField::Parse, processed_fields, field_candidates, page_language, pattern_source,
diff --git a/components/autofill/core/browser/form_parsing/form_field.h b/components/autofill/core/browser/form_parsing/form_field.h index 4d15cf3..962308ce 100644 --- a/components/autofill/core/browser/form_parsing/form_field.h +++ b/components/autofill/core/browser/form_parsing/form_field.h
@@ -105,6 +105,7 @@ static constexpr float kBaseNameParserScore = 0.9f; static constexpr float kBaseMerchantPromoCodeParserScore = 0.85f; static constexpr float kBaseSearchParserScore = 0.8f; + static constexpr float kBaseNumericQuantityParserScore = 0.75f; static constexpr float kBaseAutocompleteParserScore = 0.05f; // Only derived classes may instantiate.
diff --git a/components/autofill/core/browser/form_parsing/form_field_unittest.cc b/components/autofill/core/browser/form_parsing/form_field_unittest.cc index c3997d1..dd0be09 100644 --- a/components/autofill/core/browser/form_parsing/form_field_unittest.cc +++ b/components/autofill/core/browser/form_parsing/form_field_unittest.cc
@@ -10,7 +10,6 @@ #include "base/test/scoped_feature_list.h" #include "components/autofill/core/browser/autofill_field.h" #include "components/autofill/core/browser/form_parsing/autofill_scanner.h" -#include "components/autofill/core/browser/form_parsing/buildflags.h" #include "components/autofill/core/browser/form_parsing/form_field.h" #include "components/autofill/core/browser/form_parsing/parsing_test_utils.h" #include "components/autofill/core/browser/form_structure.h"
diff --git a/components/autofill/core/browser/form_parsing/numeric_quantity_field.cc b/components/autofill/core/browser/form_parsing/numeric_quantity_field.cc new file mode 100644 index 0000000..54a0592 --- /dev/null +++ b/components/autofill/core/browser/form_parsing/numeric_quantity_field.cc
@@ -0,0 +1,45 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill/core/browser/form_parsing/numeric_quantity_field.h" + +#include "components/autofill/core/browser/autofill_field.h" +#include "components/autofill/core/browser/form_parsing/autofill_scanner.h" +#include "components/autofill/core/browser/form_parsing/regex_patterns.h" +#include "components/autofill/core/common/autofill_regex_constants.h" + +namespace autofill { + +// static +std::unique_ptr<FormField> NumericQuantityField::Parse( + AutofillScanner* scanner, + const LanguageCode& page_language, + PatternSource pattern_source, + LogManager* log_manager) { + AutofillField* field; + base::span<const MatchPatternRef> quantity_patterns = + GetMatchPatterns("NUMERIC_QUANTITY", page_language, pattern_source); + + if (ParseFieldSpecifics( + scanner, kNumericQuantityRe, + kDefaultMatchParamsWith< + MatchFieldType::kNumber, MatchFieldType::kSelect, + MatchFieldType::kTextArea, MatchFieldType::kSearch>, + quantity_patterns, &field, {log_manager, "kNumericQuantityRe"})) { + return base::WrapUnique(new NumericQuantityField(field)); + } + + return nullptr; +} + +NumericQuantityField::NumericQuantityField(const AutofillField* field) + : field_(field) {} + +void NumericQuantityField::AddClassifications( + FieldCandidatesMap& field_candidates) const { + AddClassification(field_, NUMERIC_QUANTITY, kBaseNumericQuantityParserScore, + field_candidates); +} + +} // namespace autofill
diff --git a/components/autofill/core/browser/form_parsing/numeric_quantity_field.h b/components/autofill/core/browser/form_parsing/numeric_quantity_field.h new file mode 100644 index 0000000..d70241d --- /dev/null +++ b/components/autofill/core/browser/form_parsing/numeric_quantity_field.h
@@ -0,0 +1,42 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_NUMERIC_QUANTITY_FIELD_H_ +#define COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_NUMERIC_QUANTITY_FIELD_H_ + +#include <memory> + +#include "base/memory/raw_ptr.h" +#include "components/autofill/core/browser/form_parsing/form_field.h" +#include "components/autofill/core/common/language_code.h" + +namespace autofill { + +class AutofillField; +class AutofillScanner; +class LogManager; + +// Numeric quantities that are not eligible to be filled by Autofill. +class NumericQuantityField : public FormField { + public: + static std::unique_ptr<FormField> Parse(AutofillScanner* scanner, + const LanguageCode& page_language, + PatternSource pattern_source, + LogManager* log_manager); + + NumericQuantityField(const NumericQuantityField&) = delete; + NumericQuantityField& operator=(const NumericQuantityField&) = delete; + + protected: + void AddClassifications(FieldCandidatesMap& field_candidates) const override; + + private: + explicit NumericQuantityField(const AutofillField* field); + + raw_ptr<const AutofillField> field_; +}; + +} // namespace autofill + +#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_NUMERIC_QUANTITY_FIELD_H_
diff --git a/components/autofill/core/browser/form_parsing/numeric_quantity_field_unittest.cc b/components/autofill/core/browser/form_parsing/numeric_quantity_field_unittest.cc new file mode 100644 index 0000000..dca79c6 --- /dev/null +++ b/components/autofill/core/browser/form_parsing/numeric_quantity_field_unittest.cc
@@ -0,0 +1,46 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill/core/browser/form_parsing/numeric_quantity_field.h" + +#include "components/autofill/core/browser/form_parsing/parsing_test_utils.h" + +namespace autofill { + +class NumericQuantityFieldTest + : public FormFieldTestBase, + public testing::TestWithParam<PatternProviderFeatureState> { + public: + explicit NumericQuantityFieldTest() : FormFieldTestBase(GetParam()) {} + NumericQuantityFieldTest(const NumericQuantityFieldTest&) = delete; + NumericQuantityFieldTest& operator=(const NumericQuantityFieldTest&) = delete; + + protected: + std::unique_ptr<FormField> Parse( + AutofillScanner* scanner, + const LanguageCode& page_language = LanguageCode("en")) override { + return NumericQuantityField::Parse(scanner, page_language, + GetActivePatternSource(), + /*log_manager=*/nullptr); + } +}; + +INSTANTIATE_TEST_SUITE_P( + NumericQuantityFieldTest, + NumericQuantityFieldTest, + ::testing::ValuesIn(PatternProviderFeatureState::All())); + +TEST_P(NumericQuantityFieldTest, ParseNumericQuantity) { + AddTextFormFieldData("quantity", "quantity", NUMERIC_QUANTITY); + + ClassifyAndVerify(ParseResult::PARSED); +} + +TEST_P(NumericQuantityFieldTest, ParseNonNumericQuantity) { + AddTextFormFieldData("name", "Name", UNKNOWN_TYPE); + + ClassifyAndVerify(ParseResult::NOT_PARSED); +} + +} // namespace autofill
diff --git a/components/autofill/core/browser/form_parsing/resources/legacy_regex_patterns.json b/components/autofill/core/browser/form_parsing/resources/legacy_regex_patterns.json index eab373e..d5c4b67 100644 --- a/components/autofill/core/browser/form_parsing/resources/legacy_regex_patterns.json +++ b/components/autofill/core/browser/form_parsing/resources/legacy_regex_patterns.json
@@ -1298,6 +1298,18 @@ } ] }, + "NUMERIC_QUANTITY": { + "en": [ + { + "pattern_identifier": "en_numeric_quantity_preserving", + "positive_pattern": "size|height|quantity|length|amount", + "positive_score": 0.95, + "negative_pattern": null, + "match_field_attributes": ["LABEL", "NAME"], + "match_field_input_types": ["TEXT", "SELECT", "TEXT_AREA", "NUMBER", "SEARCH"] + } + ] + }, "PRICE": { "en": [ {
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc index 3864abe8..1a75b6b8 100644 --- a/components/autofill/core/browser/form_structure.cc +++ b/components/autofill/core/browser/form_structure.cc
@@ -1007,6 +1007,33 @@ const ServerFieldTypeSet& field_types = field->possible_types(); DCHECK(!field_types.empty()); + // For every field that has a heuristics prediction for a + // NUMERIC_QUANTITY, log if there was a colliding server + // prediction and if the NUMERIC_QUANTITY was a false-positive prediction. + // The latter is true when the field was correctly filled. This can + // only be recorded when the feature to grant precedence to + // NUMERIC_QUANTITY predictions is disabled. + if (observed_submission && field->heuristic_type() == NUMERIC_QUANTITY) { + bool field_has_non_empty_server_prediction = + field->server_type() != UNKNOWN_TYPE && + field->server_type() != NO_SERVER_DATA; + + // Log if there was a colliding server prediction. + AutofillMetrics::LogNumericQuantityCollidesWithServerPrediction( + field_has_non_empty_server_prediction); + + // If there was a collision, log if the NUMERIC_QUANTITY was a false + // positive since the field was correctly filled. + if ((field->is_autofilled || field->previously_autofilled()) && + field_has_non_empty_server_prediction && + !base::FeatureList::IsEnabled( + features::kAutofillGivePrecedenceToNumericQuantitites)) { + AutofillMetrics:: + LogAcceptedFilledFieldWithNumericQuantityHeuristicPrediction( + !field->previously_autofilled()); + } + } + if (field_types.count(EMPTY_TYPE) || field_types.count(UNKNOWN_TYPE)) { DCHECK_EQ(field_types.size(), 1u); continue;
diff --git a/components/autofill/core/browser/metrics/autofill_metrics.cc b/components/autofill/core/browser/metrics/autofill_metrics.cc index e97984e0..c24d1a49 100644 --- a/components/autofill/core/browser/metrics/autofill_metrics.cc +++ b/components/autofill/core/browser/metrics/autofill_metrics.cc
@@ -363,6 +363,7 @@ case AMBIGUOUS_TYPE: case SEARCH_TERM: case PRICE: + case NUMERIC_QUANTITY: case NOT_PASSWORD: case SINGLE_USERNAME: case NOT_USERNAME: @@ -3241,4 +3242,20 @@ return result_suffix; } +// // static +void AutofillMetrics::LogNumericQuantityCollidesWithServerPrediction( + bool collision) { + base::UmaHistogramBoolean( + "Autofill.NumericQuantityCollidesWithServerPrediction", collision); +} + +// static +void AutofillMetrics:: + LogAcceptedFilledFieldWithNumericQuantityHeuristicPrediction( + bool accepted) { + base::UmaHistogramBoolean( + "Autofill.AcceptedFilledFieldWithNumericQuantityHeuristicPrediction", + accepted); +} + } // namespace autofill
diff --git a/components/autofill/core/browser/metrics/autofill_metrics.h b/components/autofill/core/browser/metrics/autofill_metrics.h index 3a31e41..f6140ff 100644 --- a/components/autofill/core/browser/metrics/autofill_metrics.h +++ b/components/autofill/core/browser/metrics/autofill_metrics.h
@@ -1755,6 +1755,16 @@ ServerFieldType server_type, ServerFieldType heuristic_types); + // Logs whether a heuristic detection for an NUMERIC_QUANTITY collides with a + // server prediction. + static void LogNumericQuantityCollidesWithServerPrediction(bool collision); + + // Logs if the filling of a field was accepted even though it had a + // NUMERIC_QUANTITY. This metric is only emitted if the feature to grant the + // heuristic precedence is disabled. + static void LogAcceptedFilledFieldWithNumericQuantityHeuristicPrediction( + bool accepted); + private: static void Log(AutocompleteEvent event); };
diff --git a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc index c813e22..81f70df2 100644 --- a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc +++ b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
@@ -648,6 +648,78 @@ BucketsAre(test_case.credit_card_buckets)); } +// Test the emission of collisions between NUMERIC_QUANTITY and server +// predictions as well as the potential false positives. +TEST_F(AutofillMetricsTest, NumericQuantityCollision) { + // Those metrics are only collected when the numeric quantities are not + // getting precedence over server predictions. + base::test::ScopedFeatureList numeric_quanity_feature_list; + numeric_quanity_feature_list.InitAndDisableFeature( + features::kAutofillGivePrecedenceToNumericQuantitites); + + // Set up our form data. + test::FormDescription form_description = { + .description_for_logging = "AutofilledStateFieldSource", + .fields = {{.server_type = NO_SERVER_DATA, + .heuristic_type = NUMERIC_QUANTITY, + .is_autofilled = false}, + // We add a second field to make sure the metrics are only + // recorded for the field with the numeric quantity prediction. + {.server_type = ADDRESS_HOME_LINE1, + .heuristic_type = ADDRESS_HOME_LINE1, + .is_autofilled = false}}}; + + // Helper to submit the `form` and test the expectations. `collision` + // indicates that there was a collision between the NUMERIC_QUANTITY + // prediction and a server prediction. + // If `autofill_used` and a `collision` exists, the histogram to + // track `false_positive` is checked. + auto SubmitAndTest = [this](const FormData& form, bool collision, + bool autofill_used, bool false_positive) { + base::HistogramTester histogram_tester; + SubmitForm(form); + histogram_tester.ExpectUniqueSample( + "Autofill.NumericQuantityCollidesWithServerPrediction", collision, 1); + if (collision && autofill_used) { + histogram_tester.ExpectUniqueSample( + "Autofill.AcceptedFilledFieldWithNumericQuantityHeuristicPrediction", + false_positive, 1); + } + }; + + { + SCOPED_TRACE( + "No collision case - The numeric quanity does not collide with a " + "server prediction."); + FormData form = GetAndAddSeenForm(form_description); + SubmitAndTest(form, /*collision=*/false, /*autofill_used=*/false, + /*false_positive=*/false); + } + { + SCOPED_TRACE("Collision, but nothing is filled."); + // Add a server prediction to create a collision. + form_description.fields[0].server_type = NAME_FIRST; + FormData form = GetAndAddSeenForm(form_description); + SubmitAndTest(form, /*collision=*/true, /*autofill_used=*/false, + /*false_positive=*/false); + } + { + SCOPED_TRACE("Collision, the field is autofilled."); + form_description.fields[0].is_autofilled = true; + FormData form = GetAndAddSeenForm(form_description); + SubmitAndTest(form, /*collision=*/true, /*autofill_used=*/true, + /*false_positive=*/true); + } + { + SCOPED_TRACE( + "Collision, the field is autofilled and subsequently changed."); + FormData form = GetAndAddSeenForm(form_description); + SimulateUserChangedTextField(form, form.fields[0]); + SubmitAndTest(form, /*collision=*/true, /*autofill_used=*/true, + /*false_positive=*/false); + } +} + // Test that we log quality metrics appropriately. TEST_F(AutofillMetricsTest, QualityMetrics) { // Set up our form data.
diff --git a/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc b/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc index 1929b17d..b2dc979 100644 --- a/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc +++ b/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc
@@ -96,8 +96,7 @@ // If this test fails after adding a type, update // `AutofillPredictionsComparisonResult` in tools/metrics/histograms/enums.xml // and set `last_known_type` to the last entry in the enum. - constexpr ServerFieldType last_known_type = - CREDIT_CARD_STANDALONE_VERIFICATION_CODE; + constexpr ServerFieldType last_known_type = NUMERIC_QUANTITY; int max_comparison = GetShadowPrediction(last_known_type, NAME_FIRST, {NAME_LAST});
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc index 35366806..b7f68aa 100644 --- a/components/autofill/core/common/autofill_features.cc +++ b/components/autofill/core/common/autofill_features.cc
@@ -63,6 +63,12 @@ "AutofillAddressProfileSavePromptAddressVerificationSupport", base::FEATURE_DISABLED_BY_DEFAULT); +// Use the heuristic parser to detected unfillable numeric types in field labels +// and grant the heuristic precedence over non-override server predictions. +BASE_FEATURE(kAutofillGivePrecedenceToNumericQuantitites, + "AutofillGivePrecedenceToNumericQuantitites", + base::FEATURE_DISABLED_BY_DEFAULT); + // TODO(crbug.com/1135188): Remove this feature flag after the explicit save // prompts for address profiles is complete. // When enabled, address profile save problem will contain a dropdown for @@ -320,7 +326,7 @@ // TODO(crbug.com/1314360): Remove once launched. BASE_FEATURE(kAutofillRefillModifiedCreditCardExpirationDates, "AutofillRefillModifiedCreditCardExpirationDates", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); // Enables autofill to function within a FencedFrame, and is disabled by // default. @@ -459,7 +465,7 @@ // TODO(crbug.com/1326425): Remove once feature is lanuched. BASE_FEATURE(kAutofillRationalizeStreetAddressAndAddressLine, "AutofillRationalizeStreetAddressAndAddressLine", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); // Removes setting-inaccessible field types from existing profiles on startup. // TODO(crbug.com/1300548): Cleanup when launched.
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h index e5b3f084..305216ad 100644 --- a/components/autofill/core/common/autofill_features.h +++ b/components/autofill/core/common/autofill_features.h
@@ -39,6 +39,8 @@ BASE_DECLARE_FEATURE( kAutofillAddressProfileSavePromptAddressVerificationSupport); COMPONENT_EXPORT(AUTOFILL) +BASE_DECLARE_FEATURE(kAutofillGivePrecedenceToNumericQuantitites); +COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillAddressProfileSavePromptNicknameSupport); COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillAllowDuplicateFormSubmissions);
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc index 3944aa05..e753b428 100644 --- a/components/autofill/core/common/autofill_payments_features.cc +++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -198,7 +198,7 @@ // fields when parsing forms. BASE_FEATURE(kAutofillParseMerchantPromoCodeFields, "AutofillParseMerchantPromoCodeFields", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); // When enabled, Autofill will attempt to find standalone CVC fields for VCN // card on file when parsing forms.
diff --git a/components/autofill/core/common/autofill_regex_constants.h b/components/autofill/core/common/autofill_regex_constants.h index 0d71910..3c9870b 100644 --- a/components/autofill/core/common/autofill_regex_constants.h +++ b/components/autofill/core/common/autofill_regex_constants.h
@@ -206,6 +206,12 @@ u"|\\bprix\\b|\\bcoût\\b|\\bcout\\b|\\btarif\\b"; // fr-CA ///////////////////////////////////////////////////////////////////////////// +// numeric_quanitity.cc +///////////////////////////////////////////////////////////////////////////// +inline constexpr char16_t kNumericQuantityRe[] = + u"size|height|quantity|length|amount"; + +///////////////////////////////////////////////////////////////////////////// // credit_card_field.cc ///////////////////////////////////////////////////////////////////////////// inline constexpr char16_t kNameOnCardRe[] =
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto index ca714516..23fe10c0 100644 --- a/components/autofill_assistant/browser/service.proto +++ b/components/autofill_assistant/browser/service.proto
@@ -1624,8 +1624,6 @@ optional SelectorProto.SemanticFilter semantic_filter = 4; // The element's backend node id. optional int32 backend_node_id = 3; - // Whether this element was found using a feature override. - optional bool used_override = 5; reserved 1, 2; }
diff --git a/components/autofill_assistant/browser/web/element_finder.cc b/components/autofill_assistant/browser/web/element_finder.cc index 6c59879b2..a5e7ca8 100644 --- a/components/autofill_assistant/browser/web/element_finder.cc +++ b/components/autofill_assistant/browser/web/element_finder.cc
@@ -123,7 +123,7 @@ if (selector_.proto.filters_size() > 1) { // The semantic filter was only the root, there are more filters to run. - // Log and retain the current result and start a CSS lookup from here. + // Log and retain teh current result and start a CSS lookup from here. UpdateLogInfo(status); current_result_ = std::move(result);
diff --git a/components/autofill_assistant/browser/web/semantic_element_finder.cc b/components/autofill_assistant/browser/web/semantic_element_finder.cc index 546d41a..726b5b55 100644 --- a/components/autofill_assistant/browser/web/semantic_element_finder.cc +++ b/components/autofill_assistant/browser/web/semantic_element_finder.cc
@@ -21,7 +21,6 @@ #include "content/public/browser/global_routing_id.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" -#include "element.h" namespace autofill_assistant { @@ -75,7 +74,7 @@ SendResult(status, ElementFinderResult::EmptyResult()); } -void SemanticElementFinder::ResultFound(const SemanticNodeResult& node, +void SemanticElementFinder::ResultFound(const GlobalBackendNodeId& node_id, const std::string& object_id, const std::string& devtools_frame_id) { if (!callback_) { @@ -83,10 +82,10 @@ } ElementFinderResult result; - result.SetRenderFrameHostGlobalId(node.id.host_id()); + result.SetRenderFrameHostGlobalId(node_id.host_id()); result.SetObjectId(object_id); result.SetNodeFrameId(devtools_frame_id); - result.SetBackendNodeId(node.id.backend_node_id()); + result.SetBackendNodeId(node_id.backend_node_id()); SendResult(OkClientStatus(), result); } @@ -121,15 +120,13 @@ auto* predicted_element = info.mutable_semantic_inference_result()->add_predicted_elements(); predicted_element->set_backend_node_id( - semantic_node_result.id.backend_node_id()); + semantic_node_result.backend_node_id()); *predicted_element->mutable_semantic_filter() = filter_; // TODO(b/217160707): For the ignore_objective case this is not correct // and the inferred objective should be returned from the Agent and used // here. - if (semantic_node_result.used_override) { - predicted_element->set_used_override(semantic_node_result.used_override); - } } + return info; } @@ -159,6 +156,7 @@ } void SemanticElementFinder::OnTimeout() { + VLOG(1) << "AnnotateDomModel timeout."; Finalize(); } @@ -196,22 +194,20 @@ node_data_frame_status_.emplace_back(status); - std::vector<SemanticNodeResult> results; + std::vector<GlobalBackendNodeId> node_ids; for (const auto& node : node_data) { - SemanticNodeResult node_result; - node_result.id = GlobalBackendNodeId(host_id, node.backend_node_id); - node_result.used_override = node.used_override; - results.emplace_back(node_result); + node_ids.emplace_back(GlobalBackendNodeId(host_id, node.backend_node_id)); } - received_results_.emplace(host_id, std::move(results)); + + received_results_.emplace(host_id, std::move(node_ids)); MarkRenderFrameProcessed(host_id); } void SemanticElementFinder::OnRunAnnotateDomModel() { - for (const auto& [backend_id, results] : received_results_) { - semantic_node_results_.insert(semantic_node_results_.end(), results.begin(), - results.end()); + for (const auto& [backend_id, node_ids] : received_results_) { + semantic_node_results_.insert(semantic_node_results_.end(), + node_ids.begin(), node_ids.end()); } // For now we only support finding a single element. @@ -242,7 +238,7 @@ // not have a session id in our |DevtoolsClient|). std::string devtools_frame_id; auto* frame = - content::RenderFrameHost::FromID(semantic_node_result.id.host_id()); + content::RenderFrameHost::FromID(semantic_node_result.host_id()); if (frame != nullptr && frame->IsRenderFrameLive() && web_contents_->GetPrimaryMainFrame()->GetProcess() != frame->GetProcess()) { @@ -253,7 +249,7 @@ devtools_client_->GetDOM()->ResolveNode( dom::ResolveNodeParams::Builder() - .SetBackendNodeId(semantic_node_result.id.backend_node_id()) + .SetBackendNodeId(semantic_node_result.backend_node_id()) .Build(), devtools_frame_id, base::BindOnce(&SemanticElementFinder::OnResolveNodeForAnnotateDom, @@ -262,7 +258,7 @@ } void SemanticElementFinder::OnResolveNodeForAnnotateDom( - const SemanticNodeResult& node, + const GlobalBackendNodeId& node, const std::string& devtools_frame_id, const DevtoolsClient::ReplyStatus& reply_status, std::unique_ptr<dom::ResolveNodeResult> result) {
diff --git a/components/autofill_assistant/browser/web/semantic_element_finder.h b/components/autofill_assistant/browser/web/semantic_element_finder.h index a54d68d9..d558be94 100644 --- a/components/autofill_assistant/browser/web/semantic_element_finder.h +++ b/components/autofill_assistant/browser/web/semantic_element_finder.h
@@ -36,11 +36,6 @@ class SemanticElementFinder : public BaseElementFinder, public content::WebContentsObserver { public: - struct SemanticNodeResult { - GlobalBackendNodeId id = GlobalBackendNodeId(nullptr, -1); - bool used_override = false; - }; - SemanticElementFinder(content::WebContents* web_contents, DevtoolsClient* devtools_client, AnnotateDomModelService* annotate_dom_model_service, @@ -64,7 +59,7 @@ // Builds a result from the provided information and returns it with an // ok status. - void ResultFound(const SemanticNodeResult& node_id, + void ResultFound(const GlobalBackendNodeId& node_id, const std::string& object_id, const std::string& devtools_frame_id); @@ -89,7 +84,7 @@ void OnRunAnnotateDomModel(); void OnResolveNodeForAnnotateDom( - const SemanticNodeResult& node, + const GlobalBackendNodeId& node, const std::string& devtools_frame_id, const DevtoolsClient::ReplyStatus& reply_status, std::unique_ptr<dom::ResolveNodeResult> result); @@ -116,11 +111,11 @@ // Elements gathered through all frames. Unused if the |selector_| does not // contain |SemanticInformation|. - std::vector<SemanticNodeResult> semantic_node_results_; + std::vector<GlobalBackendNodeId> semantic_node_results_; std::vector<mojom::NodeDataStatus> node_data_frame_status_; std::set<content::GlobalRenderFrameHostId> expected_frame_ids_; - std::map<content::GlobalRenderFrameHostId, std::vector<SemanticNodeResult>> + std::map<content::GlobalRenderFrameHostId, std::vector<GlobalBackendNodeId>> received_results_; std::unique_ptr<base::OneShotTimer> timer_ = nullptr;
diff --git a/components/autofill_assistant/browser/web/semantic_element_finder_browsertest.cc b/components/autofill_assistant/browser/web/semantic_element_finder_browsertest.cc index 18937ea1..bbacd796 100644 --- a/components/autofill_assistant/browser/web/semantic_element_finder_browsertest.cc +++ b/components/autofill_assistant/browser/web/semantic_element_finder_browsertest.cc
@@ -328,15 +328,6 @@ ClientStatus status = RunWaitForDom(action_proto, /* use_observers= */ false, run_expectations.Get()); EXPECT_EQ(status.proto_status(), ACTION_APPLIED); - - ASSERT_EQ(log_info_.element_finder_info().size(), 1); - const auto& result = - log_info_.element_finder_info(0).semantic_inference_result(); - ASSERT_EQ(1, result.predicted_elements().size()); - EXPECT_EQ(backend_node_id, result.predicted_elements(0).backend_node_id()); - EXPECT_THAT(1, result.predicted_elements(0).semantic_filter().role()); - EXPECT_THAT(2, result.predicted_elements(0).semantic_filter().objective()); - EXPECT_FALSE(result.predicted_elements(0).used_override()); } IN_PROC_BROWSER_TEST_F(SemanticElementFinderBrowserTest, @@ -825,56 +816,4 @@ EXPECT_EQ(option_status.proto_status(), TIMED_OUT); } -#if BUILDFLAG(IS_ANDROID) -IN_PROC_BROWSER_TEST_F(SemanticElementFinderBrowserTest, - WaitForDomForSemanticElementWithOverride) { - // This element is unique. - SelectorProto baseline_selector = ToSelectorProto("#select"); - - ClientStatus element_status; - int backend_node_id = - GetBackendNodeId(Selector(baseline_selector), &element_status); - EXPECT_TRUE(element_status.ok()); - - NodeData node_data; - node_data.backend_node_id = backend_node_id; - node_data.used_override = true; - EXPECT_CALL(autofill_assistant_agent_, - GetSemanticNodes(1, 2, false, base::Milliseconds(5000), _)) - .WillOnce(RunOnceCallback<4>(mojom::NodeDataStatus::kSuccess, - std::vector<NodeData>{node_data})) - // Capture any other frames. - .WillRepeatedly(RunOnceCallback<4>( - mojom::NodeDataStatus::kUnexpectedError, std::vector<NodeData>())); - - ActionProto action_proto; - auto* wait_for_dom = action_proto.mutable_wait_for_dom(); - auto* condition = wait_for_dom->mutable_wait_condition(); - condition->mutable_client_id()->set_identifier("e"); - condition->set_require_unique_element(true); - auto* semantic_filter = - condition->mutable_match()->add_filters()->mutable_semantic(); - semantic_filter->set_role(1); - semantic_filter->set_objective(2); - - base::MockCallback<base::OnceCallback<void(ScriptExecutor*)>> - run_expectations; - EXPECT_CALL(run_expectations, Run(_)) - .WillOnce([](ScriptExecutor* script_executor) { - EXPECT_TRUE(script_executor->GetElementStore()->HasElement("e")); - }); - ClientStatus status = RunWaitForDom(action_proto, /* use_observers= */ false, - run_expectations.Get()); - EXPECT_EQ(status.proto_status(), ACTION_APPLIED); - ASSERT_EQ(log_info_.element_finder_info().size(), 1); - const auto& result = - log_info_.element_finder_info(0).semantic_inference_result(); - ASSERT_EQ(1, result.predicted_elements().size()); - EXPECT_EQ(backend_node_id, result.predicted_elements(0).backend_node_id()); - EXPECT_THAT(1, result.predicted_elements(0).semantic_filter().role()); - EXPECT_THAT(2, result.predicted_elements(0).semantic_filter().objective()); - EXPECT_TRUE(result.predicted_elements(0).used_override()); -} -#endif - } // namespace autofill_assistant
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 1ecfb916..2aaf5a6 100644 --- a/components/autofill_assistant/content/browser/content_autofill_assistant_driver.cc +++ b/components/autofill_assistant/content/browser/content_autofill_assistant_driver.cc
@@ -7,6 +7,7 @@ #include "base/files/file.h" #include "base/guid.h" #include "base/location.h" +#include "base/logging.h" #include "components/autofill_assistant/content/common/proto/semantic_feature_overrides.pb.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" @@ -34,6 +35,7 @@ pending_receiver, content::RenderFrameHost* render_frame_host) { DCHECK(render_frame_host); + auto* driver = ContentAutofillAssistantDriver::GetOrCreateForCurrentDocument( render_frame_host); if (driver) { @@ -76,6 +78,7 @@ base::TimeDelta timeout, GetAnnotateDomModelCallback callback) { if (!annotate_dom_model_service_) { + LOG(ERROR) << "No model service"; std::move(callback).Run(mojom::ModelStatus::kUnexpectedError, base::File(), /*overrides_policy=*/""); return; @@ -128,6 +131,7 @@ if (it == pending_calls_.end()) { return; } + DCHECK(it->second->callback_); std::move(it->second->callback_) .Run(model_status, std::move(model_file), GetOverridesPolicy()); @@ -136,13 +140,12 @@ void ContentAutofillAssistantDriver::SetAnnotateDomModelService( AnnotateDomModelService* annotate_dom_model_service) { + DCHECK(annotate_dom_model_service); annotate_dom_model_service_ = annotate_dom_model_service; } std::string ContentAutofillAssistantDriver::GetOverridesPolicy() const { - if (!annotate_dom_model_service_) { - return ""; - } + DCHECK(annotate_dom_model_service_); return annotate_dom_model_service_->GetOverridesPolicy(); }
diff --git a/components/autofill_assistant/content/common/autofill_assistant_types.mojom b/components/autofill_assistant/content/common/autofill_assistant_types.mojom index 0f594cf..38b4d90 100644 --- a/components/autofill_assistant/content/common/autofill_assistant_types.mojom +++ b/components/autofill_assistant/content/common/autofill_assistant_types.mojom
@@ -24,7 +24,4 @@ struct NodeData { // The BackendNodeId of this element. int32 backend_node_id; - - // Whether an override was used. - bool used_override; };
diff --git a/components/autofill_assistant/content/common/autofill_assistant_types_mojom_traits.cc b/components/autofill_assistant/content/common/autofill_assistant_types_mojom_traits.cc index 7aa16daa..07a9348 100644 --- a/components/autofill_assistant/content/common/autofill_assistant_types_mojom_traits.cc +++ b/components/autofill_assistant/content/common/autofill_assistant_types_mojom_traits.cc
@@ -14,7 +14,6 @@ Read(autofill_assistant::mojom::NodeDataDataView data, autofill_assistant::NodeData* out) { out->backend_node_id = data.backend_node_id(); - out->used_override = data.used_override(); return true; }
diff --git a/components/autofill_assistant/content/common/autofill_assistant_types_mojom_traits.h b/components/autofill_assistant/content/common/autofill_assistant_types_mojom_traits.h index 70b25a5..874b764 100644 --- a/components/autofill_assistant/content/common/autofill_assistant_types_mojom_traits.h +++ b/components/autofill_assistant/content/common/autofill_assistant_types_mojom_traits.h
@@ -20,10 +20,6 @@ return r.backend_node_id; } - static bool used_override(const autofill_assistant::NodeData& r) { - return r.used_override; - } - static bool Read(autofill_assistant::mojom::NodeDataDataView data, autofill_assistant::NodeData* out); };
diff --git a/components/autofill_assistant/content/common/node_data.h b/components/autofill_assistant/content/common/node_data.h index 1b827fc..b0cec1e 100644 --- a/components/autofill_assistant/content/common/node_data.h +++ b/components/autofill_assistant/content/common/node_data.h
@@ -18,7 +18,6 @@ ~NodeData(); int32_t backend_node_id; - bool used_override; }; } // namespace autofill_assistant
diff --git a/components/autofill_assistant/content/renderer/BUILD.gn b/components/autofill_assistant/content/renderer/BUILD.gn index a5fa3cd..81035a9c 100644 --- a/components/autofill_assistant/content/renderer/BUILD.gn +++ b/components/autofill_assistant/content/renderer/BUILD.gn
@@ -13,7 +13,8 @@ sources = [ "autofill_assistant_agent.cc", "autofill_assistant_agent.h", - "autofill_assistant_model_executor_result.h", + "autofill_assistant_agent_debug_utils.cc", + "autofill_assistant_agent_debug_utils.h", ] deps = [ @@ -33,8 +34,6 @@ if (build_with_tflite_lib) { sources += [ - "autofill_assistant_agent_debug_utils.cc", - "autofill_assistant_agent_debug_utils.h", "autofill_assistant_model_executor.cc", "autofill_assistant_model_executor.h", ]
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_agent.cc b/components/autofill_assistant/content/renderer/autofill_assistant_agent.cc index 67ef6cd8a..7d0d7590 100644 --- a/components/autofill_assistant/content/renderer/autofill_assistant_agent.cc +++ b/components/autofill_assistant/content/renderer/autofill_assistant_agent.cc
@@ -22,7 +22,6 @@ #if BUILDFLAG(BUILD_WITH_TFLITE_LIB) #include "components/autofill_assistant/content/common/proto/semantic_feature_overrides.pb.h" -#include "components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.h" #include "components/autofill_assistant/content/renderer/autofill_assistant_model_executor.h" #endif // BUILDFLAG(BUILD_WITH_TFLITE_LIB) @@ -87,10 +86,8 @@ std::string jsonEncodedSemanticEnums = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( autofill_assistant::switches::kAutofillAssistantDebugAnnotateDom); -#if BUILDFLAG(BUILD_WITH_TFLITE_LIB) semantic_labels = DecodeSemanticPredictionLabelsJson(jsonEncodedSemanticEnums); -#endif } } @@ -222,11 +219,10 @@ } } - if (result && result->role == role && - (result->objective == objective || ignore_objective)) { + if (result && result->first == role && + (result->second == objective || ignore_objective)) { NodeData node_data; node_data.backend_node_id = node_signal.backend_node_id; - node_data.used_override = result->used_override; nodes.push_back(node_data); } }
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_agent.h b/components/autofill_assistant/content/renderer/autofill_assistant_agent.h index b1e4044..06962af8 100644 --- a/components/autofill_assistant/content/renderer/autofill_assistant_agent.h +++ b/components/autofill_assistant/content/renderer/autofill_assistant_agent.h
@@ -12,6 +12,7 @@ #include "components/autofill_assistant/content/common/autofill_assistant_agent.mojom.h" #include "components/autofill_assistant/content/common/autofill_assistant_driver.mojom.h" #include "components/autofill_assistant/content/common/node_data.h" +#include "components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.h" #include "content/public/renderer/render_frame_observer.h" #include "mojo/public/cpp/bindings/associated_receiver.h" #include "mojo/public/cpp/bindings/associated_remote.h" @@ -82,9 +83,6 @@ const std::u16string& value, bool send_events); - using SemanticPredictionLabelMap = base::flat_map<int, std::string>; - using SemanticLabelsPair = - std::pair<SemanticPredictionLabelMap, SemanticPredictionLabelMap>; SemanticLabelsPair semantic_labels; mojo::AssociatedRemote<mojom::AutofillAssistantDriver> driver_;
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_agent_browsertest.cc b/components/autofill_assistant/content/renderer/autofill_assistant_agent_browsertest.cc index 8357414..a548d57 100644 --- a/components/autofill_assistant/content/renderer/autofill_assistant_agent_browsertest.cc +++ b/components/autofill_assistant/content/renderer/autofill_assistant_agent_browsertest.cc
@@ -18,7 +18,6 @@ #include "content/public/renderer/render_frame.h" #include "content/public/test/render_view_test.h" #include "mojo/public/cpp/bindings/associated_receiver_set.h" -#include "testing/gmock/include/gmock/gmock-matchers.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" @@ -33,7 +32,6 @@ using ::base::test::RunOnceCallback; using ::testing::_; -using ::testing::Field; using ::testing::SizeIs; constexpr int kDummySemanticRole = 9999; @@ -109,9 +107,7 @@ base::MockCallback<base::OnceCallback<void(mojom::NodeDataStatus, const std::vector<NodeData>&)>> callback; - EXPECT_CALL(callback, - Run(mojom::NodeDataStatus::kSuccess, - ElementsAre(Field(&NodeData::used_override, false)))); + EXPECT_CALL(callback, Run(mojom::NodeDataStatus::kSuccess, SizeIs(1))); LoadHTML(R"( <div> @@ -295,9 +291,7 @@ base::MockCallback<base::OnceCallback<void(mojom::NodeDataStatus, const std::vector<NodeData>&)>> callback; - EXPECT_CALL(callback, - Run(mojom::NodeDataStatus::kSuccess, - ElementsAre(Field(&NodeData::used_override, true)))); + EXPECT_CALL(callback, Run(mojom::NodeDataStatus::kSuccess, SizeIs(1))); autofill_assistant_agent_->GetSemanticNodes( kDummySemanticRole, kDummyObjective,
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.cc b/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.cc index ee30af96..2144f16 100644 --- a/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.cc +++ b/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.cc
@@ -86,30 +86,27 @@ std::u16string SemanticPredictionResultToDebugString( SemanticPredictionLabelMap roles, SemanticPredictionLabelMap objectives, - const ModelExecutorResult& result, + const std::pair<int, int>& result, bool ignore_objective) { - int role = result.role; - int objective = result.objective; if (!roles.empty() || !objectives.empty()) { std::string result_label = - roles.contains(role) ? roles.at(role) - : "(missing-label) " + base::NumberToString(role); + roles.contains(result.first) + ? roles.at(result.first) + : "(missing-label) " + base::NumberToString(result.first); std::string objective_label = - objectives.contains(objective) - ? objectives.at(objective) - : "(missing-label) " + base::NumberToString(objective); + objectives.contains(result.second) + ? objectives.at(result.second) + : "(missing-label) " + base::NumberToString(result.second); return base::StrCat( {u"{role: ", std::u16string(result_label.begin(), result_label.end()), u", objective: ", std::u16string(objective_label.begin(), objective_label.end()), - (ignore_objective ? u"(ignored)}" : u"}"), - (result.used_override ? u"[override]" : u"")}); + (ignore_objective ? u"(ignored)}" : u"}")}); } - return base::StrCat({u"{role: ", base::NumberToString16(role), - u", objective: ", base::NumberToString16(objective), - (ignore_objective ? u"(ignored)}" : u"}"), - (result.used_override ? u"[override]" : u"")}); + return base::StrCat({u"{role: ", base::NumberToString16(result.first), + u", objective: ", base::NumberToString16(result.second), + (ignore_objective ? u"(ignored)}" : u"}")}); } } // namespace autofill_assistant
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.h b/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.h index 1ef8ac6..df96538 100644 --- a/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.h +++ b/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.h
@@ -8,7 +8,6 @@ #include <string> #include "base/containers/flat_map.h" -#include "components/autofill_assistant/content/renderer/autofill_assistant_model_executor_result.h" #include "third_party/blink/public/web/modules/autofill_assistant/node_signals.h" namespace autofill_assistant { @@ -34,7 +33,7 @@ std::u16string SemanticPredictionResultToDebugString( SemanticPredictionLabelMap roles, SemanticPredictionLabelMap objectives, - const ModelExecutorResult& result, + const std::pair<int, int>& result, bool ignore_objective); } // namespace autofill_assistant
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils_unittest.cc b/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils_unittest.cc index 6c5d8cd1..f32b6808 100644 --- a/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils_unittest.cc +++ b/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils_unittest.cc
@@ -11,11 +11,7 @@ namespace autofill_assistant { namespace { -class SemanticLabelsJsonParsingTest : public ::testing::Test { - protected: - ModelExecutorResult model_executor_result_ = - ModelExecutorResult(47, 7, false); -}; +using SemanticLabelsJsonParsingTest = ::testing::Test; TEST_F(SemanticLabelsJsonParsingTest, ValidJson) { std::string json_input = R"({ @@ -32,27 +28,7 @@ SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json); std::u16string debug_string = SemanticPredictionResultToDebugString( - labels.first, labels.second, model_executor_result_, false); - EXPECT_EQ(debug_string, - std::u16string(expected_output.begin(), expected_output.end())); -} - -TEST_F(SemanticLabelsJsonParsingTest, UseOverrideField) { - std::string json_input = R"({ - "roles": [{"id": 47, "name": "ADDRESS_LINE1"}], - "objectives": [{"id": 7, "name": "FILL_DELIVERY_ADDRESS"}] - })"; - std::string expected_output = - "{role: ADDRESS_LINE1, objective: FILL_DELIVERY_ADDRESS}[override]"; - - // Encode the JSON and add it to the debug DOM annotations switch - std::string base64_json; - base::Base64Encode(json_input, &base64_json); - - SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json); - - std::u16string debug_string = SemanticPredictionResultToDebugString( - labels.first, labels.second, ModelExecutorResult(47, 7, true), false); + labels.first, labels.second, {47, 7}, false); EXPECT_EQ(debug_string, std::u16string(expected_output.begin(), expected_output.end())); } @@ -78,7 +54,7 @@ SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json); std::u16string debug_string = SemanticPredictionResultToDebugString( - labels.first, labels.second, model_executor_result_, false); + labels.first, labels.second, {47, 7}, false); EXPECT_EQ(debug_string, std::u16string(expected_output.begin(), expected_output.end())); } @@ -94,7 +70,7 @@ SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json); std::u16string debug_string = SemanticPredictionResultToDebugString( - labels.first, labels.second, model_executor_result_, false); + labels.first, labels.second, {47, 7}, false); EXPECT_EQ(debug_string, std::u16string(expected_output.begin(), expected_output.end())); } @@ -114,7 +90,7 @@ SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json); std::u16string debug_string = SemanticPredictionResultToDebugString( - labels.first, labels.second, model_executor_result_, false); + labels.first, labels.second, {47, 7}, false); EXPECT_EQ(debug_string, std::u16string(expected_output.begin(), expected_output.end())); } @@ -134,7 +110,7 @@ SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json); std::u16string debug_string = SemanticPredictionResultToDebugString( - labels.first, labels.second, model_executor_result_, false); + labels.first, labels.second, {47, 7}, false); EXPECT_EQ(debug_string, std::u16string(expected_output.begin(), expected_output.end())); } @@ -153,7 +129,7 @@ SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json); std::u16string debug_string = SemanticPredictionResultToDebugString( - labels.first, labels.second, model_executor_result_, false); + labels.first, labels.second, {47, 7}, false); EXPECT_EQ(debug_string, std::u16string(expected_output.begin(), expected_output.end())); } @@ -173,7 +149,7 @@ SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json); std::u16string debug_string = SemanticPredictionResultToDebugString( - labels.first, labels.second, model_executor_result_, false); + labels.first, labels.second, {47, 7}, false); EXPECT_EQ(debug_string, std::u16string(expected_output.begin(), expected_output.end())); } @@ -193,7 +169,7 @@ SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json); std::u16string debug_string = SemanticPredictionResultToDebugString( - labels.first, labels.second, model_executor_result_, false); + labels.first, labels.second, {47, 7}, false); EXPECT_EQ(debug_string, std::u16string(expected_output.begin(), expected_output.end())); } @@ -209,7 +185,7 @@ SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json); std::u16string debug_string = SemanticPredictionResultToDebugString( - labels.first, labels.second, model_executor_result_, false); + labels.first, labels.second, {47, 7}, false); EXPECT_EQ(debug_string, std::u16string(expected_output.begin(), expected_output.end())); }
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_model_executor.cc b/components/autofill_assistant/content/renderer/autofill_assistant_model_executor.cc index 8b3a60b..496d218ac 100644 --- a/components/autofill_assistant/content/renderer/autofill_assistant_model_executor.cc +++ b/components/autofill_assistant/content/renderer/autofill_assistant_model_executor.cc
@@ -6,7 +6,6 @@ #include <ostream> -#include "autofill_assistant_model_executor.h" #include "base/command_line.h" #include "base/i18n/case_conversion.h" #include "base/no_destructor.h" @@ -113,7 +112,7 @@ std::make_unique<ExecutionTask>(std::move(tflite_engine), this); } -absl::optional<ModelExecutorResult> +absl::optional<std::pair<int, int>> AutofillAssistantModelExecutor::ExecuteModelWithInput( const blink::AutofillAssistantNodeSignals& node_signals) { if (!execution_task_) { @@ -253,7 +252,7 @@ return true; } -absl::optional<ModelExecutorResult> AutofillAssistantModelExecutor::Postprocess( +absl::optional<std::pair<int, int>> AutofillAssistantModelExecutor::Postprocess( const std::vector<const TfLiteTensor*>& output_tensors) { // Check if we have an override for this execution and return that instead. if (overrides_result_) { @@ -263,8 +262,7 @@ << ", objective: " << overrides_result_->second << ")"; } // Cleanup the result in case this executor is reused. - ModelExecutorResult result(overrides_result_->first, - overrides_result_->second, true); + std::pair<int, int> result = *overrides_result_; overrides_result_.reset(); return result; } @@ -298,7 +296,7 @@ int semantic_role = model_metadata_.output().semantic_role().classes(index_of_best_role); if (semantic_role == 0) { - return ModelExecutorResult(/*r=*/0, /*o=*/0, /*with_override=*/false); + return std::pair<int, int>(semantic_role, 0); } int block_index; @@ -310,8 +308,7 @@ return absl::nullopt; } - ModelExecutorResult result(semantic_role, objective, false); - return result; + return std::pair<int, int>(semantic_role, objective); } void AutofillAssistantModelExecutor::Tokenize(
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_model_executor.h b/components/autofill_assistant/content/renderer/autofill_assistant_model_executor.h index 88d662b..7e8822e 100644 --- a/components/autofill_assistant/content/renderer/autofill_assistant_model_executor.h +++ b/components/autofill_assistant/content/renderer/autofill_assistant_model_executor.h
@@ -11,7 +11,6 @@ #include "base/files/file.h" #include "base/files/memory_mapped_file.h" -#include "components/autofill_assistant/content/renderer/autofill_assistant_model_executor_result.h" #include "components/autofill_assistant/content/renderer/model_metadata.pb.h" #include "components/optimization_guide/core/base_model_executor.h" #include "components/optimization_guide/core/base_model_executor_helpers.h" @@ -28,11 +27,11 @@ // node signals. class AutofillAssistantModelExecutor : public optimization_guide::BaseModelExecutor< - ModelExecutorResult, + std::pair<int, int>, const blink::AutofillAssistantNodeSignals&> { public: using ExecutionTask = optimization_guide::GenericModelExecutionTask< - ModelExecutorResult, + std::pair<int, int>, const blink::AutofillAssistantNodeSignals&>; using SparseVector = std::vector<std::pair<std::pair<int, int>, int>>; using SparseMap = base::flat_map<std::pair<int, int>, int>; @@ -50,7 +49,7 @@ bool InitializeModelFromFile(base::File model_file); // Execute the model with the given input. - absl::optional<ModelExecutorResult> ExecuteModelWithInput( + absl::optional<std::pair<int, int>> ExecuteModelWithInput( const blink::AutofillAssistantNodeSignals& node_signals); protected: @@ -58,7 +57,7 @@ bool Preprocess( const std::vector<TfLiteTensor*>& input_tensors, const blink::AutofillAssistantNodeSignals& node_signals) override; - absl::optional<ModelExecutorResult> Postprocess( + absl::optional<std::pair<int, int>> Postprocess( const std::vector<const TfLiteTensor*>& output_tensors) override; private:
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_model_executor_result.h b/components/autofill_assistant/content/renderer/autofill_assistant_model_executor_result.h deleted file mode 100644 index 42c40fd..0000000 --- a/components/autofill_assistant/content/renderer/autofill_assistant_model_executor_result.h +++ /dev/null
@@ -1,26 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_AUTOFILL_ASSISTANT_CONTENT_RENDERER_AUTOFILL_ASSISTANT_MODEL_EXECUTOR_RESULT_H_ -#define COMPONENTS_AUTOFILL_ASSISTANT_CONTENT_RENDERER_AUTOFILL_ASSISTANT_MODEL_EXECUTOR_RESULT_H_ - -namespace autofill_assistant { - -// Result used to communicated model execution results between interested -// parties. -struct ModelExecutorResult { - ModelExecutorResult() = default; - ModelExecutorResult(int r, int o, bool with_override) - : role(r), objective(o), used_override(with_override) {} - - // Role and objective pair. - int role = 0; - int objective = 0; - // Whether this result came from an override. - bool used_override = false; -}; - -} // namespace autofill_assistant - -#endif // COMPONENTS_AUTOFILL_ASSISTANT_CONTENT_RENDERER_AUTOFILL_ASSISTANT_MODEL_EXECUTOR_RESULT_H_
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_model_executor_unittest.cc b/components/autofill_assistant/content/renderer/autofill_assistant_model_executor_unittest.cc index 862620e..1212e00 100644 --- a/components/autofill_assistant/content/renderer/autofill_assistant_model_executor_unittest.cc +++ b/components/autofill_assistant/content/renderer/autofill_assistant_model_executor_unittest.cc
@@ -101,8 +101,8 @@ auto result = model_executor_.ExecuteModelWithInput(node_signals); ASSERT_TRUE(result.has_value()); - EXPECT_EQ(result->role, 47 /* ADDRESS_LINE1 */); - EXPECT_EQ(result->objective, 7 /* FILL_DELIVERY_ADDRESS */); + EXPECT_EQ(result->first, 47 /* ADDRESS_LINE1 */); + EXPECT_EQ(result->second, 7 /* FILL_DELIVERY_ADDRESS */); } TEST_F(AutofillAssistantModelExecutorTest, OverridesMatch) { @@ -119,9 +119,8 @@ auto result = model_executor.ExecuteModelWithInput(node_signals); ASSERT_TRUE(result.has_value()); - EXPECT_EQ(result->role, 9999); - EXPECT_EQ(result->objective, 1111); - EXPECT_TRUE(result->used_override); + EXPECT_EQ(result->first, 9999); + EXPECT_EQ(result->second, 1111); } TEST_F(AutofillAssistantModelExecutorTest, OverridesNoMatch) { @@ -136,9 +135,8 @@ auto result = model_executor.ExecuteModelWithInput(node_signals); ASSERT_TRUE(result.has_value()); - EXPECT_NE(result->role, 9999); - EXPECT_NE(result->objective, 1111); - EXPECT_FALSE(result->used_override); + EXPECT_NE(result->first, 9999); + EXPECT_NE(result->second, 1111); } TEST_F(AutofillAssistantModelExecutorTest, OverridesResultNotReused) { @@ -155,9 +153,8 @@ auto result = model_executor.ExecuteModelWithInput(node_signals); ASSERT_TRUE(result.has_value()); - EXPECT_EQ(result->role, 9999); - EXPECT_EQ(result->objective, 1111); - EXPECT_TRUE(result->used_override); + EXPECT_EQ(result->first, 9999); + EXPECT_EQ(result->second, 1111); } // We expect the internal overrides result from the previous execution to have @@ -169,9 +166,8 @@ auto result = model_executor.ExecuteModelWithInput(node_signals); ASSERT_TRUE(result.has_value()); - EXPECT_NE(result->role, 9999); - EXPECT_NE(result->objective, 1111); - EXPECT_FALSE(result->used_override); + EXPECT_NE(result->first, 9999); + EXPECT_NE(result->second, 1111); } }
diff --git a/components/desks_storage/DIR_METADATA b/components/desks_storage/DIR_METADATA new file mode 100644 index 0000000..af853d76 --- /dev/null +++ b/components/desks_storage/DIR_METADATA
@@ -0,0 +1,4 @@ +buganizer { + component_id: 1020793 +} +team_email: "cros-commercial-productivity-eng@google.com"
diff --git a/components/device_signals/core/browser/BUILD.gn b/components/device_signals/core/browser/BUILD.gn index e80af04e..f53c5c7 100644 --- a/components/device_signals/core/browser/BUILD.gn +++ b/components/device_signals/core/browser/BUILD.gn
@@ -105,4 +105,8 @@ if (is_win) { deps += [ "//components/device_signals/core/browser/win:unit_tests" ] } + + if (is_mac) { + deps += [ "//components/device_signals/core/browser/mac:unit_tests" ] + } }
diff --git a/components/device_signals/core/browser/mac/BUILD.gn b/components/device_signals/core/browser/mac/BUILD.gn index 22dfe93..dd997ca 100644 --- a/components/device_signals/core/browser/mac/BUILD.gn +++ b/components/device_signals/core/browser/mac/BUILD.gn
@@ -9,8 +9,22 @@ deps = [ "//base", - "//components/device_signals/core/browser:browser", + "//components/device_signals/core/browser", + "//components/device_signals/core/common/", ] frameworks = [ "Foundation.framework" ] } + +source_set("unit_tests") { + testonly = true + sources = [ "plist_settings_client_unittest.mm" ] + + deps = [ + ":mac", + "//base/test:test_support", + "//components/device_signals/test:test_support", + "//testing/gmock", + "//testing/gtest", + ] +}
diff --git a/components/device_signals/core/browser/mac/plist_settings_client.mm b/components/device_signals/core/browser/mac/plist_settings_client.mm index 73a0159..d0a14d5 100644 --- a/components/device_signals/core/browser/mac/plist_settings_client.mm +++ b/components/device_signals/core/browser/mac/plist_settings_client.mm
@@ -8,10 +8,175 @@ #include <utility> +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#import "base/mac/foundation_util.h" +#include "base/mac/scoped_nsobject.h" +#include "base/strings/sys_string_conversions.h" +#include "base/task/thread_pool.h" +#include "components/device_signals/core/browser/settings_client.h" #include "components/device_signals/core/browser/signals_types.h" +#include "components/device_signals/core/common/platform_utils.h" namespace device_signals { +namespace { + +// Max plist file size. +constexpr int kMaxFileSizeInMb = 500; + +// Max size of the setting element. +constexpr size_t kMaxStringSizeInBytes = 1024; + +// Parses the `data_obj` for the item at the given key `path`. Returns the +// object in the event of a successful parse, and nil otherwise. +id ParseArrays(id data_obj, NSString* path) { + NSArray* indexes = [path componentsSeparatedByString:@"["]; + + for (NSString* index_str in indexes) { + if (![data_obj isKindOfClass:[NSArray class]]) { + return nil; + } + + if (![index_str length]) + continue; + + // Checking for the square brackets being closed. If they are not, then the + // key path is malformed. + NSRange range = [index_str rangeOfString:@"]"]; + if (range.location == NSNotFound || + range.location < [index_str length] - 1) { + return nil; + } + index_str = [index_str substringToIndex:range.location]; + + // Validate that the index is a numeric. If the index is an alpha, issues + // will occur during string to integer conversion. + NSCharacterSet* numeric_set = [NSCharacterSet decimalDigitCharacterSet]; + if (![numeric_set + isSupersetOfSet:[NSCharacterSet characterSetWithCharactersInString: + index_str]]) { + return nil; + } + + NSUInteger index = base::checked_cast<NSUInteger>([index_str integerValue]); + if (index > [data_obj count]) + return nil; + + data_obj = [data_obj objectAtIndex:index]; + } + + return data_obj; +} + +// Parses the loaded plist `dict` for the setting item at `key_path`. Returns +// the setting object if it is found or nil otherwise. +id ParsePlist(NSDictionary* dict, NSString* key_path) { + // Check if an array exists in the path, If not, the plist can be parsed + // directly. + NSRange test_range = [key_path rangeOfString:@"["]; + if (test_range.location == NSNotFound) + return [dict valueForKeyPath:key_path]; + + NSDictionary* current_obj = dict; + for (NSString* sub_path in [key_path componentsSeparatedByString:@"."]) { + NSRange range = [sub_path rangeOfString:@"["]; + if (range.location == NSNotFound) { + current_obj = [current_obj valueForKey:sub_path]; + } else { + current_obj = + [current_obj valueForKey:[sub_path substringToIndex:range.location]]; + current_obj = ParseArrays(current_obj, + [sub_path substringFromIndex:range.location]); + } + } + + // This will occur if the key path is incorrect and does not actually point to + // a setting item. At the end of a parse, the only remaining object should be + // the single setting item. + if ([current_obj isKindOfClass:[NSArray class]] && [current_obj count] != 1) { + return nil; + } + return current_obj; +} + +// Using the setting `options`, this is responsible for loading and parsing the +// plists for setting values specified for the setting options. A collection of +// the setting items are returned to the caller. +std::vector<SettingsItem> GetSettingItems( + const std::vector<GetSettingsOptions>& options) { + std::vector<SettingsItem> items; + + for (GetSettingsOptions option : options) { + SettingsItem item; + item.key = option.key; + item.path = option.path; + + // Load Plist file into memory. + base::FilePath resolved_path; + if (!ResolvePath(base::FilePath(option.path), &resolved_path)) { + item.presence = PresenceValue::kNotFound; + items.push_back(item); + continue; + } + + int64_t plist_file_size = 0; + if (!base::GetFileSize(resolved_path, &plist_file_size) || + plist_file_size > (kMaxFileSizeInMb << 20)) { + item.presence = PresenceValue::kNotFound; + items.push_back(item); + continue; + } + + NSError* error = nil; + NSURL* url = base::mac::FilePathToNSURL(resolved_path); + base::scoped_nsobject<NSDictionary> plist_dict( + [[NSDictionary alloc] initWithContentsOfURL:url error:&error]); + if (error && [error code] == NSFileReadNoPermissionError) { + item.presence = PresenceValue::kAccessDenied; + items.push_back(item); + continue; + } + + if (!plist_dict) { + item.presence = PresenceValue::kNotFound; + items.push_back(item); + } + + id value_ptr = ParsePlist(plist_dict, base::SysUTF8ToNSString(option.key)); + if (!value_ptr) { + item.presence = PresenceValue::kNotFound; + items.push_back(item); + continue; + } + + item.presence = PresenceValue::kFound; + if (!option.get_value) { + items.push_back(item); + continue; + } + + if (NSString* setting_str = base::mac::ObjCCast<NSString>(value_ptr)) { + if ([setting_str length] <= kMaxStringSizeInBytes) + item.setting_value = base::Value(base::SysNSStringToUTF8(setting_str)); + } else if (NSNumber* value_num = base::mac::ObjCCast<NSNumber>(value_ptr)) { + // Differentiating between integer and float types. + const char* value_type = [value_num objCType]; + if (strcmp(value_type, "d") == 0 || strcmp(value_type, "f") == 0) { + double setting_num = [value_num doubleValue]; + item.setting_value = base::Value(setting_num); + } else { + int setting_num = [value_num integerValue]; + item.setting_value = base::Value(setting_num); + } + } + items.push_back(item); + } + return items; +} + +} // namespace + PlistSettingsClient::PlistSettingsClient() = default; PlistSettingsClient::~PlistSettingsClient() = default; @@ -19,8 +184,22 @@ void PlistSettingsClient::GetSettings( const std::vector<GetSettingsOptions>& options, GetSettingsSignalsCallback callback) { - // TODO(b:245524787): Implement. - std::move(callback).Run(std::vector<SettingsItem>()); + std::vector<SettingsItem> items; + + // Used to ensure that this function is being called on the main thread. + SEQUENCE_CHECKER(sequence_checker_); + + if (options.empty()) { + std::move(callback).Run(std::vector<SettingsItem>()); + return; + } + + base::ThreadPool::PostTaskAndReplyWithResult( + FROM_HERE, + {base::MayBlock(), base::TaskPriority::USER_BLOCKING, + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, + base::BindOnce(&GetSettingItems, std::move(options)), + std::move(callback)); } } // namespace device_signals
diff --git a/components/device_signals/core/browser/mac/plist_settings_client_unittest.mm b/components/device_signals/core/browser/mac/plist_settings_client_unittest.mm new file mode 100644 index 0000000..586ae8a --- /dev/null +++ b/components/device_signals/core/browser/mac/plist_settings_client_unittest.mm
@@ -0,0 +1,300 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/device_signals/core/browser/mac/plist_settings_client.h" + +#import <Foundation/Foundation.h> + +#include <string> + +#include "base/files/file_path.h" +#include "base/test/task_environment.h" +#include "base/test/test_future.h" +#include "components/device_signals/test/test_constants.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace device_signals { + +class PlistSettingsClientTest : public testing::Test { + protected: + GetSettingsOptions CreateOption(const std::string& key_path, bool value) { + GetSettingsOptions option; + option.path = test_file_path_.value(); + option.key = key_path; + option.get_value = value; + return option; + } + + SettingsItem CreateSettingItem(const std::string& key_path, + PresenceValue value, + const std::string& setting_value) { + SettingsItem item; + if (!setting_value.empty()) + item.setting_value = base::Value(setting_value); + return FinishSettingItemSetup(item, key_path, value); + } + + SettingsItem CreateSettingItem(const std::string& key_path, + PresenceValue value, + const int setting_value) { + SettingsItem item; + item.setting_value = base::Value(setting_value); + return FinishSettingItemSetup(item, key_path, value); + } + + SettingsItem CreateSettingItem(const std::string& key_path, + PresenceValue value, + const double setting_value) { + SettingsItem item; + item.setting_value = base::Value(setting_value); + return FinishSettingItemSetup(item, key_path, value); + } + + SettingsItem FinishSettingItemSetup(SettingsItem item, + const std::string& key_path, + PresenceValue value) { + item.path = test_file_path_.value(); + item.key = key_path; + item.presence = value; + return item; + } + + PlistSettingsClient client_; + base::FilePath test_file_path_; + base::test::TaskEnvironment task_environment_; + base::test::TestFuture<const std::vector<SettingsItem>&> future_; +}; + +// Tests an empty request to GetSettings. In this case we should have no setting +// items. +TEST_F(PlistSettingsClientTest, GetSettings_EmptyOptions) { + client_.GetSettings(std::vector<GetSettingsOptions>(), future_.GetCallback()); + EXPECT_EQ(std::vector<SettingsItem>(), future_.Get()); +} + +// Tests when the request to GetSettings contains one invalid request. In this +// case we should have no setting items. +TEST_F(PlistSettingsClientTest, GetSettings_InvalidOptions) { + test_file_path_ = test::GetMixArrayDictionaryPlistPath(); + + std::vector<GetSettingsOptions> options; + options.push_back(CreateOption("", false)); + + std::vector<SettingsItem> items; + items.push_back(CreateSettingItem("", PresenceValue::kNotFound, "")); + + client_.GetSettings(options, future_.GetCallback()); + EXPECT_EQ(items, future_.Get()); +} + +// Tests a request to GetSettings from a plist that does not exist. +TEST_F(PlistSettingsClientTest, GetSettings_PlistDoesNotExist) { + test_file_path_ = + test::GetTestDataDir().AppendASCII("plist-doesnt-exist.plist"); + + std::vector<GetSettingsOptions> options; + std::string key_path = "Key1.SubKey1.SubSubKey1[0]"; + options.push_back(CreateOption(key_path, true)); + + std::vector<SettingsItem> items; + items.push_back(CreateSettingItem(key_path, PresenceValue::kNotFound, "")); + + client_.GetSettings(options, future_.GetCallback()); + EXPECT_EQ(items, future_.Get()); +} + +// Tests a request to GetSettings from an empty plist. +TEST_F(PlistSettingsClientTest, GetSettings_Plist_EmptyPlist) { + test_file_path_ = test::GetEmptyPlistPath(); + + std::vector<GetSettingsOptions> options; + std::string key_path = "Key1.SubKey1"; + options.push_back(CreateOption(key_path, true)); + + std::vector<SettingsItem> items; + items.push_back(CreateSettingItem(key_path, PresenceValue::kNotFound, "")); + + client_.GetSettings(options, future_.GetCallback()); + EXPECT_EQ(items, future_.Get()); +} + +// Tests a request to GetSettings from a plist containing a mix of dictionaries +// and arrays with nested key paths that do not exist in the plist. +TEST_F(PlistSettingsClientTest, + GetSettings_Plist_MixOfArrayDictItems_InvalidKeyPath) { + test_file_path_ = test::GetMixArrayDictionaryPlistPath(); + + std::string key_path1 = "Key1.SubKey1.SubSubKey1[0][20]"; + std::string key_path2 = "Key1.SubKey1.SubSubKey5[1"; + std::string key_path3 = "Key1.Array]"; + std::string key_path4 = "Key1.Array[1000000]["; + std::string key_path5 = "Key1.."; + std::string key_path6 = "Key1.Array[a]"; + std::string key_path7 = "Key1.Array["; + std::string key_path8 = "Key1.Array[1]]"; + std::string key_path9 = "Key1.Array[]"; + + std::vector<GetSettingsOptions> options; + options.push_back(CreateOption(key_path1, true)); + options.push_back(CreateOption(key_path2, false)); + options.push_back(CreateOption(key_path3, false)); + options.push_back(CreateOption(key_path4, true)); + options.push_back(CreateOption(key_path5, true)); + options.push_back(CreateOption(key_path6, false)); + options.push_back(CreateOption(key_path7, false)); + options.push_back(CreateOption(key_path8, true)); + options.push_back(CreateOption(key_path9, true)); + + std::vector<SettingsItem> items; + items.push_back(CreateSettingItem(key_path1, PresenceValue::kNotFound, "")); + items.push_back(CreateSettingItem(key_path2, PresenceValue::kNotFound, "")); + items.push_back(CreateSettingItem(key_path3, PresenceValue::kNotFound, "")); + items.push_back(CreateSettingItem(key_path4, PresenceValue::kNotFound, "")); + items.push_back(CreateSettingItem(key_path5, PresenceValue::kNotFound, "")); + items.push_back(CreateSettingItem(key_path6, PresenceValue::kNotFound, "")); + items.push_back(CreateSettingItem(key_path7, PresenceValue::kNotFound, "")); + items.push_back(CreateSettingItem(key_path8, PresenceValue::kNotFound, "")); + items.push_back(CreateSettingItem(key_path9, PresenceValue::kNotFound, "")); + + client_.GetSettings(options, future_.GetCallback()); + EXPECT_EQ(items, future_.Get()); +} + +// Tests a request to GetSettings from a plist containing a mix of dictionaries +// and arrays with a nested key path that exists in the plist. +TEST_F(PlistSettingsClientTest, + GetSettings_Plist_MixOfArrayDictItems_ValidKeyPath) { + test_file_path_ = test::GetMixArrayDictionaryPlistPath(); + + std::string key_path = "Key1.SubKey1.SubSubKey1[0][10]"; + + std::vector<GetSettingsOptions> options; + options.push_back(CreateOption(key_path, true)); + options.push_back(CreateOption(key_path, false)); + + std::vector<SettingsItem> items; + items.push_back( + CreateSettingItem(key_path, PresenceValue::kFound, "string10")); + items.push_back(CreateSettingItem(key_path, PresenceValue::kFound, "")); + + client_.GetSettings(options, future_.GetCallback()); + EXPECT_EQ(items, future_.Get()); +} + +// Tests a request to GetSettings with an invalid setting path from a plist +// containing only dictionary elements. +TEST_F(PlistSettingsClientTest, + GetSettings_Plist_OnlyDictionaryItems_InvalidKeyPath) { + test_file_path_ = test::GetOnlyDictionaryPlistPath(); + + std::string key_path1 = "Key1.InvalidKeyValue"; + std::string key_path2 = "Key1.InvalidKeyValue.SubKey1"; + std::string key_path3 = "Key1.SubKey1.SubKey2.SubKey3.SubKey4"; + + std::vector<GetSettingsOptions> options; + options.push_back(CreateOption(key_path1, true)); + options.push_back(CreateOption(key_path2, false)); + options.push_back(CreateOption(key_path3, true)); + + std::vector<SettingsItem> items; + items.push_back(CreateSettingItem(key_path1, PresenceValue::kNotFound, "")); + items.push_back(CreateSettingItem(key_path2, PresenceValue::kNotFound, "")); + items.push_back(CreateSettingItem(key_path3, PresenceValue::kNotFound, "")); + + client_.GetSettings(options, future_.GetCallback()); + EXPECT_EQ(items, future_.Get()); +} + +// Tests a request to GetSettings with a path to a data type setting value from +// a plist containing only dictionary elements. +TEST_F(PlistSettingsClientTest, + GetSettings_Plist_OnlyDictionaryItems_DataType) { + test_file_path_ = test::GetOnlyDictionaryPlistPath(); + + std::string key_path = "DataKeyValue"; + + std::vector<GetSettingsOptions> options; + options.push_back(CreateOption(key_path, true)); + + std::vector<SettingsItem> items; + items.push_back(CreateSettingItem(key_path, PresenceValue::kFound, "")); + + client_.GetSettings(options, future_.GetCallback()); + EXPECT_EQ(items, future_.Get()); +} + +// Tests a request to GetSettings with a path to a float type setting value from +// a plist containing only dictionary elements. +TEST_F(PlistSettingsClientTest, + GetSettings_Plist_OnlyDictionaryItems_FloatType) { + test_file_path_ = test::GetOnlyDictionaryPlistPath(); + + std::string key_path = "RealKeyValue"; + + std::vector<GetSettingsOptions> options; + options.push_back(CreateOption(key_path, true)); + + std::vector<SettingsItem> items; + items.push_back(CreateSettingItem(key_path, PresenceValue::kFound, 0.123)); + + client_.GetSettings(options, future_.GetCallback()); + EXPECT_EQ(items, future_.Get()); +} + +// Tests a request to GetSettings with a path to a integer type setting value +// from a plist containing only dictionary elements. +TEST_F(PlistSettingsClientTest, + GetSettings_Plist_OnlyDictionaryItems_IntegerType) { + test_file_path_ = test::GetOnlyDictionaryPlistPath(); + + std::string key_path = "Key1.SubKey1.IntegerKeyValue"; + + std::vector<GetSettingsOptions> options; + options.push_back(CreateOption(key_path, true)); + + std::vector<SettingsItem> items; + items.push_back(CreateSettingItem(key_path, PresenceValue::kFound, 100)); + + client_.GetSettings(options, future_.GetCallback()); + EXPECT_EQ(items, future_.Get()); +} + +// Tests a request to GetSettings with a path to a string type setting value +// from a plist containing only dictionary elements. +TEST_F(PlistSettingsClientTest, + GetSettings_Plist_OnlyDictionaryItems_StringType) { + test_file_path_ = test::GetOnlyDictionaryPlistPath(); + + std::string key_path = "Key1.SubKey1.StringKeyValue"; + + std::vector<GetSettingsOptions> options; + options.push_back(CreateOption(key_path, true)); + + std::vector<SettingsItem> items; + items.push_back(CreateSettingItem(key_path, PresenceValue::kFound, "string")); + + client_.GetSettings(options, future_.GetCallback()); + EXPECT_EQ(items, future_.Get()); +} + +// Tests a request to GetSettings with a path to a boolean type setting value +// from a plist containing only dictionary elements. +TEST_F(PlistSettingsClientTest, + GetSettings_Plist_OnlyDictionaryItems_BooleanType) { + test_file_path_ = test::GetOnlyDictionaryPlistPath(); + + std::string key_path = "Key1.BooleanKeyValue"; + + std::vector<GetSettingsOptions> options; + options.push_back(CreateOption(key_path, true)); + + std::vector<SettingsItem> items; + items.push_back(CreateSettingItem(key_path, PresenceValue::kFound, 1)); + + client_.GetSettings(options, future_.GetCallback()); + EXPECT_EQ(items, future_.Get()); +} + +} // namespace device_signals
diff --git a/components/device_signals/test/signals_contract.cc b/components/device_signals/test/signals_contract.cc index 480435b..7894ac158 100644 --- a/components/device_signals/test/signals_contract.cc +++ b/components/device_signals/test/signals_contract.cc
@@ -140,6 +140,8 @@ base::BindRepeating(VerifyIsString, names::kDeviceHostName); contract[names::kMacAddresses] = base::BindRepeating( VerifyIsStringArray, names::kMacAddresses, /*enforce_value=*/false); + contract[names::kScreenLockSecured] = + base::BindRepeating(VerifyIsSettingInteger, names::kScreenLockSecured); #if BUILDFLAG(IS_WIN) contract[names::kChromeCleanupEnabled] = @@ -163,9 +165,6 @@ #endif #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) - contract[names::kScreenLockSecured] = - base::BindRepeating(VerifyIsSettingInteger, names::kScreenLockSecured); - contract[names::kAllowScreenLock] = base::BindRepeating(VerifyUnset, names::kAllowScreenLock); contract[names::kImei] = base::BindRepeating(VerifyUnset, names::kImei); @@ -174,9 +173,6 @@ // Chrome OS Signals. contract[names::kAllowScreenLock] = base::BindRepeating(VerifyIsBoolean, names::kAllowScreenLock); - - contract[names::kScreenLockSecured] = - base::BindRepeating(VerifyUnset, names::kScreenLockSecured); #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) return contract;
diff --git a/components/device_signals/test/test_constants.cc b/components/device_signals/test/test_constants.cc index 69f401a..b58e5db 100644 --- a/components/device_signals/test/test_constants.cc +++ b/components/device_signals/test/test_constants.cc
@@ -77,4 +77,16 @@ return GetTestDataDir().AppendASCII("Unused"); } +base::FilePath GetEmptyPlistPath() { + return GetTestDataDir().AppendASCII("empty.plist"); +} + +base::FilePath GetMixArrayDictionaryPlistPath() { + return GetTestDataDir().AppendASCII("mix_array_dictionary.plist"); +} + +base::FilePath GetOnlyDictionaryPlistPath() { + return GetTestDataDir().AppendASCII("only_dictionary.plist"); +} + } // namespace device_signals::test
diff --git a/components/device_signals/test/test_constants.h b/components/device_signals/test/test_constants.h index a1bb650..a8f9c03 100644 --- a/components/device_signals/test/test_constants.h +++ b/components/device_signals/test/test_constants.h
@@ -53,6 +53,16 @@ // Returns an absolute path to nothing (no file/directory). base::FilePath GetUnusedPath(); +// Returns an absolute path to a test empty plist. +base::FilePath GetEmptyPlistPath(); + +// Returns an absolute path to a test plist containing only dictionary items. +base::FilePath GetOnlyDictionaryPlistPath(); + +// Returns an absolute path to a test plist containing a mix of dictionary and +// array items. +base::FilePath GetMixArrayDictionaryPlistPath(); + } // namespace device_signals::test #endif // COMPONENTS_DEVICE_SIGNALS_TEST_TEST_CONSTANTS_H_
diff --git a/components/lens/DIR_METADATA b/components/lens/DIR_METADATA new file mode 100644 index 0000000..749bdad --- /dev/null +++ b/components/lens/DIR_METADATA
@@ -0,0 +1,4 @@ +monorail { + component: "UI>Browser" +} +team_email: "lens-chrome-eng+bugs@google.com"
diff --git a/components/nacl/features.gni b/components/nacl/features.gni index ba0f7e1..ba7f9d1 100644 --- a/components/nacl/features.gni +++ b/components/nacl/features.gni
@@ -5,15 +5,26 @@ import("//build/config/chromecast_build.gni") import("//build/config/gclient_args.gni") +# The NaCl sandbox and toolchain currently only support x86-32, x86-64 +# and ARM32. +# +# The NaCl sandbox itself supports MIPS32, but the Clang toolchain +# support for that is no longer up-to-date, so we don't include that +# in the list of CPU architectures to enable NaCl on. +# +# NaCl is also supported on ARM64 Chrome OS, where the ARM32 NaCl +# sandbox is used. We don't enable that by default here, but Chrome +# OS builds override "enable_nacl" to enable that. +_cpu_is_supported = + target_cpu == "x86" || target_cpu == "x64" || target_cpu == "arm" + declare_args() { # Enables Native Client support. - # Temporarily disable nacl on arm64 linux to get rid of compilation errors. + # # Intentionally and permanently disable nacl on arm64 mac. - # TODO: When mipsel-nacl-clang is available, drop the exclusion. enable_nacl = - checkout_nacl && target_os != "ios" && !is_android && !is_fuchsia && - !is_castos && current_cpu != "mipsel" && current_cpu != "mips64el" && - target_cpu != "arm64" && !(is_win && host_os != "win") && + checkout_nacl && _cpu_is_supported && target_os != "ios" && !is_android && + !is_fuchsia && !is_castos && !(is_win && host_os != "win") && !(is_mac && (host_os != "mac" || target_cpu != "x64")) }
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc index a98fde2b..e6d82a5 100644 --- a/components/omnibox/browser/autocomplete_controller.cc +++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -947,7 +947,13 @@ const AutocompleteMatch* preserve_default_match = nullptr; if (last_default_match && ShouldPreserveDefault(in_start_, input_)) preserve_default_match = &last_default_match.value(); - result_.SortAndCull(input_, template_url_service_, preserve_default_match); + + static bool single_sort_and_cull_pass = + base::FeatureList::IsEnabled(omnibox::kSingleSortAndCullPass); + // If `done_`, the below `SortAndCull()` is skipped, so this is the single + // pass. + if (!single_sort_and_cull_pass || done_) + result_.SortAndCull(input_, template_url_service_, preserve_default_match); if (!done_) { // This conditional needs to match the conditional in Start that invokes
diff --git a/components/omnibox/browser/autocomplete_controller_metrics_unittest.cc b/components/omnibox/browser/autocomplete_controller_metrics_unittest.cc index 4deeda9..441c9d05 100644 --- a/components/omnibox/browser/autocomplete_controller_metrics_unittest.cc +++ b/components/omnibox/browser/autocomplete_controller_metrics_unittest.cc
@@ -433,7 +433,8 @@ auto create_result = [&](std::vector<int> ids) { std::vector<AutocompleteResult::MatchDedupComparator> result; base::ranges::transform(ids, std::back_inserter(result), [](int id) { - return std::pair<GURL, bool>{"http://" + base::NumberToString(id), false}; + return AutocompleteResult::MatchDedupComparator{ + "http://" + base::NumberToString(id), false}; }); return result; };
diff --git a/components/omnibox/browser/autocomplete_match.cc b/components/omnibox/browser/autocomplete_match.cc index 4a31af8..47ca6d86 100644 --- a/components/omnibox/browser/autocomplete_match.cc +++ b/components/omnibox/browser/autocomplete_match.cc
@@ -115,8 +115,30 @@ return it->second; } +// Implementation of boost::hash_combine +// http://www.boost.org/doc/libs/1_43_0/doc/html/hash/reference.html#boost.hash_combine +template <typename T> +inline void hash_combine(std::size_t& seed, const T& value) { + std::hash<T> hasher; + seed ^= hasher(value) + 0x9e3779b9 + (seed << 6) + (seed >> 2); +} + } // namespace +template <typename S, typename T> +size_t ACMatchKeyHash<S, T>::operator()(const ACMatchKey<S, T>& key) const { + size_t seed = 0; + hash_combine(seed, key.first); + hash_combine(seed, key.second); + return seed; +} + +// This trick allows implementing ACMatchKeyHash in the implementation file. +template struct ACMatchKeyHash<std::u16string, std::string>; +template struct ACMatchKeyHash<std::string, bool>; + +// RichAutocompletionParams --------------------------------------------------- + RichAutocompletionParams::RichAutocompletionParams() : enabled(OmniboxFieldTrial::IsRichAutocompletionEnabled()), autocomplete_titles(
diff --git a/components/omnibox/browser/autocomplete_match.h b/components/omnibox/browser/autocomplete_match.h index bae3154..5555410 100644 --- a/components/omnibox/browser/autocomplete_match.h +++ b/components/omnibox/browser/autocomplete_match.h
@@ -58,6 +58,8 @@ // scoring non-default match. const char kACMatchPropertyScoreBoostedFrom[] = "score_boosted_from"; +// RichAutocompletionParams --------------------------------------------------- + // `RichAutocompletionParams` is a cache for the params used by // `TryRichAutocompletion()`. `TryRichAutocompletion()` is called about 80 times // per keystroke; fetching all 16 params each time causes measurable timing @@ -831,4 +833,15 @@ typedef std::vector<ACMatchClassification> ACMatchClassifications; typedef std::vector<AutocompleteMatch> ACMatches; +// Can be used as the key for grouping AutocompleteMatches in a map based on a +// std::pair of fields. This can be generalized to a std::tuple if ever needed. +// The accompanying hash function makes the key usable in an std::unordered_map. +template <typename S, typename T> +using ACMatchKey = std::pair<S, T>; + +template <typename S, typename T> +struct ACMatchKeyHash { + size_t operator()(const ACMatchKey<S, T>& key) const; +}; + #endif // COMPONENTS_OMNIBOX_BROWSER_AUTOCOMPLETE_MATCH_H_
diff --git a/components/omnibox/browser/autocomplete_result.cc b/components/omnibox/browser/autocomplete_result.cc index 6fcb25e..c5f8398 100644 --- a/components/omnibox/browser/autocomplete_result.cc +++ b/components/omnibox/browser/autocomplete_result.cc
@@ -75,14 +75,6 @@ } // namespace -struct MatchGURLHash { - // The |bool| is whether the match is a calculator suggestion. We want them - // compare differently against other matches with the same URL. - size_t operator()(const std::pair<GURL, bool>& p) const { - return std::hash<std::string>()(p.first.spec()) + p.second; - } -}; - // static size_t AutocompleteResult::GetMaxMatches(bool is_zero_suggest) { #if BUILDFLAG(IS_ANDROID) @@ -311,14 +303,14 @@ // If we are trying to keep a default match from a previous pass stable, // search the current results for it, and if found, make it the top match. if (preserve_default_match) { - std::pair<GURL, bool> default_match_fields = + const auto default_match_fields = GetMatchComparisonFields(*preserve_default_match); - top_match = - base::ranges::find_if(matches_, [&](const AutocompleteMatch& m) { + base::ranges::find_if(matches_, [&](const AutocompleteMatch& match) { // Find a match that is a duplicate AND has the same fill_into_edit. - return default_match_fields == GetMatchComparisonFields(m) && - preserve_default_match->fill_into_edit == m.fill_into_edit; + return default_match_fields == GetMatchComparisonFields(match) && + preserve_default_match->fill_into_edit == + match.fill_into_edit; }); } @@ -895,21 +887,21 @@ // static void AutocompleteResult::DeduplicateMatches(ACMatches* matches) { // Group matches by stripped URL and whether it's a calculator suggestion. - std::unordered_map<std::pair<GURL, bool>, std::vector<ACMatches::iterator>, - MatchGURLHash> + std::unordered_map<AutocompleteResult::MatchDedupComparator, + std::vector<ACMatches::iterator>, + ACMatchKeyHash<std::string, bool>> url_to_matches; for (auto i = matches->begin(); i != matches->end(); ++i) { - std::pair<GURL, bool> p = GetMatchComparisonFields(*i); - url_to_matches[p].push_back(i); + url_to_matches[GetMatchComparisonFields(*i)].push_back(i); } // For each group of duplicate matches, choose the one that's considered best. for (auto& group : url_to_matches) { const auto& key = group.first; - const GURL& gurl = key.first; + // The vector of matches whose URL are equivalent. std::vector<ACMatches::iterator>& duplicate_matches = group.second; - if (gurl.is_empty() || duplicate_matches.size() == 1) + if (key.first.empty() || duplicate_matches.size() == 1) continue; // Sort the matches best to worst, according to the deduplication criteria. @@ -943,10 +935,10 @@ } // Erase duplicate matches. - base::EraseIf(*matches, [&url_to_matches](const AutocompleteMatch& m) { - std::pair<GURL, bool> p = GetMatchComparisonFields(m); - return !m.stripped_destination_url.is_empty() && - &(*url_to_matches[p].front()) != &m; + base::EraseIf(*matches, [&url_to_matches](const AutocompleteMatch& match) { + auto match_comparison_fields = GetMatchComparisonFields(match); + return !match.stripped_destination_url.is_empty() && + &(*url_to_matches[match_comparison_fields].front()) != &match; }); } @@ -993,9 +985,9 @@ std::vector<AutocompleteResult::MatchDedupComparator> AutocompleteResult::GetMatchDedupComparators() const { - std::vector<MatchDedupComparator> comparators; + std::vector<AutocompleteResult::MatchDedupComparator> comparators; for (const auto& match : *this) - comparators.push_back(AutocompleteResult::GetMatchComparisonFields(match)); + comparators.push_back(GetMatchComparisonFields(match)); return comparators; } @@ -1199,9 +1191,9 @@ } } -std::pair<GURL, bool> AutocompleteResult::GetMatchComparisonFields( - const AutocompleteMatch& match) { - return std::make_pair(match.stripped_destination_url, +AutocompleteResult::MatchDedupComparator +AutocompleteResult::GetMatchComparisonFields(const AutocompleteMatch& match) { + return std::make_pair(match.stripped_destination_url.spec(), match.type == ACMatchType::CALCULATOR); }
diff --git a/components/omnibox/browser/autocomplete_result.h b/components/omnibox/browser/autocomplete_result.h index f218c847..34d0715 100644 --- a/components/omnibox/browser/autocomplete_result.h +++ b/components/omnibox/browser/autocomplete_result.h
@@ -36,7 +36,7 @@ public: typedef ACMatches::const_iterator const_iterator; typedef ACMatches::iterator iterator; - using MatchDedupComparator = std::pair<GURL, bool>; + using MatchDedupComparator = ACMatchKey<std::string, bool>; // Max number of matches we'll show from the various providers. This limit // may be different for zero suggest and non zero suggest. Does not take into
diff --git a/components/omnibox/browser/base_search_provider.h b/components/omnibox/browser/base_search_provider.h index 6fa4d68..999447d 100644 --- a/components/omnibox/browser/base_search_provider.h +++ b/components/omnibox/browser/base_search_provider.h
@@ -180,10 +180,10 @@ ~BaseSearchProvider() override; - typedef std::pair<std::u16string, std::string> MatchKey; - typedef std::map<MatchKey, AutocompleteMatch> MatchMap; - typedef std::vector<std::unique_ptr<SuggestionDeletionHandler>> - SuggestionDeletionHandlers; + using MatchKey = ACMatchKey<std::u16string, std::string>; + using MatchMap = std::map<MatchKey, AutocompleteMatch>; + using SuggestionDeletionHandlers = + std::vector<std::unique_ptr<SuggestionDeletionHandler>>; // Returns the appropriate value for the fill_into_edit field of an // AutcompleteMatch. The result consists of the suggestion text from
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc index 7c9afb9..9c9c73c 100644 --- a/components/omnibox/common/omnibox_features.cc +++ b/components/omnibox/common/omnibox_features.cc
@@ -93,11 +93,18 @@ "OmniboxStrippedGurlOptimization", base::FEATURE_DISABLED_BY_DEFAULT); -// Feature to debounce `AutocompleteController::UpdateResult()`. +// Feature to debounce `AutocompleteController::NotifyChanged()`. BASE_FEATURE(kUpdateResultDebounce, "OmniboxUpdateResultDebounce", base::FEATURE_DISABLED_BY_DEFAULT); +// When disabled, when providers update their matches, the new set of matches +// are sorted and culled, then merged with the old matches, then sorted and +// culled again. When enabled, the first sort and cull is skipped. +BASE_FEATURE(kSingleSortAndCullPass, + "OmniboxSingleSortAndCullPass", + base::FEATURE_DISABLED_BY_DEFAULT); + // Feature used to cap max zero suggestions shown according to the param // OmniboxMaxZeroSuggestMatches. If omitted, // OmniboxUIExperimentMaxAutocompleteMatches will be used instead. If present,
diff --git a/components/omnibox/common/omnibox_features.h b/components/omnibox/common/omnibox_features.h index 2be31a8..7fbf469 100644 --- a/components/omnibox/common/omnibox_features.h +++ b/components/omnibox/common/omnibox_features.h
@@ -26,6 +26,7 @@ BASE_DECLARE_FEATURE(kPreserveDefault); BASE_DECLARE_FEATURE(kStrippedGurlOptimization); BASE_DECLARE_FEATURE(kUpdateResultDebounce); +BASE_DECLARE_FEATURE(kSingleSortAndCullPass); // Features below this line should be sorted alphabetically by their comments.
diff --git a/components/performance_manager/user_tuning/prefs.cc b/components/performance_manager/user_tuning/prefs.cc index b8bf7b36..eb8704c0 100644 --- a/components/performance_manager/user_tuning/prefs.cc +++ b/components/performance_manager/user_tuning/prefs.cc
@@ -30,7 +30,8 @@ } void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { - registry->RegisterListPref(kTabDiscardingExceptions); + registry->RegisterListPref(kTabDiscardingExceptions, + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); registry->RegisterListPref(kManagedTabDiscardingExceptions); }
diff --git a/components/reporting/proto/synced/security_xdr_events.proto b/components/reporting/proto/synced/security_xdr_events.proto index baf84ff..6f3b34f 100644 --- a/components/reporting/proto/synced/security_xdr_events.proto +++ b/components/reporting/proto/synced/security_xdr_events.proto
@@ -2,6 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// TODO(b/250633393): This proto will need to be moved to the events directory. +// It is not currently possible because the events directory is not yet +// replicated to ChromeOS. + syntax = "proto2"; option optimize_for = LITE_RUNTIME;
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_impl.cc b/components/services/storage/public/cpp/filesystem/filesystem_impl.cc index 40461fe..27e5c5b 100644 --- a/components/services/storage/public/cpp/filesystem/filesystem_impl.cc +++ b/components/services/storage/public/cpp/filesystem/filesystem_impl.cc
@@ -117,7 +117,7 @@ const base::FilePath full_path = MakeAbsolute(path); base::FileErrorOr<std::vector<base::FilePath>> result = GetDirectoryEntries(full_path, mode); - if (result.is_error()) { + if (!result.has_value()) { std::move(callback).Run(result.error(), std::vector<base::FilePath>()); return; } @@ -255,7 +255,7 @@ void FilesystemImpl::LockFile(const base::FilePath& path, LockFileCallback callback) { base::FileErrorOr<base::File> result = LockFileLocal(MakeAbsolute(path)); - if (result.is_error()) { + if (!result.has_value()) { std::move(callback).Run(result.error(), mojo::NullRemote()); return; } @@ -282,15 +282,15 @@ base::File file(path, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ | base::File::FLAG_WRITE); if (!file.IsValid()) - return file.error_details(); + return base::unexpected(file.error_details()); if (!GetLockTable().AddLock(path)) - return base::File::FILE_ERROR_IN_USE; + return base::unexpected(base::File::FILE_ERROR_IN_USE); #if !BUILDFLAG(IS_FUCHSIA) base::File::Error error = file.Lock(base::File::LockMode::kExclusive); if (error != base::File::FILE_OK) - return error; + return base::unexpected(error); #endif return file; @@ -343,7 +343,7 @@ entries.push_back(entry); } if (enumerator.GetError() != base::File::FILE_OK) - return enumerator.GetError(); + return base::unexpected(enumerator.GetError()); return entries; }
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_proxy.cc b/components/services/storage/public/cpp/filesystem/filesystem_proxy.cc index d99e4bc..1e389c2e 100644 --- a/components/services/storage/public/cpp/filesystem/filesystem_proxy.cc +++ b/components/services/storage/public/cpp/filesystem/filesystem_proxy.cc
@@ -8,15 +8,13 @@ #include <utility> #include <vector> -#include "base/bind.h" #include "base/files/file.h" #include "base/files/file_util.h" #include "base/files/important_file_writer.h" -#include "base/types/pass_key.h" +#include "base/types/expected.h" #include "build/build_config.h" #include "components/services/storage/public/cpp/filesystem/filesystem_impl.h" #include "mojo/public/cpp/bindings/pending_receiver.h" -#include "mojo/public/cpp/bindings/self_owned_receiver.h" namespace storage { @@ -112,7 +110,7 @@ std::vector<base::FilePath> entries; remote_directory_->GetEntries(MakeRelative(path), mode, &error, &entries); if (error != base::File::FILE_OK) - return error; + return base::unexpected(error); // Fix up all the relative paths to be absolute. const base::FilePath root = path.IsAbsolute() ? path : root_.Append(path); @@ -127,7 +125,7 @@ if (!remote_directory_) { base::File file(MaybeMakeAbsolute(path), flags); if (!file.IsValid()) - return file.error_details(); + return base::unexpected(file.error_details()); return file; } @@ -161,7 +159,7 @@ break; default: NOTREACHED() << "Invalid open mode flags: " << mode_flags; - return base::File::FILE_ERROR_FAILED; + return base::unexpected(base::File::FILE_ERROR_FAILED); } mojom::FileReadAccess read_access = @@ -183,7 +181,7 @@ break; default: NOTREACHED() << "Invalid write access flags: " << write_flags; - return base::File::FILE_ERROR_FAILED; + return base::unexpected(base::File::FILE_ERROR_FAILED); } base::File::Error error = base::File::FILE_ERROR_IO; @@ -191,7 +189,7 @@ remote_directory_->OpenFile(MakeRelative(path), mode, read_access, write_access, &error, &file); if (error != base::File::FILE_OK) - return error; + return base::unexpected(error); return file; } @@ -306,8 +304,8 @@ base::FilePath full_path = MaybeMakeAbsolute(path); base::FileErrorOr<base::File> result = FilesystemImpl::LockFileLocal(full_path); - if (result.is_error()) - return result.error(); + if (!result.has_value()) + return base::unexpected(result.error()); std::unique_ptr<FileLock> lock = std::make_unique<LocalFileLockImpl>( std::move(full_path), std::move(result.value())); return lock; @@ -316,9 +314,9 @@ mojo::PendingRemote<mojom::FileLock> remote_lock; base::File::Error error = base::File::FILE_ERROR_IO; if (!remote_directory_->LockFile(MakeRelative(path), &error, &remote_lock)) - return error; + return base::unexpected(error); if (error != base::File::FILE_OK) - return error; + return base::unexpected(error); std::unique_ptr<FileLock> lock = std::make_unique<RemoteFileLockImpl>(std::move(remote_lock));
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_proxy_unittest.cc b/components/services/storage/public/cpp/filesystem/filesystem_proxy_unittest.cc index dca0b4c..520b592 100644 --- a/components/services/storage/public/cpp/filesystem/filesystem_proxy_unittest.cc +++ b/components/services/storage/public/cpp/filesystem/filesystem_proxy_unittest.cc
@@ -136,28 +136,28 @@ TEST_P(FilesystemProxyTest, GetDirectoryEntries) { FileErrorOr<std::vector<base::FilePath>> result = proxy().GetDirectoryEntries( base::FilePath(), FilesystemProxy::DirectoryEntryType::kFilesOnly); - ASSERT_FALSE(result.is_error()); + ASSERT_TRUE(result.has_value()); EXPECT_THAT(result.value(), UnorderedElementsAre(MakeAbsolute(kFile1), MakeAbsolute(kFile2))); result = proxy().GetDirectoryEntries( base::FilePath(), FilesystemProxy::DirectoryEntryType::kFilesAndDirectories); - ASSERT_FALSE(result.is_error()); + ASSERT_TRUE(result.has_value()); EXPECT_THAT(result.value(), UnorderedElementsAre(MakeAbsolute(kFile1), MakeAbsolute(kFile2), MakeAbsolute(kDir1), MakeAbsolute(kDir2))); result = proxy().GetDirectoryEntries( kDir1, FilesystemProxy::DirectoryEntryType::kFilesOnly); - ASSERT_FALSE(result.is_error()); + ASSERT_TRUE(result.has_value()); EXPECT_THAT(result.value(), UnorderedElementsAre(MakeAbsolute(kDir1.Append(kDir1File1)), MakeAbsolute(kDir1.Append(kDir1File2)))); result = proxy().GetDirectoryEntries( kDir1, FilesystemProxy::DirectoryEntryType::kFilesAndDirectories); - ASSERT_FALSE(result.is_error()); + ASSERT_TRUE(result.has_value()); EXPECT_THAT(result.value(), UnorderedElementsAre(MakeAbsolute(kDir1.Append(kDir1File1)), MakeAbsolute(kDir1.Append(kDir1File2)), @@ -183,7 +183,7 @@ FileErrorOr<base::File> file1 = proxy().OpenFile(kFile1, base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE); - EXPECT_FALSE(file1.is_error()); + EXPECT_TRUE(file1.has_value()); EXPECT_EQ(kFile1Contents, ReadFileContents(&file1.value())); } @@ -199,7 +199,7 @@ FileErrorOr<base::File> new_file = proxy().OpenFile( kNewFilename, base::File::FLAG_CREATE | base::File::FLAG_READ | base::File::FLAG_WRITE); - ASSERT_FALSE(new_file.is_error()); + ASSERT_TRUE(new_file.has_value()); EXPECT_EQ("", ReadFileContents(&new_file.value())); const std::string kData = "yeet"; @@ -212,7 +212,7 @@ FileErrorOr<base::File> file1 = proxy().OpenFile( kFile1, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ | base::File::FLAG_WRITE); - ASSERT_FALSE(file1.is_error()); + ASSERT_TRUE(file1.has_value()); EXPECT_TRUE(file1->IsValid()); EXPECT_EQ(kFile1Contents, ReadFileContents(&file1.value())); @@ -220,7 +220,7 @@ FileErrorOr<base::File> new_file = proxy().OpenFile( kNewFilename, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ | base::File::FLAG_WRITE); - ASSERT_FALSE(new_file.is_error()); + ASSERT_TRUE(new_file.has_value()); EXPECT_TRUE(new_file->IsValid()); EXPECT_EQ("", ReadFileContents(&new_file.value())); } @@ -229,7 +229,7 @@ FileErrorOr<base::File> file1 = proxy().OpenFile( kFile1, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_READ | base::File::FLAG_WRITE); - ASSERT_FALSE(file1.is_error()); + ASSERT_TRUE(file1.has_value()); EXPECT_TRUE(file1->IsValid()); EXPECT_EQ("", ReadFileContents(&file1.value())); @@ -237,7 +237,7 @@ FileErrorOr<base::File> new_file = proxy().OpenFile( kNewFilename, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_READ | base::File::FLAG_WRITE); - ASSERT_FALSE(new_file.is_error()); + ASSERT_TRUE(new_file.has_value()); EXPECT_TRUE(new_file->IsValid()); EXPECT_EQ("", ReadFileContents(&new_file.value())); } @@ -254,7 +254,7 @@ FileErrorOr<base::File> file1 = proxy().OpenFile( kFile1, base::File::FLAG_OPEN_TRUNCATED | base::File::FLAG_READ | base::File::FLAG_WRITE); - ASSERT_FALSE(file1.is_error()); + ASSERT_TRUE(file1.has_value()); EXPECT_TRUE(file1->IsValid()); EXPECT_EQ("", ReadFileContents(&file1.value())); } @@ -262,7 +262,7 @@ TEST_P(FilesystemProxyTest, OpenFileReadOnly) { FileErrorOr<base::File> file = proxy().OpenFile(kFile1, base::File::FLAG_OPEN | base::File::FLAG_READ); - ASSERT_FALSE(file.is_error()); + ASSERT_TRUE(file.has_value()); EXPECT_TRUE(file->IsValid()); // Writes should fail. @@ -280,7 +280,7 @@ TEST_P(FilesystemProxyTest, MAYBE_OpenFileWriteOnly) { FileErrorOr<base::File> file = proxy().OpenFile( kFile2, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); - ASSERT_FALSE(file.is_error()); + ASSERT_TRUE(file.has_value()); EXPECT_TRUE(file->IsValid()); const std::string kData{"files can have a little data, as a treat"}; @@ -305,7 +305,7 @@ const base::FilePath kFile3{FILE_PATH_LITERAL("file3")}; FileErrorOr<base::File> file = proxy().OpenFile( kFile3, base::File::FLAG_CREATE | base::File::FLAG_APPEND); - ASSERT_FALSE(file.is_error()); + ASSERT_TRUE(file.has_value()); EXPECT_TRUE(file->IsValid()); const std::string kData{"files can have a little data, as a treat"}; @@ -336,14 +336,14 @@ TEST_P(FilesystemProxyTest, MAYBE_DeleteFile) { FileErrorOr<base::File> file = proxy().OpenFile(kFile1, base::File::FLAG_OPEN | base ::File::FLAG_READ); - ASSERT_FALSE(file.is_error()); + ASSERT_TRUE(file.has_value()); EXPECT_TRUE(file->IsValid()); file->Close(); EXPECT_TRUE(proxy().DeleteFile(kFile1)); file = proxy().OpenFile(kFile1, base::File::FLAG_OPEN | base ::File::FLAG_READ); - EXPECT_TRUE(file.is_error()); + EXPECT_FALSE(file.has_value()); EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, file.error()); } @@ -426,7 +426,7 @@ FileErrorOr<base::File> new_file = proxy().OpenFile( kNewFilename, base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE); - ASSERT_FALSE(new_file.is_error()); + ASSERT_TRUE(new_file.has_value()); EXPECT_TRUE(new_file->IsValid()); EXPECT_EQ(kFile1Contents, ReadFileContents(&new_file.value())); } @@ -442,27 +442,27 @@ const base::FilePath kLockFilename{FILE_PATH_LITERAL("lox")}; FileErrorOr<std::unique_ptr<FilesystemProxy::FileLock>> result = proxy().LockFile(kLockFilename); - ASSERT_FALSE(result.is_error()); + ASSERT_FALSE(!result.has_value()); EXPECT_NE(nullptr, result.value()); FileErrorOr<std::unique_ptr<FilesystemProxy::FileLock>> result2 = proxy().LockFile(kLockFilename); - EXPECT_TRUE(result2.is_error()); + EXPECT_FALSE(result2.has_value()); EXPECT_EQ(base::File::FILE_ERROR_IN_USE, result2.error()); // Synchronously release so we can re-acquire the lock. EXPECT_EQ(base::File::Error::FILE_OK, result.value()->Release()); result2 = proxy().LockFile(kLockFilename); - ASSERT_FALSE(result2.is_error()); + ASSERT_TRUE(result2.has_value()); EXPECT_NE(nullptr, result2.value()); // Test that destruction also implicitly releases the lock. - result2 = base::File::FILE_ERROR_FAILED; + result2 = base::unexpected(base::File::FILE_ERROR_FAILED); // And once again we should be able to reacquire the lock. result = proxy().LockFile(kLockFilename); - ASSERT_FALSE(result.is_error()); + ASSERT_FALSE(!result.has_value()); EXPECT_NE(nullptr, result.value()); } @@ -479,7 +479,7 @@ // operate correctly. FileErrorOr<std::vector<base::FilePath>> result = proxy().GetDirectoryEntries( GetTestRoot(), FilesystemProxy::DirectoryEntryType::kFilesAndDirectories); - ASSERT_FALSE(result.is_error()); + ASSERT_FALSE(!result.has_value()); EXPECT_THAT(result.value(), UnorderedElementsAre(MakeAbsolute(kFile1), MakeAbsolute(kFile2), MakeAbsolute(kDir1), MakeAbsolute(kDir2))); @@ -492,7 +492,7 @@ FileErrorOr<std::vector<base::FilePath>> result = proxy().GetDirectoryEntries( GetTestRoot().Append(kDir1), FilesystemProxy::DirectoryEntryType::kFilesAndDirectories); - ASSERT_FALSE(result.is_error()); + ASSERT_FALSE(!result.has_value()); EXPECT_THAT(result.value(), UnorderedElementsAre(MakeAbsolute(kDir1.Append(kDir1File1)), MakeAbsolute(kDir1.Append(kDir1File2)),
diff --git a/components/services/storage/sandboxed_vfs_delegate.cc b/components/services/storage/sandboxed_vfs_delegate.cc index 9f0df7c..6a3615c 100644 --- a/components/services/storage/sandboxed_vfs_delegate.cc +++ b/components/services/storage/sandboxed_vfs_delegate.cc
@@ -26,7 +26,7 @@ base::FileErrorOr<base::File> result = filesystem_->OpenFile( file_path, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ | base::File::FLAG_WRITE); - if (result.is_error()) + if (!result.has_value()) return base::File(); return std::move(result.value()); }
diff --git a/components/test/data/autofill/heuristics/output/147_panera.custhelp.com_app_ask.out b/components/test/data/autofill/heuristics/output/147_panera.custhelp.com_app_ask.out index a879f8e..1261b49 100644 --- a/components/test/data/autofill/heuristics/output/147_panera.custhelp.com_app_ask.out +++ b/components/test/data/autofill/heuristics/output/147_panera.custhelp.com_app_ask.out
@@ -27,10 +27,10 @@ UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_action | Gift Card Action | | Incident.CustomFields.c.escalated_gift_card_devalue_1 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_issuer_person | Gift Card Issuer (person) | 588 | Incident.CustomFields.c.escalated_gift_card_devalue_1 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_appeasement_amt | Gift Card Appeasement $ Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 -UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_amount_new | Gift Card Amount (new) Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 +NUMERIC_QUANTITY | Incident.CustomFields.c.gift_card_amount_new | Gift Card Amount (new) Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_new_card | Gift Card - New Card # Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_box_number | Gift Card Box # Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 -UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_frozen_amount | Gift Card Amount (frozen) Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 +NUMERIC_QUANTITY | Incident.CustomFields.c.gift_card_frozen_amount | Gift Card Amount (frozen) Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_frozen_card_number | Gift Card Frozen Card # Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_issuing_location | Gift Card Issuing Location Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 UNKNOWN_TYPE | Incident.CustomFields.c.chat_type | Chat Topic Please select the Chat topic that best fits the issue | | Incident.CustomFields.c.escalated_gift_card_devalue_1
diff --git a/components/test/data/device_signals/empty.plist b/components/test/data/device_signals/empty.plist new file mode 100644 index 0000000..36a8706 --- /dev/null +++ b/components/test/data/device_signals/empty.plist
@@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> + <dict> + </dict> +</plist>
diff --git a/components/test/data/device_signals/mix_array_dictionary.plist b/components/test/data/device_signals/mix_array_dictionary.plist new file mode 100644 index 0000000..5aeb745 --- /dev/null +++ b/components/test/data/device_signals/mix_array_dictionary.plist
@@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> + <dict> + <key>Key1</key> + <dict> + <key>SubKey1</key> + <dict> + <key>SubSubKey1</key> + <array> + <array> + <string>string0</string> + <string>string1</string> + <string>string2</string> + <string>string3</string> + <string>string4</string> + <string>string5</string> + <string>string6</string> + <string>string7</string> + <string>string8</string> + <string>string9</string> + <string>string10</string> + <string>string11</string> + </array> + </array> + </dict> + </dict> +</dict> +</plist>
diff --git a/components/test/data/device_signals/only_dictionary.plist b/components/test/data/device_signals/only_dictionary.plist new file mode 100644 index 0000000..1e76924 --- /dev/null +++ b/components/test/data/device_signals/only_dictionary.plist
@@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>RealKeyValue</key> + <real>0.123</real> + <key>DataKeyValue</key> + <data>SGVsbG8sIHdvcmxkIQ==</data> + <key>Key1</key> + <dict> + <key>SubKey1</key> + <dict> + <key>StringKeyValue</key> + <string>string</string> + <key>IntegerKeyValue</key> + <integer>100</integer> + </dict> + <key>BooleanKeyValue</key> + <true/> + </dict> +</dict> +</plist>
diff --git a/components/translate/content/android/BUILD.gn b/components/translate/content/android/BUILD.gn index e2e7e3f..65fb37e 100644 --- a/components/translate/content/android/BUILD.gn +++ b/components/translate/content/android/BUILD.gn
@@ -96,18 +96,26 @@ } robolectric_library("junit") { - sources = - [ "java/src/org/chromium/components/translate/TranslateOptionsTest.java" ] + sources = [ + "java/src/org/chromium/components/translate/TranslateMessageTest.java", + "java/src/org/chromium/components/translate/TranslateOptionsTest.java", + ] deps = [ ":java", + "//base:base_java", "//base:base_java_test_support", "//base:base_junit_test_support", + "//components/browser_ui/widget/android:java", + "//components/messages/android:java", + "//content/public/android:content_java", "//third_party/android_deps:robolectric_all_java", "//third_party/android_support_test_runner:rules_java", "//third_party/android_support_test_runner:runner_java", "//third_party/androidx:androidx_appcompat_appcompat_java", "//third_party/androidx:androidx_test_runner_java", "//third_party/junit:junit", + "//third_party/mockito:mockito_java", + "//ui/android:ui_java", ] }
diff --git a/components/translate/content/android/java/src/org/chromium/components/translate/TranslateMessage.java b/components/translate/content/android/java/src/org/chromium/components/translate/TranslateMessage.java index 892efe7b..2880a4bb 100644 --- a/components/translate/content/android/java/src/org/chromium/components/translate/TranslateMessage.java +++ b/components/translate/content/android/java/src/org/chromium/components/translate/TranslateMessage.java
@@ -11,6 +11,7 @@ import android.view.View; import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; @@ -95,7 +96,8 @@ dismissalDurationSeconds); } - private TranslateMessage(@NonNull Context context, @NonNull MessageDispatcher messageDispatcher, + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + TranslateMessage(@NonNull Context context, @NonNull MessageDispatcher messageDispatcher, @NonNull WebContents webContents, long nativeTranslateMessage, int dismissalDurationSeconds) { mContext = context;
diff --git a/components/translate/content/android/java/src/org/chromium/components/translate/TranslateMessageTest.java b/components/translate/content/android/java/src/org/chromium/components/translate/TranslateMessageTest.java new file mode 100644 index 0000000..eacb949 --- /dev/null +++ b/components/translate/content/android/java/src/org/chromium/components/translate/TranslateMessageTest.java
@@ -0,0 +1,327 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.translate; + +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.verifyZeroInteractions; + +import android.app.Activity; +import android.content.Context; + +import androidx.test.filters.SmallTest; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import org.chromium.base.UnownedUserDataHost; +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.base.test.util.JniMocker; +import org.chromium.components.messages.DismissReason; +import org.chromium.components.messages.MessageBannerProperties; +import org.chromium.components.messages.MessageDispatcher; +import org.chromium.components.messages.MessageIdentifier; +import org.chromium.components.messages.MessageScopeType; +import org.chromium.components.messages.PrimaryActionClickBehavior; +import org.chromium.components.messages.PrimaryWidgetAppearance; +import org.chromium.components.messages.SecondaryMenuMaxSize; +import org.chromium.content_public.browser.WebContents; +import org.chromium.ui.base.WindowAndroid; +import org.chromium.ui.modelutil.PropertyModel; + +import java.lang.ref.WeakReference; + +/** + * Unit tests for TranslateMessage. + */ +@RunWith(BaseRobolectricTestRunner.class) +public final class TranslateMessageTest { + private static final long NATIVE_TRANSLATE_MESSAGE = 1337; + private static final int DISMISSAL_DURATION_SECONDS = 15; + + private static final String TITLE_BEFORE_TRANSLATE = "Translate Page?"; + private static final String TITLE_AFTER_TRANSLATE = "Page Translated"; + private static final String PRIMARY_TEXT_TRANSLATE = "Translate"; + private static final String PRIMARY_TEXT_UNDO = "Undo"; + private static final String DESCRIPTION = "French to English"; + + @Rule + public JniMocker mJniMocker = new JniMocker(); + + @Mock + WebContents mWebContents; + @Mock + TranslateMessage.Natives mMockJni; + @Mock + Context mContext; + @Mock + MessageDispatcher mMessageDispatcher; + + @Captor + ArgumentCaptor<PropertyModel> mPropertyModelCaptor; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + mJniMocker.mock(TranslateMessageJni.TEST_HOOKS, mMockJni); + } + + @Test + @SmallTest + public void testCreateWithNullWindowAndroid() { + doReturn(null).when(mWebContents).getTopLevelNativeWindow(); + Assert.assertNull(TranslateMessage.create( + mWebContents, NATIVE_TRANSLATE_MESSAGE, DISMISSAL_DURATION_SECONDS)); + } + + @Test + @SmallTest + public void testCreateWithNullActivityWeakReference() { + WindowAndroid windowAndroid = Mockito.mock(WindowAndroid.class); + doReturn(null).when(windowAndroid).getActivity(); + doReturn(windowAndroid).when(mWebContents).getTopLevelNativeWindow(); + Assert.assertNull(TranslateMessage.create( + mWebContents, NATIVE_TRANSLATE_MESSAGE, DISMISSAL_DURATION_SECONDS)); + } + + @Test + @SmallTest + public void testCreateWithNullActivity() { + WindowAndroid windowAndroid = Mockito.mock(WindowAndroid.class); + doReturn(new WeakReference<Activity>(null)).when(windowAndroid).getActivity(); + doReturn(windowAndroid).when(mWebContents).getTopLevelNativeWindow(); + Assert.assertNull(TranslateMessage.create( + mWebContents, NATIVE_TRANSLATE_MESSAGE, DISMISSAL_DURATION_SECONDS)); + } + + @Test + @SmallTest + public void testCreateWithNullMessageDispatcher() { + Activity activity = Mockito.mock(Activity.class); + WindowAndroid windowAndroid = Mockito.mock(WindowAndroid.class); + + doReturn(new WeakReference<Activity>(activity)).when(windowAndroid).getActivity(); + doReturn(windowAndroid).when(mWebContents).getTopLevelNativeWindow(); + doReturn(new UnownedUserDataHost()).when(windowAndroid).getUnownedUserDataHost(); + + Assert.assertNull(TranslateMessage.create( + mWebContents, NATIVE_TRANSLATE_MESSAGE, DISMISSAL_DURATION_SECONDS)); + } + + @Test + @SmallTest + public void testFullTranslateFlowThenDismissViaGesture() { + TranslateMessage translateMessage = new TranslateMessage(mContext, mMessageDispatcher, + mWebContents, NATIVE_TRANSLATE_MESSAGE, DISMISSAL_DURATION_SECONDS); + + // Show the before translate message. + translateMessage.showMessage(TITLE_BEFORE_TRANSLATE, DESCRIPTION, PRIMARY_TEXT_TRANSLATE, + /*hasOverflowMenu=*/true); + + verify(mMessageDispatcher) + .enqueueMessage(mPropertyModelCaptor.capture(), eq(mWebContents), + eq(MessageScopeType.NAVIGATION), /*highPriority=*/eq(false)); + PropertyModel messageProperties = mPropertyModelCaptor.getValue(); + + assertHasCommonProperties(messageProperties); + assertHasOverflowMenuProperties(messageProperties); + Assert.assertEquals( + TITLE_BEFORE_TRANSLATE, messageProperties.get(MessageBannerProperties.TITLE)); + Assert.assertEquals( + DESCRIPTION, messageProperties.get(MessageBannerProperties.DESCRIPTION)); + Assert.assertEquals(PrimaryWidgetAppearance.BUTTON_IF_TEXT_IS_SET, + messageProperties.get(MessageBannerProperties.PRIMARY_WIDGET_APPEARANCE)); + Assert.assertEquals(PRIMARY_TEXT_TRANSLATE, + messageProperties.get(MessageBannerProperties.PRIMARY_BUTTON_TEXT)); + + // Show the translation-in-progress state upon clicking "Translate". + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + translateMessage.showMessage( + TITLE_BEFORE_TRANSLATE, DESCRIPTION, "", /*hasOverflowMenu=*/true); + return null; + } + }) + .when(mMockJni) + .handlePrimaryAction(NATIVE_TRANSLATE_MESSAGE); + + Assert.assertEquals(new Integer(PrimaryActionClickBehavior.DO_NOT_DISMISS), + messageProperties.get(MessageBannerProperties.ON_PRIMARY_ACTION).get()); + + verifyNoMoreInteractions(mMessageDispatcher); + + assertHasCommonProperties(messageProperties); + assertHasOverflowMenuProperties(messageProperties); + Assert.assertEquals( + TITLE_BEFORE_TRANSLATE, messageProperties.get(MessageBannerProperties.TITLE)); + Assert.assertEquals( + DESCRIPTION, messageProperties.get(MessageBannerProperties.DESCRIPTION)); + Assert.assertEquals(PrimaryWidgetAppearance.PROGRESS_SPINNER, + messageProperties.get(MessageBannerProperties.PRIMARY_WIDGET_APPEARANCE)); + + // Show the after translate message. + translateMessage.showMessage( + TITLE_AFTER_TRANSLATE, DESCRIPTION, PRIMARY_TEXT_UNDO, /*hasOverflowMenu=*/true); + + verifyNoMoreInteractions(mMessageDispatcher); + + assertHasCommonProperties(messageProperties); + assertHasOverflowMenuProperties(messageProperties); + Assert.assertEquals( + TITLE_AFTER_TRANSLATE, messageProperties.get(MessageBannerProperties.TITLE)); + Assert.assertEquals( + DESCRIPTION, messageProperties.get(MessageBannerProperties.DESCRIPTION)); + Assert.assertEquals(PrimaryWidgetAppearance.BUTTON_IF_TEXT_IS_SET, + messageProperties.get(MessageBannerProperties.PRIMARY_WIDGET_APPEARANCE)); + Assert.assertEquals(PRIMARY_TEXT_UNDO, + messageProperties.get(MessageBannerProperties.PRIMARY_BUTTON_TEXT)); + + messageProperties.get(MessageBannerProperties.ON_DISMISSED).onResult(DismissReason.GESTURE); + verify(mMockJni).handleDismiss(NATIVE_TRANSLATE_MESSAGE, DismissReason.GESTURE); + } + + @Test + @SmallTest + public void testShowMessageWithoutOverflowMenu() { + TranslateMessage translateMessage = new TranslateMessage(mContext, mMessageDispatcher, + mWebContents, NATIVE_TRANSLATE_MESSAGE, DISMISSAL_DURATION_SECONDS); + + // Show the message. + translateMessage.showMessage(TITLE_BEFORE_TRANSLATE, DESCRIPTION, PRIMARY_TEXT_TRANSLATE, + /*hasOverflowMenu=*/false); + + verify(mMessageDispatcher) + .enqueueMessage(mPropertyModelCaptor.capture(), eq(mWebContents), + eq(MessageScopeType.NAVIGATION), /*highPriority=*/eq(false)); + PropertyModel messageProperties = mPropertyModelCaptor.getValue(); + + assertHasCommonProperties(messageProperties); + Assert.assertFalse(messageProperties.getAllSetProperties().contains( + MessageBannerProperties.SECONDARY_ICON_RESOURCE_ID)); + Assert.assertEquals( + TITLE_BEFORE_TRANSLATE, messageProperties.get(MessageBannerProperties.TITLE)); + Assert.assertEquals( + DESCRIPTION, messageProperties.get(MessageBannerProperties.DESCRIPTION)); + Assert.assertEquals(PrimaryWidgetAppearance.BUTTON_IF_TEXT_IS_SET, + messageProperties.get(MessageBannerProperties.PRIMARY_WIDGET_APPEARANCE)); + Assert.assertEquals(PRIMARY_TEXT_TRANSLATE, + messageProperties.get(MessageBannerProperties.PRIMARY_BUTTON_TEXT)); + } + + @Test + @SmallTest + public void testDismissFromNative() { + TranslateMessage translateMessage = new TranslateMessage(mContext, mMessageDispatcher, + mWebContents, NATIVE_TRANSLATE_MESSAGE, DISMISSAL_DURATION_SECONDS); + translateMessage.showMessage(TITLE_BEFORE_TRANSLATE, DESCRIPTION, PRIMARY_TEXT_TRANSLATE, + /*hasOverflowMenu=*/true); + + verify(mMessageDispatcher) + .enqueueMessage(mPropertyModelCaptor.capture(), eq(mWebContents), + eq(MessageScopeType.NAVIGATION), /*highPriority=*/eq(false)); + PropertyModel messageProperties = mPropertyModelCaptor.getValue(); + + // Call the ON_DISMISSED callback from MessageDispatcher.dismissMessage. + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + messageProperties.get(MessageBannerProperties.ON_DISMISSED) + .onResult(DismissReason.DISMISSED_BY_FEATURE); + return null; + } + }) + .when(mMessageDispatcher) + .dismissMessage(messageProperties, DismissReason.DISMISSED_BY_FEATURE); + + translateMessage.dismiss(); + + verify(mMockJni).handleDismiss( + NATIVE_TRANSLATE_MESSAGE, DismissReason.DISMISSED_BY_FEATURE); + } + + @Test + @SmallTest + public void testClearNativePointer() { + TranslateMessage translateMessage = new TranslateMessage(mContext, mMessageDispatcher, + mWebContents, NATIVE_TRANSLATE_MESSAGE, DISMISSAL_DURATION_SECONDS); + translateMessage.showMessage(TITLE_BEFORE_TRANSLATE, DESCRIPTION, PRIMARY_TEXT_TRANSLATE, + /*hasOverflowMenu=*/true); + + verify(mMessageDispatcher) + .enqueueMessage(mPropertyModelCaptor.capture(), eq(mWebContents), + eq(MessageScopeType.NAVIGATION), /*highPriority=*/eq(false)); + PropertyModel messageProperties = mPropertyModelCaptor.getValue(); + + translateMessage.clearNativePointer(); + + // No native methods should be called after clearing the native pointer. + messageProperties.get(MessageBannerProperties.ON_PRIMARY_ACTION).get(); + messageProperties.get(MessageBannerProperties.ON_DISMISSED).onResult(DismissReason.GESTURE); + Assert.assertNull(translateMessage.handleSecondaryMenuItemClicked( + new TranslateMessage.MenuItem("More languages", "", false, 2, ""))); + + verifyZeroInteractions(mMockJni); + } + + @Test + @SmallTest + public void testConstructMenuItemArray() { + final String[] titles = new String[] {"foo", "bar", "", "English", "French"}; + final String[] subtitles = new String[] {"", "", "", "", "Français"}; + final boolean[] hasCheckmarks = new boolean[] {false, true, false, false, false}; + final int[] overflowMenuItemIds = new int[] {0, 1, 2, 3, 4}; + final String[] languageCodes = new String[] {"", "", "", "en", "fr"}; + + TranslateMessage.MenuItem[] menuItems = TranslateMessage.constructMenuItemArray( + titles, subtitles, hasCheckmarks, overflowMenuItemIds, languageCodes); + Assert.assertEquals(titles.length, menuItems.length); + for (int i = 0; i < menuItems.length; ++i) { + Assert.assertEquals(titles[i], menuItems[i].title); + Assert.assertEquals(subtitles[i], menuItems[i].subtitle); + Assert.assertEquals(hasCheckmarks[i], menuItems[i].hasCheckmark); + Assert.assertEquals(overflowMenuItemIds[i], menuItems[i].overflowMenuItemId); + Assert.assertEquals(languageCodes[i], menuItems[i].languageCode); + } + } + + private static void assertHasCommonProperties(PropertyModel messageProperties) { + Assert.assertEquals(MessageIdentifier.TRANSLATE, + messageProperties.get(MessageBannerProperties.MESSAGE_IDENTIFIER)); + Assert.assertEquals(R.drawable.infobar_translate_compact, + messageProperties.get(MessageBannerProperties.ICON_RESOURCE_ID)); + Assert.assertEquals(MessageBannerProperties.TINT_NONE, + messageProperties.get(MessageBannerProperties.ICON_TINT_COLOR)); + Assert.assertEquals(DISMISSAL_DURATION_SECONDS, + messageProperties.get(MessageBannerProperties.DISMISSAL_DURATION)); + Assert.assertNotNull(messageProperties.get(MessageBannerProperties.ON_PRIMARY_ACTION)); + Assert.assertNotNull(messageProperties.get(MessageBannerProperties.ON_DISMISSED)); + } + + private static void assertHasOverflowMenuProperties(PropertyModel messageProperties) { + Assert.assertEquals(R.drawable.settings_cog, + messageProperties.get(MessageBannerProperties.SECONDARY_ICON_RESOURCE_ID)); + Assert.assertNotNull( + messageProperties.get(MessageBannerProperties.SECONDARY_MENU_BUTTON_DELEGATE)); + Assert.assertEquals(SecondaryMenuMaxSize.LARGE, + messageProperties.get(MessageBannerProperties.SECONDARY_MENU_MAX_SIZE)); + Assert.assertEquals(MessageIdentifier.TRANSLATE, + messageProperties.get(MessageBannerProperties.MESSAGE_IDENTIFIER)); + } +}
diff --git a/components/user_manager/user_image/user_image.h b/components/user_manager/user_image/user_image.h index 17c9402..e3331cdb 100644 --- a/components/user_manager/user_image/user_image.h +++ b/components/user_manager/user_image/user_image.h
@@ -26,6 +26,8 @@ FORMAT_JPEG, FORMAT_PNG, FORMAT_UNKNOWN, + // Useful when the image is external and animated. + FORMAT_WEBP, }; // Encodes the given bitmap to bytes representation in |image_format| for
diff --git a/components/viz/common/quads/render_pass_io.cc b/components/viz/common/quads/render_pass_io.cc index 3e665ae..0d4c56e 100644 --- a/components/viz/common/quads/render_pass_io.cc +++ b/components/viz/common/quads/render_pass_io.cc
@@ -210,12 +210,10 @@ return dict; } -bool PointFFromDict(const base::Value& dict, gfx::PointF* point) { +bool PointFFromDict(const base::Value::Dict& dict, gfx::PointF* point) { DCHECK(point); - if (!dict.is_dict()) - return false; - absl::optional<double> x = dict.FindDoubleKey("x"); - absl::optional<double> y = dict.FindDoubleKey("y"); + absl::optional<double> x = dict.FindDouble("x"); + absl::optional<double> y = dict.FindDouble("y"); if (!x || !y) { return false; } @@ -230,9 +228,13 @@ bool Vector2dFFromDict(const base::Value& dict, gfx::Vector2dF* v) { DCHECK(v); - gfx::PointF point; - if (!PointFFromDict(dict, &point)) + if (!dict.is_dict()) return false; + + gfx::PointF point; + if (!PointFFromDict(dict.GetDict(), &point)) + return false; + v->set_x(point.x()); v->set_y(point.y()); return true; @@ -1418,7 +1420,7 @@ const base::Value::Dict* mask_texture_size = dict.FindDict("mask_texture_size"); const base::Value* filters_scale = dict_value.FindDictKey("filters_scale"); - const base::Value* filters_origin = dict_value.FindDictKey("filters_origin"); + const base::Value::Dict* filters_origin = dict.FindDict("filters_origin"); const base::Value::Dict* tex_coord_rect = dict.FindDict("tex_coord_rect"); absl::optional<double> backdrop_filter_quality = dict.FindDouble("backdrop_filter_quality"); @@ -1512,29 +1514,29 @@ return true; } -bool TextureDrawQuadFromDict(const base::Value& dict, +bool TextureDrawQuadFromDict(const base::Value& dict_value, const DrawQuadCommon& common, TextureDrawQuad* draw_quad) { DCHECK(draw_quad); - if (!dict.is_dict()) + if (!dict_value.is_dict()) return false; if (common.resources.count != 1u) return false; + const base::Value::Dict& dict = dict_value.GetDict(); absl::optional<bool> premultiplied_alpha = - dict.FindBoolKey("premultiplied_alpha"); - const base::Value* uv_top_left = dict.FindDictKey("uv_top_left"); - const base::Value* uv_bottom_right = dict.FindDictKey("uv_bottom_right"); - const base::Value* vertex_opacity = dict.FindListKey("vertex_opacity"); - const base::Value* damage_rect = dict.FindDictKey("damage_rect"); - absl::optional<bool> y_flipped = dict.FindBoolKey("y_flipped"); - absl::optional<bool> nearest_neighbor = dict.FindBoolKey("nearest_neighbor"); - absl::optional<bool> secure_output_only = - dict.FindBoolKey("secure_output_only"); + dict.FindBool("premultiplied_alpha"); + const base::Value::Dict* uv_top_left = dict.FindDict("uv_top_left"); + const base::Value::Dict* uv_bottom_right = dict.FindDict("uv_bottom_right"); + const base::Value* vertex_opacity = dict_value.FindListKey("vertex_opacity"); + const base::Value* damage_rect = dict_value.FindDictKey("damage_rect"); + absl::optional<bool> y_flipped = dict.FindBool("y_flipped"); + absl::optional<bool> nearest_neighbor = dict.FindBool("nearest_neighbor"); + absl::optional<bool> secure_output_only = dict.FindBool("secure_output_only"); const std::string* protected_video_type = - dict.FindStringKey("protected_video_type"); + dict.FindString("protected_video_type"); const base::Value::Dict* resource_size_in_pixels = - dict.GetDict().FindDict("resource_size_in_pixels"); + dict.FindDict("resource_size_in_pixels"); if (!premultiplied_alpha || !uv_top_left || !uv_bottom_right || !vertex_opacity || !y_flipped || !nearest_neighbor || @@ -1552,7 +1554,7 @@ if (!PointFFromDict(*uv_top_left, &t_uv_top_left) || !PointFFromDict(*uv_bottom_right, &t_uv_bottom_right) || !SizeFromDict(*resource_size_in_pixels, &t_resource_size_in_pixels) || - !ColorFromDict(dict, "background_color", &t_background_color)) { + !ColorFromDict(dict_value, "background_color", &t_background_color)) { return false; } float t_vertex_opacity[4]; @@ -1568,8 +1570,7 @@ nearest_neighbor.value(), secure_output_only.value(), static_cast<gfx::ProtectedVideoType>(protected_video_type_index)); - draw_quad->is_stream_video = - dict.FindBoolKey("is_stream_video").value_or(false); + draw_quad->is_stream_video = dict.FindBool("is_stream_video").value_or(false); gfx::Rect t_damage_rect; if (damage_rect && RectFromDict(*damage_rect, &t_damage_rect)) {
diff --git a/components/viz/common/resources/transferable_resource.h b/components/viz/common/resources/transferable_resource.h index db88f375..de70043 100644 --- a/components/viz/common/resources/transferable_resource.h +++ b/components/viz/common/resources/transferable_resource.h
@@ -53,6 +53,7 @@ ReturnedResource ToReturnedResource() const; static std::vector<ReturnedResource> ReturnResources( const std::vector<TransferableResource>& input); + bool is_null() const { return mailbox_holder.mailbox.IsZero(); } static TransferableResource MakeSoftware(const SharedBitmapId& id, const gfx::Size& size,
diff --git a/components/viz/service/surfaces/surface_saved_frame.cc b/components/viz/service/surfaces/surface_saved_frame.cc index 3b9f6a4..498a171 100644 --- a/components/viz/service/surfaces/surface_saved_frame.cc +++ b/components/viz/service/surfaces/surface_saved_frame.cc
@@ -97,7 +97,7 @@ DCHECK_EQ(copy_request_count_, ExpectedResultCount()); if (copy_request_count_ == 0) { - frame_result_.emplace(); + InitFrameResult(); std::move(directive_finished_callback_).Run(directive_.sequence_id()); } } @@ -157,7 +157,7 @@ ++valid_result_count_; if (!frame_result_) { - frame_result_.emplace(); + InitFrameResult(); // Resize to the number of shared elements, even if some will be nullopts. frame_result_->shared_results.resize(directive_.shared_elements().size()); } @@ -206,7 +206,7 @@ SkImageInfo::MakeN32Premul(kDefaultTextureSizeForTesting.width(), kDefaultTextureSizeForTesting.height())); - frame_result_.emplace(); + InitFrameResult(); frame_result_->root_result.bitmap = std::move(bitmap); frame_result_->root_result.draw_data.size = kDefaultTextureSizeForTesting; frame_result_->root_result.draw_data.target_transform.MakeIdentity(); @@ -220,6 +220,11 @@ DCHECK(IsValid()); } +void SurfaceSavedFrame::InitFrameResult() { + frame_result_.emplace(); + frame_result_->empty_resource_ids = GetEmptyResourceIds(); +} + SurfaceSavedFrame::RenderPassDrawData::RenderPassDrawData() = default; SurfaceSavedFrame::RenderPassDrawData::RenderPassDrawData( const CompositorRenderPass& render_pass,
diff --git a/components/viz/service/surfaces/surface_saved_frame.h b/components/viz/service/surfaces/surface_saved_frame.h index 33570b3..0b1ed4d 100644 --- a/components/viz/service/surfaces/surface_saved_frame.h +++ b/components/viz/service/surfaces/surface_saved_frame.h
@@ -76,6 +76,7 @@ OutputCopyResult root_result; std::vector<absl::optional<OutputCopyResult>> shared_results; + base::flat_set<SharedElementResourceId> empty_resource_ids; }; SurfaceSavedFrame(CompositorFrameTransitionDirective directive, @@ -111,6 +112,7 @@ std::unique_ptr<CopyOutputResult> result); size_t ExpectedResultCount() const; + void InitFrameResult(); // Collects metadata to create a copy of the source CompositorFrame for shared // element snapshots.
diff --git a/components/viz/service/transitions/surface_animation_manager.cc b/components/viz/service/transitions/surface_animation_manager.cc index d5a8a18..027cf1fd 100644 --- a/components/viz/service/transitions/surface_animation_manager.cc +++ b/components/viz/service/transitions/surface_animation_manager.cc
@@ -444,6 +444,7 @@ // structure which has transferable resources. saved_textures_.emplace( transferable_resource_tracker_.ImportResources(std::move(saved_frame))); + empty_resource_ids_.clear(); return true; } @@ -1208,6 +1209,9 @@ if (texture_it != saved_textures_->element_id_to_resource.end()) { const auto& transferable_resource = texture_it->second; + if (transferable_resource.is_null()) + return true; + resource_list->push_back(transferable_resource); // GPU textures are flipped but software bitmaps are not.
diff --git a/components/viz/service/transitions/transferable_resource_tracker.cc b/components/viz/service/transitions/transferable_resource_tracker.cc index 1e4cb52..a6cd399 100644 --- a/components/viz/service/transitions/transferable_resource_tracker.cc +++ b/components/viz/service/transitions/transferable_resource_tracker.cc
@@ -58,6 +58,12 @@ } } } + + for (auto resource_id : frame_copy->empty_resource_ids) { + DCHECK(!resource_frame.element_id_to_resource.contains(resource_id)); + resource_frame.element_id_to_resource[resource_id] = TransferableResource(); + } + return resource_frame; }
diff --git a/content/browser/accessibility/browser_accessibility_state_impl_android.cc b/content/browser/accessibility/browser_accessibility_state_impl_android.cc index 9cc6bf63..e134262 100644 --- a/content/browser/accessibility/browser_accessibility_state_impl_android.cc +++ b/content/browser/accessibility/browser_accessibility_state_impl_android.cc
@@ -21,6 +21,23 @@ namespace { +// These are hashes of different accessibility services which are generally used +// as part of an assistive technology. +const uint32_t kAssistiveTechPackageHashes[] = { + 0x349d4b1a, // Android Accessibility Suite + 0xa5a469fc, // Sound Amplifier + 0xb13e6179, // Action Blocks Accessibility + 0xb38ef877, // Voice Access + 0xbc2897b4, // BrailleBack +}; + +// These are hashes of different "accessibility" services that enable +// accessibility but are only using it in the context of password management. +const uint32_t kPasswordPackageHashes[] = { + 0x013b76f2, 0x31cd47e3, 0x353cf6c5, 0x48723526, 0x4a8cfa8a, + 0x7e0ad835, 0x7e3515d0, 0x8e4c009f, 0x920ad3bd, 0xca841f39, +}; + // IMPORTANT! // These values are written to logs. Do not renumber or delete // existing items; add new entries to the end of the list. @@ -76,7 +93,7 @@ UMA_FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 42, UMA_FLAG_RETRIEVE_INTERACTIVE_WINDOWS = 43, UMA_SERVICE_TYPE_UNKNOWN = 44, - UMA_SERVICE_TYPE_PASSWORD_MANAGER = 45, // unused + UMA_SERVICE_TYPE_PASSWORD_MANAGER = 45, UMA_SERVICE_TYPE_ASSISTIVE_TECH = 46, UMA_CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES = 47, @@ -88,6 +105,17 @@ UMA_FLAG_REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK = 53, UMA_FLAG_SERVICE_HANDLES_DOUBLE_TAP = 54, + UMA_SERVICE_TYPE_ASSISTIVE_TECH_WITH_PASSWORD_MANAGER = 55, + UMA_SERVICE_TYPE_ASSISTIVE_TECH_WITH_UNKNOWN = 56, + UMA_SERVICE_TYPE_PASSWORD_MANAGER_WITH_UNKNOWN = 57, + UMA_SERVICE_TYPE_ALL_VARIANTS = 58, + + UMA_EVENT_SPEECH_STATE_CHANGE = 59, + UMA_FEEDBACK_ALL_MASK = 60, + UMA_FLAG_REQUEST_2_FINGER_PASSTHROUGH = 61, + UMA_FLAG_SEND_MOTION_EVENTS = 62, + UMA_FLAG_INPUT_METHOD_EDITOR = 63, + // This must always be the last enum. It's okay for its value to // increase, but none of the other enum values may change. UMA_ACCESSIBILITYSERVICEINFO_MAX @@ -97,7 +125,7 @@ // android.view.accessibility.AccessibilityEvent in Java. // // If you add a new constant, add a new UMA enum above and add a line -// to CollectAccessibilityServiceStats(), below. +// to RecordAccessibilityServiceStatsHistogram(), below. enum { ACCESSIBILITYEVENT_TYPE_VIEW_CLICKED = 0x00000001, ACCESSIBILITYEVENT_TYPE_VIEW_LONG_CLICKED = 0x00000002, @@ -125,13 +153,14 @@ ACCESSIBILITYEVENT_TYPE_WINDOWS_CHANGED = 0x00400000, ACCESSIBILITYEVENT_TYPE_VIEW_CONTEXT_CLICKED = 0x00800000, ACCESSIBILITYEVENT_TYPE_ASSIST_READING_CONTEXT = 0x01000000, + ACCESSIBILITYEVENT_TYPE_SPEECH_STATE_CHANGE = 0x02000000, }; // These are constants from // android.accessibilityservice.AccessibilityServiceInfo in Java: // // If you add a new constant, add a new UMA enum above and add a line -// to CollectAccessibilityServiceStats(), below. +// to RecordAccessibilityServiceStatsHistogram(), below. enum { ACCESSIBILITYSERVICEINFO_CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 0x00000001, ACCESSIBILITYSERVICEINFO_CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = @@ -151,20 +180,25 @@ ACCESSIBILITYSERVICEINFO_FEEDBACK_VISUAL = 0x0000008, ACCESSIBILITYSERVICEINFO_FEEDBACK_GENERIC = 0x0000010, ACCESSIBILITYSERVICEINFO_FEEDBACK_BRAILLE = 0x0000020, + ACCESSIBILITYSERVICEINFO_FEEDBACK_ALL_MASK = 0xFFFFFFFF, ACCESSIBILITYSERVICEINFO_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x0000002, ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 0x0000004, ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 0x00000008, ACCESSIBILITYSERVICEINFO_FLAG_REPORT_VIEW_IDS = 0x00000010, ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_FILTER_KEY_EVENTS = 0x00000020, ACCESSIBILITYSERVICEINFO_FLAG_RETRIEVE_INTERACTIVE_WINDOWS = 0x00000040, - ACCESSIBILITYSERVICEINFO_FLAG_FORCE_DIRECT_BOOT_AWARE = 0x00010000, + ACCESSIBILITYSERVICEINFO_FLAG_ENABLE_ACCESSIBILITY_VOLUME = 0x00000080, ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_ACCESSIBILITY_BUTTON = 0x00000100, ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_FINGERPRINT_GESTURES = 0x00000200, - ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_MULTI_FINGER_GESTURES = 0x00001000, ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK = 0x00000400, ACCESSIBILITYSERVICEINFO_FLAG_SERVICE_HANDLES_DOUBLE_TAP = 0x00000800, + ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_MULTI_FINGER_GESTURES = 0x00001000, + ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_2_FINGER_PASSTHROUGH = 0x0002000, + ACCESSIBILITYSERVICEINFO_FLAG_SEND_MOTION_EVENTS = 0x0004000, + ACCESSIBILITYSERVICEINFO_FLAG_INPUT_METHOD_EDITOR = 0x0008000, + ACCESSIBILITYSERVICEINFO_FLAG_FORCE_DIRECT_BOOT_AWARE = 0x00010000, }; // These macros simplify recording a histogram based on information we get @@ -176,33 +210,46 @@ // Doing this with macros reduces the chance for human error by // recording the wrong histogram for the wrong flag. // -// These macros are used by CollectAccessibilityServiceStats(), below. -#define EVENT_TYPE_HISTOGRAM(event_type_mask, event_type) \ - if (event_type_mask & ACCESSIBILITYEVENT_TYPE_##event_type) \ - UMA_HISTOGRAM_ENUMERATION("Accessibility.AndroidServiceInfo", \ - UMA_EVENT_##event_type, \ +// These macros are used by RecordAccessibilityServiceStatsHistogram(), below. +#define EVENT_TYPE_HISTOGRAM(event_type_mask, event_type, histogram) \ + if (event_type_mask & ACCESSIBILITYEVENT_TYPE_##event_type) \ + UMA_HISTOGRAM_ENUMERATION(histogram, UMA_EVENT_##event_type, \ UMA_ACCESSIBILITYSERVICEINFO_MAX) -#define FLAGS_HISTOGRAM(flags_mask, flag) \ - if (flags_mask & ACCESSIBILITYSERVICEINFO_FLAG_##flag) \ - UMA_HISTOGRAM_ENUMERATION("Accessibility.AndroidServiceInfo", \ - UMA_FLAG_##flag, UMA_ACCESSIBILITYSERVICEINFO_MAX) -#define FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, feedback_type) \ +#define FLAGS_HISTOGRAM(flags_mask, flag, histogram) \ + if (flags_mask & ACCESSIBILITYSERVICEINFO_FLAG_##flag) \ + UMA_HISTOGRAM_ENUMERATION(histogram, UMA_FLAG_##flag, \ + UMA_ACCESSIBILITYSERVICEINFO_MAX) +#define FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, feedback_type, histogram) \ if (feedback_type_mask & ACCESSIBILITYSERVICEINFO_FEEDBACK_##feedback_type) \ - UMA_HISTOGRAM_ENUMERATION("Accessibility.AndroidServiceInfo", \ - UMA_FEEDBACK_##feedback_type, \ + UMA_HISTOGRAM_ENUMERATION(histogram, UMA_FEEDBACK_##feedback_type, \ UMA_ACCESSIBILITYSERVICEINFO_MAX) -#define CAPABILITY_TYPE_HISTOGRAM(capability_type_mask, capability_type) \ +#define CAPABILITY_TYPE_HISTOGRAM(capability_type_mask, capability_type, \ + histogram) \ if (capability_type_mask & \ ACCESSIBILITYSERVICEINFO_CAPABILITY_##capability_type) \ - UMA_HISTOGRAM_ENUMERATION("Accessibility.AndroidServiceInfo", \ - UMA_CAPABILITY_##capability_type, \ + UMA_HISTOGRAM_ENUMERATION(histogram, UMA_CAPABILITY_##capability_type, \ UMA_ACCESSIBILITYSERVICEINFO_MAX) -#define SERVICE_TYPE_HISTOGRAM(check, name) \ - if (check) \ - UMA_HISTOGRAM_ENUMERATION("Accessibility.AndroidServiceInfo", \ - UMA_SERVICE_TYPE_##name, \ - UMA_ACCESSIBILITYSERVICEINFO_MAX); +#define SERVICE_TYPE_HISTOGRAM(service_type, histogram) \ + UMA_HISTOGRAM_ENUMERATION(histogram, service_type, \ + UMA_ACCESSIBILITYSERVICEINFO_MAX); +// This macro simplifies the recording of the aggregate accessibility +// information in the CollectAccessibilityServiceStats() method, below. +// +// There are 7 possible variants of the "Accessibility.AndroidServiceInfo.{}" +// histogram. We consider users that have: assistive tech, password managers, or +// an unknown service enabled. We track the 7 possible subsets of these (the +// empty set of nothing enabled is implicitly tracked by whichever users do not +// belong to one of the other groups). Requested event, feedback, flag, and +// capabilities are recorded per subset. +#define RECORD_ALL_HISTOGRAMS(event, feedback, flag, capability, \ + service_type_variant) \ + RecordAccessibilityServiceStatsHistogram( \ + event, feedback, flag, capability, \ + "Accessibility.AndroidServiceInfo." #service_type_variant); \ + SERVICE_TYPE_HISTOGRAM( \ + UMA_SERVICE_TYPE_##service_type_variant, \ + "Accessibility.AndroidServiceInfo." #service_type_variant) } // namespace BrowserAccessibilityStateImplAndroid::BrowserAccessibilityStateImplAndroid() { @@ -216,87 +263,26 @@ JNIEnv* env = AttachCurrentThread(); int event_type_mask = Java_BrowserAccessibilityState_getAccessibilityServiceEventTypeMask(env); - EVENT_TYPE_HISTOGRAM(event_type_mask, ANNOUNCEMENT); - EVENT_TYPE_HISTOGRAM(event_type_mask, ASSIST_READING_CONTEXT); - EVENT_TYPE_HISTOGRAM(event_type_mask, GESTURE_DETECTION_END); - EVENT_TYPE_HISTOGRAM(event_type_mask, GESTURE_DETECTION_START); - EVENT_TYPE_HISTOGRAM(event_type_mask, NOTIFICATION_STATE_CHANGED); - EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_EXPLORATION_GESTURE_END); - EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_EXPLORATION_GESTURE_START); - EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_INTERACTION_END); - EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_INTERACTION_START); - EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_ACCESSIBILITY_FOCUSED); - EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_ACCESSIBILITY_FOCUS_CLEARED); - EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_CLICKED); - EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_CONTEXT_CLICKED); - EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_FOCUSED); - EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_HOVER_ENTER); - EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_HOVER_EXIT); - EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_LONG_CLICKED); - EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_SCROLLED); - EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_SELECTED); - EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_TEXT_CHANGED); - EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_TEXT_SELECTION_CHANGED); - EVENT_TYPE_HISTOGRAM(event_type_mask, - VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY); - EVENT_TYPE_HISTOGRAM(event_type_mask, WINDOWS_CHANGED); - EVENT_TYPE_HISTOGRAM(event_type_mask, WINDOW_CONTENT_CHANGED); - EVENT_TYPE_HISTOGRAM(event_type_mask, WINDOW_STATE_CHANGED); int feedback_type_mask = Java_BrowserAccessibilityState_getAccessibilityServiceFeedbackTypeMask( env); - FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, SPOKEN); - FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, HAPTIC); - FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, AUDIBLE); - FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, VISUAL); - FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, GENERIC); - FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, BRAILLE); int flags_mask = Java_BrowserAccessibilityState_getAccessibilityServiceFlagsMask(env); - FLAGS_HISTOGRAM(flags_mask, INCLUDE_NOT_IMPORTANT_VIEWS); - FLAGS_HISTOGRAM(flags_mask, REQUEST_TOUCH_EXPLORATION_MODE); - FLAGS_HISTOGRAM(flags_mask, REQUEST_ENHANCED_WEB_ACCESSIBILITY); - FLAGS_HISTOGRAM(flags_mask, REPORT_VIEW_IDS); - FLAGS_HISTOGRAM(flags_mask, REQUEST_FILTER_KEY_EVENTS); - FLAGS_HISTOGRAM(flags_mask, RETRIEVE_INTERACTIVE_WINDOWS); - FLAGS_HISTOGRAM(flags_mask, FORCE_DIRECT_BOOT_AWARE); - FLAGS_HISTOGRAM(flags_mask, ENABLE_ACCESSIBILITY_VOLUME); - FLAGS_HISTOGRAM(flags_mask, REQUEST_ACCESSIBILITY_BUTTON); - FLAGS_HISTOGRAM(flags_mask, REQUEST_FINGERPRINT_GESTURES); - FLAGS_HISTOGRAM(flags_mask, REQUEST_MULTI_FINGER_GESTURES); - FLAGS_HISTOGRAM(flags_mask, REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK); - FLAGS_HISTOGRAM(flags_mask, SERVICE_HANDLES_DOUBLE_TAP); int capabilities_mask = Java_BrowserAccessibilityState_getAccessibilityServiceCapabilitiesMask( env); - CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_RETRIEVE_WINDOW_CONTENT); - CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_REQUEST_TOUCH_EXPLORATION); - CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, - CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY); - CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_REQUEST_FILTER_KEY_EVENTS); - CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_CONTROL_MAGNIFICATION); - CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_PERFORM_GESTURES); - CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, - CAN_REQUEST_FINGERPRINT_GESTURES); - CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_TAKE_SCREENSHOT); auto service_ids = Java_BrowserAccessibilityState_getAccessibilityServiceIds(env); + jsize len = env->GetArrayLength(service_ids.obj()); bool has_assistive_tech = false; + bool has_password_manager = false; bool has_unknown = false; - const uint32_t kAssistiveTechPackageHashes[] = { - 0x349d4b1a, // Android Accessibility Suite - 0xa5a469fc, // Sound Amplifier - 0xb13e6179, // Action Blocks Accessibility - 0xb38ef877, // Voice Access - 0xbc2897b4, // BrailleBack - }; - // TODO(crbug.com/1197608): Consider adding further categories. for (jsize i = 0; i < len; ++i) { auto* id = env->GetObjectArrayElement(service_ids.obj(), i); std::string service_id = @@ -306,13 +292,115 @@ if (base::Contains(kAssistiveTechPackageHashes, service_hash)) { has_assistive_tech = true; + } else if (base::Contains(kPasswordPackageHashes, service_hash)) { + has_password_manager = true; } else { has_unknown = true; } } - SERVICE_TYPE_HISTOGRAM(has_assistive_tech, ASSISTIVE_TECH); - SERVICE_TYPE_HISTOGRAM(has_unknown, UNKNOWN); + if (has_assistive_tech && has_password_manager && has_unknown) { + RECORD_ALL_HISTOGRAMS(event_type_mask, feedback_type_mask, flags_mask, + capabilities_mask, ALL_VARIANTS); + } else if (has_assistive_tech && has_password_manager) { + RECORD_ALL_HISTOGRAMS(event_type_mask, feedback_type_mask, flags_mask, + capabilities_mask, + ASSISTIVE_TECH_WITH_PASSWORD_MANAGER); + } else if (has_assistive_tech && has_unknown) { + RECORD_ALL_HISTOGRAMS(event_type_mask, feedback_type_mask, flags_mask, + capabilities_mask, ASSISTIVE_TECH_WITH_UNKNOWN); + } else if (has_password_manager && has_unknown) { + RECORD_ALL_HISTOGRAMS(event_type_mask, feedback_type_mask, flags_mask, + capabilities_mask, PASSWORD_MANAGER_WITH_UNKNOWN); + } else if (has_assistive_tech) { + RECORD_ALL_HISTOGRAMS(event_type_mask, feedback_type_mask, flags_mask, + capabilities_mask, ASSISTIVE_TECH); + } else if (has_password_manager) { + RECORD_ALL_HISTOGRAMS(event_type_mask, feedback_type_mask, flags_mask, + capabilities_mask, PASSWORD_MANAGER); + } else if (has_unknown) { + RECORD_ALL_HISTOGRAMS(event_type_mask, feedback_type_mask, flags_mask, + capabilities_mask, UNKNOWN); + } +} + +void BrowserAccessibilityStateImplAndroid:: + RecordAccessibilityServiceStatsHistogram(int event_type_mask, + int feedback_type_mask, + int flags_mask, + int capabilities_mask, + std::string histogram) { + EVENT_TYPE_HISTOGRAM(event_type_mask, ANNOUNCEMENT, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, ASSIST_READING_CONTEXT, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, GESTURE_DETECTION_END, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, GESTURE_DETECTION_START, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, NOTIFICATION_STATE_CHANGED, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_EXPLORATION_GESTURE_END, + histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_EXPLORATION_GESTURE_START, + histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_INTERACTION_END, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_INTERACTION_START, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_ACCESSIBILITY_FOCUSED, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_ACCESSIBILITY_FOCUS_CLEARED, + histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_CLICKED, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_CONTEXT_CLICKED, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_FOCUSED, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_HOVER_ENTER, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_HOVER_EXIT, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_LONG_CLICKED, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_SCROLLED, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_SELECTED, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_TEXT_CHANGED, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_TEXT_SELECTION_CHANGED, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, + VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, WINDOWS_CHANGED, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, WINDOW_CONTENT_CHANGED, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, WINDOW_STATE_CHANGED, histogram); + EVENT_TYPE_HISTOGRAM(event_type_mask, SPEECH_STATE_CHANGE, histogram); + + FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, SPOKEN, histogram); + FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, HAPTIC, histogram); + FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, AUDIBLE, histogram); + FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, VISUAL, histogram); + FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, GENERIC, histogram); + FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, BRAILLE, histogram); + FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, ALL_MASK, histogram); + + FLAGS_HISTOGRAM(flags_mask, INCLUDE_NOT_IMPORTANT_VIEWS, histogram); + FLAGS_HISTOGRAM(flags_mask, REQUEST_TOUCH_EXPLORATION_MODE, histogram); + FLAGS_HISTOGRAM(flags_mask, REQUEST_ENHANCED_WEB_ACCESSIBILITY, histogram); + FLAGS_HISTOGRAM(flags_mask, REPORT_VIEW_IDS, histogram); + FLAGS_HISTOGRAM(flags_mask, REQUEST_FILTER_KEY_EVENTS, histogram); + FLAGS_HISTOGRAM(flags_mask, RETRIEVE_INTERACTIVE_WINDOWS, histogram); + FLAGS_HISTOGRAM(flags_mask, FORCE_DIRECT_BOOT_AWARE, histogram); + FLAGS_HISTOGRAM(flags_mask, ENABLE_ACCESSIBILITY_VOLUME, histogram); + FLAGS_HISTOGRAM(flags_mask, REQUEST_ACCESSIBILITY_BUTTON, histogram); + FLAGS_HISTOGRAM(flags_mask, REQUEST_FINGERPRINT_GESTURES, histogram); + FLAGS_HISTOGRAM(flags_mask, REQUEST_MULTI_FINGER_GESTURES, histogram); + FLAGS_HISTOGRAM(flags_mask, REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK, + histogram); + FLAGS_HISTOGRAM(flags_mask, SERVICE_HANDLES_DOUBLE_TAP, histogram); + FLAGS_HISTOGRAM(flags_mask, REQUEST_2_FINGER_PASSTHROUGH, histogram); + FLAGS_HISTOGRAM(flags_mask, SEND_MOTION_EVENTS, histogram); + FLAGS_HISTOGRAM(flags_mask, INPUT_METHOD_EDITOR, histogram); + + CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_RETRIEVE_WINDOW_CONTENT, + histogram); + CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_REQUEST_TOUCH_EXPLORATION, + histogram); + CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, + CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY, histogram); + CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_REQUEST_FILTER_KEY_EVENTS, + histogram); + CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_CONTROL_MAGNIFICATION, + histogram); + CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_PERFORM_GESTURES, histogram); + CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_REQUEST_FINGERPRINT_GESTURES, + histogram); + CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_TAKE_SCREENSHOT, histogram); } void BrowserAccessibilityStateImplAndroid::UpdateHistogramsOnOtherThread() {
diff --git a/content/browser/accessibility/browser_accessibility_state_impl_android.h b/content/browser/accessibility/browser_accessibility_state_impl_android.h index 5518786..3d7e7bd 100644 --- a/content/browser/accessibility/browser_accessibility_state_impl_android.h +++ b/content/browser/accessibility/browser_accessibility_state_impl_android.h
@@ -7,9 +7,6 @@ #include "content/browser/accessibility/browser_accessibility_state_impl.h" -#include "base/android/jni_android.h" -#include "base/android/jni_array.h" - namespace content { class BrowserContext; @@ -18,9 +15,14 @@ : public BrowserAccessibilityStateImpl { public: BrowserAccessibilityStateImplAndroid(); - ~BrowserAccessibilityStateImplAndroid() override {} + ~BrowserAccessibilityStateImplAndroid() override = default; void CollectAccessibilityServiceStats(); + void RecordAccessibilityServiceStatsHistogram(int event_type_mask, + int feedback_type_mask, + int flags_mask, + int capabilities_mask, + std::string histogram); protected: void UpdateHistogramsOnOtherThread() override;
diff --git a/content/browser/android/java/gin_java_method_invocation_helper.cc b/content/browser/android/java/gin_java_method_invocation_helper.cc index 70a2c1e03..0f578f0 100644 --- a/content/browser/android/java/gin_java_method_invocation_helper.cc +++ b/content/browser/android/java/gin_java_method_invocation_helper.cc
@@ -133,7 +133,7 @@ for (size_t i = 0; i < method->num_parameters(); ++i) { const base::Value& argument = arguments_[i]; parameters[i] = CoerceJavaScriptValueToJavaValue( - env, &argument, method->parameter_type(i), true, object_refs_, + env, argument, method->parameter_type(i), true, object_refs_, &coercion_error); }
diff --git a/content/browser/android/java/gin_java_script_to_java_types_coercion.cc b/content/browser/android/java/gin_java_script_to_java_types_coercion.cc index ca2e77f..00d5830 100644 --- a/content/browser/android/java/gin_java_script_to_java_types_coercion.cc +++ b/content/browser/android/java/gin_java_script_to_java_types_coercion.cc
@@ -16,6 +16,7 @@ #include "base/android/jni_string.h" #include "base/check_op.h" #include "base/notreached.h" +#include "base/numerics/safe_conversions.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" @@ -106,14 +107,14 @@ case JavaType::TypeObject: // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec // requires handling object equivalents of primitive types. - result.l = NULL; + result.l = nullptr; break; case JavaType::TypeString: result.l = coerce_to_string ? ConvertUTF8ToJavaString( env, base::NumberToString(integer_value)) .Release() - : NULL; + : nullptr; break; case JavaType::TypeBoolean: // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to false. Spec @@ -123,7 +124,7 @@ case JavaType::TypeArray: // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec // requires raising a JavaScript exception. - result.l = NULL; + result.l = nullptr; break; case JavaType::TypeVoid: // Conversion to void must never happen. @@ -170,14 +171,14 @@ case JavaType::TypeObject: // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec // requires handling object equivalents of primitive types. - result.l = NULL; + result.l = nullptr; break; case JavaType::TypeString: - result.l = - coerce_to_string - ? ConvertUTF8ToJavaString( - env, base::StringPrintf("%.6lg", double_value)).Release() - : NULL; + result.l = coerce_to_string + ? ConvertUTF8ToJavaString( + env, base::StringPrintf("%.6lg", double_value)) + .Release() + : nullptr; break; case JavaType::TypeBoolean: // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to false. Spec @@ -187,7 +188,7 @@ case JavaType::TypeArray: // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec // requires raising a JavaScript exception. - result.l = NULL; + result.l = nullptr; break; case JavaType::TypeVoid: // Conversion to void must never happen. @@ -198,27 +199,27 @@ } jvalue CoerceJavaScriptBooleanToJavaValue(JNIEnv* env, - const base::Value* value, + const base::Value& value, const JavaType& target_type, bool coerce_to_string, GinJavaBridgeError* error) { // See http://jdk6.java.net/plugin2/liveconnect/#JS_BOOLEAN_VALUES. - bool boolean_value = value->GetBool(); + bool boolean_value = value.GetBool(); jvalue result; switch (target_type.type) { case JavaType::TypeBoolean: result.z = boolean_value ? JNI_TRUE : JNI_FALSE; break; case JavaType::TypeObject: - // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to NULL. Spec + // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec // requires handling java.lang.Boolean and java.lang.Object. - result.l = NULL; + result.l = nullptr; break; case JavaType::TypeString: - result.l = coerce_to_string - ? ConvertUTF8ToJavaString( - env, boolean_value ? "true" : "false").Release() - : NULL; + result.l = coerce_to_string ? ConvertUTF8ToJavaString( + env, boolean_value ? "true" : "false") + .Release() + : nullptr; break; case JavaType::TypeByte: case JavaType::TypeChar: @@ -234,9 +235,9 @@ break; } case JavaType::TypeArray: - // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to NULL. Spec + // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec // requires raising a JavaScript exception. - result.l = NULL; + result.l = nullptr; break; case JavaType::TypeVoid: // Conversion to void must never happen. @@ -247,20 +248,20 @@ } jvalue CoerceJavaScriptStringToJavaValue(JNIEnv* env, - const base::Value* value, + const base::Value& value, const JavaType& target_type, GinJavaBridgeError* error) { // See http://jdk6.java.net/plugin2/liveconnect/#JS_STRING_VALUES. jvalue result; switch (target_type.type) { case JavaType::TypeString: { - result.l = ConvertUTF8ToJavaString(env, value->GetString()).Release(); + result.l = ConvertUTF8ToJavaString(env, value.GetString()).Release(); break; } case JavaType::TypeObject: - // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to NULL. Spec + // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec // requires handling java.lang.Object. - result.l = NULL; + result.l = nullptr; break; case JavaType::TypeByte: case JavaType::TypeShort: @@ -285,9 +286,9 @@ result.z = JNI_FALSE; break; case JavaType::TypeArray: - // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to NULL. Spec + // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec // requires raising a JavaScript exception. - result.l = NULL; + result.l = nullptr; break; case JavaType::TypeVoid: // Conversion to void must never happen. @@ -319,7 +320,7 @@ case JavaType::TypeString: { ScopedJavaLocalRef<jclass> clazz( base::android::GetClass(env, kJavaLangString)); - return env->NewObjectArray(length, clazz.obj(), NULL); + return env->NewObjectArray(length, clazz.obj(), nullptr); } case JavaType::TypeVoid: // Conversion to void must never happen. @@ -328,7 +329,7 @@ // Not handled. NOTREACHED(); } - return NULL; + return nullptr; } // Sets the specified element of the supplied array to the value of the @@ -388,14 +389,14 @@ } jvalue CoerceJavaScriptNullOrUndefinedToJavaValue(JNIEnv* env, - const base::Value* value, + const base::Value& value, const JavaType& target_type, bool coerce_to_string, GinJavaBridgeError* error) { bool is_undefined = false; std::unique_ptr<const GinJavaBridgeValue> gin_value; - if (GinJavaBridgeValue::ContainsGinJavaBridgeValue(value)) { - gin_value = GinJavaBridgeValue::FromValue(value); + if (GinJavaBridgeValue::ContainsGinJavaBridgeValue(&value)) { + gin_value = GinJavaBridgeValue::FromValue(&value); if (gin_value->IsType(GinJavaBridgeValue::TYPE_UNDEFINED)) { is_undefined = true; } @@ -403,14 +404,14 @@ jvalue result; switch (target_type.type) { case JavaType::TypeObject: - result.l = NULL; + result.l = nullptr; break; case JavaType::TypeString: // LIVECONNECT_COMPLIANCE: Existing behavior is to convert undefined to - // "undefined". Spec requires converting undefined to NULL. + // "undefined". Spec requires converting undefined to null. result.l = (coerce_to_string && is_undefined) ? ConvertUTF8ToJavaString(env, kUndefined).Release() - : NULL; + : nullptr; break; case JavaType::TypeByte: case JavaType::TypeChar: @@ -427,9 +428,9 @@ result.z = JNI_FALSE; break; case JavaType::TypeArray: - // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to NULL. Spec + // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec // requires raising a JavaScript exception. - result.l = NULL; + result.l = nullptr; break; case JavaType::TypeVoid: // Conversion to void must never happen. @@ -440,7 +441,7 @@ } jobject CoerceJavaScriptListToArray(JNIEnv* env, - const base::Value* value, + const base::Value::List& list, const JavaType& target_type, const ObjectRefs& object_refs, GinJavaBridgeError* error) { @@ -449,26 +450,31 @@ // LIVECONNECT_COMPLIANCE: Existing behavior is to return null for // multi-dimensional arrays. Spec requires handling multi-demensional arrays. if (target_inner_type.type == JavaType::TypeArray) { - return NULL; + return nullptr; } // LIVECONNECT_COMPLIANCE: Existing behavior is to return null for object // arrays. Spec requires handling object arrays. if (target_inner_type.type == JavaType::TypeObject) { - return NULL; + return nullptr; } + // Coerce the length. + if (!base::IsValueInRangeForNumericType<jsize>(list.size())) { + return nullptr; + } + jsize length = static_cast<jsize>(list.size()); + // Create the Java array. - jsize length = static_cast<jsize>(value->GetListDeprecated().size()); jobject result = CreateJavaArray(env, target_inner_type, length); if (!result) { - return NULL; + return nullptr; } jsize i = 0; - for (const auto& value_element : value->GetListDeprecated()) { + for (const auto& value_element : list) { jvalue element = CoerceJavaScriptValueToJavaValue( - env, &value_element, target_inner_type, false, object_refs, error); + env, value_element, target_inner_type, false, object_refs, error); SetArrayElement(env, result, target_inner_type, i++, element); // CoerceJavaScriptValueToJavaValue() creates new local references to // strings, objects and arrays. Of these, only strings can occur here. @@ -483,7 +489,7 @@ } jobject CoerceJavaScriptDictionaryToArray(JNIEnv* env, - const base::Value* value, + const base::Value::Dict& dict, const JavaType& target_type, const ObjectRefs& object_refs, GinJavaBridgeError* error) { @@ -493,21 +499,19 @@ // LIVECONNECT_COMPLIANCE: Existing behavior is to return null for // multi-dimensional arrays. Spec requires handling multi-demensional arrays. if (target_inner_type.type == JavaType::TypeArray) { - return NULL; + return nullptr; } // LIVECONNECT_COMPLIANCE: Existing behavior is to return null for object // arrays. Spec requires handling object arrays. if (target_inner_type.type == JavaType::TypeObject) { - return NULL; + return nullptr; } - const base::DictionaryValue* dictionary_value; - value->GetAsDictionary(&dictionary_value); - const base::Value* length_value; // If the object does not have a length property, return null. - if (!dictionary_value->Get("length", &length_value)) { - return NULL; + const base::Value* length_value = dict.Find("length"); + if (!length_value) { + return nullptr; } // If the length property does not have numeric type, or is outside the valid @@ -526,21 +530,21 @@ } } if (length == -1) { - return NULL; + return nullptr; } jobject result = CreateJavaArray(env, target_inner_type, length); if (!result) { - return NULL; + return nullptr; } - auto null_value = std::make_unique<base::Value>(); + base::Value null_value; for (jsize i = 0; i < length; ++i) { const std::string key(base::NumberToString(i)); - const base::Value* value_element = dictionary_value->FindKey(key); + const base::Value* value_element = dict.Find(key); if (!value_element) - value_element = null_value.get(); + value_element = &null_value; jvalue element = CoerceJavaScriptValueToJavaValue( - env, value_element, target_inner_type, false, object_refs, error); + env, *value_element, target_inner_type, false, object_refs, error); SetArrayElement(env, result, target_inner_type, i, element); // CoerceJavaScriptValueToJavaValue() creates new local references to // strings, objects and arrays. Of these, only strings can occur here. @@ -555,7 +559,7 @@ } jvalue CoerceJavaScriptObjectToJavaValue(JNIEnv* env, - const base::Value* value, + const base::Value& value, const JavaType& target_type, bool coerce_to_string, const ObjectRefs& object_refs, @@ -567,9 +571,9 @@ jvalue result; switch (target_type.type) { case JavaType::TypeObject: { - if (GinJavaBridgeValue::ContainsGinJavaBridgeValue(value)) { + if (GinJavaBridgeValue::ContainsGinJavaBridgeValue(&value)) { std::unique_ptr<const GinJavaBridgeValue> gin_value( - GinJavaBridgeValue::FromValue(value)); + GinJavaBridgeValue::FromValue(&value)); DCHECK(gin_value); DCHECK(gin_value->IsType(GinJavaBridgeValue::TYPE_OBJECT_ID)); ScopedJavaLocalRef<jobject> obj; @@ -586,7 +590,7 @@ JNI_TRUE) { result.l = obj.Release(); } else { - result.l = NULL; + result.l = nullptr; *error = kGinJavaBridgeNonAssignableTypes; } } else { @@ -594,7 +598,7 @@ // requires converting if the target type is // netscape.javascript.JSObject, otherwise raising a JavaScript // exception. - result.l = NULL; + result.l = nullptr; } break; } @@ -603,7 +607,7 @@ // "undefined". Spec requires calling toString() on the Java object. result.l = coerce_to_string ? ConvertUTF8ToJavaString(env, kUndefined).Release() - : NULL; + : nullptr; break; case JavaType::TypeByte: case JavaType::TypeShort: @@ -624,14 +628,14 @@ result.z = JNI_FALSE; break; case JavaType::TypeArray: - if (value->is_dict()) { + if (value.is_dict()) { result.l = CoerceJavaScriptDictionaryToArray( - env, value, target_type, object_refs, error); - } else if (value->is_list()) { - result.l = CoerceJavaScriptListToArray( - env, value, target_type, object_refs, error); + env, value.GetDict(), target_type, object_refs, error); + } else if (value.is_list()) { + result.l = CoerceJavaScriptListToArray(env, value.GetList(), + target_type, object_refs, error); } else { - result.l = NULL; + result.l = nullptr; } break; case JavaType::TypeVoid: @@ -643,14 +647,14 @@ } jvalue CoerceGinJavaBridgeValueToJavaValue(JNIEnv* env, - const base::Value* value, + const base::Value& value, const JavaType& target_type, bool coerce_to_string, const ObjectRefs& object_refs, GinJavaBridgeError* error) { - DCHECK(GinJavaBridgeValue::ContainsGinJavaBridgeValue(value)); + DCHECK(GinJavaBridgeValue::ContainsGinJavaBridgeValue(&value)); std::unique_ptr<const GinJavaBridgeValue> gin_value( - GinJavaBridgeValue::FromValue(value)); + GinJavaBridgeValue::FromValue(&value)); switch (gin_value->GetType()) { case GinJavaBridgeValue::TYPE_UNDEFINED: return CoerceJavaScriptNullOrUndefinedToJavaValue( @@ -687,12 +691,12 @@ if (type.type == JavaType::TypeString || type.type == JavaType::TypeObject || type.type == JavaType::TypeArray) { env->DeleteLocalRef(value->l); - value->l = NULL; + value->l = nullptr; } } jvalue CoerceJavaScriptValueToJavaValue(JNIEnv* env, - const base::Value* value, + const base::Value& value, const JavaType& target_type, bool coerce_to_string, const ObjectRefs& object_refs, @@ -700,13 +704,13 @@ // Note that in all these conversions, the relevant field of the jvalue must // always be explicitly set, as jvalue does not initialize its fields. - switch (value->type()) { + switch (value.type()) { case base::Value::Type::INTEGER: return CoerceJavaScriptIntegerToJavaValue( - env, value->GetInt(), target_type, coerce_to_string, error); + env, value.GetInt(), target_type, coerce_to_string, error); case base::Value::Type::DOUBLE: { return CoerceJavaScriptDoubleToJavaValue( - env, value->GetDouble(), target_type, coerce_to_string, error); + env, value.GetDouble(), target_type, coerce_to_string, error); } case base::Value::Type::BOOLEAN: return CoerceJavaScriptBooleanToJavaValue(
diff --git a/content/browser/android/java/gin_java_script_to_java_types_coercion.h b/content/browser/android/java/gin_java_script_to_java_types_coercion.h index 4d9e79c..e661f2ea 100644 --- a/content/browser/android/java/gin_java_script_to_java_types_coercion.h +++ b/content/browser/android/java/gin_java_script_to_java_types_coercion.h
@@ -18,13 +18,12 @@ typedef std::map<GinJavaBoundObject::ObjectID, JavaObjectWeakGlobalRef> ObjectRefs; -jvalue CoerceJavaScriptValueToJavaValue( - JNIEnv* env, - const base::Value* value, - const JavaType& target_type, - bool coerce_to_string, - const ObjectRefs& object_refs, - GinJavaBridgeError* error); +jvalue CoerceJavaScriptValueToJavaValue(JNIEnv* env, + const base::Value& value, + const JavaType& target_type, + bool coerce_to_string, + const ObjectRefs& object_refs, + GinJavaBridgeError* error); void ReleaseJavaValueIfRequired(JNIEnv* env, jvalue* value,
diff --git a/content/browser/background_sync/background_sync_manager_unittest.cc b/content/browser/background_sync/background_sync_manager_unittest.cc index b26d203..37d77ad 100644 --- a/content/browser/background_sync/background_sync_manager_unittest.cc +++ b/content/browser/background_sync/background_sync_manager_unittest.cc
@@ -134,8 +134,8 @@ ON_CALL(*mock_permission_manager, GetPermissionStatusForWorker(PermissionType::NOTIFICATIONS, _, _)) .WillByDefault(Return(blink::mojom::PermissionStatus::DENIED)); - helper_->browser_context()->SetPermissionControllerDelegate( - std::move(mock_permission_manager)); + TestBrowserContext::FromBrowserContext(helper_->browser_context()) + ->SetPermissionControllerDelegate(std::move(mock_permission_manager)); // Create a StoragePartition with the correct BrowserContext so that the // BackgroundSyncManager can find the BrowserContext through it.
diff --git a/content/browser/background_sync/background_sync_service_impl_test_harness.cc b/content/browser/background_sync/background_sync_service_impl_test_harness.cc index 0b578bf..f3d52e55 100644 --- a/content/browser/background_sync/background_sync_service_impl_test_harness.cc +++ b/content/browser/background_sync/background_sync_service_impl_test_harness.cc
@@ -135,8 +135,9 @@ ON_CALL(*mock_permission_manager, GetPermissionStatus(blink::PermissionType::BACKGROUND_SYNC, _, _)) .WillByDefault(testing::Return(blink::mojom::PermissionStatus::GRANTED)); - embedded_worker_helper_->browser_context()->SetPermissionControllerDelegate( - std::move(mock_permission_manager)); + TestBrowserContext::FromBrowserContext( + embedded_worker_helper_->browser_context()) + ->SetPermissionControllerDelegate(std::move(mock_permission_manager)); } void BackgroundSyncServiceImplTestHarness::CreateStoragePartition() {
diff --git a/content/browser/fenced_frame/fenced_frame_browsertest.cc b/content/browser/fenced_frame/fenced_frame_browsertest.cc index 0a5af4f..cfa4dbb 100644 --- a/content/browser/fenced_frame/fenced_frame_browsertest.cc +++ b/content/browser/fenced_frame/fenced_frame_browsertest.cc
@@ -2260,6 +2260,80 @@ EXPECT_EQ(0, EvalJs(root, "window.frames.length")); } +IN_PROC_BROWSER_TEST_P(FencedFrameParameterizedBrowserTest, + SharedStorageMetadataInNestedFencedFrame) { + GURL main_url = https_server()->GetURL("a.test", "/hello.html"); + EXPECT_TRUE(NavigateToURL(shell(), main_url)); + + // It is safe to obtain the root frame tree node here, as it doesn't change. + FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) + ->GetPrimaryFrameTree() + .root(); + + FencedFrameURLMapping& url_mapping1 = + root->current_frame_host()->GetPage().fenced_frame_urls_map(); + auto urn_uuid1 = GenerateAndVerifyPendingMappedURN(&url_mapping1); + const GURL mapped_url1 = + https_server()->GetURL("b.test", "/fenced_frames/title1.html"); + SimulateSharedStorageURNMappingComplete( + url_mapping1, urn_uuid1, mapped_url1, + /*shared_storage_origin=*/url::Origin::Create(GURL("https://foo.com")), + /*budget_to_charge=*/2.0); + + EXPECT_TRUE(ExecJs(root, + "var f1 = document.createElement('fencedframe');" + "f1.mode = 'opaque-ads';" + "document.body.appendChild(f1);")); + + EXPECT_EQ(1U, root->child_count()); + FrameTreeNode* fenced_frame_root_node1 = + GetFencedFrameRootNode(root->child_at(0)); + + TestFrameNavigationObserver observer1( + fenced_frame_root_node1->current_frame_host()); + std::string navigate_urn_script1 = JsReplace("f1.src = $1;", urn_uuid1); + EXPECT_EQ(urn_uuid1.spec(), EvalJs(root, navigate_urn_script1)); + observer1.Wait(); + + FencedFrameURLMapping& url_mapping2 = + fenced_frame_root_node1->current_frame_host() + ->GetPage() + .fenced_frame_urls_map(); + auto urn_uuid2 = GenerateAndVerifyPendingMappedURN(&url_mapping2); + const GURL mapped_url2 = + https_server()->GetURL("c.test", "/fenced_frames/title1.html"); + SimulateSharedStorageURNMappingComplete( + url_mapping2, urn_uuid2, mapped_url2, + /*shared_storage_origin=*/url::Origin::Create(GURL("https://bar.com")), + /*budget_to_charge=*/3.0); + + EXPECT_TRUE(ExecJs(fenced_frame_root_node1, + "var f2 = document.createElement('fencedframe');" + "f2.mode = 'opaque-ads';" + "document.body.appendChild(f2);")); + + EXPECT_EQ(1U, fenced_frame_root_node1->child_count()); + FrameTreeNode* fenced_frame_root_node2 = + GetFencedFrameRootNode(fenced_frame_root_node1->child_at(0)); + + TestFrameNavigationObserver observer2( + fenced_frame_root_node2->current_frame_host()); + std::string navigate_urn_script2 = JsReplace("f2.src = $1;", urn_uuid2); + EXPECT_EQ(urn_uuid2.spec(), + EvalJs(fenced_frame_root_node1, navigate_urn_script2)); + observer2.Wait(); + + auto metadata = fenced_frame_root_node2->FindSharedStorageBudgetMetadata(); + + EXPECT_EQ(metadata.size(), 2u); + + EXPECT_EQ(metadata[0]->origin, url::Origin::Create(GURL("https://bar.com"))); + EXPECT_DOUBLE_EQ(metadata[0]->budget_to_charge, 3.0); + + EXPECT_EQ(metadata[1]->origin, url::Origin::Create(GURL("https://foo.com"))); + EXPECT_DOUBLE_EQ(metadata[1]->budget_to_charge, 2.0); +} + IN_PROC_BROWSER_TEST_P( FencedFrameParameterizedBrowserTest, TwoFencedFrameNavigationToSameSharedStorageOriginatedUUID_SameMetadata) { @@ -2315,7 +2389,8 @@ observer.Wait(); } - EXPECT_TRUE(fenced_frame_root_node1->FindSharedStorageBudgetMetadata()); + EXPECT_EQ(fenced_frame_root_node1->FindSharedStorageBudgetMetadata().size(), + 1u); EXPECT_EQ(fenced_frame_root_node1->FindSharedStorageBudgetMetadata(), fenced_frame_root_node2->FindSharedStorageBudgetMetadata()); @@ -2377,7 +2452,7 @@ auto budget_metadata = fenced_frame_root_node->FindSharedStorageBudgetMetadata(); - EXPECT_FALSE(budget_metadata.has_value()); + EXPECT_EQ(budget_metadata.size(), 0u); // Trigger the mapping to resume the deferred navigation. SimulateSharedStorageURNMappingComplete( @@ -2394,10 +2469,10 @@ fenced_frame_root_node->current_frame_host()->GetLastCommittedURL()); budget_metadata = fenced_frame_root_node->FindSharedStorageBudgetMetadata(); - EXPECT_TRUE(budget_metadata.has_value()); - EXPECT_EQ((*budget_metadata)->origin, + EXPECT_EQ(budget_metadata.size(), 1u); + EXPECT_EQ(budget_metadata[0]->origin, url::Origin::Create(GURL("https://bar.com"))); - EXPECT_DOUBLE_EQ((*budget_metadata)->budget_to_charge, 2.0); + EXPECT_DOUBLE_EQ(budget_metadata[0]->budget_to_charge, 2.0); } // Test the scenario where the FF navigation is deferred and then resumed, and @@ -2469,7 +2544,7 @@ // Despite the error, the budget metadata should be valid. auto metadata = fenced_frame_root_node->FindSharedStorageBudgetMetadata(); - EXPECT_TRUE(metadata); + EXPECT_EQ(metadata.size(), 1u); } IN_PROC_BROWSER_TEST_P(
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping.h b/content/browser/fenced_frame/fenced_frame_url_mapping.h index 69fc5a2..4284b127 100644 --- a/content/browser/fenced_frame/fenced_frame_url_mapping.h +++ b/content/browser/fenced_frame/fenced_frame_url_mapping.h
@@ -201,16 +201,14 @@ // fenced frame page's urn/url mapping when the urn navigation commits. absl::optional<PendingAdComponentsMap> pending_ad_components_map; - // This can only be possibly set for the outermost fenced frame root, - // because selectURL() is disallowed inside fenced frame, and the URN - // generated outside the a fenced frame cannot be recognized from inside, - // so a nested fenced frame can never navigate to a shared storage - // generated URN. - // - // This pointer to the outermost page's FencedFrameURLMapping is copied + // The pointer to the outer document page's FencedFrameURLMapping is copied // into the fenced frame root's FrameTreeNode. This is safe because a page // will outlive any NavigationRequest occurring in fenced frames in the // page. + // + // The metadata can be on fenced frame roots, and if `kAllowURNsInIframes` + // is enabled, it can also be on any node except for the main frame node in + // the outermost frame tree. absl::optional<raw_ptr<const SharedStorageBudgetMetadata>> shared_storage_budget_metadata;
diff --git a/content/browser/file_system_access/file_system_access_file_handle_impl.cc b/content/browser/file_system_access/file_system_access_file_handle_impl.cc index 2601ea0..65bc598 100644 --- a/content/browser/file_system_access/file_system_access_file_handle_impl.cc +++ b/content/browser/file_system_access/file_system_access_file_handle_impl.cc
@@ -61,7 +61,7 @@ base::File file) { int64_t file_length = file.GetLength(); if (file_length < 0) - return {std::move(file), base::File::GetLastFileError()}; + return {std::move(file), base::unexpected(base::File::GetLastFileError())}; return {std::move(file), std::move(file_length)}; } @@ -332,7 +332,7 @@ base::FileErrorOr<int64_t> length_or_error = std::move(file_and_length.second); - if (length_or_error.is_error()) { + if (!length_or_error.has_value()) { std::move(callback).Run( file_system_access_error::FromFileError(length_or_error.error()), blink::mojom::FileSystemAccessAccessHandleFilePtr(),
diff --git a/content/browser/first_party_sets/first_party_sets_handler_impl.cc b/content/browser/first_party_sets/first_party_sets_handler_impl.cc index 7b0f1e8..3fafdd8 100644 --- a/content/browser/first_party_sets/first_party_sets_handler_impl.cc +++ b/content/browser/first_party_sets/first_party_sets_handler_impl.cc
@@ -27,6 +27,10 @@ #include "net/first_party_sets/global_first_party_sets.h" #include "third_party/abseil-cpp/absl/types/optional.h" +namespace net { +class SchemefulSite; +} // namespace net + namespace content { namespace { @@ -212,12 +216,6 @@ global_sets_ = std::move(global_sets); } -const net::GlobalFirstPartySets* -FirstPartySetsHandlerImpl::GetGlobalSetsIfReady() const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return base::OptionalToPtr(global_sets_); -} - void FirstPartySetsHandlerImpl::GetPersistedGlobalSetsForTesting( const std::string& browser_context_id, base::OnceCallback<void(absl::optional<net::GlobalFirstPartySets>)> @@ -287,11 +285,24 @@ } } +absl::optional<net::FirstPartySetEntry> FirstPartySetsHandlerImpl::FindEntry( + const net::SchemefulSite& site, + const net::FirstPartySetsContextConfig& config) const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (!base::FeatureList::IsEnabled(features::kFirstPartySets)) + return absl::nullopt; + + if (!global_sets_.has_value()) { + // TODO(crbug.com/1366918) : Add metrics to see how often this occurs. + return absl::nullopt; + } + return global_sets_->FindEntry(site, config); +} + net::GlobalFirstPartySets FirstPartySetsHandlerImpl::GetGlobalSetsSync() const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - const net::GlobalFirstPartySets* sets = GetGlobalSetsIfReady(); - DCHECK(sets); - return sets->Clone(); + DCHECK(global_sets_.has_value()); + return global_sets_->Clone(); } void FirstPartySetsHandlerImpl::ClearSiteDataOnChangedSetsForContext(
diff --git a/content/browser/first_party_sets/first_party_sets_handler_impl.h b/content/browser/first_party_sets/first_party_sets_handler_impl.h index 893bc70..81fc869 100644 --- a/content/browser/first_party_sets/first_party_sets_handler_impl.h +++ b/content/browser/first_party_sets/first_party_sets_handler_impl.h
@@ -28,6 +28,11 @@ #include "net/first_party_sets/global_first_party_sets.h" #include "third_party/abseil-cpp/absl/types/optional.h" +namespace net { +class FirstPartySetEntry; +class SchemefulSite; +} // namespace net + namespace content { class BrowserContext; @@ -105,7 +110,9 @@ base::File sets_file) override; void ResetForTesting() override; void SetGlobalSetsForTesting(net::GlobalFirstPartySets global_sets) override; - const net::GlobalFirstPartySets* GetGlobalSetsIfReady() const override; + absl::optional<net::FirstPartySetEntry> FindEntry( + const net::SchemefulSite& site, + const net::FirstPartySetsContextConfig& config) const override; void GetContextConfigForPolicy( const base::Value::Dict* policy, base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback)
diff --git a/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc b/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc index e5bf749..ce7156c 100644 --- a/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc +++ b/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc
@@ -509,51 +509,6 @@ example, net::SiteType::kAssociated, 0)))); } -TEST_F(FirstPartySetsHandlerImplEnabledTest, - GetGlobalSetsIfReady_BeforeSetsReady) { - FirstPartySetsHandlerImpl::GetInstance() - ->SetEmbedderWillProvidePublicSetsForTesting(true); - - FirstPartySetsHandlerImpl::GetInstance()->Init(scoped_dir_.GetPath(), - LocalSetDeclaration()); - - EXPECT_EQ(FirstPartySetsHandlerImpl::GetInstance()->GetGlobalSetsIfReady(), - nullptr); -} - -TEST_F(FirstPartySetsHandlerImplEnabledTest, - GetGlobalSetsIfReady_AfterSetsReady) { - net::SchemefulSite example(GURL("https://example.test")); - net::SchemefulSite associated(GURL("https://associatedsite.test")); - - FirstPartySetsHandlerImpl::GetInstance() - ->SetEmbedderWillProvidePublicSetsForTesting(true); - - const std::string input = - R"({"primary": "https://example.test", )" - R"("associatedSites": ["https://associatedsite.test"]})"; - ASSERT_TRUE(base::JSONReader::Read(input)); - FirstPartySetsHandlerImpl::GetInstance()->SetPublicFirstPartySets( - base::Version(), WritePublicSetsFile(input)); - - FirstPartySetsHandlerImpl::GetInstance()->Init(scoped_dir_.GetPath(), - LocalSetDeclaration()); - - // Wait until initialization is complete. - GetSetsAndWait(); - - EXPECT_THAT( - FirstPartySetsHandlerImpl::GetInstance() - ->GetGlobalSetsIfReady() - ->FindEntries({example, associated}, - net::FirstPartySetsContextConfig()), - UnorderedElementsAre( - Pair(example, net::FirstPartySetEntry( - example, net::SiteType::kPrimary, absl::nullopt)), - Pair(associated, net::FirstPartySetEntry( - example, net::SiteType::kAssociated, 0)))); -} - class FirstPartySetsHandlerGetContextConfigForPolicyTest : public FirstPartySetsHandlerImplEnabledTest { public:
diff --git a/content/browser/indexed_db/indexed_db_leveldb_operations.cc b/content/browser/indexed_db/indexed_db_leveldb_operations.cc index cec6c45f..18722c8 100644 --- a/content/browser/indexed_db/indexed_db_leveldb_operations.cc +++ b/content/browser/indexed_db/indexed_db_leveldb_operations.cc
@@ -153,7 +153,7 @@ base::FileErrorOr<base::File> file_or_error = filesystem_proxy->OpenFile( info_path, base::File::FLAG_OPEN | base::File::FLAG_READ); - if (!file_or_error.is_error()) { + if (file_or_error.has_value()) { auto& file = file_or_error.value(); if (file.IsValid()) { std::string input_js(file_info->size, '\0');
diff --git a/content/browser/plugin_list.cc b/content/browser/plugin_list.cc index 483163f..f6a5b2c 100644 --- a/content/browser/plugin_list.cc +++ b/content/browser/plugin_list.cc
@@ -16,6 +16,7 @@ #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" +#include "content/public/browser/browser_thread.h" #include "content/public/common/content_switches.h" #include "net/base/mime_util.h" #include "url/gurl.h" @@ -67,17 +68,18 @@ // static PluginList* PluginList::Singleton() { + DCHECK_CURRENTLY_ON(BrowserThread::UI); return g_singleton.Pointer(); } void PluginList::RefreshPlugins() { - base::AutoLock lock(lock_); + DCHECK_CURRENTLY_ON(BrowserThread::UI); loading_state_ = LOADING_STATE_NEEDS_REFRESH; } void PluginList::RegisterInternalPlugin(const WebPluginInfo& info, bool add_at_beginning) { - base::AutoLock lock(lock_); + DCHECK_CURRENTLY_ON(BrowserThread::UI); internal_plugins_.push_back(info); if (add_at_beginning) { @@ -90,7 +92,8 @@ } void PluginList::UnregisterInternalPlugin(const base::FilePath& path) { - base::AutoLock lock(lock_); + DCHECK_CURRENTLY_ON(BrowserThread::UI); + bool found = false; for (size_t i = 0; i < internal_plugins_.size(); i++) { if (internal_plugins_[i].path == path) { @@ -100,12 +103,12 @@ } } DCHECK(found); - RemoveExtraPluginPathLocked(path); + RemoveExtraPluginPath(path); } void PluginList::GetInternalPlugins( std::vector<WebPluginInfo>* internal_plugins) { - base::AutoLock lock(lock_); + DCHECK_CURRENTLY_ON(BrowserThread::UI); for (const auto& plugin : internal_plugins_) internal_plugins->push_back(plugin); @@ -113,7 +116,8 @@ bool PluginList::ReadPluginInfo(const base::FilePath& filename, WebPluginInfo* info) { - base::AutoLock lock(lock_); + DCHECK_CURRENTLY_ON(BrowserThread::UI); + for (const auto& plugin : internal_plugins_) { if (filename == plugin.path) { *info = plugin; @@ -123,10 +127,13 @@ return false; } -PluginList::PluginList() = default; +PluginList::PluginList() { + DCHECK_CURRENTLY_ON(BrowserThread::UI); +} bool PluginList::PrepareForPluginLoading() { - base::AutoLock lock(lock_); + DCHECK_CURRENTLY_ON(BrowserThread::UI); + if (loading_state_ == LOADING_STATE_UP_TO_DATE) return false; @@ -135,18 +142,12 @@ } void PluginList::LoadPlugins() { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + if (!PrepareForPluginLoading()) return; std::vector<WebPluginInfo> new_plugins; - base::OnceClosure will_load_callback; - { - base::AutoLock lock(lock_); - will_load_callback = will_load_plugins_callback_; - } - if (will_load_callback) - std::move(will_load_callback).Run(); - std::vector<base::FilePath> plugin_paths; GetPluginPathsToLoad(&plugin_paths); @@ -161,6 +162,8 @@ bool PluginList::LoadPluginIntoPluginList(const base::FilePath& path, std::vector<WebPluginInfo>* plugins, WebPluginInfo* plugin_info) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + if (!ReadPluginInfo(path, plugin_info)) return false; @@ -178,15 +181,9 @@ void PluginList::GetPluginPathsToLoad( std::vector<base::FilePath>* plugin_paths) { - // Don't want to hold the lock while loading new plugins, so we don't block - // other methods if they're called on other threads. - std::vector<base::FilePath> extra_plugin_paths; - { - base::AutoLock lock(lock_); - extra_plugin_paths = extra_plugin_paths_; - } + DCHECK_CURRENTLY_ON(BrowserThread::UI); - for (const base::FilePath& path : extra_plugin_paths) { + for (const base::FilePath& path : extra_plugin_paths_) { if (base::Contains(*plugin_paths, path)) continue; plugin_paths->push_back(path); @@ -194,7 +191,7 @@ } void PluginList::SetPlugins(const std::vector<WebPluginInfo>& plugins) { - base::AutoLock lock(lock_); + DCHECK_CURRENTLY_ON(BrowserThread::UI); // If we haven't been invalidated in the mean time, mark the plugin list as // up to date. @@ -204,20 +201,14 @@ plugins_list_ = plugins; } -void PluginList::set_will_load_plugins_callback( - const base::RepeatingClosure& callback) { - base::AutoLock lock(lock_); - will_load_plugins_callback_ = callback; -} - void PluginList::GetPlugins(std::vector<WebPluginInfo>* plugins) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); LoadPlugins(); - base::AutoLock lock(lock_); plugins->insert(plugins->end(), plugins_list_.begin(), plugins_list_.end()); } bool PluginList::GetPluginsNoRefresh(std::vector<WebPluginInfo>* plugins) { - base::AutoLock lock(lock_); + DCHECK_CURRENTLY_ON(BrowserThread::UI); plugins->insert(plugins->end(), plugins_list_.begin(), plugins_list_.end()); return loading_state_ == LOADING_STATE_UP_TO_DATE; @@ -229,10 +220,10 @@ bool allow_wildcard, std::vector<WebPluginInfo>* info, std::vector<std::string>* actual_mime_types) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(mime_type == base::ToLowerASCII(mime_type)); DCHECK(info); - base::AutoLock lock(lock_); bool is_stale = loading_state_ != LOADING_STATE_UP_TO_DATE; info->clear(); if (actual_mime_types) @@ -279,9 +270,8 @@ return is_stale; } -void PluginList::RemoveExtraPluginPathLocked( - const base::FilePath& plugin_path) { - lock_.AssertAcquired(); +void PluginList::RemoveExtraPluginPath(const base::FilePath& plugin_path) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); std::vector<base::FilePath>::iterator it = base::ranges::find(extra_plugin_paths_, plugin_path); if (it != extra_plugin_paths_.end())
diff --git a/content/browser/plugin_list.h b/content/browser/plugin_list.h index 0949b863b..0b0a860 100644 --- a/content/browser/plugin_list.h +++ b/content/browser/plugin_list.h
@@ -10,11 +10,8 @@ #include <utility> #include <vector> -#include "base/callback.h" #include "base/files/file_path.h" #include "base/lazy_instance.h" -#include "base/synchronization/lock.h" -#include "base/thread_annotations.h" #include "build/build_config.h" #include "content/common/content_export.h" #include "content/public/common/webplugininfo.h" @@ -28,14 +25,8 @@ namespace content { -// The PluginList is responsible for loading our NPAPI based plugins. It does -// so in whatever manner is appropriate for the platform. On Windows, it loads -// plugins from a known directory by looking for DLLs which start with "NP", -// and checking to see if they are valid NPAPI libraries. On the Mac, it walks -// the machine-wide and user plugin directories and loads anything that has -// the correct types. On Linux, it walks the plugin directories as well -// (e.g. /usr/lib/browser-plugins/). -// This object is thread safe. +// Manages the list of plugins. At this point, there are no external plugins. +// This object lives on the UI thread. class CONTENT_EXPORT PluginList { public: // Gets the one instance of the PluginList. @@ -86,8 +77,6 @@ std::vector<WebPluginInfo>* info, std::vector<std::string>* actual_mime_types); - void set_will_load_plugins_callback(const base::RepeatingClosure& callback); - private: enum LoadingState { LOADING_STATE_NEEDS_REFRESH, @@ -120,10 +109,8 @@ // Load all plugins from the default plugins directory. void LoadPlugins(); - // Removes |plugin_path| from the list of extra plugin paths. Should only be - // called while holding |lock_|. - void RemoveExtraPluginPathLocked(const base::FilePath& plugin_path) - EXCLUSIVE_LOCKS_REQUIRED(lock_); + // Removes |plugin_path| from the list of extra plugin paths. + void RemoveExtraPluginPath(const base::FilePath& plugin_path); // Creates a WebPluginInfo structure given a plugin's path. On success // returns true, with the information being put into "info". @@ -143,23 +130,16 @@ // States whether we will load the plugin list the next time we try to access // it, whether we are currently in the process of loading it, or whether we // consider it up to date. - LoadingState loading_state_ GUARDED_BY(lock_) = LOADING_STATE_NEEDS_REFRESH; + LoadingState loading_state_ = LOADING_STATE_NEEDS_REFRESH; // Extra plugin paths that we want to search when loading. - std::vector<base::FilePath> extra_plugin_paths_ GUARDED_BY(lock_); + std::vector<base::FilePath> extra_plugin_paths_; // Holds information about internal plugins. - std::vector<WebPluginInfo> internal_plugins_ GUARDED_BY(lock_); + std::vector<WebPluginInfo> internal_plugins_; // A list holding all plugins. - std::vector<WebPluginInfo> plugins_list_ GUARDED_BY(lock_); - - // Callback that is invoked whenever the PluginList will reload the plugins. - base::RepeatingClosure will_load_plugins_callback_ GUARDED_BY(lock_); - - // Need synchronization for the above members since this object can be - // accessed on multiple threads. - base::Lock lock_; + std::vector<WebPluginInfo> plugins_list_; }; } // namespace content
diff --git a/content/browser/plugin_list_unittest.cc b/content/browser/plugin_list_unittest.cc index 7f31948..7cda980 100644 --- a/content/browser/plugin_list_unittest.cc +++ b/content/browser/plugin_list_unittest.cc
@@ -6,7 +6,8 @@ #include <string> -#include "base/strings/utf_string_conversions.h" +#include "base/files/file_path.h" +#include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" @@ -16,9 +17,8 @@ base::FilePath::CharType kFooPath[] = FILE_PATH_LITERAL("/plugins/foo.plugin"); base::FilePath::CharType kBarPath[] = FILE_PATH_LITERAL("/plugins/bar.plugin"); -const char* kFooName = "Foo Plugin"; -const char* kFooMimeType = "application/x-foo-mime-type"; -const char* kFooFileType = "foo"; +const char kFooMimeType[] = "application/x-foo-mime-type"; +const char kFooFileType[] = "foo"; bool Equals(const WebPluginInfo& a, const WebPluginInfo& b) { return (a.name == b.name && a.path == b.path && a.version == b.version && @@ -40,7 +40,7 @@ class PluginListTest : public testing::Test { public: PluginListTest() - : foo_plugin_(base::ASCIIToUTF16(kFooName), + : foo_plugin_(u"Foo PluginListTest", base::FilePath(kFooPath), u"1.2.3", u"foo"), @@ -48,21 +48,33 @@ } void SetUp() override { - plugin_list_.RegisterInternalPlugin(bar_plugin_, false); + // Cannot use std::unique_ptr due to private ctor. + plugin_list_ = new PluginList(); + plugin_list_->RegisterInternalPlugin(bar_plugin_, false); foo_plugin_.mime_types.emplace_back(kFooMimeType, kFooFileType, std::string()); - plugin_list_.RegisterInternalPlugin(foo_plugin_, false); + plugin_list_->RegisterInternalPlugin(foo_plugin_, false); + } + + void TearDown() override { + // Cannot use std::unique_ptr due to private dtor. + delete plugin_list_; } protected: - PluginList plugin_list_; + // Must be first. + BrowserTaskEnvironment task_environment_; + + // Owns the PluginList but cannot be a std::unique_ptr due to private + // ctor/dtor. + PluginList* plugin_list_; WebPluginInfo foo_plugin_; WebPluginInfo bar_plugin_; }; TEST_F(PluginListTest, GetPlugins) { std::vector<WebPluginInfo> plugins; - plugin_list_.GetPlugins(&plugins); + plugin_list_->GetPlugins(&plugins); EXPECT_EQ(2u, plugins.size()); EXPECT_TRUE(Contains(plugins, foo_plugin_)); EXPECT_TRUE(Contains(plugins, bar_plugin_)); @@ -73,11 +85,11 @@ std::u16string(), base::FilePath(FILE_PATH_LITERAL("/myplugin.3.0.43")), std::u16string(), std::u16string()); // Simulate loading of the plugins. - plugin_list_.RegisterInternalPlugin(plugin_3043, false); + plugin_list_->RegisterInternalPlugin(plugin_3043, false); // Now we should have them in the state we specified above. - plugin_list_.RefreshPlugins(); + plugin_list_->RefreshPlugins(); std::vector<WebPluginInfo> plugins; - plugin_list_.GetPlugins(&plugins); + plugin_list_->GetPlugins(&plugins); ASSERT_TRUE(Contains(plugins, plugin_3043)); } @@ -89,7 +101,7 @@ bool is_stale; // The PluginList starts out in a stale state. - is_stale = plugin_list_.GetPluginInfoArray( + is_stale = plugin_list_->GetPluginInfoArray( target_url, "application/octet-stream", /*allow_wildcard=*/false, &plugins, &actual_mime_types); EXPECT_TRUE(is_stale); @@ -97,13 +109,13 @@ EXPECT_EQ(0u, actual_mime_types.size()); // Refresh it. - plugin_list_.GetPlugins(&plugins); + plugin_list_->GetPlugins(&plugins); plugins.clear(); // The file type of the URL is supported by |foo_plugin_|. However, // GetPluginInfoArray should not match |foo_plugin_| because the MIME type is // application/octet-stream. - is_stale = plugin_list_.GetPluginInfoArray( + is_stale = plugin_list_->GetPluginInfoArray( target_url, "application/octet-stream", /*allow_wildcard=*/false, &plugins, &actual_mime_types); EXPECT_FALSE(is_stale); @@ -113,9 +125,9 @@ // |foo_plugin_| matches due to the MIME type. plugins.clear(); actual_mime_types.clear(); - is_stale = plugin_list_.GetPluginInfoArray(target_url, kFooMimeType, - /*allow_wildcard=*/false, &plugins, - &actual_mime_types); + is_stale = plugin_list_->GetPluginInfoArray(target_url, kFooMimeType, + /*allow_wildcard=*/false, + &plugins, &actual_mime_types); EXPECT_FALSE(is_stale); EXPECT_EQ(1u, plugins.size()); EXPECT_TRUE(Contains(plugins, foo_plugin_)); @@ -125,9 +137,9 @@ // |foo_plugin_| matches due to the file type and empty MIME type. plugins.clear(); actual_mime_types.clear(); - is_stale = plugin_list_.GetPluginInfoArray(target_url, "", - /*allow_wildcard=*/false, &plugins, - &actual_mime_types); + is_stale = plugin_list_->GetPluginInfoArray(target_url, "", + /*allow_wildcard=*/false, + &plugins, &actual_mime_types); EXPECT_FALSE(is_stale); EXPECT_EQ(1u, plugins.size()); EXPECT_TRUE(Contains(plugins, foo_plugin_));
diff --git a/content/browser/plugin_service_impl.cc b/content/browser/plugin_service_impl.cc index 59e73c99..ab3e8c8 100644 --- a/content/browser/plugin_service_impl.cc +++ b/content/browser/plugin_service_impl.cc
@@ -19,6 +19,7 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/synchronization/waitable_event.h" +#include "base/task/sequenced_task_runner.h" #include "base/task/task_runner_util.h" #include "base/task/thread_pool.h" #include "base/threading/thread.h" @@ -54,18 +55,6 @@ namespace { -std::vector<WebPluginInfo> GetPluginsHelper() { - std::vector<WebPluginInfo> plugins; - PluginList::Singleton()->GetPlugins(&plugins); - return plugins; -} - -// Callback set on the PluginList to assert that plugin loading happens on the -// correct thread. -void WillLoadPluginsCallback(base::SequenceChecker* sequence_checker) { - DCHECK(sequence_checker->CalledOnValidSequence()); -} - #if BUILDFLAG(ENABLE_PPAPI) int CountPpapiPluginProcessesForProfile( const base::FilePath& plugin_path, @@ -90,6 +79,8 @@ void PluginService::PurgePluginListCache(BrowserContext* browser_context, bool reload_pages) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + for (RenderProcessHost::iterator it = RenderProcessHost::AllHostsIterator(); !it.IsAtEnd(); it.Advance()) { RenderProcessHost* host = it.GetCurrentValue(); @@ -108,14 +99,7 @@ PluginServiceImpl::~PluginServiceImpl() = default; void PluginServiceImpl::Init() { - plugin_list_task_runner_ = base::ThreadPool::CreateSequencedTaskRunner( - {base::MayBlock(), base::TaskPriority::USER_VISIBLE, - base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); - - // Setup the sequence checker right after setting up the task runner. - plugin_list_sequence_checker_.DetachFromSequence(); - PluginList::Singleton()->set_will_load_plugins_callback(base::BindRepeating( - &WillLoadPluginsCallback, &plugin_list_sequence_checker_)); + DCHECK_CURRENTLY_ON(BrowserThread::UI); RegisterPlugins(); } @@ -125,6 +109,8 @@ const base::FilePath& plugin_path, const base::FilePath& profile_data_directory, const absl::optional<url::Origin>& origin_lock) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + for (PpapiPluginProcessHostIterator iter; !iter.Done(); ++iter) { if (iter->plugin_path() == plugin_path && iter->profile_data_directory() == profile_data_directory && @@ -184,6 +170,8 @@ const base::FilePath& profile_data_directory, const absl::optional<url::Origin>& origin_lock, PpapiPluginProcessHost::PluginClient* client) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + PpapiPluginProcessHost* plugin_host = FindOrStartPpapiPluginProcess( render_process_id, plugin_path, profile_data_directory, origin_lock); if (plugin_host) { @@ -201,6 +189,8 @@ bool allow_wildcard, std::vector<WebPluginInfo>* plugins, std::vector<std::string>* actual_mime_types) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + return PluginList::Singleton()->GetPluginInfoArray( url, mime_type, allow_wildcard, plugins, actual_mime_types); } @@ -234,6 +224,8 @@ bool PluginServiceImpl::GetPluginInfoByPath(const base::FilePath& plugin_path, WebPluginInfo* info) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + std::vector<WebPluginInfo> plugins; PluginList::Singleton()->GetPluginsNoRefresh(&plugins); @@ -249,6 +241,8 @@ std::u16string PluginServiceImpl::GetPluginDisplayNameByPath( const base::FilePath& path) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + std::u16string plugin_name = path.LossyDisplayName(); WebPluginInfo info; if (PluginService::GetInstance()->GetPluginInfoByPath(path, &info) && @@ -266,16 +260,23 @@ } void PluginServiceImpl::GetPlugins(GetPluginsCallback callback) { - base::PostTaskAndReplyWithResult(plugin_list_task_runner_.get(), FROM_HERE, - base::BindOnce(&GetPluginsHelper), - std::move(callback)); + DCHECK_CURRENTLY_ON(BrowserThread::UI); + + // Run `callback` later, to stay compatible with prior behavior. + base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), GetPluginsSynchronous())); } std::vector<WebPluginInfo> PluginServiceImpl::GetPluginsSynchronous() { - return GetPluginsHelper(); + DCHECK_CURRENTLY_ON(BrowserThread::UI); + std::vector<WebPluginInfo> plugins; + PluginList::Singleton()->GetPlugins(&plugins); + return plugins; } void PluginServiceImpl::RegisterPlugins() { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + #if BUILDFLAG(ENABLE_PPAPI) ComputePepperPluginList(&plugins_); #else @@ -288,6 +289,8 @@ // There should generally be very few plugins so a brute-force search is fine. const ContentPluginInfo* PluginServiceImpl::GetRegisteredPluginInfo( const base::FilePath& plugin_path) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + for (auto& plugin : plugins_) { if (plugin.path == plugin_path) return &plugin; @@ -313,10 +316,12 @@ } void PluginServiceImpl::SetFilter(PluginServiceFilter* filter) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); filter_ = filter; } PluginServiceFilter* PluginServiceImpl::GetFilter() { + DCHECK_CURRENTLY_ON(BrowserThread::UI); return filter_; } @@ -352,27 +357,32 @@ } void PluginServiceImpl::RefreshPlugins() { + DCHECK_CURRENTLY_ON(BrowserThread::UI); PluginList::Singleton()->RefreshPlugins(); } void PluginServiceImpl::RegisterInternalPlugin( const WebPluginInfo& info, bool add_at_beginning) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); PluginList::Singleton()->RegisterInternalPlugin(info, add_at_beginning); } void PluginServiceImpl::UnregisterInternalPlugin(const base::FilePath& path) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); PluginList::Singleton()->UnregisterInternalPlugin(path); } void PluginServiceImpl::GetInternalPlugins( std::vector<WebPluginInfo>* plugins) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); PluginList::Singleton()->GetInternalPlugins(plugins); } bool PluginServiceImpl::PpapiDevChannelSupported( BrowserContext* browser_context, const GURL& document_url) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); return GetContentClient()->browser()->IsPluginAllowedToUseDevChannelAPIs( browser_context, document_url); }
diff --git a/content/browser/plugin_service_impl.h b/content/browser/plugin_service_impl.h index cf98068c..e179b53f 100644 --- a/content/browser/plugin_service_impl.h +++ b/content/browser/plugin_service_impl.h
@@ -10,8 +10,6 @@ #include "base/memory/raw_ptr.h" #include "base/memory/singleton.h" -#include "base/sequence_checker.h" -#include "base/task/sequenced_task_runner.h" #include "base/time/time.h" #include "build/build_config.h" #include "content/common/content_export.h" @@ -34,7 +32,7 @@ struct ContentPluginInfo; // This class responds to requests from renderers for the list of plugins, and -// also a proxy object for plugin instances. +// also a proxy object for plugin instances. It lives on the UI thread. class CONTENT_EXPORT PluginServiceImpl : public PluginService { public: // Returns the PluginServiceImpl singleton. @@ -80,7 +78,7 @@ // Returns the plugin process host corresponding to the plugin process that // has been started by this service. This will start a process to host the // 'plugin_path' if needed. If the process fails to start, the return value - // is NULL. Must be called on the IO thread. + // is NULL. PpapiPluginProcessHost* FindOrStartPpapiPluginProcess( int render_process_id, const base::FilePath& plugin_path, @@ -88,8 +86,7 @@ const absl::optional<url::Origin>& origin_lock); // Opens a channel to a plugin process for the given mime type, starting - // a new plugin process if necessary. This must be called on the IO thread - // or else a deadlock can occur. + // a new plugin process if necessary. void OpenChannelToPpapiPlugin(int render_process_id, const base::FilePath& plugin_path, const base::FilePath& profile_data_directory, @@ -132,15 +129,9 @@ int max_ppapi_processes_per_profile_ = kDefaultMaxPpapiProcessesPerProfile; - // Weak pointer; set during the startup on UI thread and must outlive us. + // Weak pointer; set during the startup and must outlive us. raw_ptr<PluginServiceFilter> filter_ = nullptr; - // Used to load plugins from disk. - scoped_refptr<base::SequencedTaskRunner> plugin_list_task_runner_; - - // Used to verify that loading plugins from disk is done sequentially. - base::SequenceChecker plugin_list_sequence_checker_; - // Used to detect if a given plugin is crashing over and over. std::map<base::FilePath, std::vector<base::Time>> crash_times_; };
diff --git a/content/browser/renderer_host/frame_tree_node.cc b/content/browser/renderer_host/frame_tree_node.cc index a8092e2..3d6b6de 100644 --- a/content/browser/renderer_host/frame_tree_node.cc +++ b/content/browser/renderer_host/frame_tree_node.cc
@@ -979,6 +979,26 @@ } } +size_t FrameTreeNode::GetFencedFrameDepth() { + size_t depth = 0; + FrameTreeNode* node = this; + + while (node->fenced_frame_status() != + FencedFrameStatus::kNotNestedInFencedFrame) { + if (node->fenced_frame_status() == FencedFrameStatus::kFencedFrameRoot) { + depth += 1; + } else { + DCHECK_EQ(node->fenced_frame_status(), + FencedFrameStatus::kIframeNestedWithinFencedFrame); + } + + DCHECK(node->GetParentOrOuterDocument()); + node = node->GetParentOrOuterDocument()->frame_tree_node(); + } + + return depth; +} + absl::optional<base::UnguessableToken> FrameTreeNode::GetFencedFrameNonce() { auto& root_fenced_frame_properties = GetFencedFrameProperties(); if (!root_fenced_frame_properties.has_value()) { @@ -1037,15 +1057,16 @@ srcdoc_value_ = srcdoc_value; } -absl::optional<const FencedFrameURLMapping::SharedStorageBudgetMetadata*> +std::vector<const FencedFrameURLMapping::SharedStorageBudgetMetadata*> FrameTreeNode::FindSharedStorageBudgetMetadata() { + std::vector<const FencedFrameURLMapping::SharedStorageBudgetMetadata*> result; FrameTreeNode* node = this; while (true) { if (node->fenced_frame_properties_ && node->fenced_frame_properties_->shared_storage_budget_metadata) { - DCHECK(node->IsFencedFrameRoot()); - return node->fenced_frame_properties_->shared_storage_budget_metadata; + result.emplace_back(node->fenced_frame_properties_ + ->shared_storage_budget_metadata.value()); } if (node->GetParentOrOuterDocument()) { @@ -1055,7 +1076,7 @@ } } - return absl::nullopt; + return result; } const scoped_refptr<BrowsingContextState>&
diff --git a/content/browser/renderer_host/frame_tree_node.h b/content/browser/renderer_host/frame_tree_node.h index 56c6ed77..a5eff101 100644 --- a/content/browser/renderer_host/frame_tree_node.h +++ b/content/browser/renderer_host/frame_tree_node.h
@@ -574,12 +574,21 @@ const absl::optional<FencedFrameURLMapping::FencedFrameProperties>& GetFencedFrameProperties(); - // Traverse up from this node. The `shared_storage_budget_metadata()` of the - // first seen node with a non-null budget metadata will be returned (i.e. this - // node inherits that budget metadata), and this node is expected to be an - // outermost fenced frame root. Return nullptr if not found (i.e. this node is - // not subjected to shared storage budgeting). - absl::optional<const FencedFrameURLMapping::SharedStorageBudgetMetadata*> + // Return the number of fenced frame boundaries above this frame. The + // outermost main frame's frame tree has fenced frame depth 0, a topmost + // fenced frame tree embedded in the outermost main frame has fenced frame + // depth 1, etc. + size_t GetFencedFrameDepth(); + + // Traverse up from this node. Return all valid + // `node->fenced_frame_properties_->shared_storage_budget_metadata` (i.e. this + // node is subjected to the shared storage budgeting associated with those + // metadata). Every node that originates from sharedStorage.selectURL() will + // have an associated metadata. This indicates that the metadata can only + // possibly be associated with a fenced frame root, unless when + // `kAllowURNsInIframes` is enabled in which case they could be be associated + // with any node. + std::vector<const FencedFrameURLMapping::SharedStorageBudgetMetadata*> FindSharedStorageBudgetMetadata(); // Accessor to BrowsingContextState for subframes only. Only main frame
diff --git a/content/browser/service_worker/embedded_worker_instance.h b/content/browser/service_worker/embedded_worker_instance.h index 73cd7cc9..4107f6f 100644 --- a/content/browser/service_worker/embedded_worker_instance.h +++ b/content/browser/service_worker/embedded_worker_instance.h
@@ -271,7 +271,7 @@ typedef base::ObserverList<Listener>::Unchecked ListenerList; struct StartInfo; class WorkerProcessHandle; - friend class EmbeddedWorkerInstanceTest; + friend class EmbeddedWorkerInstanceTestHarness; FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerInstanceTest, StartAndStop); FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerInstanceTest, DetachDuringStart); FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerInstanceTest, StopDuringStart);
diff --git a/content/browser/service_worker/embedded_worker_instance_unittest.cc b/content/browser/service_worker/embedded_worker_instance_unittest.cc index e7eca8f..1030ee9 100644 --- a/content/browser/service_worker/embedded_worker_instance_unittest.cc +++ b/content/browser/service_worker/embedded_worker_instance_unittest.cc
@@ -8,67 +8,40 @@ #include <utility> #include <vector> -#include "base/bind.h" -#include "base/callback_helpers.h" -#include "base/command_line.h" #include "base/run_loop.h" -#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" +#include "base/test/test_future.h" #include "content/browser/service_worker/embedded_worker_status.h" #include "content/browser/service_worker/embedded_worker_test_helper.h" #include "content/browser/service_worker/fake_embedded_worker_instance_client.h" #include "content/browser/service_worker/service_worker_context_core.h" -#include "content/browser/service_worker/service_worker_context_wrapper.h" -#include "content/browser/service_worker/service_worker_registration.h" -#include "content/browser/service_worker/service_worker_test_utils.h" #include "content/browser/service_worker/service_worker_version.h" #include "content/public/common/child_process_host.h" -#include "content/public/common/content_switches.h" -#include "content/public/test/browser_task_environment.h" -#include "content/public/test/policy_container_utils.h" +#include "content/public/test/embedded_worker_instance_test_harness.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" -#include "mojo/public/cpp/bindings/remote.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/features.h" -#include "third_party/blink/public/common/storage_key/storage_key.h" #include "third_party/blink/public/mojom/service_worker/embedded_worker.mojom.h" -#include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h" -#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h" -#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h" -#include "third_party/blink/public/mojom/service_worker/service_worker_registration_options.mojom.h" -#include "url/origin.h" namespace content { namespace { -EmbeddedWorkerInstance::StatusCallback ReceiveStatus( - absl::optional<blink::ServiceWorkerStatusCode>* out_status, - base::OnceClosure quit) { - return base::BindOnce( - [](absl::optional<blink::ServiceWorkerStatusCode>* out_status, - base::OnceClosure quit, blink::ServiceWorkerStatusCode status) { - *out_status = status; - std::move(quit).Run(); - }, - out_status, std::move(quit)); -} +using RegistrationAndVersionPair = + EmbeddedWorkerTestHelper::RegistrationAndVersionPair; } // namespace -class EmbeddedWorkerInstanceTest : public testing::Test, +class EmbeddedWorkerInstanceTest : public EmbeddedWorkerInstanceTestHarness, public EmbeddedWorkerInstance::Listener { public: - EmbeddedWorkerInstanceTest(const EmbeddedWorkerInstanceTest&) = delete; - EmbeddedWorkerInstanceTest& operator=(const EmbeddedWorkerInstanceTest&) = - delete; + EmbeddedWorkerInstanceTest() + : EmbeddedWorkerInstanceTestHarness(BrowserTaskEnvironment::IO_MAINLOOP) { + } protected: - EmbeddedWorkerInstanceTest() - : task_environment_(BrowserTaskEnvironment::IO_MAINLOOP) {} - enum EventType { PROCESS_ALLOCATED, START_WORKER_MESSAGE_SENT, @@ -108,125 +81,9 @@ RecordEvent(DETACHED, old_status); } - void SetUp() override { - helper_ = std::make_unique<EmbeddedWorkerTestHelper>(base::FilePath()); - } - - void TearDown() override { helper_.reset(); } - - using RegistrationAndVersionPair = - std::pair<scoped_refptr<ServiceWorkerRegistration>, - scoped_refptr<ServiceWorkerVersion>>; - - RegistrationAndVersionPair PrepareRegistrationAndVersion( - const GURL& scope, - const GURL& script_url) { - RegistrationAndVersionPair pair; - blink::mojom::ServiceWorkerRegistrationOptions options; - options.scope = scope; - pair.first = CreateNewServiceWorkerRegistration( - context()->registry(), options, - blink::StorageKey(url::Origin::Create(scope))); - pair.second = CreateNewServiceWorkerVersion( - context()->registry(), pair.first, script_url, - blink::mojom::ScriptType::kClassic); - return pair; - } - - // Calls worker->Start() and runs until the start IPC is sent. - // - // Expects success. For failure cases, call Start() manually. - void StartWorkerUntilStartSent( - EmbeddedWorkerInstance* worker, - blink::mojom::EmbeddedWorkerStartParamsPtr params) { - absl::optional<blink::ServiceWorkerStatusCode> status; - base::RunLoop loop; - worker->Start(std::move(params), - ReceiveStatus(&status, loop.QuitClosure())); - loop.Run(); - EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status); - EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status()); - } - - // Calls worker->Start() and runs until startup finishes. - // - // Expects success. For failure cases, call Start() manually. - void StartWorker(EmbeddedWorkerInstance* worker, - blink::mojom::EmbeddedWorkerStartParamsPtr params) { - StartWorkerUntilStartSent(worker, std::move(params)); - // TODO(falken): Listen for OnStarted() instead of this. - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); - } - - blink::mojom::EmbeddedWorkerStartParamsPtr CreateStartParams( - scoped_refptr<ServiceWorkerVersion> version) { - auto params = blink::mojom::EmbeddedWorkerStartParams::New(); - params->service_worker_version_id = version->version_id(); - params->scope = version->scope(); - params->script_url = version->script_url(); - params->is_installed = false; - - params->service_worker_receiver = CreateServiceWorker(version); - params->controller_receiver = CreateController(); - params->installed_scripts_info = GetInstalledScriptsInfoPtr(); - params->provider_info = CreateProviderInfo(std::move(version)); - params->policy_container = CreateStubPolicyContainer(); - return params; - } - - blink::mojom::ServiceWorkerProviderInfoForStartWorkerPtr CreateProviderInfo( - scoped_refptr<ServiceWorkerVersion> version) { - auto provider_info = - blink::mojom::ServiceWorkerProviderInfoForStartWorker::New(); - version->worker_host_ = std::make_unique<ServiceWorkerHost>( - provider_info->host_remote.InitWithNewEndpointAndPassReceiver(), - version.get(), context()->AsWeakPtr()); - return provider_info; - } - - mojo::PendingReceiver<blink::mojom::ServiceWorker> CreateServiceWorker( - scoped_refptr<ServiceWorkerVersion> version) { - version->service_worker_remote_.reset(); - return version->service_worker_remote_.BindNewPipeAndPassReceiver(); - } - - mojo::PendingReceiver<blink::mojom::ControllerServiceWorker> - CreateController() { - controllers_.emplace_back(); - return controllers_.back().BindNewPipeAndPassReceiver(); - } - - void SetWorkerStatus(EmbeddedWorkerInstance* worker, - EmbeddedWorkerStatus status) { - worker->status_ = status; - } - - blink::mojom::ServiceWorkerInstalledScriptsInfoPtr - GetInstalledScriptsInfoPtr() { - installed_scripts_managers_.emplace_back(); - auto info = blink::mojom::ServiceWorkerInstalledScriptsInfo::New(); - info->manager_receiver = - installed_scripts_managers_.back().BindNewPipeAndPassReceiver(); - installed_scripts_manager_host_receivers_.push_back( - info->manager_host_remote.InitWithNewPipeAndPassReceiver()); - return info; - } - ServiceWorkerContextCore* context() { return helper_->context(); } - // Mojo endpoints. - std::vector<mojo::Remote<blink::mojom::ControllerServiceWorker>> controllers_; - std::vector<mojo::Remote<blink::mojom::ServiceWorkerInstalledScriptsManager>> - installed_scripts_managers_; - std::vector<mojo::PendingReceiver< - blink::mojom::ServiceWorkerInstalledScriptsManagerHost>> - installed_scripts_manager_host_receivers_; - - BrowserTaskEnvironment task_environment_; - std::unique_ptr<EmbeddedWorkerTestHelper> helper_; std::vector<EventLog> events_; - base::test::ScopedFeatureList scoped_feature_list_; blink::mojom::ServiceWorkerFetchHandlerType fetch_handler_type_; }; @@ -234,13 +91,14 @@ const GURL scope("http://example.com/"); const GURL url("http://example.com/worker.js"); - RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url); + RegistrationAndVersionPair pair = + helper_->PrepareRegistrationAndVersion(scope, url); auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get()); EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); worker->AddObserver(this); // Start should succeed. - StartWorker(worker.get(), CreateStartParams(pair.second)); + helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second)); // The 'WorkerStarted' message should have been sent by // EmbeddedWorkerTestHelper. @@ -272,14 +130,15 @@ const GURL scope("http://example.com/"); const GURL url("http://example.com/worker.js"); - RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url); + RegistrationAndVersionPair pair = + helper_->PrepareRegistrationAndVersion(scope, url); const int64_t service_worker_version_id = pair.second->version_id(); auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get()); EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); { // Start once normally. - StartWorker(worker.get(), CreateStartParams(pair.second)); + helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second)); // The worker should be using the default render process. EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id()); @@ -296,7 +155,7 @@ { // Start again. base::RunLoop run_loop; - StartWorker(worker.get(), CreateStartParams(pair.second)); + helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second)); // The worker should be using the new render process. EXPECT_EQ(helper_->new_render_process_id(), worker->process_id()); @@ -309,12 +168,13 @@ const GURL scope("http://example.com/"); const GURL url("http://example.com/worker.js"); - RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url); + RegistrationAndVersionPair pair = + helper_->PrepareRegistrationAndVersion(scope, url); auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get()); EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); // Start the worker and then call StopIfNotAttachedToDevTools(). - StartWorker(worker.get(), CreateStartParams(pair.second)); + helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second)); EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id()); worker->StopIfNotAttachedToDevTools(); EXPECT_EQ(EmbeddedWorkerStatus::STOPPING, worker->status()); @@ -326,7 +186,7 @@ // Set devtools_attached to true, and do the same. worker->SetDevToolsAttached(true); - StartWorker(worker.get(), CreateStartParams(pair.second)); + helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second)); EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id()); worker->StopIfNotAttachedToDevTools(); base::RunLoop().RunUntilIdle(); @@ -345,14 +205,16 @@ const GURL scope("http://example.com/"); const GURL url("http://example.com/worker.js"); - RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url); + RegistrationAndVersionPair pair = + helper_->PrepareRegistrationAndVersion(scope, url); auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get()); worker->AddObserver(this); auto* client = helper_->AddNewPendingInstanceClient< DelayedFakeEmbeddedWorkerInstanceClient>(helper_.get()); client->UnblockStopWorker(); - StartWorkerUntilStartSent(worker.get(), CreateStartParams(pair.second)); + helper_->StartWorkerUntilStartSent(worker.get(), + helper_->CreateStartParams(pair.second)); ASSERT_EQ(2u, events_.size()); EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); @@ -374,7 +236,8 @@ const GURL scope("http://example.com/"); const GURL url("http://example.com/worker.js"); - RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url); + RegistrationAndVersionPair pair = + helper_->PrepareRegistrationAndVersion(scope, url); auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get()); worker->AddObserver(this); @@ -382,7 +245,8 @@ DelayedFakeEmbeddedWorkerInstanceClient>(helper_.get()); client->UnblockStopWorker(); - StartWorkerUntilStartSent(worker.get(), CreateStartParams(pair.second)); + helper_->StartWorkerUntilStartSent(worker.get(), + helper_->CreateStartParams(pair.second)); ASSERT_EQ(2u, events_.size()); EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type); @@ -401,7 +265,7 @@ events_.clear(); // Restart the worker. - StartWorker(worker.get(), CreateStartParams(pair.second)); + helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second)); // The worker should be started. ASSERT_EQ(3u, events_.size()); @@ -417,11 +281,12 @@ const GURL scope("http://example.com/"); const GURL url("http://example.com/worker.js"); - RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url); + RegistrationAndVersionPair pair = + helper_->PrepareRegistrationAndVersion(scope, url); auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get()); // Start the worker. - StartWorker(worker.get(), CreateStartParams(pair.second)); + helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second)); // Detach. worker->Detach(); @@ -436,18 +301,16 @@ // Let StartWorker fail; mojo IPC fails to connect to a remote interface. helper_->AddPendingInstanceClient(nullptr); - RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url); + RegistrationAndVersionPair pair = + helper_->PrepareRegistrationAndVersion(scope, url); auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get()); worker->AddObserver(this); // Attempt to start the worker. From the browser process's point of view, the // start IPC was sent. - absl::optional<blink::ServiceWorkerStatusCode> status; - base::RunLoop loop; - worker->Start(CreateStartParams(pair.second), - ReceiveStatus(&status, loop.QuitClosure())); - loop.Run(); - EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status.value()); + base::test::TestFuture<blink::ServiceWorkerStatusCode> future; + worker->Start(helper_->CreateStartParams(pair.second), future.GetCallback()); + EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, future.Get()); // But the renderer should not receive the message and the binding is broken. // Worker should handle the failure of binding on the remote side as detach. @@ -465,19 +328,17 @@ const GURL scope("http://example.com/"); const GURL url("http://example.com/worker.js"); - RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url); + RegistrationAndVersionPair pair = + helper_->PrepareRegistrationAndVersion(scope, url); auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get()); worker->AddObserver(this); // Attempt to start the worker. - absl::optional<blink::ServiceWorkerStatusCode> status; - base::RunLoop loop; auto* client = helper_->AddNewPendingInstanceClient< DelayedFakeEmbeddedWorkerInstanceClient>(helper_.get()); - worker->Start(CreateStartParams(pair.second), - ReceiveStatus(&status, loop.QuitClosure())); - loop.Run(); - EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status.value()); + base::test::TestFuture<blink::ServiceWorkerStatusCode> future; + worker->Start(helper_->CreateStartParams(pair.second), future.GetCallback()); + EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, future.Get()); // Disconnect the Mojo connection. Worker should handle the sudden shutdown as // detach. @@ -516,7 +377,8 @@ const GURL scope("http://example.com/"); const GURL url("http://example.com/worker.js"); - RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url); + RegistrationAndVersionPair pair = + helper_->PrepareRegistrationAndVersion(scope, url); // We should set COEP, or cache storage pipe won't be made. pair.second->set_cross_origin_embedder_policy( network::CrossOriginEmbedderPolicy()); @@ -526,7 +388,7 @@ auto* client = helper_->AddNewPendingInstanceClient<RecordCacheStorageInstanceClient>( helper_.get()); - StartWorker(worker.get(), CreateStartParams(pair.second)); + helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second)); // Cache storage should have been sent. EXPECT_TRUE(client->had_cache_storage()); @@ -546,7 +408,8 @@ const GURL scope("http://example.com/"); const GURL url("http://example.com/worker.js"); - RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url); + RegistrationAndVersionPair pair = + helper_->PrepareRegistrationAndVersion(scope, url); auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get()); auto* client = helper_->AddNewPendingInstanceClient<RecordCacheStorageInstanceClient>( @@ -554,8 +417,8 @@ // Start the worker. blink::mojom::EmbeddedWorkerStartParamsPtr params = - CreateStartParams(pair.second); - StartWorker(worker.get(), std::move(params)); + helper_->CreateStartParams(pair.second); + helper_->StartWorker(worker.get(), std::move(params)); // Cache storage should not have been sent. EXPECT_FALSE(client->had_cache_storage()); @@ -587,14 +450,15 @@ TEST_F(EmbeddedWorkerInstanceTest, AbruptCompletion) { const GURL scope("http://example.com/"); const GURL url("http://example.com/worker.js"); - RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url); + RegistrationAndVersionPair pair = + helper_->PrepareRegistrationAndVersion(scope, url); auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get()); EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); worker->AddObserver(this); helper_->AddPendingInstanceClient( std::make_unique<AbruptCompletionInstanceClient>(helper_.get())); - StartWorker(worker.get(), CreateStartParams(pair.second)); + helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second)); ASSERT_EQ(3u, events_.size()); EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type); @@ -634,7 +498,8 @@ TEST_F(EmbeddedWorkerInstanceTest, HasFetchHandler) { const GURL scope("http://example.com/"); const GURL url("http://example.com/worker.js"); - RegistrationAndVersionPair pair1 = PrepareRegistrationAndVersion(scope, url); + RegistrationAndVersionPair pair1 = + helper_->PrepareRegistrationAndVersion(scope, url); auto worker1 = std::make_unique<EmbeddedWorkerInstance>(pair1.second.get()); EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker1->status()); worker1->AddObserver(this); @@ -644,13 +509,14 @@ helper_.get()); fetch_handler_worker->set_fetch_handler_type( blink::mojom::ServiceWorkerFetchHandlerType::kNotSkippable); - StartWorker(worker1.get(), CreateStartParams(pair1.second)); + helper_->StartWorker(worker1.get(), helper_->CreateStartParams(pair1.second)); EXPECT_NE(blink::mojom::ServiceWorkerFetchHandlerType::kNoHandler, fetch_handler_type_); worker1->Stop(); - RegistrationAndVersionPair pair2 = PrepareRegistrationAndVersion(scope, url); + RegistrationAndVersionPair pair2 = + helper_->PrepareRegistrationAndVersion(scope, url); auto worker2 = std::make_unique<EmbeddedWorkerInstance>(pair2.second.get()); EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker2->status()); worker2->AddObserver(this); @@ -660,7 +526,7 @@ helper_.get()); no_fetch_handler_worker->set_fetch_handler_type( blink::mojom::ServiceWorkerFetchHandlerType::kNoHandler); - StartWorker(worker2.get(), CreateStartParams(pair2.second)); + helper_->StartWorker(worker2.get(), helper_->CreateStartParams(pair2.second)); EXPECT_EQ(blink::mojom::ServiceWorkerFetchHandlerType::kNoHandler, fetch_handler_type_);
diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc index 252a4ab1..7e8834c 100644 --- a/content/browser/service_worker/embedded_worker_test_helper.cc +++ b/content/browser/service_worker/embedded_worker_test_helper.cc
@@ -9,6 +9,7 @@ #include "base/callback.h" #include "base/memory/scoped_refptr.h" +#include "base/test/test_future.h" #include "base/threading/sequenced_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h" #include "components/services/storage/service_worker/service_worker_storage_control_impl.h" @@ -16,6 +17,7 @@ #include "content/browser/service_worker/service_worker_context_wrapper.h" #include "content/browser/service_worker/service_worker_test_utils.h" #include "content/public/test/mock_render_process_host.h" +#include "content/public/test/policy_container_utils.h" #include "content/public/test/test_browser_context.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" @@ -28,12 +30,29 @@ const base::FilePath& user_data_directory) : EmbeddedWorkerTestHelper( user_data_directory, - base::MakeRefCounted<storage::MockSpecialStoragePolicy>()) {} + base::MakeRefCounted<storage::MockSpecialStoragePolicy>(), + std::make_unique<TestBrowserContext>()) {} EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper( const base::FilePath& user_data_directory, scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy) - : browser_context_(std::make_unique<TestBrowserContext>()), + : EmbeddedWorkerTestHelper(user_data_directory, + special_storage_policy, + std::make_unique<TestBrowserContext>()) {} + +EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper( + const base::FilePath& user_data_directory, + std::unique_ptr<BrowserContext> browser_context) + : EmbeddedWorkerTestHelper( + user_data_directory, + base::MakeRefCounted<storage::MockSpecialStoragePolicy>(), + std::move(browser_context)) {} + +EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper( + const base::FilePath& user_data_directory, + scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy, + std::unique_ptr<BrowserContext> browser_context) + : browser_context_(std::move(browser_context)), render_process_host_( std::make_unique<MockRenderProcessHost>(browser_context_.get())), new_render_process_host_( @@ -243,4 +262,95 @@ user_data_directory_, database_task_runner_, std::move(receiver)); } +EmbeddedWorkerTestHelper::RegistrationAndVersionPair +EmbeddedWorkerTestHelper::PrepareRegistrationAndVersion( + const GURL& scope, + const GURL& script_url) { + RegistrationAndVersionPair pair; + blink::mojom::ServiceWorkerRegistrationOptions options; + options.scope = scope; + pair.first = CreateNewServiceWorkerRegistration( + context()->registry(), options, + blink::StorageKey(url::Origin::Create(scope))); + pair.second = CreateNewServiceWorkerVersion( + context()->registry(), pair.first, script_url, + blink::mojom::ScriptType::kClassic); + return pair; +} + +// Calls worker->Start() and runs until the start IPC is sent. +// +// Expects success. For failure cases, call Start() manually. +void EmbeddedWorkerTestHelper::StartWorkerUntilStartSent( + EmbeddedWorkerInstance* worker, + blink::mojom::EmbeddedWorkerStartParamsPtr params) { + base::test::TestFuture<blink::ServiceWorkerStatusCode> future; + worker->Start(std::move(params), future.GetCallback()); + EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, future.Get()); +} + +// Calls worker->Start() and runs until startup finishes. +// +// Expects success. For failure cases, call Start() manually. +void EmbeddedWorkerTestHelper::StartWorker( + EmbeddedWorkerInstance* worker, + blink::mojom::EmbeddedWorkerStartParamsPtr params) { + StartWorkerUntilStartSent(worker, std::move(params)); + // TODO(falken): Listen for OnStarted() instead of this. + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status()); +} + +blink::mojom::EmbeddedWorkerStartParamsPtr +EmbeddedWorkerTestHelper::CreateStartParams( + scoped_refptr<ServiceWorkerVersion> version) { + auto params = blink::mojom::EmbeddedWorkerStartParams::New(); + params->service_worker_version_id = version->version_id(); + params->scope = version->scope(); + params->script_url = version->script_url(); + params->is_installed = false; + + params->service_worker_receiver = CreateServiceWorker(version); + params->controller_receiver = CreateController(); + params->installed_scripts_info = GetInstalledScriptsInfoPtr(); + params->provider_info = CreateProviderInfo(std::move(version)); + params->policy_container = CreateStubPolicyContainer(); + return params; +} + +blink::mojom::ServiceWorkerProviderInfoForStartWorkerPtr +EmbeddedWorkerTestHelper::CreateProviderInfo( + scoped_refptr<ServiceWorkerVersion> version) { + auto provider_info = + blink::mojom::ServiceWorkerProviderInfoForStartWorker::New(); + version->worker_host_ = std::make_unique<ServiceWorkerHost>( + provider_info->host_remote.InitWithNewEndpointAndPassReceiver(), + version.get(), context()->AsWeakPtr()); + return provider_info; +} + +mojo::PendingReceiver<blink::mojom::ServiceWorker> +EmbeddedWorkerTestHelper::CreateServiceWorker( + scoped_refptr<ServiceWorkerVersion> version) { + version->service_worker_remote_.reset(); + return version->service_worker_remote_.BindNewPipeAndPassReceiver(); +} + +mojo::PendingReceiver<blink::mojom::ControllerServiceWorker> +EmbeddedWorkerTestHelper::CreateController() { + controllers_.emplace_back(); + return controllers_.back().BindNewPipeAndPassReceiver(); +} + +blink::mojom::ServiceWorkerInstalledScriptsInfoPtr +EmbeddedWorkerTestHelper::GetInstalledScriptsInfoPtr() { + installed_scripts_managers_.emplace_back(); + auto info = blink::mojom::ServiceWorkerInstalledScriptsInfo::New(); + info->manager_receiver = + installed_scripts_managers_.back().BindNewPipeAndPassReceiver(); + installed_scripts_manager_host_receivers_.push_back( + info->manager_host_remote.InitWithNewPipeAndPassReceiver()); + return info; +} + } // namespace content
diff --git a/content/browser/service_worker/embedded_worker_test_helper.h b/content/browser/service_worker/embedded_worker_test_helper.h index 530f7a7..a25b298 100644 --- a/content/browser/service_worker/embedded_worker_test_helper.h +++ b/content/browser/service_worker/embedded_worker_test_helper.h
@@ -38,7 +38,6 @@ class MockRenderProcessHost; class ServiceWorkerContextCore; class ServiceWorkerContextWrapper; -class TestBrowserContext; // In-Process EmbeddedWorker test helper. // @@ -85,9 +84,15 @@ // If |user_data_directory| is empty, the context makes storage stuff in // memory. explicit EmbeddedWorkerTestHelper(const base::FilePath& user_data_directory); + EmbeddedWorkerTestHelper(const base::FilePath& user_data_directory, + std::unique_ptr<BrowserContext> browser_context); EmbeddedWorkerTestHelper( const base::FilePath& user_data_directory, scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy); + EmbeddedWorkerTestHelper( + const base::FilePath& user_data_directory, + scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy, + std::unique_ptr<BrowserContext> browser_context); EmbeddedWorkerTestHelper(const EmbeddedWorkerTestHelper&) = delete; EmbeddedWorkerTestHelper& operator=(const EmbeddedWorkerTestHelper&) = delete; @@ -116,7 +121,7 @@ return quota_manager_proxy_.get(); } - TestBrowserContext* browser_context() { return browser_context_.get(); } + BrowserContext* browser_context() { return browser_context_.get(); } static std::unique_ptr<ServiceWorkerVersion::MainScriptResponse> CreateMainScriptResponse(); @@ -179,6 +184,42 @@ base::OnceClosure callback); ///////////////////////////////////////////////////////////////////////////// + using RegistrationAndVersionPair = + std::pair<scoped_refptr<ServiceWorkerRegistration>, + scoped_refptr<ServiceWorkerVersion>>; + + RegistrationAndVersionPair PrepareRegistrationAndVersion( + const GURL& scope, + const GURL& script_url); + + // Calls worker->Start() and runs until the start IPC is sent. + // + // Expects success. For failure cases, call Start() manually. + void StartWorkerUntilStartSent( + EmbeddedWorkerInstance* worker, + blink::mojom::EmbeddedWorkerStartParamsPtr params); + + // Calls worker->Start() and runs until startup finishes. + // + // Expects success. For failure cases, call Start() manually. + void StartWorker(EmbeddedWorkerInstance* worker, + blink::mojom::EmbeddedWorkerStartParamsPtr params); + + blink::mojom::EmbeddedWorkerStartParamsPtr CreateStartParams( + scoped_refptr<ServiceWorkerVersion> version); + + blink::mojom::ServiceWorkerProviderInfoForStartWorkerPtr CreateProviderInfo( + scoped_refptr<ServiceWorkerVersion> version); + + mojo::PendingReceiver<blink::mojom::ServiceWorker> CreateServiceWorker( + scoped_refptr<ServiceWorkerVersion> version); + + mojo::PendingReceiver<blink::mojom::ControllerServiceWorker> + CreateController(); + + blink::mojom::ServiceWorkerInstalledScriptsInfoPtr + GetInstalledScriptsInfoPtr(); + protected: // Subclasses can override these to change the default fakes. This saves tests // from calling AddPending*() for each start worker attempt. @@ -191,7 +232,7 @@ mojo::PendingReceiver<storage::mojom::ServiceWorkerStorageControl> receiver); - std::unique_ptr<TestBrowserContext> browser_context_; + std::unique_ptr<BrowserContext> browser_context_; std::unique_ptr<MockRenderProcessHost> render_process_host_; std::unique_ptr<MockRenderProcessHost> new_render_process_host_; scoped_refptr<storage::MockQuotaManager> quota_manager_; @@ -222,6 +263,14 @@ int new_mock_render_process_id_; scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter_; + + // Mojo endpoints. + std::vector<mojo::Remote<blink::mojom::ControllerServiceWorker>> controllers_; + std::vector<mojo::Remote<blink::mojom::ServiceWorkerInstalledScriptsManager>> + installed_scripts_managers_; + std::vector<mojo::PendingReceiver< + blink::mojom::ServiceWorkerInstalledScriptsManagerHost>> + installed_scripts_manager_host_receivers_; }; template <typename MockType, typename... Args>
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h index b2ee957..59dda077 100644 --- a/content/browser/service_worker/service_worker_version.h +++ b/content/browser/service_worker/service_worker_version.h
@@ -687,7 +687,7 @@ private: friend class base::RefCounted<ServiceWorkerVersion>; - friend class EmbeddedWorkerInstanceTest; + friend class EmbeddedWorkerTestHelper; friend class ServiceWorkerPingController; friend class ServiceWorkerContainerHostTest; friend class ServiceWorkerReadFromCacheJobTest;
diff --git a/content/browser/shared_storage/shared_storage_browsertest.cc b/content/browser/shared_storage/shared_storage_browsertest.cc index 02cabb1..4aa615c 100644 --- a/content/browser/shared_storage/shared_storage_browsertest.cc +++ b/content/browser/shared_storage/shared_storage_browsertest.cc
@@ -83,9 +83,9 @@ const char kSelectFrom8URLsScript[] = R"( let urls = []; for (let i = 0; i < 8; ++i) { - urls.push({url: 'fenced_frames/title' + i.toString() + '.html', + urls.push({url: '/fenced_frames/title' + i.toString() + '.html', reportingMetadata: { - 'click': 'fenced_frames/report' + i.toString() + '.html' + 'click': '/fenced_frames/report' + i.toString() + '.html' }}); } @@ -1873,18 +1873,24 @@ return child_node; } - // Create an iframe and run sharedStorage.selectURL() on 8 urls. This - // generates an URN associated with `origin` and 3 bits of shared storage - // budget. This can be called at most once per origin per test, because - // `GetAttachedWorkletHostForOrigin()` will expect only one worklet host for - // this origin, and `WaitForWorkletResponsesCount()` is expected to be invoked - // once per worklet host. - GURL SelectFrom8URLsInContext(const url::Origin& origin) { - FrameTreeNode* iframe = - CreateIFrame(PrimaryFrameTreeNodeRoot(), origin.GetURL()); + // Create an iframe of origin `origin` inside `parent_node`, and run + // sharedStorage.selectURL() on 8 urls. If `parent_node` is not specified, + // the primary frame tree's root node will be chosen. This generates an URN + // associated with `origin` and 3 bits of shared storage budget. + GURL SelectFrom8URLsInContext(const url::Origin& origin, + FrameTreeNode* parent_node = nullptr) { + if (!parent_node) + parent_node = PrimaryFrameTreeNodeRoot(); + + // If this is called inside a fenced frame, creating an iframe will need + // "Supports-Loading-Mode: fenced-frame" response header. Thus, we simply + // always set the path to `kFencedFramePath`. + GURL iframe_url = origin.GetURL().Resolve(kFencedFramePath); + + FrameTreeNode* iframe = CreateIFrame(parent_node, iframe_url); EXPECT_TRUE(ExecJs(iframe, R"( - sharedStorage.worklet.addModule('shared_storage/simple_module.js'); + sharedStorage.worklet.addModule('/shared_storage/simple_module.js'); )")); std::string urn_uuid = @@ -2045,35 +2051,6 @@ } IN_PROC_BROWSER_TEST_P(SharedStorageFencedFrameInteractionBrowserTest, - SelectURLNotAllowedInFencedFrame) { - GURL main_frame_url = https_server()->GetURL("a.test", kSimplePagePath); - - EXPECT_TRUE(NavigateToURL(shell(), main_frame_url)); - - GURL fenced_frame_url = - https_server()->GetURL("a.test", "/fenced_frames/title1.html"); - - FrameTreeNode* fenced_frame_node = CreateFencedFrame(fenced_frame_url); - - EXPECT_TRUE(ExecJs(fenced_frame_node, R"( - sharedStorage.worklet.addModule('/shared_storage/simple_module.js'); - )")); - - EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount()); - EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount()); - - EvalJsResult result = EvalJs(fenced_frame_node, R"( - sharedStorage.selectURL( - 'test-url-selection-operation', - [{url: "fenced_frames/title0.html"}], {data: {'mockResult': 0}}); - )"); - - EXPECT_THAT(result.error, - testing::HasSubstr( - "sharedStorage.selectURL() is not allowed in fenced frame")); -} - -IN_PROC_BROWSER_TEST_P(SharedStorageFencedFrameInteractionBrowserTest, SelectURL_FinishAfterStartingFencedFrameNavigation) { GURL main_url = https_server()->GetURL("a.test", kSimplePagePath); EXPECT_TRUE(NavigateToURL(shell(), main_url)); @@ -2691,6 +2668,81 @@ 1); } +IN_PROC_BROWSER_TEST_P( + SharedStorageFencedFrameInteractionBrowserTest, + NestedFencedFrameNavigateTop_BudgetWithdrawalFromTwoMetadata) { + GURL main_url = https_server()->GetURL("a.test", kSimplePagePath); + EXPECT_TRUE(NavigateToURL(shell(), main_url)); + + url::Origin shared_storage_origin1 = + url::Origin::Create(https_server()->GetURL("b.test", kSimplePagePath)); + + GURL urn_uuid1 = SelectFrom8URLsInContext(shared_storage_origin1); + FrameTreeNode* fenced_frame_root_node1 = CreateFencedFrame(urn_uuid1); + + url::Origin shared_storage_origin2 = + url::Origin::Create(https_server()->GetURL("c.test", kSimplePagePath)); + + GURL urn_uuid2 = + SelectFrom8URLsInContext(shared_storage_origin2, fenced_frame_root_node1); + + FrameTreeNode* fenced_frame_root_node2 = + CreateFencedFrame(fenced_frame_root_node1, urn_uuid2); + + EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin1), kBudgetAllowed); + EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin2), kBudgetAllowed); + + GURL new_page_url = https_server()->GetURL("d.test", kSimplePagePath); + TestNavigationObserver top_navigation_observer(shell()->web_contents()); + EXPECT_TRUE(ExecJs( + fenced_frame_root_node2, + JsReplace("window.open($1, '_unfencedTop')", new_page_url.spec()))); + top_navigation_observer.Wait(); + + // After the top navigation, log(8)=3 bits should have been withdrawn from + // both `shared_storage_origin1` and `shared_storage_origin2`. + EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin1), + kBudgetAllowed - 3); + EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin2), + kBudgetAllowed - 3); +} + +IN_PROC_BROWSER_TEST_P(SharedStorageFencedFrameInteractionBrowserTest, + SelectURLNotAllowedInNestedFencedFrame) { + GURL main_url = https_server()->GetURL("a.test", kSimplePagePath); + EXPECT_TRUE(NavigateToURL(shell(), main_url)); + + url::Origin shared_storage_origin1 = + url::Origin::Create(https_server()->GetURL("b.test", kSimplePagePath)); + + GURL urn_uuid1 = SelectFrom8URLsInContext(shared_storage_origin1); + FrameTreeNode* fenced_frame_root_node1 = CreateFencedFrame(urn_uuid1); + + url::Origin shared_storage_origin2 = + url::Origin::Create(https_server()->GetURL("c.test", kSimplePagePath)); + + GURL urn_uuid2 = + SelectFrom8URLsInContext(shared_storage_origin2, fenced_frame_root_node1); + + FrameTreeNode* fenced_frame_root_node2 = + CreateFencedFrame(fenced_frame_root_node1, urn_uuid2); + + EXPECT_TRUE(ExecJs(fenced_frame_root_node2, R"( + sharedStorage.worklet.addModule('/shared_storage/simple_module.js'); + )")); + + EvalJsResult result = EvalJs(fenced_frame_root_node2, R"( + sharedStorage.selectURL( + 'test-url-selection-operation', + [{url: "/fenced_frames/title0.html"}], {data: {'mockResult': 0}}); + )"); + + EXPECT_THAT(result.error, + testing::HasSubstr( + "selectURL() is called in a context with a fenced frame " + "depth (2) exceeding the maximum allowed number (1).")); +} + IN_PROC_BROWSER_TEST_P(SharedStorageFencedFrameInteractionBrowserTest, IframeInFencedFrameNavigateTop_BudgetWithdrawal) { GURL main_url = https_server()->GetURL("a.test", kSimplePagePath); @@ -2976,6 +3028,67 @@ blink::features::FencedFramesImplementationType::kMPArch), &SharedStorageFencedFrameInteractionBrowserTest::DescribeParams); +class SharedStorageSelectURLNotAllowedInFencedFrameBrowserTest + : public SharedStorageFencedFrameInteractionBrowserTest { + public: + SharedStorageSelectURLNotAllowedInFencedFrameBrowserTest() { + scoped_feature_list_ + .InitWithFeaturesAndParameters(/*enabled_features=*/ + {{blink::features::kSharedStorageAPI, + {{"SharedStorageBitBudget", + base::NumberToString( + kBudgetAllowed)}, + {"SharedStorageMaxAllowedFencedFrameD" + "epthForSelectURL", + "0"}}}, + {features:: + kPrivacySandboxAdsAPIsOverride, + {}}}, + /*disabled_features=*/{}); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +IN_PROC_BROWSER_TEST_P(SharedStorageSelectURLNotAllowedInFencedFrameBrowserTest, + SelectURLNotAllowedInFencedFrame) { + GURL main_frame_url = https_server()->GetURL("a.test", kSimplePagePath); + + EXPECT_TRUE(NavigateToURL(shell(), main_frame_url)); + + GURL fenced_frame_url = + https_server()->GetURL("a.test", "/fenced_frames/title1.html"); + + FrameTreeNode* fenced_frame_node = CreateFencedFrame(fenced_frame_url); + + EXPECT_TRUE(ExecJs(fenced_frame_node, R"( + sharedStorage.worklet.addModule('/shared_storage/simple_module.js'); + )")); + + EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount()); + EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount()); + + EvalJsResult result = EvalJs(fenced_frame_node, R"( + sharedStorage.selectURL( + 'test-url-selection-operation', + [{url: "fenced_frames/title0.html"}], {data: {'mockResult': 0}}); + )"); + + EXPECT_THAT(result.error, + testing::HasSubstr( + "selectURL() is called in a context with a fenced frame " + "depth (1) exceeding the maximum allowed number (0).")); +} + +INSTANTIATE_TEST_SUITE_P( + All, + SharedStorageSelectURLNotAllowedInFencedFrameBrowserTest, + ::testing::Values( + blink::features::FencedFramesImplementationType::kShadowDOM, + blink::features::FencedFramesImplementationType::kMPArch), + &SharedStorageSelectURLNotAllowedInFencedFrameBrowserTest::DescribeParams); + class SharedStorageReportEventBrowserTest : public SharedStorageFencedFrameInteractionBrowserTest { void FinishSetup() override {
diff --git a/content/browser/shared_storage/shared_storage_budget_charger.cc b/content/browser/shared_storage/shared_storage_budget_charger.cc index 01d8b69..56ae6cff 100644 --- a/content/browser/shared_storage/shared_storage_budget_charger.cc +++ b/content/browser/shared_storage/shared_storage_budget_charger.cc
@@ -53,26 +53,25 @@ if (!initiator_frame_host) return; - absl::optional<const FencedFrameURLMapping::SharedStorageBudgetMetadata*> + storage::SharedStorageManager* shared_storage_manager = + initiator_frame_host->GetStoragePartition()->GetSharedStorageManager(); + + std::vector<const FencedFrameURLMapping::SharedStorageBudgetMetadata*> shared_storage_budget_metadata = initiator_frame_host->frame_tree_node() ->FindSharedStorageBudgetMetadata(); - // Skip if the initiator frame is not originated from shared storage. - if (!shared_storage_budget_metadata.has_value()) - return; + for (const auto* metadata : shared_storage_budget_metadata) { + if (metadata->budget_to_charge == 0) + continue; - if ((*shared_storage_budget_metadata)->budget_to_charge > 0) { - storage::SharedStorageManager* shared_storage_manager = - initiator_frame_host->GetStoragePartition()->GetSharedStorageManager(); shared_storage_manager->MakeBudgetWithdrawal( - (*shared_storage_budget_metadata)->origin, - (*shared_storage_budget_metadata)->budget_to_charge, base::DoNothing()); + metadata->origin, metadata->budget_to_charge, base::DoNothing()); // We only want to charge the budget the first time a navigation leaves the // fenced frame, across all fenced frames navigated to the same urn. // We can do this even though the pointer is const because // `budget_to_charge` is a mutable field of `SharedStorageBudgetMetadata`. - (*shared_storage_budget_metadata)->budget_to_charge = 0; + metadata->budget_to_charge = 0; } }
diff --git a/content/browser/shared_storage/shared_storage_document_service_impl.cc b/content/browser/shared_storage/shared_storage_document_service_impl.cc index 3435653..0eb168a8 100644 --- a/content/browser/shared_storage/shared_storage_document_service_impl.cc +++ b/content/browser/shared_storage/shared_storage_document_service_impl.cc
@@ -7,12 +7,15 @@ #include "base/strings/strcat.h" #include "components/services/storage/shared_storage/shared_storage_database.h" #include "components/services/storage/shared_storage/shared_storage_manager.h" +#include "content/browser/renderer_host/frame_tree_node.h" +#include "content/browser/renderer_host/render_frame_host_impl.h" #include "content/browser/shared_storage/shared_storage_worklet_host.h" #include "content/browser/shared_storage/shared_storage_worklet_host_manager.h" #include "content/browser/storage_partition_impl.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/common/content_client.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/shared_storage/shared_storage_utils.h" #include "url/url_constants.h" @@ -106,16 +109,6 @@ urls_with_metadata, const std::vector<uint8_t>& serialized_data, RunURLSelectionOperationOnWorkletCallback callback) { - if (render_frame_host().IsNestedWithinFencedFrame()) { - // This could indicate a compromised renderer, so let's terminate it. - receiver_.ReportBadMessage( - "Attempted to execute RunURLSelectionOperationOnWorklet within a " - "fenced frame."); - LogSharedStorageWorkletError( - blink::SharedStorageWorkletErrorType::kSelectURLNonWebVisible); - return; - } - if (!blink::IsValidSharedStorageURLsArrayLength(urls_with_metadata.size())) { // This could indicate a compromised renderer, so let's terminate it. receiver_.ReportBadMessage( @@ -161,6 +154,27 @@ return; } + int fenced_frame_depth = base::checked_cast<int>( + static_cast<RenderFrameHostImpl&>(render_frame_host()) + .frame_tree_node() + ->GetFencedFrameDepth()); + int max_allowed_fenced_frame_depth = + blink::features::kSharedStorageMaxAllowedFencedFrameDepthForSelectURL + .Get(); + + if (fenced_frame_depth > max_allowed_fenced_frame_depth) { + std::move(callback).Run( + /*success=*/false, + /*error_message=*/ + base::StrCat( + {"selectURL() is called in a context with a fenced frame depth (", + base::NumberToString(fenced_frame_depth), + ") exceeding the maximum allowed number (", + base::NumberToString(max_allowed_fenced_frame_depth), ")."}), + GURL()); + return; + } + GetSharedStorageWorkletHost()->RunURLSelectionOperationOnWorklet( name, std::move(urls_with_metadata), serialized_data, std::move(callback));
diff --git a/content/public/browser/first_party_sets_handler.h b/content/public/browser/first_party_sets_handler.h index 70b651198..4e83e14 100644 --- a/content/public/browser/first_party_sets_handler.h +++ b/content/public/browser/first_party_sets_handler.h
@@ -17,7 +17,9 @@ #include "third_party/abseil-cpp/absl/types/optional.h" namespace net { +class FirstPartySetEntry; class GlobalFirstPartySets; +class SchemefulSite; } namespace content { @@ -137,11 +139,16 @@ virtual void SetGlobalSetsForTesting( net::GlobalFirstPartySets global_sets) = 0; - // Returns all First-Party Sets that are scoped to the entire browser. + // Looks up `site` in the global First-Party Sets and `config` to find its + // associated FirstPartySetEntry. // - // If initialization is not yet complete, returns nullptr; otherwise, returns - // a pointer to the initialized GlobalFirstPartySets instance. - virtual const net::GlobalFirstPartySets* GetGlobalSetsIfReady() const = 0; + // This will return nullopt if: + // - First-Party Sets is disabled or + // - the list of First-Party Sets isn't initialized yet or + // - `site` isn't in the global First-Party Sets or `config` + virtual absl::optional<net::FirstPartySetEntry> FindEntry( + const net::SchemefulSite& site, + const net::FirstPartySetsContextConfig& config) const = 0; // Computes a representation of the changes that need to be made to the // browser's list of First-Party Sets to respect the `policy` value of the
diff --git a/content/public/browser/plugin_service.h b/content/public/browser/plugin_service.h index 9c3d960..0cd7b92 100644 --- a/content/public/browser/plugin_service.h +++ b/content/public/browser/plugin_service.h
@@ -30,12 +30,7 @@ struct ContentPluginInfo; struct WebPluginInfo; -// This must be created on the main thread but it's only called on the IO/file -// thread unless otherwise noted. This is an asynchronous wrapper around the -// PluginList interface for querying plugin information. This must be used -// instead of that to avoid doing expensive disk operations on the IO/UI -// threads. -// TODO(http://crbug.com/990013): Only use this on the UI thread. +// This class lives on the UI thread. class CONTENT_EXPORT PluginService { public: using GetPluginsCallback = @@ -48,7 +43,6 @@ // to throw away their cache of the plugin list, and optionally also reload // all the pages with plugins. If |browser_context| is nullptr, purges the // cache in all renderers. - // NOTE: can only be called on the UI thread. static void PurgePluginListCache(BrowserContext* browser_context, bool reload_pages); @@ -58,8 +52,8 @@ virtual void Init() = 0; // Gets the plugin in the list of plugins that matches the given url and mime - // type. Returns true if the data is frome a stale plugin list, false if it - // is up to date. This can be called from any thread. + // type. Returns true if the data is from a stale plugin list, false if it is + // up to date. virtual bool GetPluginInfoArray( const GURL& url, const std::string& mime_type, @@ -69,8 +63,7 @@ // Gets plugin info for an individual plugin and filters the plugins using // the |browser_context|. This will report whether the data is stale via - // |is_stale| and returns whether or not the plugin can be found. This must be - // called from the UI thread. + // |is_stale| and returns whether or not the plugin can be found. virtual bool GetPluginInfo(content::BrowserContext* browser_context, const GURL& url, const std::string& mime_type, @@ -82,25 +75,21 @@ // Get plugin info by plugin path (including disabled plugins). Returns true // if the plugin is found and WebPluginInfo has been filled in |info|. This // will use cached data in the plugin list. - // This can be called from any thread. virtual bool GetPluginInfoByPath(const base::FilePath& plugin_path, WebPluginInfo* info) = 0; // Returns the display name for the plugin identified by the given path. If // the path doesn't identify a plugin, or the plugin has no display name, // this will attempt to generate a display name from the path. - // This can be called from any thread. virtual std::u16string GetPluginDisplayNameByPath( const base::FilePath& plugin_path) = 0; // Asynchronously loads plugins if necessary and then calls back to the // provided function on the calling sequence on completion. - // This can be called from any thread. virtual void GetPlugins(GetPluginsCallback callback) = 0; // Synchronously loads plugins if necessary and returns the list of plugin - // infos. This can be called from any thread. This method is expected to - // not perform any disk IO. + // infos. virtual std::vector<WebPluginInfo> GetPluginsSynchronous() = 0; // Returns information about a plugin if it exists, otherwise `nullptr`. The
diff --git a/content/public/test/embedded_worker_instance_test_harness.cc b/content/public/test/embedded_worker_instance_test_harness.cc new file mode 100644 index 0000000..c87af56 --- /dev/null +++ b/content/public/test/embedded_worker_instance_test_harness.cc
@@ -0,0 +1,75 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/public/test/embedded_worker_instance_test_harness.h" + +#include <stdint.h> + +#include "base/run_loop.h" +#include "content/browser/service_worker/embedded_worker_instance.h" +#include "content/browser/service_worker/embedded_worker_test_helper.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "test_browser_context.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace content { + +EmbeddedWorkerInstanceTestHarness::~EmbeddedWorkerInstanceTestHarness() = + default; + +void EmbeddedWorkerInstanceTestHarness::SetUp() { + helper_ = std::make_unique<EmbeddedWorkerTestHelper>(base::FilePath(), + CreateBrowserContext()); +} + +void EmbeddedWorkerInstanceTestHarness::TearDown() { + helper_.reset(); +} + +std::unique_ptr<BrowserContext> +EmbeddedWorkerInstanceTestHarness::CreateBrowserContext() { + return std::make_unique<TestBrowserContext>(); +} + +void EmbeddedWorkerInstanceTestHarness::CreateAndStartWorker( + const GURL& origin, + const GURL& worker_url) { + EXPECT_EQ(worker_, nullptr); + EmbeddedWorkerTestHelper::RegistrationAndVersionPair pair = + helper_->PrepareRegistrationAndVersion(origin, worker_url); + worker_ = std::make_unique<EmbeddedWorkerInstance>(pair.second.get()); + helper_->StartWorker(worker_.get(), helper_->CreateStartParams(pair.second)); +} + +void EmbeddedWorkerInstanceTestHarness::StopAndResetWorker() { + EmbeddedWorkerInstance* worker = worker_.get(); + EXPECT_NE(worker_, nullptr); + // Stop the worker. + worker->Stop(); + EXPECT_EQ(EmbeddedWorkerStatus::STOPPING, worker->status()); + base::RunLoop().RunUntilIdle(); + + // The 'WorkerStopped' message should have been sent by + // EmbeddedWorkerTestHelper. + EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); + worker_.reset(); +} + +#if !BUILDFLAG(IS_ANDROID) +void EmbeddedWorkerInstanceTestHarness::BindHidServiceToWorker( + const GURL& origin, + mojo::PendingReceiver<blink::mojom::HidService> receiver) { + EXPECT_NE(worker_, nullptr); + worker_.get()->BindHidService(url::Origin::Create(origin), + std::move(receiver)); +} +#endif // !BUILDFLAG(IS_ANDROID) + +EmbeddedWorkerInstanceTestHarness::EmbeddedWorkerInstanceTestHarness( + std::unique_ptr<BrowserTaskEnvironment> task_environment) + : task_environment_(std::move(task_environment)) {} + +} // namespace content
diff --git a/content/public/test/embedded_worker_instance_test_harness.h b/content/public/test/embedded_worker_instance_test_harness.h new file mode 100644 index 0000000..60118bb --- /dev/null +++ b/content/public/test/embedded_worker_instance_test_harness.h
@@ -0,0 +1,94 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_PUBLIC_TEST_EMBEDDED_WORKER_INSTANCE_TEST_HARNESS_H_ +#define CONTENT_PUBLIC_TEST_EMBEDDED_WORKER_INSTANCE_TEST_HARNESS_H_ + +#include <stdint.h> + +#include "browser_task_environment.h" +#include "content/public/browser/browser_context.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/mojom/hid/hid.mojom.h" + +namespace content { + +class EmbeddedWorkerInstance; +class EmbeddedWorkerTestHelper; + +// EmbeddedWorkerInstanceTestHarness provides helper functions to set up a test +// environment with an EmbeddedWorkerInstance, and allow a test to test the +// worker with bound services. +// +// Example: +// +// class MyWorkerTest : public EmbeddedWorkerInstanceTestHarness { +// std::unique_ptr<BrowserContext> CreateBrowserContext() override { +// // Create the BrowserContext and store the raw pointer +// // to the created BrowserContext. +// ... +// } +// }; +// +// CreateAndStartWorker(); // Create and start a worker! +// +// mojo::Remote<Xyz> xyz_service; +// // Note a new binding function might need to be added to this harness file +// // if that is not available. +// BindXyzServiceToWorker(origin, xyz_service.BindNewPipeAndPassReceiver())); +// xyz_service->DoSomething(); +// +// StopAndResetWorker(); // Stop and delete the worker! + +class EmbeddedWorkerInstanceTestHarness : public testing::Test { + public: + // Constructs a EmbeddedWorkerInstanceTestHarness which uses |traits| to + // initialize its BrowserTaskEnvironment. + template <typename... TaskEnvironmentTraits> + explicit EmbeddedWorkerInstanceTestHarness(TaskEnvironmentTraits&&... traits) + : EmbeddedWorkerInstanceTestHarness( + std::make_unique<BrowserTaskEnvironment>( + std::forward<TaskEnvironmentTraits>(traits)...)) {} + + EmbeddedWorkerInstanceTestHarness(const EmbeddedWorkerInstanceTestHarness&) = + delete; + EmbeddedWorkerInstanceTestHarness& operator=( + const EmbeddedWorkerInstanceTestHarness&) = delete; + + ~EmbeddedWorkerInstanceTestHarness() override; + + void SetUp() override; + + void TearDown() override; + + virtual std::unique_ptr<BrowserContext> CreateBrowserContext(); + + void CreateAndStartWorker(const GURL& origin, const GURL& worker_url); + + void StopAndResetWorker(); + +#if !BUILDFLAG(IS_ANDROID) + void BindHidServiceToWorker( + const GURL& origin, + mojo::PendingReceiver<blink::mojom::HidService> receiver); +#endif + + protected: + // The template constructor has to be in the header but it delegates to this + // constructor to initialize all other members out-of-line. + explicit EmbeddedWorkerInstanceTestHarness( + std::unique_ptr<BrowserTaskEnvironment> task_environment); + std::unique_ptr<EmbeddedWorkerTestHelper> helper_; + + private: + std::unique_ptr<BrowserTaskEnvironment> task_environment_; + std::unique_ptr<EmbeddedWorkerInstance> worker_; +}; + +} // namespace content + +#endif // CONTENT_PUBLIC_TEST_EMBEDDED_WORKER_INSTANCE_TEST_HARNESS_H_
diff --git a/content/public/test/test_browser_context.cc b/content/public/test/test_browser_context.cc index 439a7d9..559e0b86 100644 --- a/content/public/test/test_browser_context.cc +++ b/content/public/test/test_browser_context.cc
@@ -177,4 +177,10 @@ return origin_trials_controller_delegate_.get(); } +// static +TestBrowserContext* TestBrowserContext::FromBrowserContext( + BrowserContext* browser_context) { + return static_cast<TestBrowserContext*>(browser_context); +} + } // namespace content
diff --git a/content/public/test/test_browser_context.h b/content/public/test/test_browser_context.h index ceb9b0a..caf37b7 100644 --- a/content/public/test/test_browser_context.h +++ b/content/public/test/test_browser_context.h
@@ -30,6 +30,10 @@ ~TestBrowserContext() override; + // Returns the TestBrowserContext corresponding to the given browser context. + static TestBrowserContext* FromBrowserContext( + BrowserContext* browser_context); + // Takes ownership of the temporary directory so that it's not deleted when // this object is destructed. base::FilePath TakePath();
diff --git a/content/renderer/media/renderer_webmediaplayer_delegate.cc b/content/renderer/media/renderer_webmediaplayer_delegate.cc index c4a4c8e..6e1d4b4 100644 --- a/content/renderer/media/renderer_webmediaplayer_delegate.cc +++ b/content/renderer/media/renderer_webmediaplayer_delegate.cc
@@ -65,7 +65,9 @@ return true; return render_frame()->GetWebView()->GetVisibilityState() != - blink::mojom::PageVisibilityState::kVisible; + blink::mojom::PageVisibilityState::kVisible && + render_frame()->GetWebView()->GetVisibilityState() != + blink::mojom::PageVisibilityState::kHiddenButPainting; } int RendererWebMediaPlayerDelegate::AddObserver(Observer* observer) { @@ -183,7 +185,17 @@ void RendererWebMediaPlayerDelegate::OnPageVisibilityChanged( blink::mojom::PageVisibilityState visibility_state) { - if (visibility_state == blink::mojom::PageVisibilityState::kVisible) { + // Treat 'hidden but painting' as 'visible', since whatever is consuming the + // painted output (e.g., Picture in Picture), probably wants the video. + // Otherwise, the player might optimize the video away. + const bool is_shown = + visibility_state == blink::mojom::PageVisibilityState::kVisible || + visibility_state == blink::mojom::PageVisibilityState::kHiddenButPainting; + if (is_shown_ == is_shown) + return; + is_shown_ = is_shown; + + if (is_shown) { RecordAction(base::UserMetricsAction("Media.Shown")); for (base::IDMap<Observer*>::iterator it(&id_map_); !it.IsAtEnd();
diff --git a/content/renderer/media/renderer_webmediaplayer_delegate.h b/content/renderer/media/renderer_webmediaplayer_delegate.h index c649ec2..b5f79f3b 100644 --- a/content/renderer/media/renderer_webmediaplayer_delegate.h +++ b/content/renderer/media/renderer_webmediaplayer_delegate.h
@@ -148,6 +148,10 @@ // Determined at construction time based on system information; determines // when the idle cleanup timer should be fired more aggressively. bool is_low_end_; + + // Last page shown/hidden state sent to the player. Unset if we have not sent + // any message. Used to elide duplicates. + absl::optional<bool> is_shown_; }; } // namespace media
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 1ef6121..f94e47a 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -191,6 +191,8 @@ "../public/test/content_test_suite_base.h", "../public/test/download_test_observer.cc", "../public/test/download_test_observer.h", + "../public/test/embedded_worker_instance_test_harness.cc", + "../public/test/embedded_worker_instance_test_harness.h", "../public/test/fake_download_item.cc", "../public/test/fake_download_item.h", "../public/test/fake_frame_widget.cc",
diff --git a/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt index 5f8cfd0..83f7191 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt
@@ -90,10 +90,7 @@ crbug.com/1338968 [ android android-nexus-5x ] WebCodecs_TexImage2d_hw_decoder [ Failure ] -# Conservatively expect all macs to fail, I'm not sure if our try bots run arm64 -# devices. A later commit needs to put mac-x86_64 here, or better still fix the -# bug and remove this expectation. -crbug.com/1371749 [ mac ] WebCodecs_EncodeDecode_offscreen_avc1.42001E_prefer-hardware [ Failure ] +crbug.com/1371749 [ mac-x86_64 ] WebCodecs_EncodeDecode_offscreen_avc1.42001E_prefer-hardware [ Failure ] ####################################################################### # Automated Entries After This Point - Do Not Manually Add Below Here # #######################################################################
diff --git a/device/fido/mac/fake_keychain.mm b/device/fido/mac/fake_keychain.mm index abb125f5..1fc4bbeb 100644 --- a/device/fido/mac/fake_keychain.mm +++ b/device/fido/mac/fake_keychain.mm
@@ -7,6 +7,10 @@ #import <Foundation/Foundation.h> #import <Security/Security.h> +#if defined(LEAK_SANITIZER) +#include <sanitizer/lsan_interface.h> +#endif + #include "base/check_op.h" #include "base/mac/foundation_util.h" #include "base/mac/scoped_cftyperef.h" @@ -23,7 +27,13 @@ CFStringCreateWithCString(kCFAllocatorDefault, keychain_access_group.data(), kCFStringEncodingUTF8)) {} -FakeKeychain::~FakeKeychain() = default; +FakeKeychain::~FakeKeychain() { + // Avoid shutdown leak of error string in Security.framework. + // See https://github.com/apple-oss-distributions/Security/blob/Security-60158.140.3/OSX/libsecurity_keychain/lib/SecBase.cpp#L88 +#if defined(LEAK_SANITIZER) + __lsan_do_leak_check(); +#endif +} base::ScopedCFTypeRef<SecKeyRef> FakeKeychain::KeyCreateRandomKey( CFDictionaryRef params,
diff --git a/gpu/command_buffer/service/dawn_service_memory_transfer_service.cc b/gpu/command_buffer/service/dawn_service_memory_transfer_service.cc index e05a148..4f12f4d 100644 --- a/gpu/command_buffer/service/dawn_service_memory_transfer_service.cc +++ b/gpu/command_buffer/service/dawn_service_memory_transfer_service.cc
@@ -30,8 +30,13 @@ size_t offset, size_t size, void* serializePointer) override { - DCHECK_LE(offset, size_); - DCHECK_LE(size, size_ - offset); + // TODO(crbug.com/1373314): A compromised renderer could have a shared + // memory size not large enough to fit the GPU buffer contents. Instead of + // DCHECK, do a CHECK here to crash the release build. The crash is fine + // since it is not reachable from normal behavior. WebGPU post-V1 will have + // a refactored API. + CHECK_LE(offset, size_); + CHECK_LE(size, size_ - offset); // Copy the data into the shared memory allocation. // In the case of buffer mapping, this is the mapped GPU memory which we // copy into client-visible shared memory. @@ -94,7 +99,10 @@ size_t deserialize_size, ReadHandle** read_handle) { DCHECK(deserialize_pointer); - DCHECK_EQ(deserialize_size, sizeof(MemoryTransferHandle)); + // Use CHECK instead of DCHECK because the cast of the memory to + // MemoryTransferHandle and subsequent reads won't be safe if deserialize_size + // is too small. + CHECK_EQ(deserialize_size, sizeof(MemoryTransferHandle)); const volatile MemoryTransferHandle* handle = reinterpret_cast<const volatile MemoryTransferHandle*>( deserialize_pointer); @@ -119,7 +127,10 @@ size_t deserialize_size, WriteHandle** write_handle) { DCHECK(deserialize_pointer); - DCHECK_EQ(deserialize_size, sizeof(MemoryTransferHandle)); + // Use CHECK instead of DCHECK because the cast of the memory to + // MemoryTransferHandle and subsequent reads won't be safe if deserialize_size + // is too small. + CHECK_EQ(deserialize_size, sizeof(MemoryTransferHandle)); const volatile MemoryTransferHandle* handle = reinterpret_cast<const volatile MemoryTransferHandle*>( deserialize_pointer);
diff --git a/gpu/command_buffer/service/shared_image/compound_image_backing.cc b/gpu/command_buffer/service/shared_image/compound_image_backing.cc index ddf6c281..7beeb6c 100644 --- a/gpu/command_buffer/service/shared_image/compound_image_backing.cc +++ b/gpu/command_buffer/service/shared_image/compound_image_backing.cc
@@ -93,15 +93,17 @@ void EndAccess() final { wrapped_->EndAccess(); } - gpu::TextureBase* GetTextureBase() final { - return wrapped_->GetTextureBase(); + gpu::TextureBase* GetTextureBase(int plane_index) final { + return wrapped_->GetTextureBase(plane_index); } bool SupportsMultipleConcurrentReadAccess() final { return wrapped_->SupportsMultipleConcurrentReadAccess(); } - gles2::Texture* GetTexture() final { return wrapped_->GetTexture(); } + gles2::Texture* GetTexture(int plane_index) final { + return wrapped_->GetTexture(plane_index); + } private: std::unique_ptr<GLTextureImageRepresentation> wrapped_; @@ -134,17 +136,17 @@ } void EndAccess() final { wrapped_->EndAccess(); } - gpu::TextureBase* GetTextureBase() final { - return wrapped_->GetTextureBase(); + gpu::TextureBase* GetTextureBase(int plane_index) final { + return wrapped_->GetTextureBase(plane_index); } bool SupportsMultipleConcurrentReadAccess() final { return wrapped_->SupportsMultipleConcurrentReadAccess(); } - const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough() - final { - return wrapped_->GetTexturePassthrough(); + const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough( + int plane_index) final { + return wrapped_->GetTexturePassthrough(plane_index); } private:
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc index e502cade..f6f2673 100644 --- a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc +++ b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc
@@ -1566,12 +1566,12 @@ api->glActiveTextureFn(GL_TEXTURE0); api->glBindTextureFn(GL_TEXTURE_EXTERNAL_OES, - y_texture->GetTextureBase()->service_id()); + y_texture->GetTexturePassthrough()->service_id()); ASSERT_EQ(api->glGetErrorFn(), static_cast<GLenum>(GL_NO_ERROR)); api->glActiveTextureFn(GL_TEXTURE1); api->glBindTextureFn(GL_TEXTURE_EXTERNAL_OES, - uv_texture->GetTextureBase()->service_id()); + uv_texture->GetTexturePassthrough()->service_id()); ASSERT_EQ(api->glGetErrorFn(), static_cast<GLenum>(GL_NO_ERROR)); api->glUseProgramFn(program); @@ -1770,7 +1770,7 @@ SharedImageRepresentation::AllowUnclearedAccess::kNo); ASSERT_NE(y_access, nullptr); - GLuint y_texture_id = y_texture->GetTextureBase()->service_id(); + GLuint y_texture_id = y_texture->GetTexturePassthrough()->service_id(); api->glBindTextureFn(GL_TEXTURE_2D, y_texture_id); api->glFramebufferTexture2DEXTFn(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, y_texture_id, 0); @@ -1805,7 +1805,7 @@ SharedImageRepresentation::AllowUnclearedAccess::kNo); ASSERT_NE(uv_access, nullptr); - GLuint uv_texture_id = uv_texture->GetTextureBase()->service_id(); + GLuint uv_texture_id = uv_texture->GetTexturePassthrough()->service_id(); api->glBindTextureFn(GL_TEXTURE_2D, uv_texture_id); api->glFramebufferTexture2DEXTFn(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, uv_texture_id, 0);
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_representation.cc b/gpu/command_buffer/service/shared_image/d3d_image_representation.cc index 399cf66..238b653 100644 --- a/gpu/command_buffer/service/shared_image/d3d_image_representation.cc +++ b/gpu/command_buffer/service/shared_image/d3d_image_representation.cc
@@ -22,7 +22,9 @@ texture_(std::move(texture)) {} const scoped_refptr<gles2::TexturePassthrough>& -GLTexturePassthroughD3DImageRepresentation::GetTexturePassthrough() { +GLTexturePassthroughD3DImageRepresentation::GetTexturePassthrough( + int plane_index) { + DCHECK_EQ(plane_index, 0); return texture_; } @@ -31,7 +33,8 @@ bool GLTexturePassthroughD3DImageRepresentation::BeginAccess(GLenum mode) { // Bind the GLImage if necessary. - auto texture = GetTexturePassthrough(); + auto texture = + GLTexturePassthroughImageRepresentation::GetTexturePassthrough(); if (texture->is_bind_pending()) { GLenum target = texture->target(); gl::GLImage* image = texture->GetLevelImage(target, 0);
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_representation.h b/gpu/command_buffer/service/shared_image/d3d_image_representation.h index 41330cd..f0704ede 100644 --- a/gpu/command_buffer/service/shared_image/d3d_image_representation.h +++ b/gpu/command_buffer/service/shared_image/d3d_image_representation.h
@@ -34,8 +34,8 @@ scoped_refptr<gles2::TexturePassthrough> texture); ~GLTexturePassthroughD3DImageRepresentation() override; - const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough() - override; + const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough( + int plane_index) override; private: bool BeginAccess(GLenum mode) override;
diff --git a/gpu/command_buffer/service/shared_image/egl_image_backing.cc b/gpu/command_buffer/service/shared_image/egl_image_backing.cc index 5366b82..8f3ace21 100644 --- a/gpu/command_buffer/service/shared_image/egl_image_backing.cc +++ b/gpu/command_buffer/service/shared_image/egl_image_backing.cc
@@ -130,7 +130,8 @@ void EndAccess() override { shared_.EndAccess(); } - gles2::Texture* GetTexture() override { + gles2::Texture* GetTexture(int plane_index) override { + DCHECK_EQ(plane_index, 0); return shared_.texture_holder()->texture(); } @@ -162,8 +163,9 @@ void EndAccess() override { shared_.EndAccess(); } - const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough() - override { + const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough( + int plane_index) override { + DCHECK_EQ(plane_index, 0); // TODO(https://crbug.com/1172769): Remove this CHECK. CHECK(shared_.texture_holder()->texture_passthrough()); return shared_.texture_holder()->texture_passthrough();
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_gl_representation.cc b/gpu/command_buffer/service/shared_image/external_vk_image_gl_representation.cc index b8b6f99..ec9fe8b 100644 --- a/gpu/command_buffer/service/shared_image/external_vk_image_gl_representation.cc +++ b/gpu/command_buffer/service/shared_image/external_vk_image_gl_representation.cc
@@ -166,7 +166,8 @@ ExternalVkImageGLRepresentation::~ExternalVkImageGLRepresentation() {} -gles2::Texture* ExternalVkImageGLRepresentation::GetTexture() { +gles2::Texture* ExternalVkImageGLRepresentation::GetTexture(int plane_index) { + DCHECK_EQ(plane_index, 0); return texture_; } @@ -191,7 +192,9 @@ ~ExternalVkImageGLPassthroughRepresentation() {} const scoped_refptr<gles2::TexturePassthrough>& -ExternalVkImageGLPassthroughRepresentation::GetTexturePassthrough() { +ExternalVkImageGLPassthroughRepresentation::GetTexturePassthrough( + int plane_index) { + DCHECK_EQ(plane_index, 0); return representation_shared_.backing_impl()->GetTexturePassthrough(); }
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_gl_representation.h b/gpu/command_buffer/service/shared_image/external_vk_image_gl_representation.h index 4df28a77..4a79767 100644 --- a/gpu/command_buffer/service/shared_image/external_vk_image_gl_representation.h +++ b/gpu/command_buffer/service/shared_image/external_vk_image_gl_representation.h
@@ -66,7 +66,7 @@ ~ExternalVkImageGLRepresentation() override; // GLTextureImageRepresentation implementation. - gles2::Texture* GetTexture() override; + gles2::Texture* GetTexture(int plane_index) override; bool BeginAccess(GLenum mode) override; void EndAccess() override; @@ -91,8 +91,8 @@ ~ExternalVkImageGLPassthroughRepresentation() override; // GLTexturePassthroughImageRepresentation implementation. - const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough() - override; + const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough( + int plane_index) override; bool BeginAccess(GLenum mode) override; void EndAccess() override;
diff --git a/gpu/command_buffer/service/shared_image/gl_image_backing.cc b/gpu/command_buffer/service/shared_image/gl_image_backing.cc index 57f3f9c..21c18fa 100644 --- a/gpu/command_buffer/service/shared_image/gl_image_backing.cc +++ b/gpu/command_buffer/service/shared_image/gl_image_backing.cc
@@ -57,7 +57,8 @@ client_->GLTextureImageRepresentationRelease(has_context()); } -gles2::Texture* GLTextureGLCommonRepresentation::GetTexture() { +gles2::Texture* GLTextureGLCommonRepresentation::GetTexture(int plane_index) { + DCHECK_EQ(plane_index, 0); return texture_; } @@ -104,7 +105,9 @@ } const scoped_refptr<gles2::TexturePassthrough>& -GLTexturePassthroughGLCommonRepresentation::GetTexturePassthrough() { +GLTexturePassthroughGLCommonRepresentation::GetTexturePassthrough( + int plane_index) { + DCHECK_EQ(plane_index, 0); return texture_passthrough_; }
diff --git a/gpu/command_buffer/service/shared_image/gl_image_backing.h b/gpu/command_buffer/service/shared_image/gl_image_backing.h index 9fb665a8..51766b7 100644 --- a/gpu/command_buffer/service/shared_image/gl_image_backing.h +++ b/gpu/command_buffer/service/shared_image/gl_image_backing.h
@@ -37,7 +37,7 @@ private: // GLTextureImageRepresentation: - gles2::Texture* GetTexture() override; + gles2::Texture* GetTexture(int plane_index) override; bool BeginAccess(GLenum mode) override; void EndAccess() override; @@ -65,8 +65,8 @@ private: // GLTexturePassthroughImageRepresentation: - const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough() - override; + const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough( + int plane_index) override; bool BeginAccess(GLenum mode) override; void EndAccess() override;
diff --git a/gpu/command_buffer/service/shared_image/gl_ozone_image_representation.cc b/gpu/command_buffer/service/shared_image/gl_ozone_image_representation.cc index 12d949c..51cfecf 100644 --- a/gpu/command_buffer/service/shared_image/gl_ozone_image_representation.cc +++ b/gpu/command_buffer/service/shared_image/gl_ozone_image_representation.cc
@@ -193,7 +193,8 @@ texture_holder_->MarkContextLost(); } -gles2::Texture* GLTextureOzoneImageRepresentation::GetTexture() { +gles2::Texture* GLTextureOzoneImageRepresentation::GetTexture(int plane_index) { + DCHECK_EQ(plane_index, 0); return texture_holder_->texture(); } @@ -276,7 +277,9 @@ } const scoped_refptr<gles2::TexturePassthrough>& -GLTexturePassthroughOzoneImageRepresentation::GetTexturePassthrough() { +GLTexturePassthroughOzoneImageRepresentation::GetTexturePassthrough( + int plane_index) { + DCHECK_EQ(plane_index, 0); return texture_holder_->texture_passthrough(); }
diff --git a/gpu/command_buffer/service/shared_image/gl_ozone_image_representation.h b/gpu/command_buffer/service/shared_image/gl_ozone_image_representation.h index 36b9c41..a93ecb8 100644 --- a/gpu/command_buffer/service/shared_image/gl_ozone_image_representation.h +++ b/gpu/command_buffer/service/shared_image/gl_ozone_image_representation.h
@@ -81,7 +81,7 @@ ~GLTextureOzoneImageRepresentation() override; // GLTextureImageRepresentation implementation. - gles2::Texture* GetTexture() override; + gles2::Texture* GetTexture(int plane_index) override; bool BeginAccess(GLenum mode) override; void EndAccess() override; @@ -120,8 +120,8 @@ ~GLTexturePassthroughOzoneImageRepresentation() override; // GLTexturePassthroughImageRepresentation implementation. - const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough() - override; + const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough( + int plane_index) override; bool BeginAccess(GLenum mode) override; void EndAccess() override;
diff --git a/gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.cc b/gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.cc index 92554e7..a93be5504 100644 --- a/gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.cc +++ b/gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.cc
@@ -24,7 +24,9 @@ texture_->RemoveLightweightRef(has_context()); } -gles2::Texture* GLTextureAndroidImageRepresentation::GetTexture() { +gles2::Texture* GLTextureAndroidImageRepresentation::GetTexture( + int plane_index) { + DCHECK_EQ(plane_index, 0); return texture_; }
diff --git a/gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.h b/gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.h index 76fada95..3b1aeac 100644 --- a/gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.h +++ b/gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.h
@@ -28,7 +28,7 @@ GLTextureAndroidImageRepresentation& operator=( const GLTextureAndroidImageRepresentation&) = delete; - gles2::Texture* GetTexture() override; + gles2::Texture* GetTexture(int plane_index) override; bool BeginAccess(GLenum mode) override; void EndAccess() override;
diff --git a/gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.cc b/gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.cc index a4971d6..838e301 100644 --- a/gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.cc +++ b/gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.cc
@@ -29,7 +29,9 @@ } const scoped_refptr<gles2::TexturePassthrough>& -GLTexturePassthroughAndroidImageRepresentation::GetTexturePassthrough() { +GLTexturePassthroughAndroidImageRepresentation::GetTexturePassthrough( + int plane_index) { + DCHECK_EQ(plane_index, 0); return texture_; }
diff --git a/gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.h b/gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.h index 2ef895d..2f168f85 100644 --- a/gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.h +++ b/gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.h
@@ -26,8 +26,8 @@ GLTexturePassthroughAndroidImageRepresentation& operator=( const GLTexturePassthroughAndroidImageRepresentation&) = delete; - const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough() - override; + const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough( + int plane_index) override; bool BeginAccess(GLenum mode) override; void EndAccess() override;
diff --git a/gpu/command_buffer/service/shared_image/shared_image_representation.cc b/gpu/command_buffer/service/shared_image/shared_image_representation.cc index d881870..11f2b07c 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_representation.cc +++ b/gpu/command_buffer/service/shared_image/shared_image_representation.cc
@@ -66,6 +66,11 @@ base::PassKey<GLTextureImageRepresentationBase>(), this); } +gpu::TextureBase* GLTextureImageRepresentationBase::GetTextureBase() { + DCHECK(format().is_single_plane()); + return GetTextureBase(0); +} + bool GLTextureImageRepresentationBase::BeginAccess(GLenum mode) { return true; } @@ -74,8 +79,14 @@ return false; } -gpu::TextureBase* GLTextureImageRepresentation::GetTextureBase() { - return GetTexture(); +gpu::TextureBase* GLTextureImageRepresentation::GetTextureBase( + int plane_index) { + return GetTexture(plane_index); +} + +gles2::Texture* GLTextureImageRepresentation::GetTexture() { + DCHECK(format().is_single_plane()); + return GetTexture(0); } void GLTextureImageRepresentation::UpdateClearedStateOnEndAccess() { @@ -96,8 +107,15 @@ texture->SetLevelClearedRect(texture->target(), 0, cleared_rect); } -gpu::TextureBase* GLTexturePassthroughImageRepresentation::GetTextureBase() { - return GetTexturePassthrough().get(); +gpu::TextureBase* GLTexturePassthroughImageRepresentation::GetTextureBase( + int plane_index) { + return GetTexturePassthrough(plane_index).get(); +} + +const scoped_refptr<gles2::TexturePassthrough>& +GLTexturePassthroughImageRepresentation::GetTexturePassthrough() { + DCHECK(format().is_single_plane()); + return GetTexturePassthrough(0); } bool SkiaImageRepresentation::SupportsMultipleConcurrentReadAccess() {
diff --git a/gpu/command_buffer/service/shared_image/shared_image_representation.h b/gpu/command_buffer/service/shared_image/shared_image_representation.h index bdc5ae6..73a86e7 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_representation.h +++ b/gpu/command_buffer/service/shared_image/shared_image_representation.h
@@ -192,7 +192,11 @@ GLenum mode, AllowUnclearedAccess allow_uncleared); - virtual gpu::TextureBase* GetTextureBase() = 0; + // Gets the texture associated with the `plane_index` for SharedImageFormat. + virtual gpu::TextureBase* GetTextureBase(int plane_index) = 0; + // Calls GetTextureBase with `plane_index` = 0 for single planar formats eg. + // RGB. + gpu::TextureBase* GetTextureBase(); protected: friend class SkiaGLImageRepresentation; @@ -221,9 +225,12 @@ : GLTextureImageRepresentationBase(manager, backing, tracker) {} // TODO(ericrk): Move this to the ScopedAccess object. crbug.com/1003686 - virtual gles2::Texture* GetTexture() = 0; + // Gets the texture associated with the `plane_index` for SharedImageFormat. + virtual gles2::Texture* GetTexture(int plane_index) = 0; + // Calls GetTexture with `plane_index` = 0 for single planar formats eg. RGB. + gles2::Texture* GetTexture(); - gpu::TextureBase* GetTextureBase() override; + gpu::TextureBase* GetTextureBase(int plane_index) override; protected: friend class WrappedGLTextureCompoundImageRepresentation; @@ -241,10 +248,15 @@ : GLTextureImageRepresentationBase(manager, backing, tracker) {} // TODO(ericrk): Move this to the ScopedAccess object. crbug.com/1003686 - virtual const scoped_refptr<gles2::TexturePassthrough>& - GetTexturePassthrough() = 0; + // Gets the passthrough texture associated with the `plane_index` for + // SharedImageFormat. + virtual const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough( + int plane_index) = 0; + // Calls GetTexturePassthrough with `plane_index` = 0 for single planar + // formats eg. RGB. + const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough(); - gpu::TextureBase* GetTextureBase() override; + gpu::TextureBase* GetTextureBase(int plane_index) override; private: friend class WrappedGLTexturePassthroughCompoundImageRepresentation;
diff --git a/gpu/command_buffer/service/shared_image/test_image_backing.cc b/gpu/command_buffer/service/shared_image/test_image_backing.cc index a4694b9..04d0266 100644 --- a/gpu/command_buffer/service/shared_image/test_image_backing.cc +++ b/gpu/command_buffer/service/shared_image/test_image_backing.cc
@@ -24,7 +24,10 @@ : GLTextureImageRepresentation(manager, backing, tracker), texture_(texture) {} - gles2::Texture* GetTexture() override { return texture_; } + gles2::Texture* GetTexture(int plane_index) override { + DCHECK_EQ(plane_index, 0); + return texture_; + } bool BeginAccess(GLenum mode) override { return static_cast<TestImageBacking*>(backing())->can_access(); } @@ -44,8 +47,9 @@ : GLTexturePassthroughImageRepresentation(manager, backing, tracker), texture_(std::move(texture)) {} - const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough() - override { + const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough( + int plane_index) override { + DCHECK_EQ(plane_index, 0); return texture_; } bool BeginAccess(GLenum mode) override {
diff --git a/gpu/command_buffer/service/shared_image/video_image_reader_image_backing.cc b/gpu/command_buffer/service/shared_image/video_image_reader_image_backing.cc index e3e002e..9423cceb 100644 --- a/gpu/command_buffer/service/shared_image/video_image_reader_image_backing.cc +++ b/gpu/command_buffer/service/shared_image/video_image_reader_image_backing.cc
@@ -187,7 +187,9 @@ GLTextureVideoImageRepresentation& operator=( const GLTextureVideoImageRepresentation&) = delete; - gles2::Texture* GetTexture() override { + gles2::Texture* GetTexture(int plane_index) override { + DCHECK_EQ(plane_index, 0); + auto* texture = gles2::Texture::CheckedCast(texture_->GetTextureBase()); DCHECK(texture); @@ -254,8 +256,9 @@ GLTexturePassthroughVideoImageRepresentation& operator=( const GLTexturePassthroughVideoImageRepresentation&) = delete; - const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough() - override { + const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough( + int plane_index) override { + DCHECK_EQ(plane_index, 0); return passthrough_texture_; }
diff --git a/gpu/command_buffer/service/shared_image/video_surface_texture_image_backing.cc b/gpu/command_buffer/service/shared_image/video_surface_texture_image_backing.cc index 4388607..9725195 100644 --- a/gpu/command_buffer/service/shared_image/video_surface_texture_image_backing.cc +++ b/gpu/command_buffer/service/shared_image/video_surface_texture_image_backing.cc
@@ -117,7 +117,9 @@ GLTextureVideoImageRepresentation& operator=( const GLTextureVideoImageRepresentation&) = delete; - gles2::Texture* GetTexture() override { + gles2::Texture* GetTexture(int plane_index) override { + DCHECK_EQ(plane_index, 0); + auto* texture = gles2::Texture::CheckedCast(texture_->GetTextureBase()); DCHECK(texture); @@ -134,8 +136,8 @@ // If we passed a GLImage to BindStreamTextureImage(), mark it as bound. if (!base::FeatureList::IsEnabled(kPassNullForGLImageWhenBindingTexture)) { - GetTexture()->SetLevelImageState(GetTexture()->target(), 0, - gles2::Texture::BOUND); + gles2::Texture* texture = GLTextureImageRepresentation::GetTexture(); + texture->SetLevelImageState(texture->target(), 0, gles2::Texture::BOUND); } return true; @@ -143,8 +145,9 @@ void EndAccess() override { if (!base::FeatureList::IsEnabled(kPassNullForGLImageWhenBindingTexture)) { - GetTexture()->SetLevelImageState(GetTexture()->target(), 0, - gles2::Texture::UNBOUND); + gles2::Texture* texture = GLTextureImageRepresentation::GetTexture(); + texture->SetLevelImageState(texture->target(), 0, + gles2::Texture::UNBOUND); } } @@ -176,8 +179,9 @@ GLTexturePassthroughVideoImageRepresentation& operator=( const GLTexturePassthroughVideoImageRepresentation&) = delete; - const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough() - override { + const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough( + int plane_index) override { + DCHECK_EQ(plane_index, 0); return passthrough_texture_; }
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc index 7de01a3..e7794567 100644 --- a/gpu/command_buffer/service/webgpu_decoder_impl.cc +++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -87,34 +87,6 @@ } } -// Helper class to make a scoped variable that creates an error scope to ignore -// validation errors on a device. -class IgnoreValidationErrorsScope { - public: - explicit IgnoreValidationErrorsScope(const DawnProcTable& procs, - WGPUDevice device) - : procs_(procs), device_(device) { - procs_.devicePushErrorScope(device_, WGPUErrorFilter_Validation); - procs_.deviceReference(device_); - } - ~IgnoreValidationErrorsScope() { - procs_.devicePopErrorScope( - device_, [](WGPUErrorType, const char*, void*) {}, nullptr); - procs_.deviceRelease(device_); - } - - IgnoreValidationErrorsScope(const IgnoreValidationErrorsScope&) = delete; - IgnoreValidationErrorsScope(IgnoreValidationErrorsScope&&) = delete; - IgnoreValidationErrorsScope& operator=(const IgnoreValidationErrorsScope&) = - delete; - IgnoreValidationErrorsScope& operator=(IgnoreValidationErrorsScope&&) = - delete; - - private: - const DawnProcTable& procs_; - WGPUDevice device_; -}; - } // namespace class WebGPUDecoderImpl final : public WebGPUDecoder { @@ -542,8 +514,6 @@ } ~SharedImageRepresentationAndAccessSkiaFallback() override { - auto ignore_validation_errors = - IgnoreValidationErrorsScope(procs_, device_); // If we have write access, flush any writes by uploading // into the SkSurface. if ((usage_ & kAllowedWritableMailboxTextureUsages) != 0) { @@ -1953,11 +1923,10 @@ // The compositor renders uninitialized textures as red. If the texture is // not initialized, we need to explicitly clear its contents to black. // This may not successfully initialize the texture if the texture or device - // was explicitly destroyed. TODO(crbug.com/1359106): Some other workaround - // will be needed to make the texture black in the destroyed case. + // was explicitly destroyed, however the client ensures Dissociate is sent + // before destroy. // TODO(crbug.com/1242712): Use the C++ WebGPU API. const auto& procs = dawn::native::GetProcs(); - auto ignore_validation_errors = IgnoreValidationErrorsScope(procs, device); WGPUTextureView view = procs.textureCreateView(texture, nullptr); WGPURenderPassColorAttachment color_attachment = {};
diff --git a/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc b/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc index 2296d45c8..b667058 100644 --- a/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc +++ b/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc
@@ -447,229 +447,6 @@ ->RunsTasksInCurrentSequence(); } -// Test that Associate and Dissociate mailbox may be used after the device is -// destroyed. The test should not crash or produce unexpected validation errors. -TEST_P(WebGPUMailboxTest, AssociateDissociateMailboxAfterDeviceDestroy) { - if (!GPUTestBotConfig::CurrentConfigMatches("Mac") && - !GPUTestBotConfig::CurrentConfigMatches("Win10")) { - GTEST_SKIP() << "Test skipped due to crbug.com/1359106."; - } - - SharedImageInterface* sii = GetSharedImageInterface(); - Mailbox mailbox = sii->CreateSharedImage( - GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(), - kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU, - kNullSurfaceHandle); - SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken(); - webgpu()->WaitSyncTokenCHROMIUM(mailbox_produced_token.GetConstData()); - - webgpu::ReservedTexture reservation = webgpu()->ReserveTexture(device_.Get()); - - device_.Destroy(); - - EXPECT_WEBGPU_ERROR( - device_, WGPUErrorType_Validation, - webgpu()->AssociateMailbox( - reservation.deviceId, reservation.deviceGeneration, reservation.id, - reservation.generation, WGPUTextureUsage_RenderAttachment, - webgpu::WEBGPU_MAILBOX_NONE, - reinterpret_cast<const GLbyte*>(&mailbox))); - - wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture); - EXPECT_WEBGPU_ERROR(device_, WGPUErrorType_Validation, texture.CreateView()); - webgpu()->DissociateMailbox(reservation.id, reservation.generation); - webgpu()->FlushCommands(); -} - -// Test that Associate mailbox and DissociateForPresent may be used after the -// device is destroyed. The test should not crash or produce unexpected -// validation errors. -TEST_P(WebGPUMailboxTest, - AssociateDissociateMailboxForPresentAfterDeviceDestroy) { - if (!GPUTestBotConfig::CurrentConfigMatches("Mac") && - !GPUTestBotConfig::CurrentConfigMatches("Win10")) { - GTEST_SKIP() << "Test skipped due to crbug.com/1359106."; - } - - SharedImageInterface* sii = GetSharedImageInterface(); - Mailbox mailbox = sii->CreateSharedImage( - GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(), - kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU, - kNullSurfaceHandle); - SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken(); - webgpu()->WaitSyncTokenCHROMIUM(mailbox_produced_token.GetConstData()); - - webgpu::ReservedTexture reservation = webgpu()->ReserveTexture(device_.Get()); - - device_.Destroy(); - - EXPECT_WEBGPU_ERROR( - device_, WGPUErrorType_Validation, - webgpu()->AssociateMailbox( - reservation.deviceId, reservation.deviceGeneration, reservation.id, - reservation.generation, WGPUTextureUsage_RenderAttachment, - webgpu::WEBGPU_MAILBOX_NONE, - reinterpret_cast<const GLbyte*>(&mailbox))); - wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture); - EXPECT_WEBGPU_ERROR(device_, WGPUErrorType_Validation, texture.CreateView()); - webgpu()->DissociateMailboxForPresent(reservation.deviceId, - reservation.deviceGeneration, - reservation.id, reservation.generation); - webgpu()->FlushCommands(); -} - -// Test that ReserveTexture may be used after the device is destroyed. -// The test should not crash or produce unexpected validation errors. -TEST_P(WebGPUMailboxTest, ReserveTextureAfterDeviceDestroy) { - if (!GPUTestBotConfig::CurrentConfigMatches("Mac") && - !GPUTestBotConfig::CurrentConfigMatches("Win10")) { - GTEST_SKIP() << "Test skipped due to crbug.com/1359106."; - } - - SharedImageInterface* sii = GetSharedImageInterface(); - Mailbox mailbox = sii->CreateSharedImage( - GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(), - kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU, - kNullSurfaceHandle); - SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken(); - webgpu()->WaitSyncTokenCHROMIUM(mailbox_produced_token.GetConstData()); - - device_.Destroy(); - - webgpu::ReservedTexture reservation = webgpu()->ReserveTexture(device_.Get()); - - EXPECT_WEBGPU_ERROR( - device_, WGPUErrorType_Validation, - webgpu()->AssociateMailbox( - reservation.deviceId, reservation.deviceGeneration, reservation.id, - reservation.generation, WGPUTextureUsage_RenderAttachment, - webgpu::WEBGPU_MAILBOX_NONE, - reinterpret_cast<const GLbyte*>(&mailbox))); - wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture); - EXPECT_WEBGPU_ERROR(device_, WGPUErrorType_Validation, texture.CreateView()); - webgpu()->DissociateMailbox(reservation.id, reservation.generation); - webgpu()->FlushCommands(); -} - -// Test that DissociateMailbox may be used after the device is destroyed. -// The test should not crash or produce unexpected validation errors. -TEST_P(WebGPUMailboxTest, DissociateMailboxAfterDeviceDestroy) { - if (!GPUTestBotConfig::CurrentConfigMatches("Mac") && - !GPUTestBotConfig::CurrentConfigMatches("Win10")) { - GTEST_SKIP() << "Test skipped due to crbug.com/1359106."; - } - - SharedImageInterface* sii = GetSharedImageInterface(); - Mailbox mailbox = sii->CreateSharedImage( - GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(), - kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU, - kNullSurfaceHandle); - SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken(); - webgpu()->WaitSyncTokenCHROMIUM(mailbox_produced_token.GetConstData()); - - webgpu::ReservedTexture reservation = webgpu()->ReserveTexture(device_.Get()); - - webgpu()->AssociateMailbox( - reservation.deviceId, reservation.deviceGeneration, reservation.id, - reservation.generation, WGPUTextureUsage_RenderAttachment, - webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<const GLbyte*>(&mailbox)); - - wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture); - device_.Destroy(); - webgpu()->DissociateMailbox(reservation.id, reservation.generation); - webgpu()->FlushCommands(); -} - -// Test that DissociateMailboxForPresentAfterDeviceDestroy may be used after the -// device is destroyed. The test should not crash or produce unexpected -// validation errors. -TEST_P(WebGPUMailboxTest, DissociateMailboxForPresentAfterDeviceDestroy) { - if (!GPUTestBotConfig::CurrentConfigMatches("Mac") && - !GPUTestBotConfig::CurrentConfigMatches("Win10")) { - GTEST_SKIP() << "Test skipped due to crbug.com/1359106."; - } - - SharedImageInterface* sii = GetSharedImageInterface(); - Mailbox mailbox = sii->CreateSharedImage( - GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(), - kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU, - kNullSurfaceHandle); - SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken(); - webgpu()->WaitSyncTokenCHROMIUM(mailbox_produced_token.GetConstData()); - - webgpu::ReservedTexture reservation = webgpu()->ReserveTexture(device_.Get()); - - webgpu()->AssociateMailbox( - reservation.deviceId, reservation.deviceGeneration, reservation.id, - reservation.generation, WGPUTextureUsage_RenderAttachment, - webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<const GLbyte*>(&mailbox)); - - wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture); - UninitializeTexture(device_, texture); - device_.Destroy(); - webgpu()->DissociateMailboxForPresent(reservation.deviceId, - reservation.deviceGeneration, - reservation.id, reservation.generation); -} - -// Test that DissociateMailbox may be used after the texture is destroyed. -// The test should not crash or produce unexpected validation errors. -TEST_P(WebGPUMailboxTest, DissociateMailboxAfterTextureDestroy) { - if (!GPUTestBotConfig::CurrentConfigMatches("Mac") && - !GPUTestBotConfig::CurrentConfigMatches("Win10")) { - GTEST_SKIP() << "Test skipped due to crbug.com/1359106."; - } - - SharedImageInterface* sii = GetSharedImageInterface(); - Mailbox mailbox = sii->CreateSharedImage( - GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(), - kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU, - kNullSurfaceHandle); - SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken(); - webgpu()->WaitSyncTokenCHROMIUM(mailbox_produced_token.GetConstData()); - - webgpu::ReservedTexture reservation = webgpu()->ReserveTexture(device_.Get()); - - webgpu()->AssociateMailbox( - reservation.deviceId, reservation.deviceGeneration, reservation.id, - reservation.generation, WGPUTextureUsage_RenderAttachment, - webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<const GLbyte*>(&mailbox)); - - wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture); - texture.Destroy(); - webgpu()->DissociateMailbox(reservation.id, reservation.generation); - webgpu()->FlushCommands(); -} - -// Test that DissociateMailboxForPresent may be used after the texture is -// destroyed. The test should not crash or produce unexpected validation errors. -TEST_P(WebGPUMailboxTest, DissociateMailboxForPresentAfterTextureDestroy) { - if (!GPUTestBotConfig::CurrentConfigMatches("Mac") && - !GPUTestBotConfig::CurrentConfigMatches("Win10")) { - GTEST_SKIP() << "Test skipped due to crbug.com/1359106."; - } - - SharedImageInterface* sii = GetSharedImageInterface(); - Mailbox mailbox = sii->CreateSharedImage( - GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(), - kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU, - kNullSurfaceHandle); - - webgpu::ReservedTexture reservation = webgpu()->ReserveTexture(device_.Get()); - - webgpu()->AssociateMailbox( - reservation.deviceId, reservation.deviceGeneration, reservation.id, - reservation.generation, WGPUTextureUsage_RenderAttachment, - webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<const GLbyte*>(&mailbox)); - - wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture); - UninitializeTexture(device_, texture); - texture.Destroy(); - webgpu()->DissociateMailboxForPresent(reservation.deviceId, - reservation.deviceGeneration, - reservation.id, reservation.generation); -} - // Tests using Associate/DissociateMailbox to share an image with Dawn. // For simplicity of the test the image is shared between a Dawn device and // itself: we render to it using the Dawn device, then re-associate it to a
diff --git a/gpu/config/gpu_test_config.cc b/gpu/config/gpu_test_config.cc index 95aaf795..0b936b4 100644 --- a/gpu/config/gpu_test_config.cc +++ b/gpu/config/gpu_test_config.cc
@@ -85,6 +85,8 @@ return GPUTestConfig::kOsMacBigSur; case 12: return GPUTestConfig::kOsMacMonterey; + case 13: + return GPUTestConfig::kOsMacVentura; } return GPUTestConfig::kOsUnknown; #elif BUILDFLAG(IS_ANDROID) @@ -230,6 +232,7 @@ case kOsMacCatalina: case kOsMacBigSur: case kOsMacMonterey: + case kOsMacVentura: case kOsLinux: case kOsChromeOS: case kOsAndroid:
diff --git a/gpu/config/gpu_test_config.h b/gpu/config/gpu_test_config.h index 4032ade3..d48eeb0 100644 --- a/gpu/config/gpu_test_config.h +++ b/gpu/config/gpu_test_config.h
@@ -41,10 +41,11 @@ kOsMacCatalina = 1 << 20, kOsMacBigSur = 1 << 21, kOsMacMonterey = 1 << 22, + kOsMacVentura = 1 << 23, kOsMac = kOsMacLeopard | kOsMacSnowLeopard | kOsMacLion | kOsMacMountainLion | kOsMacMavericks | kOsMacYosemite | kOsMacElCapitan | kOsMacSierra | kOsMacHighSierra | kOsMacMojave | - kOsMacCatalina | kOsMacBigSur | kOsMacMonterey, + kOsMacCatalina | kOsMacBigSur | kOsMacMonterey | kOsMacVentura, // Jump over a few bits for future OSX versions. kOsLinux = 1 << 25, kOsChromeOS = 1 << 26,
diff --git a/gpu/config/gpu_test_expectations_parser.cc b/gpu/config/gpu_test_expectations_parser.cc index 93d901b5f..cac6b50 100644 --- a/gpu/config/gpu_test_expectations_parser.cc +++ b/gpu/config/gpu_test_expectations_parser.cc
@@ -49,6 +49,7 @@ kConfigMacCatalina, kConfigMacBigSur, kConfigMacMonterey, + kConfigMacVentura, kConfigMac, kConfigLinux, kConfigChromeOS, @@ -112,6 +113,7 @@ {"catalina", GPUTestConfig::kOsMacCatalina}, {"bigsur", GPUTestConfig::kOsMacBigSur}, {"monterey", GPUTestConfig::kOsMacMonterey}, + {"ventura", GPUTestConfig::kOsMacVentura}, {"mac", GPUTestConfig::kOsMac}, {"linux", GPUTestConfig::kOsLinux}, {"chromeos", GPUTestConfig::kOsChromeOS}, @@ -283,6 +285,7 @@ case kConfigMacCatalina: case kConfigMacBigSur: case kConfigMacMonterey: + case kConfigMacVentura: case kConfigMac: case kConfigLinux: case kConfigChromeOS: @@ -350,6 +353,7 @@ case kConfigMacCatalina: case kConfigMacBigSur: case kConfigMacMonterey: + case kConfigMacVentura: case kConfigMac: case kConfigLinux: case kConfigChromeOS: @@ -480,6 +484,7 @@ case kConfigMacCatalina: case kConfigMacBigSur: case kConfigMacMonterey: + case kConfigMacVentura: case kConfigMac: case kConfigLinux: case kConfigChromeOS:
diff --git a/gpu/config/gpu_test_expectations_parser_unittest.cc b/gpu/config/gpu_test_expectations_parser_unittest.cc index 1f669867..8645b64 100644 --- a/gpu/config/gpu_test_expectations_parser_unittest.cc +++ b/gpu/config/gpu_test_expectations_parser_unittest.cc
@@ -41,6 +41,7 @@ {{"CATALINA", GPUTestConfig::kOsMacCatalina}, kOsFamilyMac}, {{"BIGSUR", GPUTestConfig::kOsMacBigSur}, kOsFamilyMac}, {{"MONTEREY", GPUTestConfig::kOsMacMonterey}, kOsFamilyMac}, + {{"VENTURA", GPUTestConfig::kOsMacVentura}, kOsFamilyMac}, {{"LINUX", GPUTestConfig::kOsLinux}, {"LINUX", GPUTestConfig::kOsLinux}}, {{"CHROMEOS", GPUTestConfig::kOsChromeOS}, {"CHROMEOS", GPUTestConfig::kOsChromeOS}},
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 5aaf0dc..398f697 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -44313,6 +44313,10 @@ value: 10 } experiments { + key: "luci.buildbucket.omit_python2" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -78755,6 +78759,10 @@ value: 100 } experiments { + key: "chromium_rts.inverted_rts_bail_early" + value: 100 + } + experiments { key: "chromium_swarming.expose_merge_script_failures" value: 20 }
diff --git a/infra/config/subprojects/chromium/ci/metadata.exporter.star b/infra/config/subprojects/chromium/ci/metadata.exporter.star index 943caad..d22e1b5 100644 --- a/infra/config/subprojects/chromium/ci/metadata.exporter.star +++ b/infra/config/subprojects/chromium/ci/metadata.exporter.star
@@ -12,9 +12,6 @@ execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, - - # TODO(crbug.com/1362440): remove this. - omit_python2 = False, ) consoles.console_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star index 30d8cd7c..7455608 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
@@ -710,6 +710,7 @@ experiments = { "remove_src_checkout_experiment": 100, "chromium_rts.inverted_rts": 100, + "chromium_rts.inverted_rts_bail_early": 100, }, use_orchestrator_pool = True, )
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn index 0d7423e3..1419816 100644 --- a/ios/chrome/app/BUILD.gn +++ b/ios/chrome/app/BUILD.gn
@@ -91,7 +91,9 @@ "//ios/chrome/browser/browser_state:test_support", "//ios/chrome/browser/metrics:metrics", "//ios/chrome/browser/prefs:browser_prefs", + "//ios/chrome/browser/promos_manager:constants", "//ios/chrome/browser/promos_manager:promos_manager", + "//ios/chrome/browser/promos_manager:test_support", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:signin_util", "//ios/chrome/browser/signin:test_support", @@ -109,6 +111,7 @@ "//ios/testing:block_swizzler", "//ios/third_party/material_components_ios", "//ios/web/public/test:test", + "//testing/gmock", "//testing/gtest", "//third_party/ocmock", "//url", @@ -316,6 +319,8 @@ "//base", "//ios/chrome/app/application_delegate:app_state_header", "//ios/chrome/app/application_delegate:application_delegate_internal", + "//ios/chrome/browser/application_context:application_context", + "//ios/chrome/browser/promos_manager:constants", "//ios/chrome/browser/promos_manager:promos_manager", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:signin_util", @@ -542,6 +547,7 @@ "//ios/chrome/app/startup:startup_basic", "//ios/chrome/browser/crash_report", "//ios/chrome/common", + "//ios/public/provider/chrome/browser/primes:primes_api", ] if (ios_enable_sandbox_dump) { deps += [ "//ios/chrome/app/startup:sandbox_dump" ]
diff --git a/ios/chrome/app/chrome_exe_main.mm b/ios/chrome/app/chrome_exe_main.mm index ac5994e..53197f17 100644 --- a/ios/chrome/app/chrome_exe_main.mm +++ b/ios/chrome/app/chrome_exe_main.mm
@@ -10,6 +10,7 @@ #import "ios/chrome/app/startup/ios_chrome_main.h" #import "ios/chrome/app/startup/ios_enable_sandbox_dump_buildflags.h" #import "ios/chrome/browser/crash_report/crash_helper.h" +#import "ios/public/provider/chrome/browser/primes/primes_api.h" #if BUILDFLAG(IOS_ENABLE_SANDBOX_DUMP) #import "ios/chrome/app/startup/sandbox_dump.h" // nogncheck @@ -87,6 +88,11 @@ // Create this here since it's needed to start the crash handler. base::AtExitManager at_exit; + // Start Primes logging if it's supported. + if (ios::provider::IsPrimesSupported()) { + ios::provider::PrimesStartLogging(); + } + // The Crash Controller is started here even if the user opted out since we // don't have yet preferences. Later on it is stopped if the user opted out. // In any case reports are not sent if the user opted out.
diff --git a/ios/chrome/app/post_restore_app_agent.mm b/ios/chrome/app/post_restore_app_agent.mm index 27ce9e2a..6ce4a511 100644 --- a/ios/chrome/app/post_restore_app_agent.mm +++ b/ios/chrome/app/post_restore_app_agent.mm
@@ -5,6 +5,8 @@ #import "ios/chrome/app/post_restore_app_agent.h" #import "ios/chrome/app/application_delegate/app_state.h" +#import "ios/chrome/browser/application_context/application_context.h" +#import "ios/chrome/browser/promos_manager/constants.h" #import "ios/chrome/browser/promos_manager/promos_manager.h" #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/signin_util.h"
diff --git a/ios/chrome/app/post_restore_app_agent_unittest.mm b/ios/chrome/app/post_restore_app_agent_unittest.mm index 51db9b9..2fe3c955 100644 --- a/ios/chrome/app/post_restore_app_agent_unittest.mm +++ b/ios/chrome/app/post_restore_app_agent_unittest.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/app/post_restore_app_agent.h" #import "base/test/scoped_feature_list.h" +#import "base/values.h" #import "components/prefs/pref_registry_simple.h" #import "components/prefs/testing_pref_service.h" #import "ios/chrome/app/application_delegate/app_state.h" @@ -12,6 +13,8 @@ #import "ios/chrome/browser/application_context/application_context.h" #import "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/prefs/pref_names.h" +#import "ios/chrome/browser/promos_manager/constants.h" +#import "ios/chrome/browser/promos_manager/mock_promos_manager.h" #import "ios/chrome/browser/promos_manager/promos_manager.h" #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" @@ -20,6 +23,7 @@ #import "ios/chrome/browser/ui/post_restore_signin/features.h" #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h" #import "ios/web/public/test/web_task_environment.h" +#import "testing/gmock/include/gmock/gmock.h" #import "testing/platform_test.h" #import "third_party/abseil-cpp/absl/types/optional.h" #import "third_party/ocmock/OCMock/OCMock.h" @@ -29,6 +33,9 @@ #error "This file requires ARC support." #endif +using ::testing::_; +using ::testing::AnyNumber; + namespace { const char kFakePreRestoreAccountEmail[] = "person@example.org"; } // namespace @@ -42,7 +49,7 @@ web::WebTaskEnvironment task_environment_; std::unique_ptr<TestChromeBrowserState> browser_state_; PostRestoreAppAgent* appAgent_; - std::unique_ptr<PromosManager> promos_manager_; + std::unique_ptr<MockPromosManager> promos_manager_; AuthenticationService* auth_service_; base::test::ScopedFeatureList scoped_feature_list_; id mockAppState_; @@ -56,9 +63,9 @@ [appAgent_ setAppState:mockAppState_]; } - PromosManager* CreatePromosManager() { - promos_manager_ = std::make_unique<PromosManager>(local_state_.Get()); - promos_manager_->Init(); + MockPromosManager* CreatePromosManager() { + promos_manager_ = std::make_unique<MockPromosManager>(); + return promos_manager_.get(); } @@ -74,19 +81,6 @@ return auth_service_; } - int CountSingleDisplayActivePromos() { - return local_state_.Get() - ->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos) - .size(); - } - - void ExpectRegisteredPromo(promos_manager::Promo promo) { - const base::Value::List& promos = local_state_.Get()->GetList( - prefs::kIosPromosManagerSingleDisplayActivePromos); - EXPECT_EQ(promos.size(), unsigned(1)); - EXPECT_EQ(promos[0], promos_manager::NameForPromo(promo)); - } - void MockAppStateChange(InitStage initStage) { OCMStub([mockAppState_ initStage]).andReturn(initStage); [appAgent_ appState:mockAppState_ @@ -115,36 +109,43 @@ }; TEST_F(PostRestoreAppAgentTest, maybeRegisterPromo) { - // Ensure that no promos are registered initially. - EXPECT_EQ(CountSingleDisplayActivePromos(), 0); + EXPECT_CALL(*promos_manager_.get(), RegisterPromoForSingleDisplay(_)) + .Times(0); + EXPECT_CALL(*promos_manager_.get(), RegisterPromoForContinuousDisplay(_)) + .Times(0); // Scenarios which should not register a promo. ClearPreRestoreIdentity(local_state_.Get()); MockAppStateChange(InitStageFinal); - EXPECT_EQ(CountSingleDisplayActivePromos(), 0); SetFakePreRestoreAccountInfo(); MockAppStateChange(InitStageFinal); - EXPECT_EQ(CountSingleDisplayActivePromos(), 0); ClearPreRestoreIdentity(local_state_.Get()); EnableFeatureVariationFullscreen(); MockAppStateChange(InitStageFinal); - EXPECT_EQ(CountSingleDisplayActivePromos(), 0); } TEST_F(PostRestoreAppAgentTest, registerPromoFullscreen) { + EXPECT_CALL(*promos_manager_.get(), + RegisterPromoForSingleDisplay( + promos_manager::Promo::PostRestoreSignInFullscreen)) + .Times(1); + EnableFeatureVariationFullscreen(); SetFakePreRestoreAccountInfo(); MockAppStateChange(InitStageFinal); - ExpectRegisteredPromo(promos_manager::Promo::PostRestoreSignInFullscreen); } TEST_F(PostRestoreAppAgentTest, registerPromoAlert) { + EXPECT_CALL(*promos_manager_.get(), + RegisterPromoForSingleDisplay( + promos_manager::Promo::PostRestoreSignInAlert)) + .Times(1); + EnableFeatureVariationAlert(); SetFakePreRestoreAccountInfo(); MockAppStateChange(InitStageFinal); - ExpectRegisteredPromo(promos_manager::Promo::PostRestoreSignInAlert); } TEST_F(PostRestoreAppAgentTest, registerPromoDisablesReauthPrompt) { @@ -157,49 +158,50 @@ } TEST_F(PostRestoreAppAgentTest, deregisterPromoFullscreen) { - promos_manager_->RegisterPromoForSingleDisplay( - promos_manager::Promo::PostRestoreSignInFullscreen); - EXPECT_EQ(CountSingleDisplayActivePromos(), 1); + EXPECT_CALL(*promos_manager_.get(), DeregisterPromo(_)).Times(1); + EXPECT_CALL( + *promos_manager_.get(), + DeregisterPromo(promos_manager::Promo::PostRestoreSignInFullscreen)) + .Times(1); EnableFeatureVariationAlert(); + SetFakePreRestoreAccountInfo(); ClearPreRestoreIdentity(local_state_.Get()); MockAppStateChange(InitStageFinal); - EXPECT_EQ(CountSingleDisplayActivePromos(), 0); } TEST_F(PostRestoreAppAgentTest, deregisterPromoAlert) { - promos_manager_->RegisterPromoForSingleDisplay( - promos_manager::Promo::PostRestoreSignInAlert); - EXPECT_EQ(CountSingleDisplayActivePromos(), 1); + EXPECT_CALL(*promos_manager_.get(), DeregisterPromo(_)).Times(1); + EXPECT_CALL(*promos_manager_.get(), + DeregisterPromo(promos_manager::Promo::PostRestoreSignInAlert)) + .Times(1); - EnableFeatureVariationAlert(); + EnableFeatureVariationFullscreen(); + SetFakePreRestoreAccountInfo(); ClearPreRestoreIdentity(local_state_.Get()); MockAppStateChange(InitStageFinal); - EXPECT_EQ(CountSingleDisplayActivePromos(), 0); } TEST_F(PostRestoreAppAgentTest, featureVariationSwitchToFullscreen) { - // Simulate that the Alert promo was previously registered. - promos_manager_->RegisterPromoForSingleDisplay( - promos_manager::Promo::PostRestoreSignInAlert); - EXPECT_EQ(CountSingleDisplayActivePromos(), 1); + EXPECT_CALL(*promos_manager_.get(), + RegisterPromoForSingleDisplay( + promos_manager::Promo::PostRestoreSignInFullscreen)) + .Times(1); EnableFeatureVariationFullscreen(); SetFakePreRestoreAccountInfo(); MockAppStateChange(InitStageFinal); - ExpectRegisteredPromo(promos_manager::Promo::PostRestoreSignInFullscreen); } TEST_F(PostRestoreAppAgentTest, featureVariationSwitchToAlert) { - // Simulate that the Fullscreen promo was previously registered. - promos_manager_->RegisterPromoForSingleDisplay( - promos_manager::Promo::PostRestoreSignInFullscreen); - EXPECT_EQ(CountSingleDisplayActivePromos(), 1); + EXPECT_CALL(*promos_manager_.get(), + RegisterPromoForSingleDisplay( + promos_manager::Promo::PostRestoreSignInAlert)) + .Times(1); EnableFeatureVariationAlert(); SetFakePreRestoreAccountInfo(); MockAppStateChange(InitStageFinal); - ExpectRegisteredPromo(promos_manager::Promo::PostRestoreSignInAlert); }
diff --git a/ios/chrome/browser/application_context/BUILD.gn b/ios/chrome/browser/application_context/BUILD.gn index 133a8d9..668929cb 100644 --- a/ios/chrome/browser/application_context/BUILD.gn +++ b/ios/chrome/browser/application_context/BUILD.gn
@@ -52,8 +52,8 @@ "//ios/chrome/browser/prefs", "//ios/chrome/browser/prefs:browser_prefs", "//ios/chrome/browser/prefs:pref_names", - "//ios/chrome/browser/promos_manager", "//ios/chrome/browser/promos_manager:features", + "//ios/chrome/browser/promos_manager:internal", "//ios/chrome/browser/push_notification:push_notification_service", "//ios/chrome/browser/segmentation_platform", "//ios/chrome/browser/update_client",
diff --git a/ios/chrome/browser/application_context/application_context_impl.mm b/ios/chrome/browser/application_context/application_context_impl.mm index b5cbfc84..336182a 100644 --- a/ios/chrome/browser/application_context/application_context_impl.mm +++ b/ios/chrome/browser/application_context/application_context_impl.mm
@@ -60,7 +60,7 @@ #import "ios/chrome/browser/prefs/ios_chrome_pref_service_factory.h" #import "ios/chrome/browser/prefs/pref_names.h" #import "ios/chrome/browser/promos_manager/features.h" -#import "ios/chrome/browser/promos_manager/promos_manager.h" +#import "ios/chrome/browser/promos_manager/promos_manager_impl.h" #import "ios/chrome/browser/push_notification/push_notification_service.h" #import "ios/chrome/browser/segmentation_platform/otr_web_state_observer.h" #import "ios/chrome/browser/update_client/ios_chrome_update_query_params_delegate.h" @@ -474,7 +474,7 @@ PromosManager* ApplicationContextImpl::GetPromosManager() { DCHECK(thread_checker_.CalledOnValidThread()); if (IsFullscreenPromosManagerEnabled() && !promos_manager_) { - promos_manager_ = std::make_unique<PromosManager>(GetLocalState()); + promos_manager_ = std::make_unique<PromosManagerImpl>(GetLocalState()); } return promos_manager_.get(); }
diff --git a/ios/chrome/browser/autocomplete/BUILD.gn b/ios/chrome/browser/autocomplete/BUILD.gn index ff4ada7..f8a2e618 100644 --- a/ios/chrome/browser/autocomplete/BUILD.gn +++ b/ios/chrome/browser/autocomplete/BUILD.gn
@@ -20,6 +20,8 @@ "shortcuts_backend_factory.mm", "tab_matcher_impl.h", "tab_matcher_impl.mm", + "zero_suggest_cache_service_factory.cc", + "zero_suggest_cache_service_factory.h", ] configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.mm b/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.mm index 497bfdd3..e6de6c32 100644 --- a/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.mm +++ b/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.mm
@@ -25,6 +25,7 @@ #import "ios/chrome/browser/autocomplete/remote_suggestions_service_factory.h" #import "ios/chrome/browser/autocomplete/shortcuts_backend_factory.h" #import "ios/chrome/browser/autocomplete/tab_matcher_impl.h" +#import "ios/chrome/browser/autocomplete/zero_suggest_cache_service_factory.h" #import "ios/chrome/browser/bookmarks/bookmark_model_factory.h" #import "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/history/history_service_factory.h" @@ -136,12 +137,14 @@ ZeroSuggestCacheService* AutocompleteProviderClientImpl::GetZeroSuggestCacheService() { - return nullptr; + return ios::ZeroSuggestCacheServiceFactory::GetForBrowserState( + browser_state_); } const ZeroSuggestCacheService* AutocompleteProviderClientImpl::GetZeroSuggestCacheService() const { - return nullptr; + return ios::ZeroSuggestCacheServiceFactory::GetForBrowserState( + browser_state_); } OmniboxPedalProvider* AutocompleteProviderClientImpl::GetPedalProvider() const {
diff --git a/ios/chrome/browser/autocomplete/zero_suggest_cache_service_factory.cc b/ios/chrome/browser/autocomplete/zero_suggest_cache_service_factory.cc new file mode 100644 index 0000000..35e9f80 --- /dev/null +++ b/ios/chrome/browser/autocomplete/zero_suggest_cache_service_factory.cc
@@ -0,0 +1,42 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ios/chrome/browser/autocomplete/zero_suggest_cache_service_factory.h" + +#include "base/no_destructor.h" +#include "components/keyed_service/ios/browser_state_dependency_manager.h" +#include "components/omnibox/browser/omnibox_field_trial.h" +#include "components/omnibox/browser/zero_suggest_cache_service.h" +#include "ios/chrome/browser/browser_state/chrome_browser_state.h" + +namespace ios { + +// static +ZeroSuggestCacheService* ZeroSuggestCacheServiceFactory::GetForBrowserState( + ChromeBrowserState* browser_state) { + return static_cast<ZeroSuggestCacheService*>( + GetInstance()->GetServiceForBrowserState(browser_state, true)); +} + +// static +ZeroSuggestCacheServiceFactory* ZeroSuggestCacheServiceFactory::GetInstance() { + static base::NoDestructor<ZeroSuggestCacheServiceFactory> instance; + return instance.get(); +} + +ZeroSuggestCacheServiceFactory::ZeroSuggestCacheServiceFactory() + : BrowserStateKeyedServiceFactory( + "ZeroSuggestCacheService", + BrowserStateDependencyManager::GetInstance()) {} + +ZeroSuggestCacheServiceFactory::~ZeroSuggestCacheServiceFactory() = default; + +std::unique_ptr<KeyedService> +ZeroSuggestCacheServiceFactory::BuildServiceInstanceFor( + web::BrowserState* context) const { + return std::make_unique<ZeroSuggestCacheService>( + OmniboxFieldTrial::kZeroSuggestCacheMaxSize.Get()); +} + +} // namespace ios
diff --git a/ios/chrome/browser/autocomplete/zero_suggest_cache_service_factory.h b/ios/chrome/browser/autocomplete/zero_suggest_cache_service_factory.h new file mode 100644 index 0000000..ff0692d --- /dev/null +++ b/ios/chrome/browser/autocomplete/zero_suggest_cache_service_factory.h
@@ -0,0 +1,45 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_AUTOCOMPLETE_ZERO_SUGGEST_CACHE_SERVICE_FACTORY_H_ +#define IOS_CHROME_BROWSER_AUTOCOMPLETE_ZERO_SUGGEST_CACHE_SERVICE_FACTORY_H_ + +#include "memory.h" + +#include "base/no_destructor.h" +#include "components/keyed_service/ios/browser_state_keyed_service_factory.h" + +class ChromeBrowserState; +class ZeroSuggestCacheService; + +namespace ios { +// Singleton that owns all ZeroSuggestCacheServices and associates them with +// ChromeBrowserState +class ZeroSuggestCacheServiceFactory : public BrowserStateKeyedServiceFactory { + public: + static ZeroSuggestCacheService* GetForBrowserState( + ChromeBrowserState* browser_state); + static ZeroSuggestCacheServiceFactory* GetInstance(); + // Returns the default factory used to build ZeroSuggestCacheService. Can be + // registered with SetTestingFactory to use real instances during testing. + static TestingFactory GetDefaultFactory(); + + ZeroSuggestCacheServiceFactory(const ZeroSuggestCacheServiceFactory&) = + delete; + ZeroSuggestCacheServiceFactory& operator=( + const ZeroSuggestCacheServiceFactory&) = delete; + + private: + friend class base::NoDestructor<ZeroSuggestCacheServiceFactory>; + + ZeroSuggestCacheServiceFactory(); + ~ZeroSuggestCacheServiceFactory() override; + + // BrowerStateKeyedServiceFactory implementation. + std::unique_ptr<KeyedService> BuildServiceInstanceFor( + web::BrowserState* context) const override; +}; +} // namespace ios + +#endif // IOS_CHROME_BROWSER_AUTOCOMPLETE_ZERO_SUGGEST_CACHE_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index cc664b0..af1199e 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -1176,6 +1176,11 @@ flag_descriptions::kOmniboxZeroSuggestPrefetchingName, flag_descriptions::kOmniboxZeroSuggestPrefetchingDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(omnibox::kZeroSuggestPrefetching)}, + {"omnibox-zero-suggest-in-memory-caching", + flag_descriptions::kOmniboxZeroSuggestInMemoryCachingName, + flag_descriptions::kOmniboxZeroSuggestInMemoryCachingDescription, + flags_ui::kOsIos, + FEATURE_VALUE_TYPE(omnibox::kZeroSuggestInMemoryCaching)}, {"enable-user-policy", flag_descriptions::kEnableUserPolicyName, flag_descriptions::kEnableUserPolicyDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(policy::kUserPolicy)},
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index e990a37..fbb3a7b 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -591,6 +591,11 @@ "Enables prefetching of the zero prefix suggestions for eligible users " "on the New Tab page."; +const char kOmniboxZeroSuggestInMemoryCachingName[] = + "Omnibox Zero Prefix Suggestion in-memory caching"; +const char kOmniboxZeroSuggestInMemoryCachingDescription[] = + "Enables in-memory caching of zero prefix suggestions."; + const char kIOSOmniboxUpdatedPopupUIName[] = "Popup refresh"; const char kIOSOmniboxUpdatedPopupUIDescription[] = "Enable the new Popup implementation with Actions";
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index 1ed6072..529f536 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -535,6 +535,10 @@ extern const char kOmniboxZeroSuggestPrefetchingName[]; extern const char kOmniboxZeroSuggestPrefetchingDescription[]; +// Title and description for the use of in-memory zero-suggest caching. +extern const char kOmniboxZeroSuggestInMemoryCachingName[]; +extern const char kOmniboxZeroSuggestInMemoryCachingDescription[]; + // Title and description for the flag to enable ChromeActions (and optionally // SwiftUI omnibox popup implementation). extern const char kIOSOmniboxUpdatedPopupUIName[];
diff --git a/ios/chrome/browser/flags/system_flags.h b/ios/chrome/browser/flags/system_flags.h index fefd3ff..4e2abc4 100644 --- a/ios/chrome/browser/flags/system_flags.h +++ b/ios/chrome/browser/flags/system_flags.h
@@ -72,6 +72,11 @@ // Whether the DCheckIsFatal feature should be disabled. bool AreDCHECKCrashesDisabled(); +// Returns the name of the promo to be forced to display when the app is +// launched or resumed. Returns empty string if no promo is to be forced +// to display. Always returns nil for users in stable/beta. +NSString* GetForcedPromoToDisplay(); + } // namespace experimental_flags #endif // IOS_CHROME_BROWSER_FLAGS_SYSTEM_FLAGS_H_
diff --git a/ios/chrome/browser/flags/system_flags.mm b/ios/chrome/browser/flags/system_flags.mm index 12172cd..95b0ed5 100644 --- a/ios/chrome/browser/flags/system_flags.mm +++ b/ios/chrome/browser/flags/system_flags.mm
@@ -34,6 +34,7 @@ NSString* const kOriginServerHost = @"AlternateOriginServerHost"; NSString* const kWhatsNewPromoStatus = @"WhatsNewPromoStatus"; NSString* const kClearApplicationGroup = @"ClearApplicationGroup"; +NSString* const kNextPromoForDisplayOverride = @"NextPromoForDisplayOverride"; BASE_FEATURE(kEnableThirdPartyKeyboardWorkaround, "EnableThirdPartyKeyboardWorkaround", base::FEATURE_ENABLED_BY_DEFAULT); @@ -125,4 +126,9 @@ return base::FeatureList::IsEnabled(kEnableThirdPartyKeyboardWorkaround); } +NSString* GetForcedPromoToDisplay() { + return [[NSUserDefaults standardUserDefaults] + stringForKey:kNextPromoForDisplayOverride]; +} + } // namespace experimental_flags
diff --git a/ios/chrome/browser/promos_manager/BUILD.gn b/ios/chrome/browser/promos_manager/BUILD.gn index a7f3bf63..a00428b6 100644 --- a/ios/chrome/browser/promos_manager/BUILD.gn +++ b/ios/chrome/browser/promos_manager/BUILD.gn
@@ -22,6 +22,27 @@ ] } +source_set("internal") { + sources = [ + "promos_manager_impl.h", + "promos_manager_impl.mm", + ] + frameworks = [ "Foundation.framework" ] + configs += [ "//build/config/compiler:enable_arc" ] + public_deps = [ + ":constants", + ":promos_manager", + ":types", + "//base", + "//components/prefs", + "//third_party/abseil-cpp:absl", + ] + deps = [ + ":features", + "//ios/chrome/browser/prefs:pref_names", + ] +} + source_set("types") { sources = [ "impression_limit.h", @@ -53,17 +74,35 @@ deps = [ "//base" ] } -source_set("unit_tests") { +source_set("test_support") { testonly = true sources = [ - "promos_manager_unittest.h", - "promos_manager_unittest.mm", + "mock_promos_manager.h", + "mock_promos_manager.mm", ] frameworks = [ "Foundation.framework" ] configs += [ "//build/config/compiler:enable_arc" ] + public_deps = [ + ":constants", + ":promos_manager", + ":types", + "//base", + "//base/test:test_support", + "//testing/gmock", + "//testing/gtest", + "//third_party/abseil-cpp:absl", + ] +} + +source_set("unit_tests") { + testonly = true + sources = [ "promos_manager_impl_unittest.mm" ] + frameworks = [ "Foundation.framework" ] + configs += [ "//build/config/compiler:enable_arc" ] deps = [ ":constants", ":features", + ":internal", ":promos_manager", ":types", "//base",
diff --git a/ios/chrome/browser/promos_manager/constants.cc b/ios/chrome/browser/promos_manager/constants.cc index 7d3392ae..a3671a60 100644 --- a/ios/chrome/browser/promos_manager/constants.cc +++ b/ios/chrome/browser/promos_manager/constants.cc
@@ -12,8 +12,6 @@ const std::string kImpressionPromoKey = "promo"; const std::string kImpressionDayKey = "day"; const int kNumDaysImpressionHistoryStored = 365; - -// Prefix used when stringifying promos. const std::string kPromoStringifyPrefix = "promos_manager::Promo::"; // WARNING - PLEASE READ: Sadly, we cannot switch over strings in C++, so be
diff --git a/ios/chrome/browser/promos_manager/constants.h b/ios/chrome/browser/promos_manager/constants.h index b31456e..1e1f4d8 100644 --- a/ios/chrome/browser/promos_manager/constants.h +++ b/ios/chrome/browser/promos_manager/constants.h
@@ -17,6 +17,9 @@ // Dictionary key for `day` in stored impression (base::Value). extern const std::string kImpressionDayKey; +// Prefix used when stringifying promos. +extern const std::string kPromoStringifyPrefix; + // The max number of days for impression history to be stored & maintained. extern const int kNumDaysImpressionHistoryStored;
diff --git a/ios/chrome/browser/promos_manager/mock_promos_manager.h b/ios/chrome/browser/promos_manager/mock_promos_manager.h new file mode 100644 index 0000000..1452df2 --- /dev/null +++ b/ios/chrome/browser/promos_manager/mock_promos_manager.h
@@ -0,0 +1,54 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_PROMOS_MANAGER_MOCK_PROMOS_MANAGER_H_ +#define IOS_CHROME_BROWSER_PROMOS_MANAGER_MOCK_PROMOS_MANAGER_H_ + +#import "ios/chrome/browser/promos_manager/promos_manager.h" + +#import <Foundation/Foundation.h> + +#import <map> +#import <set> + +#import "base/containers/small_map.h" +#import "ios/chrome/browser/promos_manager/constants.h" +#import "ios/chrome/browser/promos_manager/impression_limit.h" +#import "testing/gmock/include/gmock/gmock.h" +#import "third_party/abseil-cpp/absl/types/optional.h" + +// Mock version of PromosManager. +class MockPromosManager : public PromosManager { + public: + MockPromosManager(); + ~MockPromosManager() override; + + // PromosManager implementation. + MOCK_METHOD(void, Init, (), (override)); + MOCK_METHOD(void, + InitializePromoImpressionLimits, + ((base::small_map< + std::map<promos_manager::Promo, NSArray<ImpressionLimit*>*>> + promo_impression_limits)), + (override)); + MOCK_METHOD(void, + RecordImpression, + (promos_manager::Promo promo), + (override)); + MOCK_METHOD(absl::optional<promos_manager::Promo>, + NextPromoForDisplay, + (), + (const, override)); + MOCK_METHOD(void, + RegisterPromoForContinuousDisplay, + (promos_manager::Promo promo), + (override)); + MOCK_METHOD(void, + RegisterPromoForSingleDisplay, + (promos_manager::Promo promo), + (override)); + MOCK_METHOD(void, DeregisterPromo, (promos_manager::Promo promo), (override)); +}; + +#endif // IOS_CHROME_BROWSER_PROMOS_MANAGER_MOCK_PROMOS_MANAGER_H_
diff --git a/ios/chrome/browser/promos_manager/mock_promos_manager.mm b/ios/chrome/browser/promos_manager/mock_promos_manager.mm new file mode 100644 index 0000000..5a996aa --- /dev/null +++ b/ios/chrome/browser/promos_manager/mock_promos_manager.mm
@@ -0,0 +1,14 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/promos_manager/mock_promos_manager.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#pragma mark - Constructor/Destructor + +MockPromosManager::MockPromosManager() {} +MockPromosManager::~MockPromosManager() {}
diff --git a/ios/chrome/browser/promos_manager/promos_manager.h b/ios/chrome/browser/promos_manager/promos_manager.h index 773ace8..d1c39fa 100644 --- a/ios/chrome/browser/promos_manager/promos_manager.h +++ b/ios/chrome/browser/promos_manager/promos_manager.h
@@ -6,251 +6,66 @@ #define IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_H_ #import <Foundation/Foundation.h> + #import <map> -#import <set> -#import <vector> #import "base/containers/small_map.h" -#import "base/values.h" -#import "components/prefs/pref_service.h" -#import "ios/chrome/browser/promos_manager/constants.h" -#import "ios/chrome/browser/promos_manager/impression_limit.h" #import "third_party/abseil-cpp/absl/types/optional.h" -class PromosManagerTest; +@class ImpressionLimit; + +namespace promos_manager { +enum class Promo; +} // namespace promos_manager // Centralized promos manager for coordinating and scheduling the display of // app-wide promos. Feature teams interested in displaying promos should -// leverage this manager. +// leverage this manager, and only use the following methods: +// 1. RegisterPromoForSingleDisplay +// 2. RegisterPromoForContinuousDisplay +// 3. DeregisterPromo class PromosManager { public: - explicit PromosManager(PrefService* local_state); - ~PromosManager(); + PromosManager(); + virtual ~PromosManager(); + +#pragma mark - Public-facing APIs + + // Registers `promo` for continuous display, and persists registration status + // across app launches. + virtual void RegisterPromoForContinuousDisplay( + promos_manager::Promo promo) = 0; + + // Registers `promo` for single (one-time) display, and persists registration + // status across app launches. + virtual void RegisterPromoForSingleDisplay(promos_manager::Promo promo) = 0; + + // Deregisters `promo` (stopping `promo` from being displayed) by removing the + // promo entry from the single-display and continuous-display active promos + // lists. + virtual void DeregisterPromo(promos_manager::Promo promo) = 0; + +#pragma mark - Internal APIs + + // Initialize the Promos Manager by restoring state from Prefs. Must be called + // after creation and before any other operation. + virtual void Init(); + + // Ingests promo-specific impression limits and stores them in-memory for + // later reference. + virtual void InitializePromoImpressionLimits( + base::small_map< + std::map<promos_manager::Promo, NSArray<ImpressionLimit*>*>> + promo_impression_limits) = 0; // Records the impression of `promo` in the impression history. // // NOTE: If `promo` is a single-display promo, it will be automatically // deregistered. - void RecordImpression(promos_manager::Promo promo); - - // Ingests promo-specific impression limits and stores them in-memory for - // later reference. - void InitializePromoImpressionLimits( - base::small_map< - std::map<promos_manager::Promo, NSArray<ImpressionLimit*>*>> - promo_impression_limits); + virtual void RecordImpression(promos_manager::Promo promo) = 0; // Returns the next promo for display, if any. - absl::optional<promos_manager::Promo> NextPromoForDisplay() const; - - // Registers `promo` for continuous display, and persists registration status - // across app launches. - void RegisterPromoForContinuousDisplay(promos_manager::Promo promo); - - // Registers `promo` for single (one-time) display, and persists registration - // status across app launches. - void RegisterPromoForSingleDisplay(promos_manager::Promo promo); - - // Deregisters `promo` (stopping `promo` from being displayed) by removing the - // promo entry from the single-display and continuous-display active promos - // lists. - void DeregisterPromo(promos_manager::Promo promo); - - // Initialize the Promos Manager by restoring state from Prefs. Must be called - // after creation and before any other operation. - void Init(); - - private: - // Weak pointer to the local state prefs store. - const raw_ptr<PrefService> local_state_; - - // The set of currently active, continuous-display promos. - std::set<promos_manager::Promo> active_promos_; - - // The set of currently active, single-display promos. - std::set<promos_manager::Promo> single_display_active_promos_; - - // The impression history sorted by `day` (most recent -> least recent). - std::vector<promos_manager::Impression> impression_history_; - - // Promo-specific impression limits (promos_manager::Promo : [Impression - // Limits]). - base::small_map<std::map<promos_manager::Promo, NSArray<ImpressionLimit*>*>> - promo_impression_limits_; - - // `promo`-specific impression limits, if defined. May return an empty - // NSArray, indicating no promo-specific impression limits were defined for - // `promo`. - NSArray<ImpressionLimit*>* PromoImpressionLimits( - promos_manager::Promo promo) const; - - // Returns a std::vector<promos_manager::Promo> that only includes promos in - // `active_promos`, sorted by day (least recent -> most recent). - // - // Assumes that `sorted_impressions` is sorted by day (most recent -> least - // recent). - // - // When `active_promos` or `sorted_impressions` is empty, returns an empty - // array. - // - // Promos that have never been shown before are considered less recently shown - // than promos that have been shown. - // - // Promos shown on the same day will be sorted by relative position. More - // concretely, even if two promos are shown on the same day, the promos with - // the lower index in the impressions history list will be considered more - // recently seen, as `sorted_impressions` is sorted by day (most recent -> - // least recent). - std::vector<promos_manager::Promo> LeastRecentlyShown( - const std::set<promos_manager::Promo>& active_promos, - const std::vector<promos_manager::Impression>& sorted_impressions) const; - - // Impression limits that count against all promos. - NSArray<ImpressionLimit*>* GlobalImpressionLimits() const; - - // Impression limits that count against any given promo. - NSArray<ImpressionLimit*>* GlobalPerPromoImpressionLimits() const; - - // Loops over the stored impression history (base::Value::List) and returns - // corresponding a std::vector<promos_manager::Impression>. - std::vector<promos_manager::Impression> ImpressionHistory( - const base::Value::List& stored_impression_history); - - // Loops over the stored active promos list (base::Value::List) and returns - // a corresponding std::set<promos_manager::Promo>. - std::set<promos_manager::Promo> ActivePromos( - const base::Value::List& stored_active_promos); - - // Returns true if any impression limit from `impression_limits` is triggered, - // and false otherwise. - // - // At each limit, evaluates the following: - // - // (1) Is the current limit valid for evaluation? This is determined by - // whether or not `window_days` is < the current limit's window. - // - // (2) If the limit is valid for evaluation, compare `impression_count` with - // the current limit's impression count. If `impression_count` >= the current - // limit's impression count, the limit has been triggered. - - // (3) If the limit is triggered, exits early and returns true. Otherwise, - // keep going. - bool AnyImpressionLimitTriggered( - int impression_count, - int window_days, - NSArray<ImpressionLimit*>* impression_limits) const; - - // Algorithm loops over pre-sorted impressions history list. The algorithm - // assumes `valid_impressions` is sorted by impression day (most recent -> - // least recent). - // - // At each impression, the algorithm asks if either a time-based or - // time-agnostic impression limit has been met. If so, the algorithm exits - // early and returns false. - // - // If the algorithm reaches its end, no impression limits were hit for - // `promo`. If so, the algorithm returns true, as it's safe to display - // `promo`. - bool CanShowPromo( - promos_manager::Promo promo, - const std::vector<promos_manager::Impression>& sorted_impressions) const; - - // Returns a list of impression counts (std::vector<int>) from a promo - // impression counts map. - std::vector<int> ImpressionCounts( - std::map<promos_manager::Promo, int>& promo_impression_counts) const; - - // Returns the greatest impression count (int) from a promo impression counts - // map. - int MaxImpressionCount( - std::map<promos_manager::Promo, int>& promo_impression_counts) const; - - // Returns the total number of impressions (int) from a promo impression - // counts map. - int TotalImpressionCount( - std::map<promos_manager::Promo, int>& promo_impression_counts) const; - - // Allow unit tests to access private methods. - friend class PromosManagerTest; - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsImpressionCounts); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsEmptyImpressionCounts); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsTotalImpressionCount); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - ReturnsZeroForTotalImpressionCount); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsMaxImpressionCount); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsZeroForMaxImpressionCount); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - DetectsSingleImpressionLimitTriggered); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - DetectsOneOfMultipleImpressionLimitsTriggered); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - DetectsNoImpressionLimitTriggered); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, DecidesCanShowPromo); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, DecidesCannotShowPromo); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsLeastRecentlyShown); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - ReturnsLeastRecentlyShownWithSomeInactivePromos); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - ReturnsLeastRecentlyShownBreakingTies); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - ReturnsLeastRecentlyShownWithOnlyOnePromoActive); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - ReturnsLeastRecentlyShownWithoutImpressionHistory); - FRIEND_TEST_ALL_PREFIXES( - PromosManagerTest, - ReturnsEmptyListWhenLeastRecentlyShownHasNoActivePromoCampaigns); - FRIEND_TEST_ALL_PREFIXES( - PromosManagerTest, - ReturnsEmptyListWhenLeastRecentlyShownHasNoImpressionHistory); - FRIEND_TEST_ALL_PREFIXES( - PromosManagerTest, - SortsUnshownPromosBeforeShownPromosForLeastRecentlyShown); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsImpressionHistory); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - ReturnsBlankImpressionHistoryForBlankPrefs); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - ReturnsImpressionHistoryBySkippingMalformedEntries); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsActivePromos); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - ReturnsBlankActivePromosForBlankPrefs); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - ReturnsActivePromosAndSkipsMalformedData); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - RegistersPromoForContinuousDisplay); - FRIEND_TEST_ALL_PREFIXES( - PromosManagerTest, - RegistersPromoForContinuousDisplayAndImmediatelyUpdateVariables); - FRIEND_TEST_ALL_PREFIXES( - PromosManagerTest, - RegistersPromoForContinuousDisplayForEmptyActivePromos); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - RegistersAlreadyRegisteredPromoForContinuousDisplay); - FRIEND_TEST_ALL_PREFIXES( - PromosManagerTest, - RegistersAlreadyRegisteredPromoForContinuousDisplayForEmptyActivePromos); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, RegistersPromoForSingleDisplay); - FRIEND_TEST_ALL_PREFIXES( - PromosManagerTest, - RegistersPromoForSingleDisplayAndImmediatelyUpdateVariables); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - RegistersPromoForSingleDisplayForEmptyActivePromos); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - RegistersAlreadyRegisteredPromoForSingleDisplay); - FRIEND_TEST_ALL_PREFIXES( - PromosManagerTest, - RegistersAlreadyRegisteredPromoForSingleDisplayForEmptyActivePromos); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - RegistersPromoSpecificImpressionLimits); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, RecordsImpression); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - RecordsImpressionAndImmediatelyUpdateVariables); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, DeregistersActivePromo); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, - DeregistersActivePromoAndImmediatelyUpdateVariables); - FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, DeregistersNonExistentPromo); - FRIEND_TEST_ALL_PREFIXES( - PromosManagerTest, - DeregistersSingleDisplayPromoAfterRecordedImpression); + virtual absl::optional<promos_manager::Promo> NextPromoForDisplay() const = 0; }; #endif // IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_H_
diff --git a/ios/chrome/browser/promos_manager/promos_manager.mm b/ios/chrome/browser/promos_manager/promos_manager.mm index 63a30d52..47ba07d 100644 --- a/ios/chrome/browser/promos_manager/promos_manager.mm +++ b/ios/chrome/browser/promos_manager/promos_manager.mm
@@ -4,436 +4,15 @@ #import "ios/chrome/browser/promos_manager/promos_manager.h" -#import <Foundation/Foundation.h> - -#import <iterator> -#import <map> -#import <numeric> -#import <set> -#import <vector> - -#import "base/containers/contains.h" -#import "base/time/time.h" -#import "base/values.h" -#import "components/prefs/pref_service.h" -#import "components/prefs/scoped_user_pref_update.h" -#import "ios/chrome/browser/prefs/pref_names.h" -#import "ios/chrome/browser/promos_manager/constants.h" -#import "ios/chrome/browser/promos_manager/features.h" -#import "ios/chrome/browser/promos_manager/impression_limit.h" -#import "third_party/abseil-cpp/absl/types/optional.h" - #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif -namespace { - -// The number of days since the Unix epoch; one day, in this context, runs -// from UTC midnight to UTC midnight. -int TodaysDay() { - return (base::Time::Now() - base::Time::UnixEpoch()).InDays(); -} - -// Conditionally appends `promo` to the list pref `pref_path`. If `promo` -// already exists in the list pref `pref_path`, does nothing. If `promo` doesn't -// exist in the list pref `pref_path`, appends `promo` to the list. -void ConditionallyAppendPromoToPrefList(promos_manager::Promo promo, - const std::string& pref_path, - PrefService* local_state) { - DCHECK(local_state); - - ScopedListPrefUpdate update(local_state, pref_path); - base::Value::List& active_promos = update.Get(); - std::string promo_name = promos_manager::NameForPromo(promo); - - // Erase `promo_name` if it already exists in `active_promos`; avoid polluting - // `active_promos` with duplicate `promo_name` entries. - active_promos.EraseValue(base::Value(promo_name)); - - active_promos.Append(promo_name); -} - -} // namespace - -#pragma mark - PromosManager - #pragma mark - Constructor/Destructor -PromosManager::PromosManager(PrefService* local_state) - : local_state_(local_state) { - DCHECK(local_state_); -} +PromosManager::PromosManager() {} +PromosManager::~PromosManager() {} -PromosManager::~PromosManager() = default; +#pragma mark - Internal APIs -#pragma mark - Public - -void PromosManager::Init() { - if (!IsFullscreenPromosManagerEnabled()) - return; - - DCHECK(local_state_); - - active_promos_ = - ActivePromos(local_state_->GetList(prefs::kIosPromosManagerActivePromos)); - single_display_active_promos_ = ActivePromos( - local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos)); - impression_history_ = ImpressionHistory( - local_state_->GetList(prefs::kIosPromosManagerImpressions)); -} - -// Impression history should grow in sorted order. Given this happens on the -// main thread, appending to the end of the impression history list is -// sufficient. -void PromosManager::RecordImpression(promos_manager::Promo promo) { - DCHECK(local_state_); - - base::Value::Dict impression; - impression.Set(promos_manager::kImpressionPromoKey, - promos_manager::NameForPromo(promo)); - impression.Set(promos_manager::kImpressionDayKey, TodaysDay()); - - ScopedListPrefUpdate update(local_state_, - prefs::kIosPromosManagerImpressions); - update->Append(std::move(impression)); - - impression_history_ = ImpressionHistory( - local_state_->GetList(prefs::kIosPromosManagerImpressions)); - - // Auto-deregister `promo` if it's a single-display promo. - if (single_display_active_promos_.find(promo) != - single_display_active_promos_.end()) { - DeregisterPromo(promo); - } -} - -void PromosManager::RegisterPromoForContinuousDisplay( - promos_manager::Promo promo) { - ConditionallyAppendPromoToPrefList( - promo, prefs::kIosPromosManagerActivePromos, local_state_); - - active_promos_ = - ActivePromos(local_state_->GetList(prefs::kIosPromosManagerActivePromos)); -} - -void PromosManager::RegisterPromoForSingleDisplay(promos_manager::Promo promo) { - ConditionallyAppendPromoToPrefList( - promo, prefs::kIosPromosManagerSingleDisplayActivePromos, local_state_); - - single_display_active_promos_ = ActivePromos( - local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos)); -} - -void PromosManager::DeregisterPromo(promos_manager::Promo promo) { - DCHECK(local_state_); - - ScopedListPrefUpdate active_promos_update( - local_state_, prefs::kIosPromosManagerActivePromos); - ScopedListPrefUpdate single_display_promos_update( - local_state_, prefs::kIosPromosManagerSingleDisplayActivePromos); - - base::Value::List& active_promos = active_promos_update.Get(); - base::Value::List& single_display_promos = single_display_promos_update.Get(); - - std::string promo_name = promos_manager::NameForPromo(promo); - - // Erase `promo_name` from the single-display and continuous-display active - // promos lists. - active_promos.EraseValue(base::Value(promo_name)); - single_display_promos.EraseValue(base::Value(promo_name)); - - active_promos_ = - ActivePromos(local_state_->GetList(prefs::kIosPromosManagerActivePromos)); - single_display_active_promos_ = ActivePromos( - local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos)); -} - -void PromosManager::InitializePromoImpressionLimits( - base::small_map<std::map<promos_manager::Promo, NSArray<ImpressionLimit*>*>> - promo_impression_limits) { - promo_impression_limits_ = std::move(promo_impression_limits); -} - -absl::optional<promos_manager::Promo> PromosManager::NextPromoForDisplay() - const { - // Construct a superset including active (1) single-display and - // (2) continuous-display promo campaigns. - std::set<promos_manager::Promo> all_active_promos(active_promos_); - - // Non-destructively insert the single-display promos into - // `all_active_promos`. - all_active_promos.insert(single_display_active_promos_.begin(), - single_display_active_promos_.end()); - - std::vector<promos_manager::Promo> least_recently_shown_promos = - LeastRecentlyShown(all_active_promos, impression_history_); - - if (least_recently_shown_promos.empty()) - return absl::nullopt; - - for (promos_manager::Promo promo : least_recently_shown_promos) - if (CanShowPromo(promo, impression_history_)) - return promo; - - return absl::nullopt; -} - -#pragma mark - Private - -std::vector<promos_manager::Impression> PromosManager::ImpressionHistory( - const base::Value::List& stored_impression_history) { - std::vector<promos_manager::Impression> impression_history; - - for (size_t i = 0; i < stored_impression_history.size(); ++i) { - const base::Value::Dict& stored_impression = - stored_impression_history[i].GetDict(); - const std::string* stored_promo = - stored_impression.FindString(promos_manager::kImpressionPromoKey); - absl::optional<int> stored_day = - stored_impression.FindInt(promos_manager::kImpressionDayKey); - - // Skip malformed impression history. (This should almost never happen.) - if (!stored_promo || !stored_day.has_value()) - continue; - - absl::optional<promos_manager::Promo> promo = - promos_manager::PromoForName(*stored_promo); - - // Skip malformed impression history. (This should almost never happen.) - if (!promo.has_value()) - continue; - - impression_history.push_back( - promos_manager::Impression(promo.value(), stored_day.value())); - } - - return impression_history; -} - -std::set<promos_manager::Promo> PromosManager::ActivePromos( - const base::Value::List& stored_active_promos) { - std::set<promos_manager::Promo> active_promos; - - for (size_t i = 0; i < stored_active_promos.size(); ++i) { - absl::optional<promos_manager::Promo> promo = - promos_manager::PromoForName(stored_active_promos[i].GetString()); - - // Skip malformed active promos data. (This should almost never happen.) - if (!promo.has_value()) - continue; - - active_promos.insert(promo.value()); - } - - return active_promos; -} - -NSArray<ImpressionLimit*>* PromosManager::PromoImpressionLimits( - promos_manager::Promo promo) const { - auto it = promo_impression_limits_.find(promo); - - if (it == promo_impression_limits_.end()) - return @[]; - - return it->second; -} - -NSArray<ImpressionLimit*>* PromosManager::GlobalImpressionLimits() const { - static NSArray<ImpressionLimit*>* limits; - static dispatch_once_t onceToken; - - if (IsSkippingInternalImpressionLimitsEnabled()) { - return limits; - } - - dispatch_once(&onceToken, ^{ - ImpressionLimit* onceEveryTwoDays = - [[ImpressionLimit alloc] initWithLimit:1 forNumDays:2]; - ImpressionLimit* thricePerWeek = [[ImpressionLimit alloc] initWithLimit:3 - forNumDays:7]; - limits = @[ onceEveryTwoDays, thricePerWeek ]; - }); - - return limits; -} - -NSArray<ImpressionLimit*>* PromosManager::GlobalPerPromoImpressionLimits() - const { - static NSArray<ImpressionLimit*>* limits; - static dispatch_once_t onceToken; - - if (IsSkippingInternalImpressionLimitsEnabled()) { - return limits; - } - - dispatch_once(&onceToken, ^{ - ImpressionLimit* oncePerMonth = [[ImpressionLimit alloc] initWithLimit:1 - forNumDays:30]; - limits = @[ oncePerMonth ]; - }); - - return limits; -} - -bool PromosManager::AnyImpressionLimitTriggered( - int impression_count, - int window_days, - NSArray<ImpressionLimit*>* impression_limits) const { - for (ImpressionLimit* impression_limit in impression_limits) { - if (window_days < impression_limit.numDays && - impression_count >= impression_limit.numImpressions) - return true; - } - - return false; -} - -bool PromosManager::CanShowPromo( - promos_manager::Promo promo, - const std::vector<promos_manager::Impression>& sorted_impressions) const { - // Maintains a map ([promos_manager::Promo] : [current impression count]) for - // evaluating against GlobalImpressionLimits(), - // GlobalPerPromoImpressionLimits(), and, if defined, `promo`-specific - // impression limits - std::map<promos_manager::Promo, int> promo_impression_counts; - - NSArray<ImpressionLimit*>* promo_impression_limits = - PromoImpressionLimits(promo); - NSArray<ImpressionLimit*>* global_per_promo_impression_limits = - GlobalPerPromoImpressionLimits(); - NSArray<ImpressionLimit*>* global_impression_limits = - GlobalImpressionLimits(); - - int window_start = TodaysDay(); - int window_end = - (window_start - promos_manager::kNumDaysImpressionHistoryStored) + 1; - size_t curr_impression_index = 0; - - // Impression limits are defined by a certain number of impressions - // (int) within a certain window of days (int). - // - // This loop starts at TodaysDay() (today) and grows a window, day-by-day, to - // check against different impression limits. - // - // Depending on the size of the window, impression limits may become valid or - // invalid. For example, if the window covers 7 days, an impression limit of - // 2-day scope is no longer valid. However, if window covered 1-2 days, an - // impression limit of 2-day scope is valid. - for (int curr_day = window_start; curr_day >= window_end; --curr_day) { - if (curr_impression_index < sorted_impressions.size()) { - promos_manager::Impression curr_impression = - sorted_impressions[curr_impression_index]; - // If the current impression matches the current day, add it to - // `promo_impression_counts`. - if (curr_impression.day == curr_day) { - promo_impression_counts[curr_impression.promo]++; - curr_impression_index++; - } else { - // Only check impression limits when counts are incremented: if an - // impression limit were to be triggered below - but counts weren't - // incremented above - it wouldve've already been triggered in a - // previous loop run. - continue; - } - } - - int window_days = window_start - curr_day; - int promo_impression_count = promo_impression_counts[promo]; - int most_seen_promo_impression_count = - MaxImpressionCount(promo_impression_counts); - int total_impression_count = TotalImpressionCount(promo_impression_counts); - - if (AnyImpressionLimitTriggered(promo_impression_count, window_days, - promo_impression_limits) || - AnyImpressionLimitTriggered(most_seen_promo_impression_count, - window_days, - global_per_promo_impression_limits) || - AnyImpressionLimitTriggered(total_impression_count, window_days, - global_impression_limits)) - return false; - } - - return true; -} - -std::vector<int> PromosManager::ImpressionCounts( - std::map<promos_manager::Promo, int>& promo_impression_counts) const { - std::vector<int> counts; - - for (const auto& [promo, count] : promo_impression_counts) - counts.push_back(count); - - return counts; -} - -int PromosManager::MaxImpressionCount( - std::map<promos_manager::Promo, int>& promo_impression_counts) const { - std::vector<int> counts = ImpressionCounts(promo_impression_counts); - std::vector<int>::iterator max_count_iter = - std::max_element(counts.begin(), counts.end()); - size_t index = std::distance(counts.begin(), max_count_iter); - if (index < counts.size()) - return counts[index]; - return 0; -} - -int PromosManager::TotalImpressionCount( - std::map<promos_manager::Promo, int>& promo_impression_counts) const { - std::vector<int> counts = ImpressionCounts(promo_impression_counts); - - return std::accumulate(counts.begin(), counts.end(), 0); -} - -std::vector<promos_manager::Promo> PromosManager::LeastRecentlyShown( - const std::set<promos_manager::Promo>& active_promos, - const std::vector<promos_manager::Impression>& sorted_impressions) const { - std::vector<promos_manager::Promo> - active_promos_sorted_by_least_recently_shown; - - // If there are no active promos, and no impression history, return an empty - // array. (This is seldom expected to happen, if ever, as Promos Manager will - // launch with promos_manager::Promo::DefaultBrowser continuously running.) - if (active_promos.empty() && sorted_impressions.empty()) - return active_promos_sorted_by_least_recently_shown; - - for (promos_manager::Impression impression : sorted_impressions) { - // The resulting, sorted array only needs to contain the active promos. Once - // all active promos are accounted for in - // `active_promos_sorted_by_least_recently_shown`, we can short-circuit and - // return `active_promos_sorted_by_least_recently_shown`. - if (active_promos_sorted_by_least_recently_shown.size() == - active_promos.size()) - break; - - // If the current impression's promo already exists in - // `active_promos_sorted_by_least_recently_shown`, move onto the next - // impression. - if (base::Contains(active_promos_sorted_by_least_recently_shown, - impression.promo)) { - continue; - } - - if (active_promos.count(impression.promo)) - active_promos_sorted_by_least_recently_shown.push_back(impression.promo); - } - - // It's possible some active promos have never been seen (so no impressions - // exist for the promo). In that case, add them to the end of the resulting - // array, before the array is reversed. Those never-before-seen promos will - // end up at the front of the resulting array after reversal. - // - // Never-before-seen promos are considered less recently seen than previously - // seen promos. - for (promos_manager::Promo unseen_promo : active_promos) { - if (!base::Contains(active_promos_sorted_by_least_recently_shown, - unseen_promo)) { - active_promos_sorted_by_least_recently_shown.push_back(unseen_promo); - } - } - - std::reverse(active_promos_sorted_by_least_recently_shown.begin(), - active_promos_sorted_by_least_recently_shown.end()); - - return active_promos_sorted_by_least_recently_shown; -} +void PromosManager::Init() {}
diff --git a/ios/chrome/browser/promos_manager/promos_manager_impl.h b/ios/chrome/browser/promos_manager/promos_manager_impl.h new file mode 100644 index 0000000..2aabe457 --- /dev/null +++ b/ios/chrome/browser/promos_manager/promos_manager_impl.h
@@ -0,0 +1,152 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_IMPL_H_ +#define IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_IMPL_H_ + +#import "ios/chrome/browser/promos_manager/promos_manager.h" + +#import <Foundation/Foundation.h> +#import <map> +#import <set> +#import <vector> + +#import "base/containers/small_map.h" +#import "base/values.h" +#import "components/prefs/pref_service.h" +#import "ios/chrome/browser/promos_manager/constants.h" +#import "ios/chrome/browser/promos_manager/impression_limit.h" +#import "third_party/abseil-cpp/absl/types/optional.h" + +// Centralized promos manager for coordinating and scheduling the display of +// app-wide promos. Feature teams should not use this directly, use +// promo_manager.h instead. +class PromosManagerImpl : public PromosManager { + public: + explicit PromosManagerImpl(PrefService* local_state); + ~PromosManagerImpl() override; + + // `promo`-specific impression limits, if defined. May return an empty + // NSArray, indicating no promo-specific impression limits were defined for + // `promo`. + NSArray<ImpressionLimit*>* PromoImpressionLimits( + promos_manager::Promo promo) const; + + // Returns a std::vector<promos_manager::Promo> that only includes promos in + // `active_promos`, sorted by day (least recent -> most recent). + // + // Assumes that `sorted_impressions` is sorted by day (most recent -> least + // recent). + // + // When `active_promos` or `sorted_impressions` is empty, returns an empty + // array. + // + // Promos that have never been shown before are considered less recently shown + // than promos that have been shown. + // + // Promos shown on the same day will be sorted by relative position. More + // concretely, even if two promos are shown on the same day, the promos with + // the lower index in the impressions history list will be considered more + // recently seen, as `sorted_impressions` is sorted by day (most recent -> + // least recent). + std::vector<promos_manager::Promo> LeastRecentlyShown( + const std::set<promos_manager::Promo>& active_promos, + const std::vector<promos_manager::Impression>& sorted_impressions) const; + + // Impression limits that count against all promos. + NSArray<ImpressionLimit*>* GlobalImpressionLimits() const; + + // Impression limits that count against any given promo. + NSArray<ImpressionLimit*>* GlobalPerPromoImpressionLimits() const; + + // Loops over the stored impression history (base::Value::List) and returns + // corresponding a std::vector<promos_manager::Impression>. + std::vector<promos_manager::Impression> ImpressionHistory( + const base::Value::List& stored_impression_history); + + // Loops over the stored active promos list (base::Value::List) and returns + // a corresponding std::set<promos_manager::Promo>. + std::set<promos_manager::Promo> ActivePromos( + const base::Value::List& stored_active_promos); + + // Returns true if any impression limit from `impression_limits` is triggered, + // and false otherwise. + // + // At each limit, evaluates the following: + // + // (1) Is the current limit valid for evaluation? This is determined by + // whether or not `window_days` is < the current limit's window. + // + // (2) If the limit is valid for evaluation, compare `impression_count` with + // the current limit's impression count. If `impression_count` >= the current + // limit's impression count, the limit has been triggered. + + // (3) If the limit is triggered, exits early and returns true. Otherwise, + // keep going. + bool AnyImpressionLimitTriggered( + int impression_count, + int window_days, + NSArray<ImpressionLimit*>* impression_limits) const; + + // Algorithm loops over pre-sorted impressions history list. The algorithm + // assumes `valid_impressions` is sorted by impression day (most recent -> + // least recent). + // + // At each impression, the algorithm asks if either a time-based or + // time-agnostic impression limit has been met. If so, the algorithm exits + // early and returns false. + // + // If the algorithm reaches its end, no impression limits were hit for + // `promo`. If so, the algorithm returns true, as it's safe to display + // `promo`. + bool CanShowPromo( + promos_manager::Promo promo, + const std::vector<promos_manager::Impression>& sorted_impressions) const; + + // Returns a list of impression counts (std::vector<int>) from a promo + // impression counts map. + std::vector<int> ImpressionCounts( + std::map<promos_manager::Promo, int>& promo_impression_counts) const; + + // Returns the greatest impression count (int) from a promo impression counts + // map. + int MaxImpressionCount( + std::map<promos_manager::Promo, int>& promo_impression_counts) const; + + // Returns the total number of impressions (int) from a promo impression + // counts map. + int TotalImpressionCount( + std::map<promos_manager::Promo, int>& promo_impression_counts) const; + + // PromosManager implementation. + void Init() override; + void InitializePromoImpressionLimits( + base::small_map< + std::map<promos_manager::Promo, NSArray<ImpressionLimit*>*>> + promo_impression_limits) override; + void RecordImpression(promos_manager::Promo promo) override; + absl::optional<promos_manager::Promo> NextPromoForDisplay() const override; + void RegisterPromoForContinuousDisplay(promos_manager::Promo promo) override; + void RegisterPromoForSingleDisplay(promos_manager::Promo promo) override; + void DeregisterPromo(promos_manager::Promo promo) override; + + // Weak pointer to the local state prefs store. + const raw_ptr<PrefService> local_state_; + + // The set of currently active, continuous-display promos. + std::set<promos_manager::Promo> active_promos_; + + // The set of currently active, single-display promos. + std::set<promos_manager::Promo> single_display_active_promos_; + + // The impression history sorted by `day` (most recent -> least recent). + std::vector<promos_manager::Impression> impression_history_; + + // Promo-specific impression limits (promos_manager::Promo : [Impression + // Limits]). + base::small_map<std::map<promos_manager::Promo, NSArray<ImpressionLimit*>*>> + promo_impression_limits_; +}; + +#endif // IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_IMPL_H_
diff --git a/ios/chrome/browser/promos_manager/promos_manager_impl.mm b/ios/chrome/browser/promos_manager/promos_manager_impl.mm new file mode 100644 index 0000000..4ff7144 --- /dev/null +++ b/ios/chrome/browser/promos_manager/promos_manager_impl.mm
@@ -0,0 +1,440 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/promos_manager/promos_manager_impl.h" + +#import <Foundation/Foundation.h> + +#import <iterator> +#import <map> +#import <numeric> +#import <set> +#import <vector> + +#import "base/containers/contains.h" +#import "base/time/time.h" +#import "base/values.h" +#import "components/prefs/pref_service.h" +#import "components/prefs/scoped_user_pref_update.h" +#import "ios/chrome/browser/prefs/pref_names.h" +#import "ios/chrome/browser/promos_manager/constants.h" +#import "ios/chrome/browser/promos_manager/features.h" +#import "ios/chrome/browser/promos_manager/impression_limit.h" +#import "third_party/abseil-cpp/absl/types/optional.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { + +// The number of days since the Unix epoch; one day, in this context, runs +// from UTC midnight to UTC midnight. +int TodaysDay() { + return (base::Time::Now() - base::Time::UnixEpoch()).InDays(); +} + +// Conditionally appends `promo` to the list pref `pref_path`. If `promo` +// already exists in the list pref `pref_path`, does nothing. If `promo` doesn't +// exist in the list pref `pref_path`, appends `promo` to the list. +void ConditionallyAppendPromoToPrefList(promos_manager::Promo promo, + const std::string& pref_path, + PrefService* local_state) { + DCHECK(local_state); + + ScopedListPrefUpdate update(local_state, pref_path); + base::Value::List& active_promos = update.Get(); + std::string promo_name = promos_manager::NameForPromo(promo); + + // Erase `promo_name` if it already exists in `active_promos`; avoid polluting + // `active_promos` with duplicate `promo_name` entries. + active_promos.EraseValue(base::Value(promo_name)); + + active_promos.Append(promo_name); +} + +} // namespace + +#pragma mark - PromosManagerImpl + +#pragma mark - Constructor/Destructor + +PromosManagerImpl::PromosManagerImpl(PrefService* local_state) + : local_state_(local_state) { + DCHECK(local_state_); +} + +PromosManagerImpl::~PromosManagerImpl() = default; + +#pragma mark - Public + +void PromosManagerImpl::Init() { + if (!IsFullscreenPromosManagerEnabled()) + return; + + DCHECK(local_state_); + + active_promos_ = + ActivePromos(local_state_->GetList(prefs::kIosPromosManagerActivePromos)); + single_display_active_promos_ = ActivePromos( + local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos)); + impression_history_ = ImpressionHistory( + local_state_->GetList(prefs::kIosPromosManagerImpressions)); +} + +// Impression history should grow in sorted order. Given this happens on the +// main thread, appending to the end of the impression history list is +// sufficient. +void PromosManagerImpl::RecordImpression(promos_manager::Promo promo) { + DCHECK(local_state_); + + base::Value::Dict impression; + impression.Set(promos_manager::kImpressionPromoKey, + promos_manager::NameForPromo(promo)); + impression.Set(promos_manager::kImpressionDayKey, TodaysDay()); + + ScopedListPrefUpdate update(local_state_, + prefs::kIosPromosManagerImpressions); + update->Append(std::move(impression)); + + impression_history_ = ImpressionHistory( + local_state_->GetList(prefs::kIosPromosManagerImpressions)); + + // Auto-deregister `promo` if it's a single-display promo. + if (single_display_active_promos_.find(promo) != + single_display_active_promos_.end()) { + DeregisterPromo(promo); + } +} + +void PromosManagerImpl::RegisterPromoForContinuousDisplay( + promos_manager::Promo promo) { + ConditionallyAppendPromoToPrefList( + promo, prefs::kIosPromosManagerActivePromos, local_state_); + + active_promos_ = + ActivePromos(local_state_->GetList(prefs::kIosPromosManagerActivePromos)); +} + +void PromosManagerImpl::RegisterPromoForSingleDisplay( + promos_manager::Promo promo) { + ConditionallyAppendPromoToPrefList( + promo, prefs::kIosPromosManagerSingleDisplayActivePromos, local_state_); + + single_display_active_promos_ = ActivePromos( + local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos)); +} + +void PromosManagerImpl::DeregisterPromo(promos_manager::Promo promo) { + DCHECK(local_state_); + + ScopedListPrefUpdate active_promos_update( + local_state_, prefs::kIosPromosManagerActivePromos); + ScopedListPrefUpdate single_display_promos_update( + local_state_, prefs::kIosPromosManagerSingleDisplayActivePromos); + + base::Value::List& active_promos = active_promos_update.Get(); + base::Value::List& single_display_promos = single_display_promos_update.Get(); + + std::string promo_name = promos_manager::NameForPromo(promo); + + // Erase `promo_name` from the single-display and continuous-display active + // promos lists. + active_promos.EraseValue(base::Value(promo_name)); + single_display_promos.EraseValue(base::Value(promo_name)); + + active_promos_ = + ActivePromos(local_state_->GetList(prefs::kIosPromosManagerActivePromos)); + single_display_active_promos_ = ActivePromos( + local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos)); +} + +void PromosManagerImpl::InitializePromoImpressionLimits( + base::small_map<std::map<promos_manager::Promo, NSArray<ImpressionLimit*>*>> + promo_impression_limits) { + promo_impression_limits_ = std::move(promo_impression_limits); +} + +absl::optional<promos_manager::Promo> PromosManagerImpl::NextPromoForDisplay() + const { + // Construct a superset including active (1) single-display and + // (2) continuous-display promo campaigns. + std::set<promos_manager::Promo> all_active_promos(active_promos_); + + // Non-destructively insert the single-display promos into + // `all_active_promos`. + all_active_promos.insert(single_display_active_promos_.begin(), + single_display_active_promos_.end()); + + std::vector<promos_manager::Promo> least_recently_shown_promos = + LeastRecentlyShown(all_active_promos, impression_history_); + + if (least_recently_shown_promos.empty()) + return absl::nullopt; + + for (promos_manager::Promo promo : least_recently_shown_promos) + if (CanShowPromo(promo, impression_history_)) + return promo; + + return absl::nullopt; +} + +#pragma mark - Private + +std::vector<promos_manager::Impression> PromosManagerImpl::ImpressionHistory( + const base::Value::List& stored_impression_history) { + std::vector<promos_manager::Impression> impression_history; + + for (size_t i = 0; i < stored_impression_history.size(); ++i) { + const base::Value::Dict& stored_impression = + stored_impression_history[i].GetDict(); + const std::string* stored_promo = + stored_impression.FindString(promos_manager::kImpressionPromoKey); + absl::optional<int> stored_day = + stored_impression.FindInt(promos_manager::kImpressionDayKey); + + // Skip malformed impression history. (This should almost never happen.) + if (!stored_promo || !stored_day.has_value()) + continue; + + absl::optional<promos_manager::Promo> promo = + promos_manager::PromoForName(*stored_promo); + + // Skip malformed impression history. (This should almost never happen.) + if (!promo.has_value()) + continue; + + impression_history.push_back( + promos_manager::Impression(promo.value(), stored_day.value())); + } + + return impression_history; +} + +std::set<promos_manager::Promo> PromosManagerImpl::ActivePromos( + const base::Value::List& stored_active_promos) { + std::set<promos_manager::Promo> active_promos; + + for (size_t i = 0; i < stored_active_promos.size(); ++i) { + absl::optional<promos_manager::Promo> promo = + promos_manager::PromoForName(stored_active_promos[i].GetString()); + + // Skip malformed active promos data. (This should almost never happen.) + if (!promo.has_value()) + continue; + + active_promos.insert(promo.value()); + } + + return active_promos; +} + +NSArray<ImpressionLimit*>* PromosManagerImpl::PromoImpressionLimits( + promos_manager::Promo promo) const { + auto it = promo_impression_limits_.find(promo); + + if (it == promo_impression_limits_.end()) + return @[]; + + return it->second; +} + +NSArray<ImpressionLimit*>* PromosManagerImpl::GlobalImpressionLimits() const { + static NSArray<ImpressionLimit*>* limits; + static dispatch_once_t onceToken; + + if (IsSkippingInternalImpressionLimitsEnabled()) { + return limits; + } + + dispatch_once(&onceToken, ^{ + ImpressionLimit* onceEveryTwoDays = + [[ImpressionLimit alloc] initWithLimit:1 forNumDays:2]; + ImpressionLimit* thricePerWeek = [[ImpressionLimit alloc] initWithLimit:3 + forNumDays:7]; + limits = @[ onceEveryTwoDays, thricePerWeek ]; + }); + + return limits; +} + +NSArray<ImpressionLimit*>* PromosManagerImpl::GlobalPerPromoImpressionLimits() + const { + static NSArray<ImpressionLimit*>* limits; + static dispatch_once_t onceToken; + + if (IsSkippingInternalImpressionLimitsEnabled()) { + return limits; + } + + dispatch_once(&onceToken, ^{ + ImpressionLimit* oncePerMonth = [[ImpressionLimit alloc] initWithLimit:1 + forNumDays:30]; + limits = @[ oncePerMonth ]; + }); + + return limits; +} + +bool PromosManagerImpl::AnyImpressionLimitTriggered( + int impression_count, + int window_days, + NSArray<ImpressionLimit*>* impression_limits) const { + for (ImpressionLimit* impression_limit in impression_limits) { + if (window_days < impression_limit.numDays && + impression_count >= impression_limit.numImpressions) + return true; + } + + return false; +} + +bool PromosManagerImpl::CanShowPromo( + promos_manager::Promo promo, + const std::vector<promos_manager::Impression>& sorted_impressions) const { + // Maintains a map ([promos_manager::Promo] : [current impression count]) for + // evaluating against GlobalImpressionLimits(), + // GlobalPerPromoImpressionLimits(), and, if defined, `promo`-specific + // impression limits + std::map<promos_manager::Promo, int> promo_impression_counts; + + NSArray<ImpressionLimit*>* promo_impression_limits = + PromoImpressionLimits(promo); + NSArray<ImpressionLimit*>* global_per_promo_impression_limits = + GlobalPerPromoImpressionLimits(); + NSArray<ImpressionLimit*>* global_impression_limits = + GlobalImpressionLimits(); + + int window_start = TodaysDay(); + int window_end = + (window_start - promos_manager::kNumDaysImpressionHistoryStored) + 1; + size_t curr_impression_index = 0; + + // Impression limits are defined by a certain number of impressions + // (int) within a certain window of days (int). + // + // This loop starts at TodaysDay() (today) and grows a window, day-by-day, to + // check against different impression limits. + // + // Depending on the size of the window, impression limits may become valid or + // invalid. For example, if the window covers 7 days, an impression limit of + // 2-day scope is no longer valid. However, if window covered 1-2 days, an + // impression limit of 2-day scope is valid. + for (int curr_day = window_start; curr_day >= window_end; --curr_day) { + if (curr_impression_index < sorted_impressions.size()) { + promos_manager::Impression curr_impression = + sorted_impressions[curr_impression_index]; + // If the current impression matches the current day, add it to + // `promo_impression_counts`. + if (curr_impression.day == curr_day) { + promo_impression_counts[curr_impression.promo]++; + curr_impression_index++; + } else { + // Only check impression limits when counts are incremented: if an + // impression limit were to be triggered below - but counts weren't + // incremented above - it wouldve've already been triggered in a + // previous loop run. + continue; + } + } + + int window_days = window_start - curr_day; + int promo_impression_count = promo_impression_counts[promo]; + int most_seen_promo_impression_count = + MaxImpressionCount(promo_impression_counts); + int total_impression_count = TotalImpressionCount(promo_impression_counts); + + if (AnyImpressionLimitTriggered(promo_impression_count, window_days, + promo_impression_limits) || + AnyImpressionLimitTriggered(most_seen_promo_impression_count, + window_days, + global_per_promo_impression_limits) || + AnyImpressionLimitTriggered(total_impression_count, window_days, + global_impression_limits)) + return false; + } + + return true; +} + +std::vector<int> PromosManagerImpl::ImpressionCounts( + std::map<promos_manager::Promo, int>& promo_impression_counts) const { + std::vector<int> counts; + + for (const auto& [promo, count] : promo_impression_counts) + counts.push_back(count); + + return counts; +} + +int PromosManagerImpl::MaxImpressionCount( + std::map<promos_manager::Promo, int>& promo_impression_counts) const { + std::vector<int> counts = ImpressionCounts(promo_impression_counts); + std::vector<int>::iterator max_count_iter = + std::max_element(counts.begin(), counts.end()); + size_t index = std::distance(counts.begin(), max_count_iter); + if (index < counts.size()) + return counts[index]; + return 0; +} + +int PromosManagerImpl::TotalImpressionCount( + std::map<promos_manager::Promo, int>& promo_impression_counts) const { + std::vector<int> counts = ImpressionCounts(promo_impression_counts); + + return std::accumulate(counts.begin(), counts.end(), 0); +} + +std::vector<promos_manager::Promo> PromosManagerImpl::LeastRecentlyShown( + const std::set<promos_manager::Promo>& active_promos, + const std::vector<promos_manager::Impression>& sorted_impressions) const { + std::vector<promos_manager::Promo> + active_promos_sorted_by_least_recently_shown; + + // If there are no active promos, and no impression history, return an empty + // array. (This is seldom expected to happen, if ever, as Promos Manager will + // launch with promos_manager::Promo::DefaultBrowser continuously running.) + if (active_promos.empty() && sorted_impressions.empty()) + return active_promos_sorted_by_least_recently_shown; + + for (promos_manager::Impression impression : sorted_impressions) { + // The resulting, sorted array only needs to contain the active promos. Once + // all active promos are accounted for in + // `active_promos_sorted_by_least_recently_shown`, we can short-circuit and + // return `active_promos_sorted_by_least_recently_shown`. + if (active_promos_sorted_by_least_recently_shown.size() == + active_promos.size()) + break; + + // If the current impression's promo already exists in + // `active_promos_sorted_by_least_recently_shown`, move onto the next + // impression. + if (base::Contains(active_promos_sorted_by_least_recently_shown, + impression.promo)) { + continue; + } + + if (active_promos.count(impression.promo)) + active_promos_sorted_by_least_recently_shown.push_back(impression.promo); + } + + // It's possible some active promos have never been seen (so no impressions + // exist for the promo). In that case, add them to the end of the resulting + // array, before the array is reversed. Those never-before-seen promos will + // end up at the front of the resulting array after reversal. + // + // Never-before-seen promos are considered less recently seen than previously + // seen promos. + for (promos_manager::Promo unseen_promo : active_promos) { + if (!base::Contains(active_promos_sorted_by_least_recently_shown, + unseen_promo)) { + active_promos_sorted_by_least_recently_shown.push_back(unseen_promo); + } + } + + std::reverse(active_promos_sorted_by_least_recently_shown.begin(), + active_promos_sorted_by_least_recently_shown.end()); + + return active_promos_sorted_by_least_recently_shown; +}
diff --git a/ios/chrome/browser/promos_manager/promos_manager_unittest.mm b/ios/chrome/browser/promos_manager/promos_manager_impl_unittest.mm similarity index 90% rename from ios/chrome/browser/promos_manager/promos_manager_unittest.mm rename to ios/chrome/browser/promos_manager/promos_manager_impl_unittest.mm index 8efc1130..1f3ec78b 100644 --- a/ios/chrome/browser/promos_manager/promos_manager_unittest.mm +++ b/ios/chrome/browser/promos_manager/promos_manager_impl_unittest.mm
@@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/chrome/browser/promos_manager/promos_manager_unittest.h" - #import <Foundation/Foundation.h> #import <set> #import <vector> @@ -18,6 +16,7 @@ #import "ios/chrome/browser/promos_manager/impression_limit.h" #import "ios/chrome/browser/promos_manager/promo.h" #import "ios/chrome/browser/promos_manager/promos_manager.h" +#import "ios/chrome/browser/promos_manager/promos_manager_impl.h" #import "testing/platform_test.h" #import "third_party/abseil-cpp/absl/types/optional.h" @@ -35,12 +34,38 @@ } // namespace -PromosManagerTest::PromosManagerTest() { +class PromosManagerImplTest : public PlatformTest { + public: + PromosManagerImplTest(); + ~PromosManagerImplTest() override; + + // Creates a mock promo without impression limits. + Promo* TestPromo(); + + // Creates a mock promo with impression limits. + Promo* TestPromoWithImpressionLimits(); + + // Creates mock impression limits. + NSArray<ImpressionLimit*>* TestImpressionLimits(); + + protected: + // Creates PromosManager with empty pref data. + void CreatePromosManager(); + + // Create pref registry for tests. + void CreatePrefs(); + + std::unique_ptr<TestingPrefServiceSimple> local_state_; + std::unique_ptr<PromosManagerImpl> promos_manager_; + base::test::ScopedFeatureList scoped_feature_list_; +}; + +PromosManagerImplTest::PromosManagerImplTest() { scoped_feature_list_.InitWithFeatures({kFullscreenPromosManager}, {}); } -PromosManagerTest::~PromosManagerTest() {} +PromosManagerImplTest::~PromosManagerImplTest() {} -NSArray<ImpressionLimit*>* PromosManagerTest::TestImpressionLimits() { +NSArray<ImpressionLimit*>* PromosManagerImplTest::TestImpressionLimits() { static NSArray<ImpressionLimit*>* limits; static dispatch_once_t onceToken; @@ -55,23 +80,23 @@ return limits; } -Promo* PromosManagerTest::TestPromo() { +Promo* PromosManagerImplTest::TestPromo() { return [[Promo alloc] initWithIdentifier:promos_manager::Promo::Test]; } -Promo* PromosManagerTest::TestPromoWithImpressionLimits() { +Promo* PromosManagerImplTest::TestPromoWithImpressionLimits() { return [[Promo alloc] initWithIdentifier:promos_manager::Promo::Test andImpressionLimits:TestImpressionLimits()]; } -void PromosManagerTest::CreatePromosManager() { +void PromosManagerImplTest::CreatePromosManager() { CreatePrefs(); - promos_manager_ = std::make_unique<PromosManager>(local_state_.get()); + promos_manager_ = std::make_unique<PromosManagerImpl>(local_state_.get()); promos_manager_->Init(); } // Create pref registry for tests. -void PromosManagerTest::CreatePrefs() { +void PromosManagerImplTest::CreatePrefs() { local_state_ = std::make_unique<TestingPrefServiceSimple>(); local_state_->registry()->RegisterListPref( @@ -82,9 +107,9 @@ prefs::kIosPromosManagerSingleDisplayActivePromos); } -// Tests the initializer correctly creates a PromosManager* with the +// Tests the initializer correctly creates a PromosManagerImpl* with the // specified Pref service. -TEST_F(PromosManagerTest, InitWithPrefService) { +TEST_F(PromosManagerImplTest, InitWithPrefService) { CreatePromosManager(); EXPECT_NE(local_state_->FindPreference(prefs::kIosPromosManagerImpressions), @@ -102,45 +127,45 @@ // Tests promos_manager::NameForPromo correctly returns the string // representation of a given promo. -TEST_F(PromosManagerTest, ReturnsNameForTestPromo) { +TEST_F(PromosManagerImplTest, ReturnsNameForTestPromo) { EXPECT_EQ(promos_manager::NameForPromo(promos_manager::Promo::Test), "promos_manager::Promo::Test"); } // Tests promos_manager::PromoForName correctly returns the // promos_manager::Promo given its string name. -TEST_F(PromosManagerTest, ReturnsTestPromoForName) { +TEST_F(PromosManagerImplTest, ReturnsTestPromoForName) { EXPECT_EQ(promos_manager::PromoForName("promos_manager::Promo::Test"), promos_manager::Promo::Test); } // Tests promos_manager::PromoForName correctly returns absl::nullopt for bad // input. -TEST_F(PromosManagerTest, ReturnsNulloptForBadName) { +TEST_F(PromosManagerImplTest, ReturnsNulloptForBadName) { EXPECT_FALSE(promos_manager::PromoForName("promos_manager::Promo::FOOBAR") .has_value()); } -// Tests PromosManagerTest::TestPromo() correctly creates one mock promo. -TEST_F(PromosManagerTest, CreatesPromo) { +// Tests PromosManagerImplTest::TestPromo() correctly creates one mock promo. +TEST_F(PromosManagerImplTest, CreatesPromo) { Promo* promo = TestPromo(); EXPECT_NE(promo, nil); EXPECT_EQ((int)promo.impressionLimits.count, 0); } -// Tests PromosManagerTest::TestPromoWithImpressionLimits() correctly creates -// one mock promo with mock impression limits. -TEST_F(PromosManagerTest, CreatesPromoWithImpressionLimits) { +// Tests PromosManagerImplTest::TestPromoWithImpressionLimits() correctly +// creates one mock promo with mock impression limits. +TEST_F(PromosManagerImplTest, CreatesPromoWithImpressionLimits) { Promo* promoWithImpressionLimits = TestPromoWithImpressionLimits(); EXPECT_NE(promoWithImpressionLimits, nil); EXPECT_EQ((int)promoWithImpressionLimits.impressionLimits.count, 2); } -// Tests PromosManagerTest::TestImpressionLimits() correctly creates two mock -// impression limits. -TEST_F(PromosManagerTest, CreatesImpressionLimits) { +// Tests PromosManagerImplTest::TestImpressionLimits() correctly creates two +// mock impression limits. +TEST_F(PromosManagerImplTest, CreatesImpressionLimits) { NSArray<ImpressionLimit*>* impressionLimits = TestImpressionLimits(); EXPECT_NE(impressionLimits, nil); @@ -152,7 +177,7 @@ // Tests PromosManager::ImpressionCounts() correctly returns a counts list from // an impression counts map. -TEST_F(PromosManagerTest, ReturnsImpressionCounts) { +TEST_F(PromosManagerImplTest, ReturnsImpressionCounts) { std::map<promos_manager::Promo, int> promo_impression_counts = { {promos_manager::Promo::Test, 3}, {promos_manager::Promo::AppStoreRating, 1}, @@ -167,7 +192,7 @@ // Tests PromosManager::ImpressionCounts() correctly returns an empty counts // list for an empty impression counts map. -TEST_F(PromosManagerTest, ReturnsEmptyImpressionCounts) { +TEST_F(PromosManagerImplTest, ReturnsEmptyImpressionCounts) { std::map<promos_manager::Promo, int> promo_impression_counts; std::vector<int> counts; @@ -176,7 +201,7 @@ // Tests PromosManager::TotalImpressionCount() correctly adds the counts of // different promos from an impression counts map. -TEST_F(PromosManagerTest, ReturnsTotalImpressionCount) { +TEST_F(PromosManagerImplTest, ReturnsTotalImpressionCount) { std::map<promos_manager::Promo, int> promo_impression_counts = { {promos_manager::Promo::Test, 3}, {promos_manager::Promo::AppStoreRating, 1}, @@ -190,7 +215,7 @@ // Tests PromosManager::TotalImpressionCount() returns zero for an empty // impression counts map. -TEST_F(PromosManagerTest, ReturnsZeroForTotalImpressionCount) { +TEST_F(PromosManagerImplTest, ReturnsZeroForTotalImpressionCount) { std::map<promos_manager::Promo, int> promo_impression_counts; EXPECT_EQ(promos_manager_->TotalImpressionCount(promo_impression_counts), 0); @@ -198,7 +223,7 @@ // Tests PromosManager::MaxImpressionCount() correctly returns the max // impression count from an impression counts map. -TEST_F(PromosManagerTest, ReturnsMaxImpressionCount) { +TEST_F(PromosManagerImplTest, ReturnsMaxImpressionCount) { std::map<promos_manager::Promo, int> promo_impression_counts = { {promos_manager::Promo::Test, 3}, {promos_manager::Promo::AppStoreRating, 1}, @@ -211,7 +236,7 @@ // Tests PromosManager::MaxImpressionCount() correctly returns zero for an empty // impression counts map. -TEST_F(PromosManagerTest, ReturnsZeroForMaxImpressionCount) { +TEST_F(PromosManagerImplTest, ReturnsZeroForMaxImpressionCount) { std::map<promos_manager::Promo, int> promo_impression_counts; EXPECT_EQ(promos_manager_->MaxImpressionCount(promo_impression_counts), 0); @@ -219,7 +244,7 @@ // Tests PromosManager::AnyImpressionLimitTriggered() correctly detects an // impression limit is triggered. -TEST_F(PromosManagerTest, DetectsSingleImpressionLimitTriggered) { +TEST_F(PromosManagerImplTest, DetectsSingleImpressionLimitTriggered) { ImpressionLimit* thricePerWeek = [[ImpressionLimit alloc] initWithLimit:3 forNumDays:7]; NSArray<ImpressionLimit*>* limits = @[ @@ -236,7 +261,7 @@ // Tests PromosManager::AnyImpressionLimitTriggered() correctly detects an // impression limit is triggered over multiple impression limits. -TEST_F(PromosManagerTest, DetectsOneOfMultipleImpressionLimitsTriggered) { +TEST_F(PromosManagerImplTest, DetectsOneOfMultipleImpressionLimitsTriggered) { ImpressionLimit* onceEveryTwoDays = [[ImpressionLimit alloc] initWithLimit:1 forNumDays:2]; ImpressionLimit* thricePerWeek = [[ImpressionLimit alloc] initWithLimit:3 @@ -254,7 +279,7 @@ // Tests PromosManager::AnyImpressionLimitTriggered() correctly detects no // impression limits are triggered. -TEST_F(PromosManagerTest, DetectsNoImpressionLimitTriggered) { +TEST_F(PromosManagerImplTest, DetectsNoImpressionLimitTriggered) { ImpressionLimit* onceEveryTwoDays = [[ImpressionLimit alloc] initWithLimit:1 forNumDays:2]; ImpressionLimit* thricePerWeek = [[ImpressionLimit alloc] initWithLimit:3 @@ -269,7 +294,7 @@ // Tests PromosManager::CanShowPromo() correctly allows a promo to be shown // because it hasn't met any impression limits. -TEST_F(PromosManagerTest, DecidesCanShowPromo) { +TEST_F(PromosManagerImplTest, DecidesCanShowPromo) { CreatePromosManager(); const std::vector<promos_manager::Impression> zeroImpressions = {}; @@ -280,7 +305,7 @@ // Tests PromosManager::CanShowPromo() correctly denies promos from being shown // as they've triggered impression limits. -TEST_F(PromosManagerTest, DecidesCannotShowPromo) { +TEST_F(PromosManagerImplTest, DecidesCannotShowPromo) { CreatePromosManager(); int today = TodaysDay(); @@ -316,7 +341,7 @@ // Tests PromosManager::LeastRecentlyShown() correctly returns a list of active // promos sorted by least recently shown. -TEST_F(PromosManagerTest, ReturnsLeastRecentlyShown) { +TEST_F(PromosManagerImplTest, ReturnsLeastRecentlyShown) { const std::set<promos_manager::Promo> active_promos = { promos_manager::Promo::Test, promos_manager::Promo::CredentialProviderExtension, @@ -350,7 +375,7 @@ // Tests PromosManager::LeastRecentlyShown() correctly returns a list of // active / promos sorted by least recently shown (with some impressions / // belonging to inactive promo campaigns). -TEST_F(PromosManagerTest, ReturnsLeastRecentlyShownWithSomeInactivePromos) { +TEST_F(PromosManagerImplTest, ReturnsLeastRecentlyShownWithSomeInactivePromos) { const std::set<promos_manager::Promo> active_promos = { promos_manager::Promo::Test, promos_manager::Promo::AppStoreRating, @@ -379,7 +404,7 @@ // Tests PromosManager::LeastRecentlyShown() gracefully returns a list of // active / promos when multiple promos are tied for least recently shown. -TEST_F(PromosManagerTest, ReturnsLeastRecentlyShownBreakingTies) { +TEST_F(PromosManagerImplTest, ReturnsLeastRecentlyShownBreakingTies) { const std::set<promos_manager::Promo> active_promos = { promos_manager::Promo::Test, promos_manager::Promo::CredentialProviderExtension, @@ -411,7 +436,7 @@ // Tests PromosManager::LeastRecentlyShown() gracefully returns a single promo // in a list when the impression history contains only one active promo // campaign. -TEST_F(PromosManagerTest, ReturnsLeastRecentlyShownWithOnlyOnePromoActive) { +TEST_F(PromosManagerImplTest, ReturnsLeastRecentlyShownWithOnlyOnePromoActive) { const std::set<promos_manager::Promo> active_promos = { promos_manager::Promo::Test, }; @@ -438,7 +463,7 @@ // Tests PromosManager::LeastRecentlyShown() gracefully returns an empty array // when there are no active promo campaigns. -TEST_F(PromosManagerTest, +TEST_F(PromosManagerImplTest, ReturnsEmptyListWhenLeastRecentlyShownHasNoActivePromoCampaigns) { const std::set<promos_manager::Promo> active_promos; @@ -462,7 +487,7 @@ // Tests PromosManager::LeastRecentlyShown() gracefully returns an empty array // when no impression history and no active promos exist. -TEST_F(PromosManagerTest, +TEST_F(PromosManagerImplTest, ReturnsEmptyListWhenLeastRecentlyShownHasNoImpressionHistory) { const std::set<promos_manager::Promo> active_promos; const std::vector<promos_manager::Impression> impressions; @@ -474,7 +499,7 @@ // Tests PromosManager::LeastRecentlyShown() sorts unshown promos before shown // promos. -TEST_F(PromosManagerTest, +TEST_F(PromosManagerImplTest, SortsUnshownPromosBeforeShownPromosForLeastRecentlyShown) { const std::set<promos_manager::Promo> active_promos = { promos_manager::Promo::Test, @@ -505,7 +530,7 @@ // Tests PromosManager::ImpressionHistory() correctly ingests impression history // (base::Value::List) and returns corresponding // std::vector<promos_manager::Impression>. -TEST_F(PromosManagerTest, ReturnsImpressionHistory) { +TEST_F(PromosManagerImplTest, ReturnsImpressionHistory) { int today = TodaysDay(); base::Value::Dict first_impression; @@ -543,7 +568,7 @@ // Tests PromosManager::ImpressionHistory() correctly ingests empty impression // history (base::Value::List) and returns empty // std::vector<promos_manager::Impression>. -TEST_F(PromosManagerTest, ReturnsBlankImpressionHistoryForBlankPrefs) { +TEST_F(PromosManagerImplTest, ReturnsBlankImpressionHistoryForBlankPrefs) { base::Value::List impressions; std::vector<promos_manager::Impression> result = @@ -555,7 +580,8 @@ // Tests PromosManager::ImpressionHistory() correctly ingests impression history // with malformed data (base::Value::List) and returns corresponding // std::vector<promos_manager::Impression> without malformed entries. -TEST_F(PromosManagerTest, ReturnsImpressionHistoryBySkippingMalformedEntries) { +TEST_F(PromosManagerImplTest, + ReturnsImpressionHistoryBySkippingMalformedEntries) { int today = TodaysDay(); base::Value::Dict first_impression; @@ -588,7 +614,7 @@ // Tests PromosManager::ActivePromos() correctly ingests active promos // (base::Value::List) and returns corresponding // std::vector<promos_manager::Promo>. -TEST_F(PromosManagerTest, ReturnsActivePromos) { +TEST_F(PromosManagerImplTest, ReturnsActivePromos) { base::Value::List promos; promos.Append("promos_manager::Promo::DefaultBrowser"); promos.Append("promos_manager::Promo::AppStoreRating"); @@ -608,7 +634,7 @@ // Tests PromosManager::ActivePromos() correctly ingests empty active promos // (base::Value::List) and returns empty std::set<promos_manager::Promo>. -TEST_F(PromosManagerTest, ReturnsBlankActivePromosForBlankPrefs) { +TEST_F(PromosManagerImplTest, ReturnsBlankActivePromosForBlankPrefs) { base::Value::List promos; std::set<promos_manager::Promo> result = @@ -620,7 +646,7 @@ // Tests PromosManager::ActivePromos() correctly ingests active promos with // malformed data (base::Value::List) and returns corresponding // std::vector<promos_manager::Promo> with malformed entries pruned. -TEST_F(PromosManagerTest, ReturnsActivePromosAndSkipsMalformedData) { +TEST_F(PromosManagerImplTest, ReturnsActivePromosAndSkipsMalformedData) { base::Value::List promos; promos.Append("promos_manager::Promo::DefaultBrowser"); promos.Append("promos_manager::Promo::AppStoreRating"); @@ -640,7 +666,7 @@ // Tests PromosManager::RegisterPromoForContinuousDisplay() correctly registers // a promo for continuous display by writing the promo's name to the pref // `kIosPromosManagerActivePromos`. -TEST_F(PromosManagerTest, RegistersPromoForContinuousDisplay) { +TEST_F(PromosManagerImplTest, RegistersPromoForContinuousDisplay) { CreatePromosManager(); EXPECT_TRUE( local_state_->GetList(prefs::kIosPromosManagerActivePromos).empty()); @@ -674,7 +700,7 @@ // a promo for continuous display by writing the promo's name to the pref // `kIosPromosManagerActivePromos` and immediately updates active_promos_ to // reflect the new state. -TEST_F(PromosManagerTest, +TEST_F(PromosManagerImplTest, RegistersPromoForContinuousDisplayAndImmediatelyUpdateVariables) { CreatePromosManager(); EXPECT_TRUE( @@ -697,7 +723,7 @@ // Tests PromosManager::RegisterPromoForContinuousDisplay() correctly registers // a promo—for the very first time—for continuous display by writing the // promo's name to the pref `kIosPromosManagerActivePromos`. -TEST_F(PromosManagerTest, +TEST_F(PromosManagerImplTest, RegistersPromoForContinuousDisplayForEmptyActivePromos) { CreatePromosManager(); EXPECT_TRUE( @@ -717,7 +743,8 @@ // an already-registered promo for continuous display by first erasing, and then // re-writing, the promo's name to the pref `kIosPromosManagerActivePromos`; // tests no duplicate entries are created. -TEST_F(PromosManagerTest, RegistersAlreadyRegisteredPromoForContinuousDisplay) { +TEST_F(PromosManagerImplTest, + RegistersAlreadyRegisteredPromoForContinuousDisplay) { CreatePromosManager(); EXPECT_TRUE( local_state_->GetList(prefs::kIosPromosManagerActivePromos).empty()); @@ -749,7 +776,7 @@ // first erasing, and then re-writing, the promo's name to the pref // `kIosPromosManagerActivePromos`; tests no duplicate entries are created. TEST_F( - PromosManagerTest, + PromosManagerImplTest, RegistersAlreadyRegisteredPromoForContinuousDisplayForEmptyActivePromos) { CreatePromosManager(); EXPECT_TRUE( @@ -773,7 +800,7 @@ // Tests PromosManager::RegisterPromoForSingleDisplay() correctly registers // a promo for single display by writing the promo's name to the pref // `kIosPromosManagerSingleDisplayActivePromos`. -TEST_F(PromosManagerTest, RegistersPromoForSingleDisplay) { +TEST_F(PromosManagerImplTest, RegistersPromoForSingleDisplay) { CreatePromosManager(); EXPECT_TRUE( local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos) @@ -815,7 +842,7 @@ // a promo for single display by writing the promo's name to the pref // `kIosPromosManagerSingleDisplayActivePromos` and immediately updates // single_display_active_promos_ to reflect the new state. -TEST_F(PromosManagerTest, +TEST_F(PromosManagerImplTest, RegistersPromoForSingleDisplayAndImmediatelyUpdateVariables) { CreatePromosManager(); EXPECT_TRUE( @@ -839,7 +866,8 @@ // Tests PromosManager::RegisterPromoForSingleDisplay() correctly registers // a promo for single display—for the very first time—by writing the promo's // name to the pref `kIosPromosManagerSingleDisplayActivePromos`. -TEST_F(PromosManagerTest, RegistersPromoForSingleDisplayForEmptyActivePromos) { +TEST_F(PromosManagerImplTest, + RegistersPromoForSingleDisplayForEmptyActivePromos) { CreatePromosManager(); EXPECT_TRUE( local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos) @@ -863,7 +891,7 @@ // re-writing, the promo's name to the pref // `kIosPromosManagerSingleDisplayActivePromos`; tests no duplicate entries are // created. -TEST_F(PromosManagerTest, RegistersAlreadyRegisteredPromoForSingleDisplay) { +TEST_F(PromosManagerImplTest, RegistersAlreadyRegisteredPromoForSingleDisplay) { CreatePromosManager(); EXPECT_TRUE( local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos) @@ -902,7 +930,7 @@ // first erasing, and then re-writing, the promo's name to the pref // `kIosPromosManagerSingleDisplayActivePromos`; tests no duplicate entries are // created. -TEST_F(PromosManagerTest, +TEST_F(PromosManagerImplTest, RegistersAlreadyRegisteredPromoForSingleDisplayForEmptyActivePromos) { CreatePromosManager(); EXPECT_TRUE( @@ -929,7 +957,7 @@ // Tests PromosManager::InitializePromoImpressionLimits() correctly registers // promo-specific impression limits. -TEST_F(PromosManagerTest, RegistersPromoSpecificImpressionLimits) { +TEST_F(PromosManagerImplTest, RegistersPromoSpecificImpressionLimits) { CreatePromosManager(); ImpressionLimit* onceEveryTwoDays = [[ImpressionLimit alloc] initWithLimit:1 @@ -962,7 +990,7 @@ } // Tests PromosManager::RecordImpression() correctly records a new impression. -TEST_F(PromosManagerTest, RecordsImpression) { +TEST_F(PromosManagerImplTest, RecordsImpression) { CreatePromosManager(); promos_manager_->RecordImpression(promos_manager::Promo::DefaultBrowser); @@ -995,7 +1023,7 @@ // Tests PromosManager::RecordImpression() correctly records a new impression // and immediately updates impression_history_ to reflect the new state -TEST_F(PromosManagerTest, RecordsImpressionAndImmediatelyUpdateVariables) { +TEST_F(PromosManagerImplTest, RecordsImpressionAndImmediatelyUpdateVariables) { CreatePromosManager(); promos_manager_->RecordImpression(promos_manager::Promo::DefaultBrowser); @@ -1008,7 +1036,7 @@ // Tests PromosManager::DeregisterPromo() correctly deregisters a currently // active promo campaign. -TEST_F(PromosManagerTest, DeregistersActivePromo) { +TEST_F(PromosManagerImplTest, DeregistersActivePromo) { CreatePromosManager(); EXPECT_EQ(local_state_->GetList(prefs::kIosPromosManagerActivePromos).size(), @@ -1052,7 +1080,8 @@ // Tests PromosManager::DeregisterPromo() correctly deregisters a currently // active promo campaign and immediately updates active_promos_ & // single_display_active_promos_ to reflect the new state. -TEST_F(PromosManagerTest, DeregistersActivePromoAndImmediatelyUpdateVariables) { +TEST_F(PromosManagerImplTest, + DeregistersActivePromoAndImmediatelyUpdateVariables) { CreatePromosManager(); EXPECT_EQ(local_state_->GetList(prefs::kIosPromosManagerActivePromos).size(), @@ -1083,7 +1112,7 @@ // Tests PromosManager::DeregisterPromo() gracefully handles deregistration if // the promo doesn't exist in a given active promos list. -TEST_F(PromosManagerTest, DeregistersNonExistentPromo) { +TEST_F(PromosManagerImplTest, DeregistersNonExistentPromo) { CreatePromosManager(); EXPECT_EQ(local_state_->GetList(prefs::kIosPromosManagerActivePromos).size(), @@ -1116,7 +1145,7 @@ // Tests a given single-display promo is automatically deregistered after its // impression is recorded. -TEST_F(PromosManagerTest, +TEST_F(PromosManagerImplTest, DeregistersSingleDisplayPromoAfterRecordedImpression) { CreatePromosManager();
diff --git a/ios/chrome/browser/promos_manager/promos_manager_unittest.h b/ios/chrome/browser/promos_manager/promos_manager_unittest.h deleted file mode 100644 index 50fd1204..0000000 --- a/ios/chrome/browser/promos_manager/promos_manager_unittest.h +++ /dev/null
@@ -1,43 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_UNITTEST_H_ -#define IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_UNITTEST_H_ - -#import <Foundation/Foundation.h> - -#import "base/test/scoped_feature_list.h" -#import "components/prefs/testing_pref_service.h" -#import "ios/chrome/browser/promos_manager/impression_limit.h" -#import "ios/chrome/browser/promos_manager/promo.h" -#import "ios/chrome/browser/promos_manager/promos_manager.h" -#import "testing/platform_test.h" - -class PromosManagerTest : public PlatformTest { - public: - PromosManagerTest(); - ~PromosManagerTest() override; - - // Creates a mock promo without impression limits. - Promo* TestPromo(); - - // Creates a mock promo with impression limits. - Promo* TestPromoWithImpressionLimits(); - - // Creates mock impression limits. - NSArray<ImpressionLimit*>* TestImpressionLimits(); - - protected: - // Creates PromosManager with empty pref data. - void CreatePromosManager(); - - // Create pref registry for tests. - void CreatePrefs(); - - std::unique_ptr<TestingPrefServiceSimple> local_state_; - std::unique_ptr<PromosManager> promos_manager_; - base::test::ScopedFeatureList scoped_feature_list_; -}; - -#endif // IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_UNITTEST_H_
diff --git a/ios/chrome/browser/resources/Settings.bundle/Experimental.plist b/ios/chrome/browser/resources/Settings.bundle/Experimental.plist index ac54acf..490aded 100644 --- a/ios/chrome/browser/resources/Settings.bundle/Experimental.plist +++ b/ios/chrome/browser/resources/Settings.bundle/Experimental.plist
@@ -136,6 +136,26 @@ </dict> <dict> <key>Type</key> + <string>PSMultiValueSpecifier</string> + <key>Title</key> + <string>Force Promo</string> + <key>Key</key> + <string>NextPromoForDisplayOverride</string> + <key>DefaultValue</key> + <string></string> + <key>Values</key> + <array> + <string></string> + <string>promos_manager::Promo::AppStoreRating</string> + </array> + <key>Titles</key> + <array> + <string>Disabled (No Promos Forced)</string> + <string>App Store Rating</string> + </array> + </dict> + <dict> + <key>Type</key> <string>PSGroupSpecifier</string> <key>Title</key> <string>Debug Settings</string>
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history.mm index 60150a3..4b8cbfa 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history.mm +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history.mm
@@ -36,20 +36,24 @@ constexpr int kInitialBufferNumClicks = 3; // clicks // The dictionary key used for storing rankings. -const std::string kRankingKey = "ranking"; +const char kRankingKey[] = "ranking"; // The default destinations ranking, based on statistical usage of the old // overflow menu. -std::vector<overflow_menu::Destination> kDefaultRanking = { - overflow_menu::Destination::Bookmarks, - overflow_menu::Destination::History, - overflow_menu::Destination::ReadingList, - overflow_menu::Destination::Passwords, - overflow_menu::Destination::Downloads, - overflow_menu::Destination::RecentTabs, - overflow_menu::Destination::SiteInfo, - overflow_menu::Destination::Settings, -}; +std::vector<overflow_menu::Destination> DefaultDestinationsRanking() { + std::vector<overflow_menu::Destination> default_ranking = { + overflow_menu::Destination::Bookmarks, + overflow_menu::Destination::History, + overflow_menu::Destination::ReadingList, + overflow_menu::Destination::Passwords, + overflow_menu::Destination::Downloads, + overflow_menu::Destination::RecentTabs, + overflow_menu::Destination::SiteInfo, + overflow_menu::Destination::Settings, + }; + + return default_ranking; +} // The number of days since the Unix epoch; one day, in this context, runs from // UTC midnight to UTC midnight. @@ -279,7 +283,10 @@ const base::Value::Dict& history = self.prefService->GetDict(prefs::kOverflowMenuDestinationUsageHistory); - for (overflow_menu::Destination destination : kDefaultRanking) { + std::vector<overflow_menu::Destination> defaultRanking = + DefaultDestinationsRanking(); + + for (overflow_menu::Destination destination : defaultRanking) { const std::string path = today + "." + overflow_menu::StringNameForDestination(destination); update->SetByDottedPath( @@ -331,14 +338,17 @@ - (const base::Value::List)calculateNewRanking: (const base::Value::List*)previousRanking numAboveFoldDestinations:(int)numAboveFoldDestinations { - if (!previousRanking) - return List(kDefaultRanking); + if (!previousRanking) { + std::vector<overflow_menu::Destination> defaultRanking = + DefaultDestinationsRanking(); + + return List(defaultRanking); + } if (numAboveFoldDestinations >= static_cast<int>(previousRanking->size())) return previousRanking->Clone(); - std::vector<overflow_menu::Destination> prevRanking = - previousRanking ? Vector(previousRanking) : kDefaultRanking; + std::vector<overflow_menu::Destination> prevRanking = Vector(previousRanking); std::vector<overflow_menu::Destination> newRanking = [self updatedRankWithCurrentRanking:prevRanking numAboveFoldDestinations:numAboveFoldDestinations];
diff --git a/ios/chrome/browser/ui/promos_manager/BUILD.gn b/ios/chrome/browser/ui/promos_manager/BUILD.gn index 61c1efa0..96b8960 100644 --- a/ios/chrome/browser/ui/promos_manager/BUILD.gn +++ b/ios/chrome/browser/ui/promos_manager/BUILD.gn
@@ -61,6 +61,7 @@ "//ios/chrome/app/strings", "//ios/chrome/browser", "//ios/chrome/browser/application_context", + "//ios/chrome/browser/flags:system_flags", "//ios/chrome/browser/main:public", "//ios/chrome/browser/promos_manager:constants", "//ios/chrome/browser/ui/app_store_rating",
diff --git a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.h b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.h index fc61ee0..6ca687b 100644 --- a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.h +++ b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.h
@@ -13,7 +13,6 @@ #import "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/main/test_browser.h" #import "ios/chrome/browser/prefs/pref_names.h" -#import "ios/chrome/browser/promos_manager/promos_manager.h" #import "ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.h" #import "ios/chrome/test/scoped_key_window.h" #import "testing/platform_test.h" @@ -27,14 +26,10 @@ // Creates PromosManagerCoordinator. void CreatePromosManagerCoordinator(); - // Creates PromosManager with empty pref data. - void CreatePromosManager(); - // Create pref registry for tests. void CreatePrefs(); std::unique_ptr<TestingPrefServiceSimple> local_state_; - std::unique_ptr<PromosManager> promos_manager_; base::test::ScopedFeatureList scoped_feature_list_; PromosManagerCoordinator* coordinator_; base::test::TaskEnvironment task_environment_;
diff --git a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.mm b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.mm index 73ec13b..ef20970 100644 --- a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.mm
@@ -15,7 +15,6 @@ #import "ios/chrome/browser/main/test_browser.h" #import "ios/chrome/browser/prefs/pref_names.h" #import "ios/chrome/browser/promos_manager/features.h" -#import "ios/chrome/browser/promos_manager/promos_manager.h" #import "ios/chrome/browser/ui/promos_manager/bannered_promo_view_provider.h" #import "ios/chrome/browser/ui/promos_manager/promos_manager_coordinator+internal.h" #import "ios/chrome/browser/ui/promos_manager/standard_promo_action_handler.h" @@ -40,19 +39,13 @@ PromosManagerCoordinatorTest::~PromosManagerCoordinatorTest() {} void PromosManagerCoordinatorTest::CreatePromosManagerCoordinator() { - CreatePromosManager(); + CreatePrefs(); coordinator_ = [[PromosManagerCoordinator alloc] initWithBaseViewController:view_controller_ browser:browser_.get()]; } -void PromosManagerCoordinatorTest::CreatePromosManager() { - CreatePrefs(); - promos_manager_ = std::make_unique<PromosManager>(local_state_.get()); - promos_manager_->Init(); -} - // Create pref registry for tests. void PromosManagerCoordinatorTest::CreatePrefs() { local_state_ = std::make_unique<TestingPrefServiceSimple>();
diff --git a/ios/chrome/browser/ui/promos_manager/promos_manager_mediator.mm b/ios/chrome/browser/ui/promos_manager/promos_manager_mediator.mm index 3be27a11..2961de6 100644 --- a/ios/chrome/browser/ui/promos_manager/promos_manager_mediator.mm +++ b/ios/chrome/browser/ui/promos_manager/promos_manager_mediator.mm
@@ -8,6 +8,8 @@ #import <map> #import "base/containers/small_map.h" +#import "base/strings/sys_string_conversions.h" +#import "ios/chrome/browser/flags/system_flags.h" #import "ios/chrome/browser/promos_manager/constants.h" #import "third_party/abseil-cpp/absl/types/optional.h" @@ -39,8 +41,21 @@ - (absl::optional<promos_manager::Promo>)nextPromoForDisplay { DCHECK_NE(_promosManager, nullptr); - + NSString* forcedPromoName = [self forcedPromoToDisplay]; + if ([forcedPromoName length] > 0) { + absl::optional<promos_manager::Promo> forcedPromo = + promos_manager::PromoForName(base::SysNSStringToUTF8(forcedPromoName)); + DCHECK(forcedPromo); + return forcedPromo; + } return self.promosManager->NextPromoForDisplay(); } +// Returns the promo selected in the Force Promo experimental setting. +// If none are selected, returns empty string. If user is in beta/stable, +// this method always returns nil. +- (NSString*)forcedPromoToDisplay { + return experimental_flags::GetForcedPromoToDisplay(); +} + @end
diff --git a/ios/chrome/browser/ui/util/BUILD.gn b/ios/chrome/browser/ui/util/BUILD.gn index c9cbf78..07b4073 100644 --- a/ios/chrome/browser/ui/util/BUILD.gn +++ b/ios/chrome/browser/ui/util/BUILD.gn
@@ -41,7 +41,6 @@ "top_view_controller.mm", "transparent_link_button.h", "transparent_link_button.mm", - "ui_util.h", "uikit_ui_util.h", "uikit_ui_util.mm", ]
diff --git a/ios/chrome/browser/ui/util/ui_util.h b/ios/chrome/browser/ui/util/ui_util.h deleted file mode 100644 index d5115d4e0a..0000000 --- a/ios/chrome/browser/ui/util/ui_util.h +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright 2012 The Chromium Authors -// 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_UTIL_UI_UTIL_H_ -#define IOS_CHROME_BROWSER_UI_UTIL_UI_UTIL_H_ - -// All the methods from this file are in progress to be migrated -// `ios/chrome/common/ui/util/ui_util.h`. This header is kept until all the -// migration is done. Please include directly -// `ios/chrome/common/ui/util/ui_util.h`. -#import "ios/chrome/common/ui/util/ui_util.h" - -#endif // IOS_CHROME_BROWSER_UI_UTIL_UI_UTIL_H_
diff --git a/ios/chrome/browser/ui/util/uikit_ui_util.h b/ios/chrome/browser/ui/util/uikit_ui_util.h index 0299164..482891c9 100644 --- a/ios/chrome/browser/ui/util/uikit_ui_util.h +++ b/ios/chrome/browser/ui/util/uikit_ui_util.h
@@ -9,7 +9,6 @@ #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> -#import "ios/chrome/browser/ui/util/ui_util.h" #import "ios/web/common/uikit_ui_util.h" // UI Util containing functions that require UIKit.
diff --git a/ios/chrome/browser/web/chrome_main_parts.mm b/ios/chrome/browser/web/chrome_main_parts.mm index 380ee94a..4521bf7 100644 --- a/ios/chrome/browser/web/chrome_main_parts.mm +++ b/ios/chrome/browser/web/chrome_main_parts.mm
@@ -402,7 +402,9 @@ // Ensure the Fullscren Promos Manager is initialized. PromosManager* promos_manager = application_context_->GetPromosManager(); - promos_manager->Init(); + if (promos_manager) { + promos_manager->Init(); + } } void IOSChromeMainParts::PostMainMessageLoopRun() {
diff --git a/ios/web/public/js_messaging/README.md b/ios/web/public/js_messaging/README.md index f259227..305f87a 100644 --- a/ios/web/public/js_messaging/README.md +++ b/ios/web/public/js_messaging/README.md
@@ -1,18 +1,26 @@ -# Using JavaScript in Chrome for iOS Features +# Using TypeScript in Chrome for iOS -tl;dr A high level overview of using `JavaScriptFeature` in ``//ios/chrome`` to -build features which interact with the web page contents. +tl;dr A high level overview of using TypeScript and `JavaScriptFeature` to +build features which interact with the web page contents on Chrome for iOS. Chrome for iOS doesn't have access to the renderer code so many browser features -require JavaScript in order to interact with the webpage. +require JavaScript in order to interact with the webpage. Please use TypeScript +for all new feature development. -Slides covering this topic are available [here](https://docs.google.com/presentation/d/1HKdi7CGtNTGhMcCscpX_LVFZ8iLTtXjpSQ-980N7J38/edit?usp=sharing). +Slides covering JavaScriptFeature are available [here](https://docs.google.com/presentation/d/1HKdi7CGtNTGhMcCscpX_LVFZ8iLTtXjpSQ-980N7J38/edit?usp=sharing). ## Background It is important to first understand the following concepts in order to properly design a feature using JavaScript. +### JavaScript vs TypeScript + +Sometimes the terms JavaScript and TypeScript are used interchangeably. Even +though feature developers write TypeScript, the TypeScript is compiled into +plain JavaScript at compile time. New scripts should be written as TypeScript +since it provides additional assurances of code correctness and type safety. + ### JavaScript Injection JavaScript is considered to be "injected" when it is added to every webpage by @@ -23,10 +31,9 @@ `BrowserState`. This may mean that the JavaScript doesn’t do anything when it is injected, but -instead it may add functions which are exposed (through `__gCrWeb`) for later -use. +instead add functions which are exposed (through `__gCrWeb`) for later use. -Note that WebKit uses the terminology UserScript for this injected JavaScript. +Note: WebKit uses the terminology "WKUserScript" for this injected JavaScript. ### JavaScript Execution @@ -45,10 +52,12 @@ ### Content Worlds -A content world can be thought of as a JavaScript namespace. +A "content world"" can be thought of as a JavaScript namespace. -The application can choose to inject its JavaScript into any world. All worlds -have access to read and modify the same underlying webpage DOM. +A JavaScriptFeature instance can choose to inject its JavaScript into a +particular world. All worlds have access to read and modify the same underlying +webpage DOM, but can not interact with the JavaScript state in different +worlds. #### Page Content World @@ -65,7 +74,7 @@ execute arbitrary code is also able to interact with scripts in isolated worlds, including the ability to manipulate and send messages from isolated worlds. -NOTE: Isolated worlds are only supported on iOS 14 and later. +NOTE: Isolated worlds are supported on iOS 14 and later. ## web::JavaScriptFeature @@ -100,12 +109,12 @@ The InjectionTime is when the script should be ran during the loading of the webpage's DOM. -Scripts configured with `kDocumentStart` can create functions. Overrides of -functions in the page content world which the webpage may call should be done at -this time. +Scripts configured with `kDocumentStart` can create functions, but the DOM will +not yet be available. Overrides of functions in the page content world which +the webpage may call should be done at this time. Scripts configured with `kDocumentEnd` will run after the DOM is available. This -can be useful for scripts which may make pass over the DOM to manipulate it +can be useful for scripts which may make a pass over the DOM to manipulate it only once after page load. Or to scan the webpage for some metadata and send it back to the native application. @@ -129,14 +138,14 @@ `JavaScriptFeature` subclass to call into the injected JavaScript and set the proper replacement value. -### JavaScriptFeature::ExecuteJavaScript +### JavaScriptFeature::CallJavaScriptFunction -`JavaScriptFeature` exposes `protected CallJavaScriptFunction` APIs. These are +`JavaScriptFeature` exposes protected `CallJavaScriptFunction` APIs. These are to be used within specialized `JavaScriptFeature` subclasses in order to call -into the injected JavaScript. +into injected JavaScript. This is necessary in order to ensure that the JavaScript execution occurs in the -same content world which the features scripts were injected into. +same content world which the feature scripts were injected into. JavaScript injected by a `JavaScriptFeature` should not be called outside of the specialized `JavaScriptFeature` subclass. @@ -149,25 +158,94 @@ Any responses will be routed to `ScriptMessageReceived`. From the JavaScript side, these messages are sent using -`__gCrWeb.common.sendWebKitMessage` +`__gCrWeb.common.sendWebKitMessage` in older scripts and `sendWebKitMessage` +from `//ios/web/public/js_messaging/resources/utils.js` in modern scripts. -Note that the handler name must be application wide unique. WebKit will thrown -an exception if a name is already registered. +Note that the handler name must be unique application-wide. WebKit will throw +an exception while setting up the handler if a name is already registered. ### JavaScriptFeature Lifecycle `JavaScriptFeature`s conceptually live at the `BrowserState` layer. Simple features which hold no state can live statically within the application -and be shared across the normal and incognito `BrowserState`s. +and may be shared across the normal and incognito `BrowserState`s. `base::NoDestructor` and a static `GetInstance()` method can be used for these features. More complex features can be owned by the `BrowserState`s themselves as -UserData. +UserData. For example, see `ContextMenuJavaScriptFeature`. -In order to inject JavaScript, //ios/chrome features must be registered at -application launch time in `ChromeWebClient::GetJavaScriptFeatures`. +In order to inject JavaScript, features which are implemented in `//ios/chrome` +must be registered at application launch time in +`ChromeWebClient::GetJavaScriptFeatures`. + +## Writing TypeScript + +All new scripts used on iOS should be written in TypeScript. TypeScript is +written in a very similar manner to JavaScript, but additionally allows for +error detection at compile time. + +Note that ES6 import/export statements are supported so your feature TypeScript +can be split across multiple files. Reference other files using the full path, +similar to other imports in native code. For example: + + import {gCrWeb} from '//ios/web/public/js_messaging/resources/gcrweb.js'; + +Note that the import uses the ".js" extension, even if the file is written as +TypeScript with a ".ts" file extension because the type information only exists +before compile time. + +Additionally, it is important to realize that import/export statements are also +stripped away during compile time using [Rollup]. This may have unexpected side +effects like variables defined in a common file not being shared as expected. +State should be stored globally if it needs to be maintained across multiple +files. + +[Rollup]: rollupjs.org + +### compile_ts + +Use [compile_ts] to compile TypeScript into JavaScript which is imported by +many other scripts. Use `compile_ts` directly when your feature has multiple +files or you are creating a script library to be used as a dep for many other +script targets. See also `optimize_ts` below which might be a better fit. + +[compile_ts]: https://source.chromium.org/chromium/chromium/src/+/main:ios/web/public/js_messaging/compile_ts.gni + +### optimize_js + +[optimize_js] bundles one or more JavaScript files into a single output file in +the application resources directory. These targets can depend on any number of +dependent compiled script targets by listed `compile_ts` targets in `deps`. + +By default, it also minimizes the scripts. +However, minimization can be disabled for debugging by setting `minify_scripts` +at the top of `optimize_js.gni` to `false`. + +Use optimize_js directly if your +feature has multiple script files, otherwise, see `optimize_ts` below handles +the most common case. + +[optimize_js]: https://source.chromium.org/chromium/chromium/src/+/main:ios/web/public/js_messaging/optimize_js.gni + +### optimize_ts + +[optimize_ts] compiles a single TypeScript or JavaScript file and copies it to +the application resources directory. This handles the common case where a +feature has a single TypeScript file which needs to be compiled into JavaScript +and copied into the application bundle for use by a JavaScriptFeature instance. + +[optimize_ts]: https://source.chromium.org/chromium/chromium/src/+/main:ios/web/public/js_messaging/optimize_ts.gni + +### Guidelines + +* Adhere to the [TypeScript styleguide]. +* Use [existing TypeScript] as reference. +* When possible, split your code into multiple files using ES6 export/import. + +[TypeScript styleguide]: https://google.github.io/styleguide/tsguide.html +[existing TypeScript]: https://source.chromium.org/search?q=file:%5Eios%20file:%22.ts%22&sq= ## Best Practices for JavaScript Messaging @@ -209,8 +287,9 @@ sent by an attacker. These messages are untrustworthy input. Determine the origin of a message using trusted data rather than the content of -the message. For example, use `web::ScriptMessage`’s `request_url`_ field, or -`WKScriptMessage.frameInfo.request.URL`. +the message. For example, use `web::ScriptMessage::request_url()` or +`WKScriptMessage.frameInfo.request.URL`. Do not rely on url information in the +message itself as it can be easily spoofed. ### Sanitize and validate messages @@ -227,17 +306,19 @@ return; } - std::string* event_type = message.body()->FindStringKey("eventType"); + base::Value::Dict message_body = std::move(script_message.body()->GetDict()); + + std::string* event_type = message_body.FindString("eventType"); if (!event_type || event_type->empty()) { return; } - std::string* text = message.body()->FindStringKey("text"); + std::string* text = message_body.FindString("text"); if (!text || text->empty()) { return; } - // Now use |eventType| and |text|. + // Now, you can *carefully* use `eventType` and `text` as non-empty strings. } ``` @@ -273,7 +354,13 @@ `web::ScriptMessage` in overrides of `JavaScriptFeature::ScriptMessageReceived`, and when using `WebStateImpl::ExecuteJavaScript`. Always use `WebFrame::CallJavaScriptFunction` rather than directly calling -`[WKWebView evaluateJavaScript]`, to avoid having to manually handle conversion. +`[WKWebView evaluateJavaScript]`, to avoid having to manually handle conversion +and to ensure that the message will only be sent to the expected webpage. +Sending JavaScript to the WKWebView or web::WebState is not bound to any +particular webpage or domain and may execute on a different page than expected +if a navigation occurs between the sending and execution of the message. +However, messages sent to a WebFrame will be bound to that webpage and be +dropped if the webpage goes away before the JavaScript is executed. [legacy IPC docs]: https://www.chromium.org/Home/chromium-security/education/security-tips-for-ipc [Mojo IPC docs]: https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/security/mojo.md
diff --git a/ios/web/public/js_messaging/compile_ts.gni b/ios/web/public/js_messaging/compile_ts.gni index e6148441..e272569 100644 --- a/ios/web/public/js_messaging/compile_ts.gni +++ b/ios/web/public/js_messaging/compile_ts.gni
@@ -6,11 +6,6 @@ # Defines a target that compiles one or more TypeScript and JavaScript input # files. -# NOTE: Since ts_library produces files with hardcoded names at -# `target_gen_dir`, only a single `compile_ts` target may exist in a BUILD -# file. However, even with this restriction, unrelated TypeScript files may be -# compiled together in a single `compile_ts` target, then be used in multiple, -# separate `optimize_js` instances. # # Variables # sources:
diff --git a/ios/web/public/js_messaging/optimize_ts.gni b/ios/web/public/js_messaging/optimize_ts.gni index 89a4255..38b19d3 100644 --- a/ios/web/public/js_messaging/optimize_ts.gni +++ b/ios/web/public/js_messaging/optimize_ts.gni
@@ -26,7 +26,7 @@ _sources_count += 1 } assert(_sources_count == 1, - "only a single source may be provided to compile_and_optimize_ts") + "only a single source may be provided to optimize_ts") _compile_ts_target_name = target_name + "_compile_ts" compile_ts(_compile_ts_target_name) {
diff --git a/mojo/core/ipcz_driver/transport.cc b/mojo/core/ipcz_driver/transport.cc index a4a944e..5ff1f72 100644 --- a/mojo/core/ipcz_driver/transport.cc +++ b/mojo/core/ipcz_driver/transport.cc
@@ -373,9 +373,10 @@ header.reserved[1] = 0; header.reserved[2] = 0; - const HandleOwner handle_owner = remote_process_.IsValid() - ? HandleOwner::kRecipient - : HandleOwner::kSender; + const HandleOwner handle_owner = + remote_process_.IsValid() && source_type() == kBroker + ? HandleOwner::kRecipient + : HandleOwner::kSender; header.handle_owner = handle_owner; auto handle_data = base::make_span(reinterpret_cast<HANDLE*>(&header + 1),
diff --git a/mojo/public/tools/bindings/generators/mojom_js_generator.py b/mojo/public/tools/bindings/generators/mojom_js_generator.py index c6c7bb1c..3fa88e3 100644 --- a/mojo/public/tools/bindings/generators/mojom_js_generator.py +++ b/mojo/public/tools/bindings/generators/mojom_js_generator.py
@@ -994,13 +994,6 @@ def _GetConstantValueInJsModule(self, constant): return self._GetConstantValue(constant, for_module=True) - def _GenerateHtmlImports(self): - result = [] - for full_import in self.module.imports: - result.append( - os.path.relpath(full_import.path, os.path.dirname(self.module.path))) - return result - def _GetJsModuleImports(self, for_webui_module=False): this_module_path = _GetWebUiModulePath(self.module) this_module_is_shared = bool(
diff --git a/net/cert/pki/parse_name.cc b/net/cert/pki/parse_name.cc index 8905786..f83246f 100644 --- a/net/cert/pki/parse_name.cc +++ b/net/cert/pki/parse_name.cc
@@ -5,7 +5,6 @@ #include "net/cert/pki/parse_name.h" #include "base/check_op.h" -#include "base/notreached.h" #include "base/strings/string_number_conversions.h" #include "net/der/parse_values.h" #include "third_party/boringssl/src/include/openssl/bytestring.h" @@ -72,7 +71,7 @@ case der::kBmpString: return der::ParseBmpString(value, out); default: - NOTREACHED(); + assert(0); // NOTREACHED return false; } }
diff --git a/net/cert/pki/path_builder.cc b/net/cert/pki/path_builder.cc index 8867fc4..c73d033 100644 --- a/net/cert/pki/path_builder.cc +++ b/net/cert/pki/path_builder.cc
@@ -11,7 +11,6 @@ #include "base/logging.h" #include "base/memory/raw_ptr.h" #include "base/metrics/histogram_functions.h" -#include "base/notreached.h" #include "base/strings/string_number_conversions.h" #include "net/base/net_errors.h" #include "net/cert/pki/cert_issuer_source.h" @@ -459,7 +458,7 @@ return nullptr; } - NOTREACHED(); + assert(0); // NOTREACHED return nullptr; }
diff --git a/net/cert/pki/trust_store.cc b/net/cert/pki/trust_store.cc index 93a2c35..0f0858cd 100644 --- a/net/cert/pki/trust_store.cc +++ b/net/cert/pki/trust_store.cc
@@ -4,8 +4,6 @@ #include "net/cert/pki/trust_store.h" -#include "base/notreached.h" - namespace net { CertificateTrust CertificateTrust::ForTrustAnchor() { @@ -49,7 +47,7 @@ return true; } - NOTREACHED(); + assert(0); // NOTREACHED return false; } @@ -64,7 +62,7 @@ return false; } - NOTREACHED(); + assert(0); // NOTREACHED return false; } @@ -79,7 +77,7 @@ return false; } - NOTREACHED(); + assert(0); // NOTREACHED return true; }
diff --git a/net/cert/pki/verify_name_match.cc b/net/cert/pki/verify_name_match.cc index 3f26412..002e424 100644 --- a/net/cert/pki/verify_name_match.cc +++ b/net/cert/pki/verify_name_match.cc
@@ -5,7 +5,6 @@ #include "net/cert/pki/verify_name_match.h" #include "base/check.h" -#include "base/notreached.h" #include "base/strings/string_util.h" #include "net/cert/pki/cert_error_params.h" #include "net/cert/pki/cert_errors.h" @@ -139,7 +138,7 @@ success = NormalizeDirectoryString(ENFORCE_ASCII, output); break; default: - NOTREACHED(); + // NOTREACHED success = false; break; }
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json index 75341c99..1a91a597 100644 --- a/net/http/transport_security_state_static.json +++ b/net/http/transport_security_state_static.json
@@ -1382,7 +1382,6 @@ { "name": "shopontarget.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "siraweb.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "spdysync.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "sylaps.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sysctl.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tauchkater.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "theshadestore.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -1415,7 +1414,6 @@ { "name": "jonnybarnes.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "miasarafina.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "prefontaine.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "redlatam.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "schachburg.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "schreiber-netzwerk.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "syss.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -2111,7 +2109,6 @@ { "name": "richiemail.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ricochet.im", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "roman-pavlik.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "roots.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "royalacademy.org.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rubecodeberg.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sabahattin-gucukoglu.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -2265,7 +2262,6 @@ { "name": "buiko.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cdt.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cheesetart.my", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "climateinteractive.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "costablancavoorjou.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cracker.in.th", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dohosting.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -3604,7 +3600,6 @@ { "name": "hawkeyeinsight.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hencagon.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hilahdih.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "hrbatypes.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hroschyk.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ichronos.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "idaspis.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -3725,7 +3720,6 @@ { "name": "atisoft.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "atisoft.net.tr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "atisoft.web.tr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "balboa.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bcsytv.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "beholdthehurricane.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "beranovi.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -4003,7 +3997,6 @@ { "name": "unpr.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "utdsgda.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "valordolarblue.com.ar", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "vieclam24h.vn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vm0.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vnvisa.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "watersb.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -4631,7 +4624,6 @@ { "name": "iocheck.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "isaacman.tech", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "isondo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "jacobphono.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jcraft.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jennythebaker.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jonaskjodt.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -5360,7 +5352,6 @@ { "name": "davidandersson.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "davidreinhardt.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dc585.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "ddhosted.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dedicatutiempo.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "degeberg.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "deinballon.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -6049,7 +6040,6 @@ { "name": "xss.ht", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xwalck.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "yakmade.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "yakmoo.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "yanaduday.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "yanwh.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "yaxim.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -6856,7 +6846,6 @@ { "name": "adderall.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "agwa.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "alanlee.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "antocom.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "atletika.hu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "auto-anleitung.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bakaweb.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -7659,7 +7648,6 @@ { "name": "allstarswithus.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "allthingssquared.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "alphabuild.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "alt-three.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "alterbaum.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "altopia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "amcvega.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -7778,7 +7766,6 @@ { "name": "bf.am", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bgcparkstad.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bgdaddy.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "bhtelecom.ba", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bible-maroc.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "biblerhymes.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "biblionaut.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -8490,7 +8477,6 @@ { "name": "ip6.im", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ipal.im", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ipal.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "iplabs.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ipmotion.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "isbengrumpy.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ischool.co.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -8541,7 +8527,6 @@ { "name": "jsg-technologies.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "json-viewer.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jthackery.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "jualssh.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "julibear.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "julido.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "juliemaurel.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -8867,7 +8852,6 @@ { "name": "newlooknow.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "newstone-tech.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "newsyslog.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "newtnote.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "next176.sk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "next24.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nextgencel.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -9130,7 +9114,6 @@ { "name": "recapp.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "redar.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "redballoonsecurity.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "redburn.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "reddingsbrigade-zwolle.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rede-reim.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rede.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -9347,7 +9330,6 @@ { "name": "stabletoken.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "stadionmanager.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "stadjerspasonline.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "stageirites.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "stagingjobshq.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "stahl.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "starmusic.ga", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -9363,7 +9345,6 @@ { "name": "stqry.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "str0.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "strchr.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "streamzilla.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "strictlysudo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "stroeercrm.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "studenckiemetody.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -9498,7 +9479,6 @@ { "name": "trademan.ky", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tradinghope.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "trakfusion.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "transacid.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "transmithe.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "transportal.sk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "travelinsurance.co.nz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -9685,7 +9665,6 @@ { "name": "wvg.myds.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "x3led.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "x509.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "xa1.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xbb.hk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xbb.li", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xboxdownloadthat.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -10741,7 +10720,6 @@ { "name": "wsv-grafenau.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "yaucy.win", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "yard-fu.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "zachpeters.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "zaoshanghao-dajia.rhcloud.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "yourself.today", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ynsn.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -10839,7 +10817,6 @@ { "name": "bydisk.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cablesandkits.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "caim.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "callision.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "campus-cybersecurity.team", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "canoonic.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "casa-due-pur.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -10878,7 +10855,6 @@ { "name": "crazymeeshu.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "create-test-publish.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "creative-wave.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "creativecaptiv.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cross-x.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "crstat.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cryptopartynewcastle.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -11411,7 +11387,6 @@ { "name": "xperidia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xpi.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xroot.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "yarcom.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "yooooex.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "yoyoost.duckdns.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "z3liff.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -11470,7 +11445,6 @@ { "name": "advocatenalkmaar.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "adxperience.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "aerialmediapro.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "agileui.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "aidanmontare.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "aify.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "aiois.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -11537,7 +11511,6 @@ { "name": "bacon-monitoring.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "balist.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ballejaune.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "bancacrs.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bankcircle.co.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bankinter.pt", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bannisbierblog.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -12327,7 +12300,6 @@ { "name": "nicolas-simond.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nidro.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nien.chat", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "nien.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nien.com.tw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nien.taipei", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nigelwakefield.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -12889,7 +12861,6 @@ { "name": "xscapers.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "yachts-magazine.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "yarogneva.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "yesdevnull.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ylk.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "yntongji.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "yoga-school.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -13144,7 +13115,6 @@ { "name": "casbuijs.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "captured-symphonies.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ciphrex.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "chicolawfirm.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cbamo.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "carlosjeurissen.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cardurl.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -14326,7 +14296,6 @@ { "name": "thorstenschaefer.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tindewen.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "thynx.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "timroes.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "timnash.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "thues.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ti-pla.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -14860,7 +14829,6 @@ { "name": "estonoentraenelexamen.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ever.sale", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "evolutionexpeditions.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "etidni.help", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "financier.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "epichouse.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "esample.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -15414,7 +15382,6 @@ { "name": "pokeduel.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "printexpress.cloud", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rafting-japan.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "qubyte.codes", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "qwant.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "recreoviral.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "president.bg", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -16190,7 +16157,6 @@ { "name": "cuni-rec.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dakl-shop.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cubecart-hosting.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "debigare.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "datenlast.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cybertorsk.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "das-sommercamp.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -16739,7 +16705,6 @@ { "name": "jd1.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jurko.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jmcleaning.services", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "karit.nz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "kavinvin.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "kerem.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "kingtecservices.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -17103,7 +17068,6 @@ { "name": "osburn.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "olswangtrainees.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "new.travel.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "pagiamtzis.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "octopus-agents.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "orchidspaper.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "offenedialoge.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -17874,7 +17838,6 @@ { "name": "adurra.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ahmadly.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "afri.cc", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "0x7fffffff.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "1644091933.rsc.cdn77.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "163pwd.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "acemobileforce.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -18185,10 +18148,8 @@ { "name": "certcenter.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cakestart.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cavern.tv", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "chrisb.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cdasiaonline.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "chima.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "chrisb.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "chronogram.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "chisago-isantidfl.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "benwattie.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -18197,7 +18158,6 @@ { "name": "centos.tips", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "beersandco.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "chatxtutti.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "chriswbarry.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "chocolatesandhealth.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "canlidoviz.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "chatt-gratis.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -21488,7 +21448,6 @@ { "name": "bitmainwarranty.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bitrush.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bixservice.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "bizniskatalog.mk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bizzi.tv", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "blackdiam.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "blackdotbrewery.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -21597,7 +21556,6 @@ { "name": "capsogusto.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "captalize.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "capture-app.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "car24.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "carauctionsillinois.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "carbon-designz.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "carck.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -21694,7 +21652,6 @@ { "name": "cloudpengu.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cloudwarez.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "clounix.online", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "clouz.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "clsimage.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "clubdeslecteurs.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "clusterfuck.nz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -21816,7 +21773,6 @@ { "name": "d4x.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dabbot.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "daciaforum.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "dag-hebergement.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dai-rin.co.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dailyblogged.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dailyhealthguard.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -21933,7 +21889,6 @@ { "name": "drillion.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "drinknaturespower.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "driven2shine.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "drkhsh.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "drms.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "drunkscifi.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "drybasement.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -22154,7 +22109,6 @@ { "name": "foregroundweb.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "foreverssl.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "formation-assureur.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "formersessalaries.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "forrestheller.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "forsyththeatre.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fortress.no", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -22482,7 +22436,6 @@ { "name": "im66.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "imadalin.ro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "imaginair.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "imanhearts.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "immanuel60.hu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "immo-vk.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "immobilien-wallat.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -23072,7 +23025,6 @@ { "name": "mtd.ovh", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mtdn.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "muga.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "mulaccosmetics.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mulaisehat.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mulheres18.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "munrabi.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -23190,7 +23142,6 @@ { "name": "nuclearcat.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nuclearcrimes.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nuclearcrimes1.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "nulltime.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "numerossanos.com.ar", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "numis.tech", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nuriacamaras.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -23516,7 +23467,6 @@ { "name": "readtldr.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "realhorsegirls.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "really-simple-ssl.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "realwildart.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "reancos.report", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "reboxetine.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rechtschreibpruefung24.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -24926,7 +24876,6 @@ { "name": "chrstn.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cipri.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cloud.fail", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "clearsky.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cianmawhinney.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "carinsurance.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "clashersrepublic.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -25165,7 +25114,6 @@ { "name": "dogoo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "diadorafitness.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "diagonale-deco.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "dmdre.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "domyzitrka.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "danandrum.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "drybasementkansas.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -25664,7 +25612,6 @@ { "name": "imperdin.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "imperdintechnologies.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "huitaodang.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "iaeste.no", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "imawhale.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "imperiumnova.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "inderagamono.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -25798,7 +25745,6 @@ { "name": "julianickel.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "juliawebber.co.za", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jornalalerta.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "jorovik.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "johnfulgenzi.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "just-pools.co.za", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jskoelliken.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -26247,7 +26193,6 @@ { "name": "nextshutter.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nevolution.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "newcreamforface.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "nehoupat.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "netde.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nesolabs.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "musikverein-elten.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -27108,7 +27053,6 @@ { "name": "tommyweber.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "truekey.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "titelseite.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "trumeet.top", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "trialmock.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "transferio.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "travel-dealz.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -27232,7 +27176,6 @@ { "name": "uniformecomgas.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "versfin.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vagabondgal.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "virtualvaults.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vconcept.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "visionthroughknowledge.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vconcept.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -27304,7 +27247,6 @@ { "name": "willems-kristiansen.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "whitby-brewery.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wp-securehosting.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "windowstech.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "whitepharmacy.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "worst.horse", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "win7stylebuilder.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -28204,7 +28146,6 @@ { "name": "hughtodd.ink", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "icyapril.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hondenoppasfraneker.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "hm773.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "html5media.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hinterposemuckel.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "idealtruss.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -28440,7 +28381,6 @@ { "name": "la-petite-entreprise.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lisowski-photography.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "localdecor.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "lojafilipaper.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lojashowdecozinha.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "livrariacoad.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mac-world.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -28736,7 +28676,6 @@ { "name": "playerscout.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "pissflaps.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "oinky.ddns.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "planlos.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "pi-dash.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "oganek.ie", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "pizzeriacolore.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -28927,7 +28866,6 @@ { "name": "seocomposer.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "scripthost.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "shadowsocks.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "sethvargo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "shadowsocks.la", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "secretar.is", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sharperedge.pw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -29401,7 +29339,6 @@ { "name": "harrypottereditor.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ilikfreshweedstores.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "eminhuseynov.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "hj.rs", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "casadowifi.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "barprive.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "injust.cf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -29606,7 +29543,6 @@ { "name": "borisschapira.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "brucemartin.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bt123.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "budgetlovers.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bypass.sh", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cestasedelicias.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "chentianyi.cn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -30596,7 +30532,6 @@ { "name": "arizonaautomobileclub.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "arjunasdaughter.pub", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "armeni-jewellery.gr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "arnoudraeven.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "arnoudvandalen.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "asianshops.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "asoul.tw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -31149,7 +31084,6 @@ { "name": "itds-consulting.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "iterader.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "itsasaja.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "itsevident.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "itzap.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ivanbenito.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "janssen.fm", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -31321,7 +31255,6 @@ { "name": "markusgran.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "marocemploi.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "marxist.party", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "maryeclark.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mat99.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "matheo-schefczyk.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "matriterie-sdv.ro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -31444,7 +31377,6 @@ { "name": "nvq.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "oben.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "oberam.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "octal.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "odoo.co.th", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "offersgame.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "officeprint.co.th", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -31568,7 +31500,6 @@ { "name": "quasseldroid.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "question.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "qwertee.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "raeven.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rainbowstore.com.ua", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rainpaper.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rb-china.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -31579,7 +31510,6 @@ { "name": "realum.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "realum.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "realum.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "reaven.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rebelessex.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "reboxonline.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "recetasdecocinaideal.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -32075,7 +32005,6 @@ { "name": "beybiz.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bez-energie.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "biobuttons.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "biyori.moe", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "blackseals.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bleaching-tipps.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "block65.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -32483,7 +32412,6 @@ { "name": "tearoy.faith", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "techcracky.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "teyssedre.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "tgamobility.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "thebigbitch.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "thecolumnist.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "thecskr.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -32611,7 +32539,6 @@ { "name": "adsbouncycastles.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "adtgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "adventureforest.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aeon.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aergia.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "affichagepub3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "affordablebouncycastle.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -33828,7 +33755,6 @@ { "name": "thehaxbys.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theinflatables-ni.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theinflatablesne.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "thelonelyones.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thepartydoctors.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thepieslicer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theplaydaysbus.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -33849,7 +33775,6 @@ { "name": "tmc.com.mt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tmcpromotions.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tohokinemakan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tokobungaasryflorist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tokobungadilampung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tokobungadipadangflorist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tokyo-onkyo.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -34030,7 +33955,6 @@ { "name": "os24.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "photo-livesearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "phrive.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pneusgppremium.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pokalsocial.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "products4more.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rhodes.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -34588,7 +34512,6 @@ { "name": "tribac.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tripsinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trynta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "uitgeverij-deviant.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unschoolrules.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ursa-minor-beta.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "usedu.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -34700,7 +34623,6 @@ { "name": "av163.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "avcd.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "avocode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b1.work", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bankmilhas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "barsil.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bella.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -35702,7 +35624,6 @@ { "name": "agoravm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agouraelectrician.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ai1989.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aimerworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aimrom.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "akcounselingservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alainodea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -36256,7 +36177,6 @@ { "name": "gayukai.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "generalinsuranceservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "generationsweldom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "geojs.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getenergized2018.kpn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getpagespeed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getteamninja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -36446,7 +36366,6 @@ { "name": "kirwandigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kissesb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kivitelezesbiztositas.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "klseet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kocherev.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kochereva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kogcoder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -37051,7 +36970,6 @@ { "name": "tourtrektrip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toyota-kinenkan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trackingstream.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "trade-arcade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "travel1x1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "travellovers.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "treetopsecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -37086,7 +37004,6 @@ { "name": "utcast-mate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "utgifter.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vantagepointpreneed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "vasilikieleftheriou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vats.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vatsim-uk.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vatsim.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -37241,7 +37158,6 @@ { "name": "allkindzabeats.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alphavote-avex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alphavote.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "amalfi5stars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amalfilapiazzetta.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amalfipositanoboatrental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amaresq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -38140,7 +38056,6 @@ { "name": "casino-cash-flow.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "casinocashflow.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cgal.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "championsofpowerfulliving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chanddriving.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "charlotteomnes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "checkmyessay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -38906,7 +38821,6 @@ { "name": "dedge.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "deechtebakkers.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dekeurslagers.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dekulk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "delf.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "der-lan.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "despachomartinyasociados.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -39276,7 +39190,6 @@ { "name": "spittank.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sportvereine.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "spotteredu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "spreadsheetgear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ssh.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "star-clean.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "startergen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -40235,7 +40148,6 @@ { "name": "c12discountonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "c3.pm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "camshowhub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "captainsinn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cartouche-deal.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carun.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cdncompanies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -41096,7 +41008,6 @@ { "name": "kazanasolutions.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "keeprubyweird.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kelheor.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kemmerer-net.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kernelmode.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kevinhq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "khosla.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -41509,7 +41420,6 @@ { "name": "commissionagenda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "consulenza.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cooksbookscorks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cornerstonecmc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "corpusslayer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "coursables.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "creared.edu.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -41817,7 +41727,6 @@ { "name": "inchenaim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "indexyz.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "industriasrenova.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ioliver.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ipadkaitori.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "itesign.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "joetsutj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -42986,7 +42895,6 @@ { "name": "kc1hbk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kersvers.agency", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "keys.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kipa.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kirkforillinois.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kitchenalley.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "knetterbak.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -43380,7 +43288,6 @@ { "name": "albertinum-goettingen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alexio.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alexschroeder.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "alliance-psychiatry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alligatorge.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alphaantileak.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alt-tab-design.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -43503,7 +43410,6 @@ { "name": "dariaburger.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "datenschutz-consult.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "david-mallett.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "davidsopas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dawnofeden.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dbmiller.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dc1.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -43751,7 +43657,6 @@ { "name": "kost-magazin.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "krausoft.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ku-7.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kualiti.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kuhne-electronic.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kvnsport.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lagout.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -43958,7 +43863,6 @@ { "name": "quimatic.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qunzi.la", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rachelmoorelaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rahulpnath.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rajkapoordas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "raltha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rangercollege.edu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -44855,7 +44759,6 @@ { "name": "topservercccam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "topservercccam.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "topshoptools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "toucan-informatique.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "treatment.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tripolistars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "truhlarstvi-fise.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -44865,7 +44768,6 @@ { "name": "tryndraze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tvlplus.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tyler.coach", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tylercoach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "typeof.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unblocked.vet", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unkrn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -45480,7 +45382,6 @@ { "name": "e51888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "easew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "easterncapebirding.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "easytechguides.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ecardoo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ecxforum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "electionsbycounty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -46347,7 +46248,6 @@ { "name": "xn--kckd0bd4a8tp27yee2e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xn--mgbpkc7fz3awhe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "youngpeopleunited.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "youtuberis.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zengdong.ren", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zny.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zone403.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -46380,7 +46280,6 @@ { "name": "80036.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "86286286.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8xx.bet", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8xx.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8xx888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8xxbet.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "9riddles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -46582,7 +46481,6 @@ { "name": "cobcode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "codejots.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "codexpo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "codinginfinity.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "coentropic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "comandofilmes.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "comeals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -48124,7 +48022,6 @@ { "name": "ankitpati.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aqdun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arbeitsch.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "architectryan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arizonabondedtitle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arti-group.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "asbestosthedarkarts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -48347,7 +48244,6 @@ { "name": "service-wueste-vodafone.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sethoedjo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shakingthehabitual.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "shawnalucey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shiqisifu.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "signsdance.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "silent-yachts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -48470,7 +48366,6 @@ { "name": "888bwf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "88bwf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "9822.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "9822.bz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "abdel.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "accoladescreens.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "actonwoodworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -48565,7 +48460,6 @@ { "name": "aos-llc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aptitudetests.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "araraexpress.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "armanozak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arviksa.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "asproni.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "astral-imperium.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -48895,7 +48789,6 @@ { "name": "mangahigh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "manmeetgill.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mariacorzo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "marijnfidder.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marjeta-gurtner.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "markandrosalind.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marketingforfood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -49043,7 +48936,6 @@ { "name": "pasadenasandwich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "paulcooper.me.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "peacedivorce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "per-olsson.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "peterjin.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "petr.as", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pewnews.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -49653,7 +49545,6 @@ { "name": "fdresearch.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "felixaufreisen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "feng-hhcm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "fierscleaning.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "film-colleges.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "finance-colleges.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fire-schools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -49754,7 +49645,6 @@ { "name": "isavings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iskanderbroere.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "islavolcan.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "itsundef.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iurisnow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ivy-league-colleges.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iwebolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -50324,7 +50214,6 @@ { "name": "darklaunch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "davypropper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dedicatedtowomenobgyn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "deepinsight.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "deliveryiquique.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "desuchan.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "desuchan.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -50668,7 +50557,6 @@ { "name": "aidanmitchell.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "airlibre-parachutisme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "airswap.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "airweb.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alibiloungelv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alis-test.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "allpointsheating.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -51497,10 +51385,8 @@ { "name": "holyspiritweb.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "homes-in-norcal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "homes-in-stockton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "homestay.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "horairetrain.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "horizonresourcesinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hotel-kontorhaus-stralsund.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hotel-kontorhaus.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hotelromacuernavaca.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hugo.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -51539,7 +51425,6 @@ { "name": "jclynne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jeffrhinelander.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jennierobinson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "jering.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jgoldgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jgregory.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jimizhou.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -51824,7 +51709,6 @@ { "name": "sassandbelle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sassandbelletrade.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sassandbelletrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "saveoney.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sbscyber.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sceenfox.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scentofwine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -52686,7 +52570,6 @@ { "name": "huangjia99.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hypeitems.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "i2gether.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ibiu.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ibutikk.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "icnsoft.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "idoparadoxon.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -52706,7 +52589,6 @@ { "name": "impera.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inessoftsec.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inethost.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "informations-echafaudages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "infosectalks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "infranoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "infrapeer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -53046,7 +52928,6 @@ { "name": "perfectstreaming.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "periodic-drinking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "persocloud.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "peterbarrett.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "peterhons.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pflug.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "phillipsdistribution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -53193,7 +53074,6 @@ { "name": "redzonedaily.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reening.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reflets.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rendall.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "renovablesverdes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rensa-datorn.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rentayventadecarpas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -53243,7 +53123,6 @@ { "name": "seamoo.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "searchfox.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "section77.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "securist.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "seedcoworking.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "segnidisegni.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sekikawa.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -53404,7 +53283,6 @@ { "name": "tittelbach.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tobi-server.goip.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tobi-videos.goip.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "toddmath.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tofliving.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tombroker.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tonifarres.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -53513,7 +53391,6 @@ { "name": "woodenson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wpexplainer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wpno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wptorium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wrightselfstorageandremovals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wunder.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wx37.ac.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -54086,7 +53963,6 @@ { "name": "danielparker.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "darkestproductions.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "datahive360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "david-hinschberger.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dbmxpca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "decfun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "decrypto.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -54098,7 +53974,6 @@ { "name": "derbyware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "desertmedaesthetics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "devswag.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dexonrest.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dhbr.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dia.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "diccionarqui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -54328,7 +54203,6 @@ { "name": "maplegate.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "margays.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "matrieux.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "maxlaumeister.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "meangirl.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mellitus.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "merchcity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -54707,7 +54581,6 @@ { "name": "133492.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "136774.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "137724.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "141145.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1889p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "2083236893.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "2206p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -55206,7 +55079,6 @@ { "name": "horsegateway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hostingalternative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hotel1926.com.mt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hrafnkellbaldurs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "huangqifu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ideatarmac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "idyl.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -55373,7 +55245,6 @@ { "name": "mamabepo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "manantialdevida1450.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "maniacoland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "marietrap.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "maroismasso.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "martian.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "massagetherapyschoolsinformation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -56006,7 +55877,6 @@ { "name": "cookingperfected.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "courseconfidence.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cricklewood.condos", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ctknight.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cupoane-reducere.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cursosypostgrados.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cvutdecin.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -56032,7 +55902,6 @@ { "name": "earn.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "econsorzio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "emergencyshutoff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "emil.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "encens.boutique", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "epasar.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "escalesensorielle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -56083,7 +55952,6 @@ { "name": "inflated.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "isaropiping.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jabba.homelinux.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "jonas.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jxkangyifu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jz585.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kalugadeti.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -56703,7 +56571,6 @@ { "name": "gurunpa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gyume.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "h33t.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "harelmallacglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hawawa.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "healthyrecharge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "heikohessenkemper.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -56752,7 +56619,6 @@ { "name": "ltlec.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ltmw.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "m2tm.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mailhardener.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mainhattan-handwerker.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "malibumodas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mantuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -57094,7 +56960,6 @@ { "name": "mandiblackburnphoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mathes.berlin", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "medsblalabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "meidev.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "minapin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "minhyukpark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mirrordream.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -57632,7 +57497,6 @@ { "name": "a-bm.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aaronfurtado.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "acefreightco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "adamgibbins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "adc64.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "administratiekantoorblom.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "adrianobarbosa.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -57931,7 +57795,6 @@ { "name": "unblocked.cx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unblocked.llc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "univate.berlin", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "urbanxhome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "usamdt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uvx.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uyku-apnesi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -57946,7 +57809,6 @@ { "name": "wanmen.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wardslager.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "websa.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "weidehelp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "widely.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wigelsworth.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "woodwormtreatment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -58439,7 +58301,6 @@ { "name": "cansworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carbon.coop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cardano.eco", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "caroleblouin.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carolineeball.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "casian.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "catenariadiscos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -58694,7 +58555,6 @@ { "name": "xn--95q32l0t6b9cb17l.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xn--anyd-7na.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xn--int-ru8ea.xn--6qq986b3xl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "xn--kkcon-fwab.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xtri.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ys6888.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zahnarzt-drvogel-rosenheim.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -58808,7 +58668,6 @@ { "name": "guysauto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gwo24.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "h2rul.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "halbowman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "haplogroup.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hashtagpatriot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hawaiioceanproject.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -59001,7 +58860,6 @@ { "name": "592227.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "599980.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "716227.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "716331.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "7pb.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "933325.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aattrans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -59127,7 +58985,6 @@ { "name": "gummientchen.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hangerphant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "haskett.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "healingourskin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "heaven.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hellomedian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hengroenet.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -59473,7 +59330,6 @@ { "name": "elettricisti.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elipsyum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "emilybellydance.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "empatico.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "enersolelectrical.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "entropy.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eringmaguire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -59661,7 +59517,6 @@ { "name": "skyscnr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "slopeedge.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "slownik123.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "slpm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "smartmachine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "snabblim.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "snopyta.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -59922,7 +59777,6 @@ { "name": "cakeoffencesact.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "callerstrom.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cameronthomson.racing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "canadaradon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carespot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carlislepassionplay.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cases.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -59984,7 +59838,6 @@ { "name": "dakindesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dakinnyc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "darani.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "darkskymap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "datelligent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dcdestetica.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "death.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -60219,7 +60072,6 @@ { "name": "kartbird.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "katieriker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kaypasocks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kee.pm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kevchia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kexino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "keynes.id.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -60239,7 +60091,6 @@ { "name": "koof.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "koreaninhd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "korem011-tniad.mil.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ksoc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kumpulannamabayi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kunvn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kupferschmids.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -60638,7 +60489,6 @@ { "name": "techcu.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "techjobplaybook.nyc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tecknobox.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "teeqq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tehniss.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "teleskell.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tenthousandbottoms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -60888,7 +60738,6 @@ { "name": "changemywifipassword.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chliine.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "classiccutstupelo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cmserviscz.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "consultasdigitales.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "controlambientalbogota.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "counterenlol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -60979,7 +60828,6 @@ { "name": "klu.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "koeldezomerdoor.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "koenrh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "koenrh.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "koenrh.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "koenrouwhorst.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kolas.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -62172,7 +62020,6 @@ { "name": "ii9728.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "imoe.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "imoney.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "imovel5.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "impresapulizie.firenze.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "infstudios.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inputmodes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -62765,7 +62612,6 @@ { "name": "luckystorevn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "manicuradegel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "manicuradegel.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mariafernanda.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marvell.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "matt.gd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mauricioquadradoconsultor.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -63177,7 +63023,6 @@ { "name": "se.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sector.zone", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "securemantra.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "seerainer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "serenavilage.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sglorch.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shachang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -63885,7 +63730,6 @@ { "name": "videownload.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "viennadancecrew.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vipf88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "vivo.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vtuber.land", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vv6957.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w6729.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -64430,7 +64274,6 @@ { "name": "cnymenshealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cododigital.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "comeyegroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "comicsans.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "contabilidadebrooklin.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "contactaffix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "correctemails.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -64720,7 +64563,6 @@ { "name": "tintoria.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tohofc.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tomasmoberg.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "torresshop.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tqm1.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "twlitek.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "umail2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -65009,7 +64851,6 @@ { "name": "nahouw.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nasladko.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "naslovi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ncascade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nednex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "networkmas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "newdirectionsolar.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -65167,7 +65008,6 @@ { "name": "blenderman.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blogdefarmacia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "botnam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bouwplaatscheckin.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "briangosnell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brianpagan.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "buddy-development-rabodirectconnect-api.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -65241,7 +65081,6 @@ { "name": "getcheapinsurancenow.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glamur-video.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "godan.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "goldlevelmarketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goparity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goswak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "graviola.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66034,7 +65873,6 @@ { "name": "588e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "62222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "88btt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "91milk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "a2os.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "acapadena.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "accadia.academy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66179,7 +66017,6 @@ { "name": "israelil-leumidev.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "issoexiste.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "itdutchie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "jaculus.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jehelpdesk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jeps.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jeroendev.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66209,7 +66046,6 @@ { "name": "ks996.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kuscheln.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "larpkalender.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "larryandprisca.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lebanonbitcoin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lichtletters-huren.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "linosky.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66650,7 +66486,6 @@ { "name": "indianjewellery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "infixegypt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "infotelecharge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ingestion.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "injurylawyer.world", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "innovacoachgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inoio.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66668,7 +66503,6 @@ { "name": "joorshin.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jppcadvertising.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "juweliervanwillegen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kaanhaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "karodos.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kathy.lgbt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kawaii.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66834,7 +66668,6 @@ { "name": "thekiddz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thutucxuatnhapkhau.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tipsdebellezaysalud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tobimi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tomstew.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tracknerd.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trainingswiese.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -68798,7 +68631,6 @@ { "name": "sritspanish.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sritvermont.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "standartgost.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "starsandmanifolds.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stealthpressurewashers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stebenkov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stefchapman.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -69456,7 +69288,6 @@ { "name": "bridgedigest.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brigittefontaine.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bromo.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "brownwolfstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "browsbybecca.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bssolvfagen-pre-storeswa-wap.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "btc-alpha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -71136,7 +70967,6 @@ { "name": "demadryn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "der-rohrstock.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dermo-concept.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "df63.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "digitalch.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "digitalchurch.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "digitaldaily.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -71352,7 +71182,6 @@ { "name": "stylusgroup.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "subven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "supersandro.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "swgenetx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "swlabs.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sycca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "symplexia.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -71393,7 +71222,6 @@ { "name": "valordotrabalho.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vandrielschoenen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vidady.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "villavaltava.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vintagecarparts.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vns89386.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vorsco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72139,7 +71967,6 @@ { "name": "xlunastore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xn--80ageukloel.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xn--skmotoroptimering-zzb.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "xoommit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xy369.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yap26.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yavin4.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72164,7 +71991,6 @@ { "name": "88home9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "88wewin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "9kb.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aaapo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "afashion.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aigner-club.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aigner-club.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72428,7 +72254,6 @@ { "name": "snj.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sofiawestergren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "softly.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sonderfloral.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "songyang.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "srfloki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "srkb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72584,7 +72409,6 @@ { "name": "diabhal-staff.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "digiepoxypaint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "digitalframe.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "disruptiveadvertising.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dnssecandipv6.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "doctorcalefon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dotnetdocs.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72613,7 +72437,6 @@ { "name": "fgafsaneh.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fish4dogs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "florida-immigration.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "fluidpicturesinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "flying-dudes.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forexarby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fortdodgeradio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72920,7 +72743,6 @@ { "name": "glamcosmetic.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goldeneggs.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "graddient.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "grahamarthur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "growingsmiles.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "growwithdaylight.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gymlife.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73204,7 +73026,6 @@ { "name": "christopherd.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clarkwifi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cleveille.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cliksource.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clinicos.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "codingblog.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "colonize.africa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73292,7 +73113,6 @@ { "name": "magniflood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mansora.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marijuanajobscannabiscareers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "martindoe.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "masterplumber.coach", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mcs-kutc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mcukhost.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73561,7 +73381,6 @@ { "name": "fuckssl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "funktionevents.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gaetantremois.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gaozj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "garduri-electrice-animale.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "globalairsea.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "globalvoice.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73930,7 +73749,6 @@ { "name": "drewlearns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ducksoft.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eaglenation.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ecuteam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "edisa.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "electrum.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elena-baykova.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74521,7 +74339,6 @@ { "name": "ceskaexpedice.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chapek9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chicagobreastaugdrs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "chriswilding.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chronograph.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chronosgroup.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "classicfg.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74597,7 +74414,6 @@ { "name": "freedomhk.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "freedomhkg.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "freedomhkg.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "freevision.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fujieb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fxsshiwo.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "g00228.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -75427,7 +75243,6 @@ { "name": "artofhappyliving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aspireuniversal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aspirevc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aussiemilfs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "background-checks-systems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "background-checks.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "background-checks.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -75538,7 +75353,6 @@ { "name": "greekplots.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "greiner-it.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "greinerj.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "groupescr.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grupoalpi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gryinx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "h36533.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -75624,7 +75438,6 @@ { "name": "mercadosex.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "meridanas.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mgae.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mia.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mijngeldcoach.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mimolo.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mist79.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -75722,7 +75535,6 @@ { "name": "soupbuahtaza.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sphericalvision.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "spmax.design", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sprossenwand.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stagemaster.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stamboomforum.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "statuswatch.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -75830,7 +75642,6 @@ { "name": "abdullahavci.net.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "adamoshaver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aes-freundeskreis.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "affaire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agenciabonobo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ainzu.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ajbenet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -76006,7 +75817,6 @@ { "name": "hardweb.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hastaneurunleri.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "haystackrenovation.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hearty.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hiyoko-shokutaku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hmeonot.org.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "homeworkacers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -76389,7 +76199,6 @@ { "name": "action-verite.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "adv-f1.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agriquads.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "alliedpavers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "allspinecare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ampgroep.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amt-taxfrance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -76485,7 +76294,6 @@ { "name": "dev-pmcc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dev.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "devconf.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "devpp.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dgangsta.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dhtr.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "digitalagencynetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -76585,7 +76393,6 @@ { "name": "jdproofing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jenniwiltz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jensdesmeyter.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "joaobautista.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "johnrosen.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jonaskarlssonfoto.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jonathanha.as", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -76821,7 +76628,6 @@ { "name": "102ch.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "19990bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "19990cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "19990d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "19990dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "19990ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "19990ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77015,13 +76821,11 @@ { "name": "fullcirclestudio.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "g22-livechat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gabe.house", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gamingroomaccessories.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gardensandgifts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gatomanias.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gaypirateassassins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gesamenvat.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getboubou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gezondetips.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glamira.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "global-monitoring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glutenfreehomemaker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77689,7 +77493,6 @@ { "name": "marketplacestrategy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "masdemexico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "masterwayhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "matthiasmueller.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mattrude.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "maywoodpark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mbc.asn.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77719,7 +77522,6 @@ { "name": "myjarofhope.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myloanmanager.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nbook.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nectardigit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "netliste.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "netzwerk-lq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "newyorkhiltonmidtown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77748,7 +77550,6 @@ { "name": "patlis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "patrickcurl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pcrab.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pedigreetechnologies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pendrivelinux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "performancepiers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "permista.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -79475,7 +79276,6 @@ { "name": "widecontrol.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wolfhowl.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wonderland.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wondium.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wordpressp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "worldvisionsummerfest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wrap.in.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -79967,7 +79767,6 @@ { "name": "speeder.best", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "speederss.best", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "spteam.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "stevenapate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "studiekort.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "studiekortet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "studiekortet.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -80754,7 +80553,6 @@ { "name": "belgie-postcodes.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "belkamfish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bellabrowbydesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bennet.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bestguessonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bet86ah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bet86am.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -80814,7 +80612,6 @@ { "name": "camptuk.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cani-compostelle.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cardideas.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "carnivorousplants.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "catherinejflee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cavaleirocity.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ccgx.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81761,7 +81558,6 @@ { "name": "huai123.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "i0day.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ibex-lb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "internewscast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ionutnica.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ippo-juku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "isis.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81877,7 +81673,6 @@ { "name": "speciale.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sportingpontenova.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stacyscbdoil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "stadlwirt.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "starinc.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "startw.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "steffi-knorn.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -82108,7 +81903,6 @@ { "name": "logibow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lucade.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lumoria.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "luxury-inside.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "maisapanama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "maisie.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "malcolmellis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -82514,7 +82308,6 @@ { "name": "hoffmann-fliesen-design.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "homedentist.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hostpoint.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hotdates18.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ichinghero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ignation.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iiet.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -82776,7 +82569,6 @@ { "name": "zusterjansen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zwilla.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "11ag8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "123viajando.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "12ag8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "13ag8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "16ag6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -83516,7 +83308,6 @@ { "name": "capssouthafrica.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carcountking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "caritascenter.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "carlosbronze.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carre-jardin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carsinsuranceis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "casamiento.com.uy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -83627,7 +83418,6 @@ { "name": "digchip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "digchip.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "digchip.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "digitalcanvas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "digitallive24.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "digitalproj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "digitium.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -83683,7 +83473,6 @@ { "name": "englishliterature.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "enigmadark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "epsilon.photography", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "eskiegaming.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "esmibot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "est8.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "estudosnacionais.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -83821,7 +83610,6 @@ { "name": "hoogelandzorg.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "horaciolopez.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hostedghost.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hotdates18.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hothub.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "howunadeydoam.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hucklebucks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -84296,7 +84084,6 @@ { "name": "soundmoney.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sourcecode.hosting", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "southernviewmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "spacebabies.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "speaker-animateur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "speedliner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sponsor.software", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -84592,7 +84379,6 @@ { "name": "bdtc.com.bd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "be-in.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "be.ax", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "beatsearch.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "belidzs.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beratung.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bergunabanget.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -84646,7 +84432,6 @@ { "name": "cardiosportsilvinadelgado.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cardloan-center.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "careercapital.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "carlesjavierre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carlospiga.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carpetinstallationpros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "casadeladiabetescali.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -84683,7 +84468,6 @@ { "name": "comunidadciclismo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "conntrack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "constructoraferamaingenieros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "controlshiftlabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cophumouraustralia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "copygeneral.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "corneerasmus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -84785,7 +84569,6 @@ { "name": "encode.training", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "entomobolivia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "entrenossocialinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "erapotensia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "es.ax", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "essentieleolie.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "etdp.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -84810,7 +84593,6 @@ { "name": "findolino.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "findolino.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fiosgenomics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "firmground.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fishygames.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fitandfightrijswijk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "flatart.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -85382,7 +85164,6 @@ { "name": "thecorianderkitchen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thefabulouslifestyles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thegingersnapbaker.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "thestable.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thewebaround.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tiandixing.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tilid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -86052,7 +85833,6 @@ { "name": "33kpkp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "33vu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "33zaza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "33zv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "33zxzx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "34ac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "34ae.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -87107,7 +86887,6 @@ { "name": "hardmagic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hautzentrumwien.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hersmartchoice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hidglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "highgatejoinery.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "highlandpublicschool.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "himalayanoutback.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -87171,7 +86950,6 @@ { "name": "kylehaka.la", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kylehakala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lechucero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "leonvermunt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "livingtohearsix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "localbiketrader.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "localemergencyplumber24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -87423,7 +87201,6 @@ { "name": "amp-logistics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "andrewmichaelsmith.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "angievancise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "antocom.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "apvc.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "areminder.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arjanhofmann.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -88033,10 +87810,7 @@ { "name": "zakbk.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0km.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0x2a.ninja", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "1211bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "1266bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1277bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "1299bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "171365a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "171365b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "171365c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -88063,13 +87837,9 @@ { "name": "171365z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1clic1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "2122bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "2322bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "233.land", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "233.services", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "233image.land", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "2366bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "2377bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "2399bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "24webservice.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "30for30podcasts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3133bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -88156,7 +87926,6 @@ { "name": "babyvillagegt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bachelorampel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "backporchartists.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "banimarket.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "basamadco.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "basementdoctorwestvirginia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "basementdoctorwv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -88717,7 +88486,6 @@ { "name": "lekkerleben.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lesborgestv.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "leticia.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "letiziamx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "letsdevelop.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lfcnsv.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "libcip.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -88794,7 +88562,6 @@ { "name": "mychicken.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myfsb.bank", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myfutureself.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mynook.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mypet24.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mytefl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "narec.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -95868,7 +95635,6 @@ { "name": "ryazancity.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rybinsk.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rybnitsa.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ryland.consulting", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rymanow.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rymergames.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rzero.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -99121,7 +98887,6 @@ { "name": "midi-coquillages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "miisy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mikeyroxtravels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "miratechgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mirumhongkong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "misson.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mlfitnesscenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -99140,7 +98905,6 @@ { "name": "mycloudhome.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myriadlex.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myswimmingclub.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nataschaskraamzorg.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nbsgames.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nejrecept.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "newikis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -99253,7 +99017,6 @@ { "name": "techiecomputers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "technews360.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "teknisetdemarit.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tepui.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "texnogu.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thegatewaytoanewworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "themedicalmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -99356,7 +99119,6 @@ { "name": "backflow.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "baecker-know-how.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "baghtelecom.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bayanbennett.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bbcustomremodeling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bbunits.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bcyw56.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -99391,7 +99153,6 @@ { "name": "chinafree.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "christo.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cibleclick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clariti-health.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clementpinon.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cloudfree.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -99559,7 +99320,6 @@ { "name": "locksmithunit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "locksmithunit.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "logodzyn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lojahbk.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lojavirtualdopsicopedagogo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "losangelesescorts.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "luisabreu.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -99758,7 +99518,6 @@ { "name": "sumareaguas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "summer.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sumutoday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "suntzuparadirectivos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "supercours.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "support96.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sweetologist.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -100095,7 +99854,6 @@ { "name": "keshankang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "key.lol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kibazen.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kinklist.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kinkyheretics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kokily.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kristineskitchenblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -101038,7 +100796,6 @@ { "name": "eternia.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ewelinagrochowina.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "exashop.tn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "explodingearths.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "expobeds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eyestrainexplained.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "familytravelmagazine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -101713,7 +101470,6 @@ { "name": "mypiloteis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myrasp.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "n30019.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "naganoziotech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "naturopatiasiddharta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "neimadtelliam.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "neither-side-news.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -101786,7 +101542,6 @@ { "name": "pohoron.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "point.pink", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ponteachambear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pontupagina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pooteng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pornline.sex", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pornogam.porn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -102160,7 +101915,6 @@ { "name": "fenyks.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "finalgambit.band", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "firstbaptistchurchofchrist.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "fitmybike.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fl0w.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "flowbuk.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "flowcrypt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -102336,7 +102090,6 @@ { "name": "novaway.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nycstyleboutique.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oecdpisaforschools.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "offtherayles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ohiowebtech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "orbitgoods.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "osdnc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -102465,7 +102218,6 @@ { "name": "verdi.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "verzi.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "villu.stream", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "virtool.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vivo.cam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "voltajedigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wallabywallaroo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -102768,7 +102520,6 @@ { "name": "linulex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lizteacher.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "locoxlasmascotas.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lojaonlineshop.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "loopcore.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lost-in-place.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "maiotik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -102987,7 +102738,6 @@ { "name": "xpsauto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xpsautomation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xvaldezendocrino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "yamanami.tokyo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yourcrypto.tax", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zamtech.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zenspace.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -103811,7 +103561,6 @@ { "name": "santandertrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sarahjaneredmond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "saxobroko.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "schoffelcountry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scifplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scifsafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scorb.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -103859,7 +103608,6 @@ { "name": "thewaytoyourself.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thoplam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tiendamaquillajes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tilcra.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tinmarin.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tradeshift.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trains.sexy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -104128,9 +103876,7 @@ { "name": "hope21.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hopkinsmediation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hotelfloridachaco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "howarh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "howtohomeschool.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hypertesto.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hypr.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iamattila.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ifederalland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -104396,7 +104142,6 @@ { "name": "venbraca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "verstaanwiskunde.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "verygoodwebsite.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "vidaxp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vincentwolsink.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vincie.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vipturismo-europa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -104808,7 +104553,6 @@ { "name": "polifisio.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "poppylala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pornbot.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "precisionstocks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "privatefiles.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "proxybay.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qlulife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -105009,7 +104753,6 @@ { "name": "braun-soddisfattiorimborsati.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bricks4kidzelearn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brickvortex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bridges2understanding.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brizzo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "broca.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bsknri.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -105097,7 +104840,6 @@ { "name": "fenotipo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fetishwheels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "financialnews.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "fiorebjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fireplacesutah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "flagstoneim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "flibanserina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -105245,7 +104987,6 @@ { "name": "meperidina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "messengerwebdesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "metrosyvaras.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mgfashion.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "michaelamead.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mijncloud.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "minhng99.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -105321,7 +105062,6 @@ { "name": "principedepaz.gt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "println.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "privanza.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "prixpictet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "productivemachine.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "prosperos-services.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "prostaglandina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -105381,7 +105121,6 @@ { "name": "stellarlumensnews.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stockmarkettoday.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stormdamages.claims", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "strategicmind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stumblefallcrawl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stx.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "styllussports.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -105635,7 +105374,6 @@ { "name": "droneways.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "duansunshinesdiamond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dvwa.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "e-estonia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ecamisetas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eclipse4academia-startups.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "egypttimetravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -105751,7 +105489,6 @@ { "name": "jy11.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "k2analytics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kakazai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kappawingman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "karlov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "khalidalnajjar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kienviethung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -105820,7 +105557,6 @@ { "name": "nk-vision.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nkontur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "notimesupport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nunogand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oandareview.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "obscur.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "odiris.lk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -105950,7 +105686,6 @@ { "name": "totalinfo.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trade99review.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tragaver.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "travelix.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "treatmentindiana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tronnews.best", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tronnews.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -106354,9 +106089,7 @@ { "name": "mrcool.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mrtg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mssa.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mtsn3padang.sch.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "muchbetterthancash.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mutahar.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mydaymark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mylittlegrocer.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mylittlegrocer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -106457,12 +106190,10 @@ { "name": "sandramorrone.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sarah-secret.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sardegnarifiuti.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "satyamshivamsundaram.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "saul-eslake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "secrets-marketing.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "security-courses.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "segurdatacr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sekko2.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sendai-cdc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sendai-ctr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sendai-rc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -106872,7 +106603,6 @@ { "name": "logalot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "long-journey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lprr.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lucaplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lucasrajaonutricao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "maarivpn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "madmenmedia.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107044,7 +106774,6 @@ { "name": "sterlingtechnotrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "straightlinetutoring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "success.market", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sukriyedonmez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "suncitycinemas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sunday.pm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "synccore1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107507,7 +107236,6 @@ { "name": "shireyishunjian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "siemens.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "silverbox.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "simply2020.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sitechange.dedyn.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sjaaktrekhaak.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "skygates.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107650,7 +107378,6 @@ { "name": "alonsoluzgas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "altadancesport.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alvarojacome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "amalbansode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ampdes.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "andislaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "apruebaexamenes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107896,7 +107623,6 @@ { "name": "kuisus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kwx.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "l4s.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "landoftherisingson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "langyamk.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lastrourbanismo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "legba.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -108058,7 +107784,6 @@ { "name": "tishsglitches.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tmstats.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tontonroger.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "top1.com.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toplevel.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trouvons.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ttcmed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -108126,7 +107851,6 @@ { "name": "almasteb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alphalight.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alphalightgear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "amineamellouk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anjaamelia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ankarakurumsalwebtasarim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ao3-cn.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -108371,7 +108095,6 @@ { "name": "pelatihanwirausaha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pension-chevaux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "persuasionmatters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "phg-eg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "plexmark.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pmi-install.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pmrockstars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -109334,7 +109057,6 @@ { "name": "ethicalads.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "etsu.edu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "evante-bus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "examesrush.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "examroll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "excite.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "expressrepair.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -109454,7 +109176,6 @@ { "name": "harakahdaily.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hardinal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hargaindo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "healthequity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "heartofamum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hellven.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "heraldmakassar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -109579,7 +109300,6 @@ { "name": "lasmorfianapoletana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lastlightlodge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "latdor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "latouchemusicale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "laura.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "laurahausmann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "laventura.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -109678,7 +109398,6 @@ { "name": "ncegs.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nepdtp.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "netlify.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nettruepro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "newmuslims.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "newsbytesapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ngutek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -109772,7 +109491,6 @@ { "name": "pressnetwork.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "price-tracker.duckdns.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pricetum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "privatehd.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pro.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "productmarketingalliance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "productum.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -110111,7 +109829,6 @@ { "name": "beauty-salon-lino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beautyinfos.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "biki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "billy.wales", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "binabangsaschool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bioselect.com.cy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blastoise186.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -110502,7 +110219,6 @@ { "name": "arcskoru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "armyholidays.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "armyrtf.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aroncull.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arsenalzae.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ashwainfo.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "asthma-uk.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -110753,7 +110469,6 @@ { "name": "polisanaraka.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "polisanarciarska.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "polisynazycie.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pollyundpaule.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "porkyx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pornodvdkopen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "povzetki-knjig.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -111362,7 +111077,6 @@ { "name": "amaismarket.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amithvijayan.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anlitas.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "answering365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "antenadorada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aperture.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "apkfame.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -111538,7 +111252,6 @@ { "name": "libget.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lifebun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "liquidplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "loavies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "loli.edu.kg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "londynelliot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "love4taylor.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -111640,7 +111353,6 @@ { "name": "stopthemoss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "strijdmeevoorvrede.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "strikers.futbol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "strongdm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stroopwafel.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "studentingent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sumatogroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -111707,7 +111419,6 @@ { "name": "42browning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aanmeldensecundairescholen.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ackadia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aeonc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ageasagentessummit.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agrotek.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aicamilwaukee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -111748,7 +111459,6 @@ { "name": "belfa.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bijlesportal.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "billiebikes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "birdgifs.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bit-and.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bitpress.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blaarmeersen.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -111847,7 +111557,6 @@ { "name": "fossbytes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "freakinstream.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "freetrial.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "freshplus62.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "futureindia.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "futureshock7130.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fyziotomi.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112047,7 +111756,6 @@ { "name": "s20121946.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "safetymeasuresas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "salaamgateway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "samroelants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "samuel-philipp.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scholarsclub.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scottandtammy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112107,7 +111815,6 @@ { "name": "trarch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "travelbags.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "travelbags.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "treatyoself.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tulippublishing.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tutorialforest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uhost.cyou", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112246,7 +111953,6 @@ { "name": "cxda.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cybernest.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cybertik.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cycling74.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dachshundtalk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dashboard.gov.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dashboardph.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112789,7 +112495,6 @@ { "name": "cdrom.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cecamericas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "centurion-it.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "certprep.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "certpro.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cfent.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cfo4you.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112920,7 +112625,6 @@ { "name": "esm.run", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "espenandersen.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "everythinglidia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "examesrush.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "excellence.corsica", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "executivecatering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "expandtheroom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112987,7 +112691,6 @@ { "name": "gyefund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gyefund.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "h2orto.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "habrastorage.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hatierchinois.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hcr2bot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "healthyhomeventilation.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -113508,7 +113211,6 @@ { "name": "zahnarzt-backfisch.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zelvar.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zerofogmask.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "zerty.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zhstar.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zimedia.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zorgenvoorherena.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -113717,7 +113419,6 @@ { "name": "init3.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inkhub.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ipass.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "iprep.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "isaacgolding.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ite.st", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ivnext.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -113850,7 +113551,6 @@ { "name": "saisyuusyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "samanthabiggers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "samuel-brown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "samuelbramley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "san.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sangitafoodmess.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sanity.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -114180,7 +113880,6 @@ { "name": "digitalis-france.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "disinfectiondoctor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "divinecnainstitute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dodomy.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dolle-shop.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dpc.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dues-eckert.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -114290,7 +113989,6 @@ { "name": "inwonderofit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ip-addr.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iqreview.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "isleyfarmsupply.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "israel-escorts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "israelimtovim.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "itsgreener.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -114472,7 +114170,6 @@ { "name": "platinmods.my.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "polymathian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pozyka.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "prepz.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "press-wall24.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pricesdoors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "profarm.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -114631,7 +114328,6 @@ { "name": "valerieorsoni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vault.spdns.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vdheyden.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "verkiezingsuitslagen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vermaeckbouw.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vfwauxiliary.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vipku.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -115287,7 +114983,6 @@ { "name": "swissmarket24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "symbolics.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "symstar.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "symvolik.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "syuumi.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "t-shirt-template.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tabletsandlaptops.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -115295,7 +114990,6 @@ { "name": "taiyou-planning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tamamo.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tarper24.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "taskussa.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taxadvantagellc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tayanasolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "teacherfrancis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -115363,7 +115057,6 @@ { "name": "usahealthwebapps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ussst.org.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "valencraft.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "valencraft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "valeryaksesuar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vanderbeekonline.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "venev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -115456,7 +115149,6 @@ { "name": "almanea.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amateur-ham-rad.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amazingpetshere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "amigosdivecenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amindset.hk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "analisi-grammaticale.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "analisi-periodo.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -115507,7 +115199,6 @@ { "name": "attlane.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "attorneystrialgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "authenticate.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "autoblok.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "autobot.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "autogarant.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "autohausmf-nord.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -115852,7 +115543,6 @@ { "name": "hclu.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hds-rx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "headofhair.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hearty.gift", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "helprf.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hen.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "henri.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -116080,7 +115770,6 @@ { "name": "modaadesso.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "modelflight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "modenuit.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "moer.tel", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mondpo.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "moneybirdstorage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "montillafarm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -116090,7 +115779,6 @@ { "name": "morningchew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "morooi.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mortgagewebinars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "motopoland.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mototeam.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mrupp.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mrzauto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -116392,7 +116080,6 @@ { "name": "taijutsubudo.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tammelin.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tannercorporation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tarfandgram.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tasteofadventure.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taxborn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tbi.equipment", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -116451,7 +116138,6 @@ { "name": "tuulialaine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tychoverstraete.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tygochrum.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tylertysdal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ubberup.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uberalles.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ue30.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -116619,7 +116305,6 @@ { "name": "yuharahisako.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yumechi.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yzervast-heestert.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "yzydo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zamokservis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zayzoh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zdenekpasek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -117046,7 +116731,6 @@ { "name": "bestdslrcameras.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bestgriefbooks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "besthairsale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "besthomescents.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "besties4life.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bestreleases.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "besttipsntricks.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -117914,7 +117598,6 @@ { "name": "elfranco.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eliminations.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elinformatico.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "elisabethborgermans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eliskamyskova.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elite-forums.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elite-units.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -117934,7 +117617,6 @@ { "name": "eltormo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elverdaderoamor.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elvikom.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "elvikom.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elvis-presley.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "email24.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "emavending.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -118030,7 +117712,6 @@ { "name": "evopack.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eworldmedia.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "examlab.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "examroo.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "exarcheia.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "excelglobalpartners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "exclusivemarket.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -118854,7 +118535,6 @@ { "name": "kontabilitet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "konyahaber.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "koolkool.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "koomaldreaming.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kooratalk.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kopb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "koreanure.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -120391,7 +120071,6 @@ { "name": "tipnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tirebichon.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "titanicauto.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tlicycling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tnved2013-narod.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toki-doki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toledo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -120457,7 +120136,6 @@ { "name": "trophcomplewin.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tropiweb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trubmet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "trugears.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trulock.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trustvox.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "truthlost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -120534,7 +120212,6 @@ { "name": "upfurniture.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uportal.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "upr.llc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "uptech.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uqschool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "urbanarcana.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "urfreecon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -120929,7 +120606,6 @@ { "name": "aihschgo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ajramos.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alamitosbaytraders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "albatrosboat.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alenbadel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alexandre-barret.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alexeyweb.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -121168,7 +120844,6 @@ { "name": "comunidadeseo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "concealoutfitters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "conditionyellowacademy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "connectedrisksolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "conssec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "consultation.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "contrapeso.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -121621,7 +121296,6 @@ { "name": "kitesurfen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "klawitter-kreis.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kleki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "knowuproxy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "koiro.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kolkatanight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kormmi.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -121637,7 +121311,6 @@ { "name": "kwikkarkave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kwikkarofmesquite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kwikkarrichardson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ladybirdeducation.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lakspuiterijmosman.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lanabello.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lansoft.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -122202,7 +121875,6 @@ { "name": "tcsemotion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tcshairandbeauty.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "teachermommylife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tealegrar.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "teamkgsr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "teamwork-bad-wurzach.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "teatrolatea.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -122459,7 +122131,6 @@ { "name": "4budget.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "84036.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "a356.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aaliyahclothing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aamt.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "abayakaram.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aboutconstruction.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -123880,7 +123551,6 @@ { "name": "powersurgedatasystems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "praxisfilms.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pretty-liars.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "prettymama.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "prikolkz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "projectimagine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "prostitytki-nijnevartovsk.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -124347,7 +124017,6 @@ { "name": "camcapital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "campingbuffs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "capitalmarkets.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "car-diagnose.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "caraliadeluxe.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cat2heory.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "caulkingexperts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -124426,7 +124095,6 @@ { "name": "eaofcarrollton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "easukasbestos.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eco69.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "econstitution.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "egotripproductions.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elcozinante.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "electricit.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -124652,7 +124320,6 @@ { "name": "ncrypt.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "netletic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "newsinfo71.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nieuwsberichten.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nilmaracursos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nilmaraquintela.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "noradanismanlik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -124734,7 +124401,6 @@ { "name": "qualitypolyjacking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qualitywaterproofingco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quanquan.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "qxpress.com.py", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rangersofbelgium.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "raomed.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rdv-coquin-rapide.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -124810,7 +124476,6 @@ { "name": "springmountaindistrict.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "standardizarea.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "staywild.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "stefankuehnel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stinkmemes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stockhuntertrading.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stocksfam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -124881,7 +124546,6 @@ { "name": "viscondedemaua.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "visitislandpond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vitaalfitcoaching.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "vivi.zone", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vongdeophongthuy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "voxsiren.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vutruso.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -124936,7 +124600,6 @@ { "name": "zenti-im-zug.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zerodechet.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zjawa.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "zorgvanoranje.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zotan.photography", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0cean.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "100v.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -125874,7 +125537,6 @@ { "name": "akonlineworks.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alasdupur.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alcatraztourtickets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "alctel.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aldastv.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aldo-shop.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aleks.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -126283,7 +125945,6 @@ { "name": "clickzagency.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clindamycinantibiotic.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clinicamagdalena.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "clinicmono.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cloneuniverse.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clonoe.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clothilde-wattelier.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -126378,7 +126039,6 @@ { "name": "deutschlandreport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dev-ylinternal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "devendrameena.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dexerto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dfaapostille.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dianoxofficiel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "diasporan.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -127590,7 +127250,6 @@ { "name": "purtahan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pvplounge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pyjy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "qiu.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qparents.qld.edu.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qrlab.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qrlab.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -127913,7 +127572,6 @@ { "name": "sonsonate.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sophomoric.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sosnova.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "soste.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sosteric.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sota-tv.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "soundshepard.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -128539,7 +128197,6 @@ { "name": "bigmonsters.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "biletturk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bimbingan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bintanglautplatinum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bioadva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "biographymint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "birone.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -129923,7 +129580,6 @@ { "name": "californiabudgetfinance.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "camped.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cangku.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "capris.cr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cartegrise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "casinocity.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "castillo.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -130324,7 +129980,6 @@ { "name": "jnx.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "joeshare.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "joeshimkus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "jogoshoje.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "joiceorthopaedics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "joycosmetics.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "juegosalcubo.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -130341,7 +129996,6 @@ { "name": "kingston-fear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kleinhapl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "klexhub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "klinikatlantis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kolabtree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kommerciya.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kompliant.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -131053,7 +130707,6 @@ { "name": "behindthedesk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beiramar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "belarus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bellflowerlactation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bellyaccessoriesest.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beptutotnhat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bergwandercamp.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -132630,7 +132283,6 @@ { "name": "serwusik.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sexworkrights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sfhp.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "shadhoc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shaned.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sharpletters.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shed49.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -132840,7 +132492,6 @@ { "name": "thingformatter.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "threethirty.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tilecenters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tmamontreal.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toku.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tomdougiamas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "top-aanbiedingen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -133595,7 +133246,6 @@ { "name": "macabeo.bio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "malmomusikskola.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marbermedical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "marcotolk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marqueandbrew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marrakech-desert-trips.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "martinbiely.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -134236,7 +133886,6 @@ { "name": "growledlamp.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "growledlamp.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "guisador.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gunbot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hantera.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hardcoreincest.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "haval.iq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -134274,7 +133923,6 @@ { "name": "kevinvermassen.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kiprooks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kn6olc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kostavro.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "krednal.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kura.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kuruwi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -134423,7 +134071,6 @@ { "name": "snakesolid.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "snorer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "solanowonen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "somni.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "southgeorgiacargotrailers.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "soyka.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "staffhours.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -135418,7 +135065,6 @@ { "name": "antoniorodriguesadv.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anyebooks.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anyebooks.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aoi-ryo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "apollomobile.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aquedim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ararat-rp.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -135522,7 +135168,6 @@ { "name": "businesslondon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "businessnewsera.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "businesstexas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "butsoccers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "buyornot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bv-driver.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "caindelhi.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -135750,7 +135395,6 @@ { "name": "guysroulette.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gymnastic.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gymnastic.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gyx.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "haberkotherapy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hairgrowth.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hairloss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -135850,7 +135494,6 @@ { "name": "joingy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "joingy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "josisummer.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "jrtech.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "judge.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ka-kousin.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kaboommagazine.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -136029,7 +135672,6 @@ { "name": "politicsnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "poolspa.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "poppersy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ppusl.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pravagolosa.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pre-commit.ci", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "preservecrownhill.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -136714,7 +136356,6 @@ { "name": "budapestgraphics.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bugraseyhan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bulentcirakli.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bulhost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bullish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bumirc.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "buscagenealogia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -138465,7 +138106,6 @@ { "name": "recursosrev.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "redfish.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "redhackerteam.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "redper.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reedy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "regele.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rehab.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -138875,7 +138515,6 @@ { "name": "thetoto.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thewebmasters.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thewish.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "thingswithleaves.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thinkwits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thr-kurd.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "throneofmolok.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -139422,7 +139061,6 @@ { "name": "cm-penalvadocastelo.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cmperalta.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "coco-01.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cointree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "commagere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "computer-service.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "concilioderivendel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -139697,7 +139335,6 @@ { "name": "lesnet.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "letterrill.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "libramedia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lilithqueisser.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "limitededitioncomputers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "limitededitionsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lipnihezron.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -139848,7 +139485,6 @@ { "name": "posterlounge.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "posterlounge.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pr92.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "practitest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "prijzen-vergelijken.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "primesensecosmeticos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "prismaot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -139859,7 +139495,6 @@ { "name": "queenondvd.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quest3.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ranchu.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "randyandpixel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rangemarketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rapbull.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rayonnage-stockage.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -140096,7 +139731,6 @@ { "name": "airquestion.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "akustyka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alavieestbelle.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "albaneselorenzo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alerque.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alexlambertz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alexridevski.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -140139,7 +139773,6 @@ { "name": "askusutah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "assoft.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "asteracancercare.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "atlasgaming.ma", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "audiobit.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aureshotels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "autoinkoop.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -140513,7 +140146,6 @@ { "name": "eurocontrol.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "evacuinera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "evakuator-kharkov.kh.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "evoluzione.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "evoting-test.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "expodom.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "expodom.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -140800,7 +140432,6 @@ { "name": "perusteet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pet-guide.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "petersotare.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pinebeecreative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pixifi.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pixyship.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "planetamestizo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -141701,7 +141332,6 @@ { "name": "hobo.video", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hoc-bv.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "holydumplings.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "homewell-hk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "honeyuniversity.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hoofexplorer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hoofexplorer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -141865,7 +141495,6 @@ { "name": "madeinua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "magnetremodeling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mahdi.style", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "maisproduzida.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "malacat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "maldivestraveller.mv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mamilove.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -144728,7 +144357,6 @@ { "name": "casinocity.vu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "catlicking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "caxaa.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ccaag.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ccwallet.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ceiphr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cfdt-fleurymichon.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -144880,7 +144508,6 @@ { "name": "huboo.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hypercritical.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hyunjoonkim.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "idctechnologies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "igamingnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ikbenrichie.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "immanuelos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -145169,7 +144796,6 @@ { "name": "stuartwilsonhair.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "subology.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "summitpediatriaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sundoctors.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sunglassstyle.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sunrisesolutionsutah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "superops.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -145343,7 +144969,6 @@ { "name": "azjosh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "azonic.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "babel.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "balicari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bdsmbibliothek.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beanboygames.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "best-pool-cleaner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -145360,7 +144985,6 @@ { "name": "bradyosborne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bridgethailand28chidlom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brightshinystuff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "brilliantvintage.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "broca.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brock.guide", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brockenhurstguide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -145417,7 +145041,6 @@ { "name": "cyberzone.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dadroidrd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dankrokos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "davehewison.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "davidsmedberg.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dd3ah.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "debashishsahu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -145895,7 +145518,6 @@ { "name": "autoroutes.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "available.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "awakinn.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aydahwa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b5i.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "babycezi.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "babytoschool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -146562,7 +146184,6 @@ { "name": "wildvicky.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "williamlong.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "winchuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wogame.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wowpilates.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wrozbyzkartklasycznych.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xavierxu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -146618,7 +146239,6 @@ { "name": "asapmail.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "asdf.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ashgroveclinic.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "asur.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aulialaundry.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "azkunazentroa.eus", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "barramansa.rj.gov.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -146663,7 +146283,6 @@ { "name": "ch-poitiers.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "childrenoftheshadow.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chineseplease.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "chrawrizard.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chriscelkins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "christianotero.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "civilconcretellc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -146831,7 +146450,6 @@ { "name": "literaturkreis-online.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "literaturkreis.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "literaturpreis.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "log.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lorisvelos.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lossecretosdedorian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "losyandex.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -147228,7 +146846,6 @@ { "name": "edevletkapisi.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "edupesa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "efcpharma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ehdlofsweden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ejkathome.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ejkatwork.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ejkenergie.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -147327,7 +146944,6 @@ { "name": "igpromo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ilikevaping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "imksk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "imlzc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "imoe.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "imranc.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "individualrestaurants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -147431,7 +147047,6 @@ { "name": "mordelles-altitude.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "morrisbart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mrg-team.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mtexpert.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "murrietadogtrainers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "muslimclothing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mutagen.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -147847,7 +147462,6 @@ { "name": "haveibeenpwned.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hayward.uk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hcqmeta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "heartymail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "help24.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "herez.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "highcalorierecipes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -147905,7 +147519,6 @@ { "name": "maid.gay", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "manderstam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marocfoot.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "maxrickettsuy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "maytretrungphuong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "medialine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mediangr.com.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -147950,7 +147563,6 @@ { "name": "paralleum.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "parastasi-clothes.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pardanaud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "patguzmanconstruction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pcsolottodraw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "peopleappstech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "perrosenlapradera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -147996,7 +147608,6 @@ { "name": "servercore.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "serviciotecnicoencomputacion.com.ve", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shoppingonlinecoffee2u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "shoveltoss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sidralmundet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sightsecurity.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "simranmehta.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -148031,7 +147642,6 @@ { "name": "thegoodveggie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "themealpantry.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tiremoni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tirodirecto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toddvbanks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tomi.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "topdogtrainingcourse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -148182,7 +147792,6 @@ { "name": "bonvorur.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bookmaker.expert", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "borntobetogether.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bortox.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brainshit.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brandor.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bravegk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -148240,7 +147849,6 @@ { "name": "cognitivehealthintl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "coharushika.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "compassivaimoveis.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "conclusion.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "corneranimal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cradleaccounting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "crmplace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -148281,8 +147889,6 @@ { "name": "drgabrielschmitt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drink.casa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drivingsupport.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dublinhonda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dublinmazda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "e-e.icu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "e-gc.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ecopark.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -148309,7 +147915,6 @@ { "name": "esperancario.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ethzero.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "evalcorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "examinrush.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "expoxl.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "faroitalia.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fcblueboys.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -148326,7 +147931,6 @@ { "name": "forest-soft.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forexsignalroom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fovndry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "freeman-toyota.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "freemilf.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "freenomyoulilb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "freightcenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -148378,7 +147982,6 @@ { "name": "hadoora.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "happyflow.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "happystores.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "haywardhonda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hdvburs.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "heijmans.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "heptagonsystems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -148563,7 +148166,6 @@ { "name": "nordbusinessaccount.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "northboot.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "novumsafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "novumsoft.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nqeshreview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nugnet.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nulldev.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -148726,8 +148328,6 @@ { "name": "torino.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "totalwebpartners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tqnx.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tracyhonda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tracymazda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "traeger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "traegergrills.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trafficmgr.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -148797,7 +148397,6 @@ { "name": "yachts.rentals", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ycalculators.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ycl.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "youcruit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yourberksbucksoxon.wedding", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yourgloswilts.wedding", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yourkent.wedding", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -148959,7 +148558,6 @@ { "name": "bosquedepalabras.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boumstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bracesbyberry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "braeden.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bratt.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brauhaus.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brew.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -149200,7 +148798,6 @@ { "name": "gotchaphotos.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gotowebstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gotravelmexico.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gottagohack.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grahameger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grancargo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grechutaszkolenia.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -149385,7 +148982,6 @@ { "name": "mos-upak.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mujer.gob.do", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mukli.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mxtm.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myfloridarealty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mygolod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myhechar.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -149546,7 +149142,6 @@ { "name": "sandlerpartners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sanhotel.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sanjanaherath.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sanleandromazda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "saqara.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "schneider-dresden.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "schroderusa.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -150719,7 +150314,6 @@ { "name": "bluelime.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bmrpainting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boisehomeoffers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "boldare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bongit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bonitech.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bono3.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -151257,7 +150851,6 @@ { "name": "rahasyavedicastrology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rbi-admin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rbi-umbrella.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rcforex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rctrk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reachpersonalgrowth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "readcity.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -151355,7 +150948,6 @@ { "name": "steamlevelmarket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stephenbakalian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stethostalk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "stetsed.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stmaryskutztown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stonesgarden.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "storageshedsnc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -151491,7 +151083,6 @@ { "name": "what.ink", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "whichphish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "whizkidpcservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wholebody.je", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wildglass.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "woodlandgarden.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "woodvibes.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -151638,7 +151229,6 @@ { "name": "dressshopboutique.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drfuhrman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "druckagentur.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "drybms.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drziyayavuz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dukkanacmak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dutch-fieldhockey-drills.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -151817,10 +151407,8 @@ { "name": "neometals.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "neurococi.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "new-mexico-sexcams.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "newcapitaldev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "newcinema.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "newemage.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "niledevelopmentseg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nimbo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nipponkaigi.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nirex.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -151841,7 +151429,6 @@ { "name": "panamasportsfactory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "paycaptain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pentopolimer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pergam.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pergam.kz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pergam.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pgp.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -151900,7 +151487,6 @@ { "name": "soliujing.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sonbilgi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sontaycamera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "soopy.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "starrosesandplants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "statscrew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stjh.org.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -151924,7 +151510,6 @@ { "name": "temoinfidele.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "temp-lars.army", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tequenikality.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tesladeaths.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thatguy.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thatsnotathing.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thoth.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -151943,7 +151528,6 @@ { "name": "try2services.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tt-bentley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ttug.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tuneserver.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tutarot.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tyroola.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tyu.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -152014,7 +151598,6 @@ { "name": "alluance.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amal.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ambersafety.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "amotarget.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ancade.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "annoyinggui.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "antlerprojects.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -152081,7 +151664,6 @@ { "name": "chiara.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "childrensdentalranch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chocorp.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "chrestos.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chronnick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chungachyan.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cimat.ma", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -152209,7 +151791,6 @@ { "name": "grambaba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "graphicz.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "growfedbiz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "haber.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "habtum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hajajaam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "halgap.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -152437,7 +152018,6 @@ { "name": "sbtv.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sby-tampere.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "schuhfits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sebastianelectric.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "semalt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "seoefectivo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "seoeye.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -152471,7 +152051,6 @@ { "name": "superfilmgeldi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "superfullhdfilmizle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "superpowerexperts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "surmoms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "swingers.com.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "talichi.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taxjusticeafrica.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -152831,7 +152410,6 @@ { "name": "andreaskloebl.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "andreasxp.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "andrespr.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "andrewsfasteners.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "andythomsonbooks.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anfadern.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anfr.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -153369,7 +152947,6 @@ { "name": "camerata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cameronwince.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cammamam.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "campuskota.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "canadapropertyexpert.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "canceraid.coach", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "canceraid.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -153432,7 +153009,6 @@ { "name": "cervellomorto.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cesarteixeiraimoveis.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cesurteknikservis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cgaro-amerstd.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cgbf.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cgise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chakanaherb.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -153695,7 +153271,6 @@ { "name": "cyber-article.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cyber-swiat.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cyber-tarot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cyber72.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cyberdynesystems.servebeer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cyberlocos.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cybern.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -154632,7 +154207,6 @@ { "name": "gtalenders.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "guamhome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "guarever.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gubea.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gudostudio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gugli3d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "guidefox.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -154644,7 +154218,6 @@ { "name": "gulizaroztemel.av.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gunisifiyatlari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gunturnovizal.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gursesgazetesi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gutenbier.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gutierrezvidal.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "guykokken.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -155126,7 +154699,6 @@ { "name": "jesolo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jessejanepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jetaninchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "jetsome.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jfhr.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jfmdevelopment.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jgonzalezhomes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -155740,7 +155312,6 @@ { "name": "mercadopago.com.ec", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "merchstudio.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mercurysquad.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "merenbach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mesdagh.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mesologie-soesterberg.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mesotheliomalawfirm-worldwide.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -155841,7 +155412,6 @@ { "name": "mohister.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mohot.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "moisesbarrio.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mojodentallaboratory.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mojtabagol.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mokaszinhaz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "molkerei-ammerland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -156165,8 +155735,6 @@ { "name": "office-basilique.notaires.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "officerjones.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "officialdubaidev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "officialniledevelopments.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "officialpyramids.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "offspringmexico.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "offspringzero.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ofis.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -156294,7 +155862,6 @@ { "name": "punaise-de-lit-paris.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "punk-jazz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "puntaires.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "puppy.actor", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pur-institut.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "puravidaquiropractica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "purchaserprotect.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -156679,7 +156246,6 @@ { "name": "sferalakiera.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sfumusic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sgoossens.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "shaftofdarkness.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shaheedirfani.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shaheednawazirfani.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shahriar.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -157246,7 +156812,6 @@ { "name": "tinky.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tintiger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tipi.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tipsfitness.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tisph.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tk-its.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tm-sports.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -157411,7 +156976,6 @@ { "name": "twopipes.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tylerobrien.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tyrael.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tzortzis.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "u2co.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uabc.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uaemegadeals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -157432,7 +156996,6 @@ { "name": "underground.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uneaimages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unicornsoft.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "unique-local-ipv6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uniquemode.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uniquequilts.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unitysavannah.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -158095,7 +157658,6 @@ { "name": "ajoneuvokeskitys.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "akademialazarev.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "akaritakai.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "alan-turnbull.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alanokling.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alarmnewengland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "albergointernational.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -158175,7 +157737,6 @@ { "name": "arquitetosvendem.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "artemiy-plus.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "artevos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "artevos.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "articlesarea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "artisreit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "artsandculturessm.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -158360,7 +157921,6 @@ { "name": "boehs.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boew.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boikhor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "boldsmartlock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boltreplassen.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bolzano-bozen.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bolzanoavvocati.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -158483,7 +158043,6 @@ { "name": "catmatchers.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "catsuae.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "catsystemsaustralia.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "catu-bikes.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cbes.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cblocallocksmiths.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cbrbuildingrepairs.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -158637,7 +158196,6 @@ { "name": "csafederalsummit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cscred.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "csgofinder.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "csmediaoc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "csty.ltd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "csulb-cmp-eir.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ctfacialplasticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -158755,7 +158313,6 @@ { "name": "domkiwgrodku.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "doodlecorn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "doodung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "doradosystems.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "doreyaromatherapy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dortmunderblog.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "doszkocs-zsuzsa.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -158847,7 +158404,6 @@ { "name": "edgerton.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "educaenvivo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "educateaprende.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "edufever.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eduradiadores.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eenmailsturen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eenvoudhup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -158878,7 +158434,6 @@ { "name": "emiliaromagnaeconomy.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "emilioadani.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "emiratesoffers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "emmerdale.me.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "emonovo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "employmentguide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "emprendecausa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -159144,7 +158699,6 @@ { "name": "givemeoffer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gizmogrind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gkdworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gkdworld.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glasswall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glbaumaulwurf.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glenwoodpark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -159250,7 +158804,6 @@ { "name": "hinolab-m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hireinsight.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hiruthicsha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "historicist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hoagiandpita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hofgut.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "homegrounds.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -159295,7 +158848,6 @@ { "name": "hoyenapple.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hpfxd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hrbl.lc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hroc.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hrzblt.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "htmlformatter.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "https.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -159422,7 +158974,6 @@ { "name": "israel-web.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "israelandhome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "israelpalestineconfederation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "istrosec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "istrosec.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "it-foro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "it-lobster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -159457,7 +159008,6 @@ { "name": "jefaisducafe.mywire.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jeff.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jeff.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "jelmyto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jemezdravo.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jemyzdrowo.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jenever.amsterdam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -159522,7 +159072,6 @@ { "name": "k7add.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kachat.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kada.lk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kadidak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kadix.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kagel.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kaiche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -159970,7 +159519,6 @@ { "name": "mysticmine.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mytea.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mytourstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "myturf.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "n-tennis.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nabboon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nadlan.immo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -160549,7 +160097,6 @@ { "name": "preciouspebble.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "preguntasmasfrecuentes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "premiachef.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "premiersimgl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "premiumpeaches.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "prepa-code.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "presail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -160578,7 +160125,6 @@ { "name": "projectlarix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "projet-pastel.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "properties.org.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "propertyprofilereport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "proressource.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "proressources.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "prosvita.dp.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -160715,7 +160261,6 @@ { "name": "rinsbacherhof.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "riri-tendedasole.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "riscone.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "riveal.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "riverhoa.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rivertv.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rizaderindag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -160723,7 +160268,6 @@ { "name": "rkowalewski.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rkstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rl3.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "roamadvisors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "robbie.bio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "robbie.contact", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "robbie.studio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -160796,7 +160340,6 @@ { "name": "sber.games", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sbestimes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sbz.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "scale.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scented-delights.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "schaumstoff-meister.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "schella.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -160821,7 +160364,6 @@ { "name": "seanbright.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "searchgurus.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sebetesty.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "secret-bases.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sectigo.com.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "seebetterlab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "segel-setzen-buch.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -160877,7 +160419,6 @@ { "name": "silvaserv.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "silver-salt.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "simplydonelegal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sinavcevaplan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "singita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "singles-day.org.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sinta-d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -161152,7 +160693,6 @@ { "name": "tiejet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tiendamacoco.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tiktok-download.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "timesloth.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "timoviveen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "timtj.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tinder.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -161245,7 +160785,6 @@ { "name": "uptimesonar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uquid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "urbane-narrationen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "urogen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uskostadariksi.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uspanglish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "utilitybot.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -161667,7 +161206,6 @@ { "name": "ashotofadrenaline.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "asportnoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "asprivacy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "atlan.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "atlasreclame.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aurabeautyhub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aurelvoica.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -161743,7 +161281,6 @@ { "name": "budgetscan.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bundlejs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "burgesspetcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bursasite.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "burzmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "burzmedia.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bus-hit.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -162012,7 +161549,6 @@ { "name": "githubconstellation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "githubnext.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glassellparkmagnet.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gleisner.legal", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "globaleducationservices.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "globalideas.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "globalmarketrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -162190,7 +161726,6 @@ { "name": "konoex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "koosaline.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kopyandsonslandscaping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "koso.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "koujiao.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kredi-hesaplama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kriener.photography", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -162227,7 +161762,6 @@ { "name": "limetw.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lindipendente.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "listiclepal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "litnis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "liveandalucia.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "liversurgerycentre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "livli.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -162260,7 +161794,6 @@ { "name": "macrosec.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "madagui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "madagui.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "madelynn.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "maggie.gy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "maguroalmare.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mahi.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -162289,7 +161822,6 @@ { "name": "max96.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mazda-mps.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mckhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mcmk.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mdf-nakladki.kiev.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "medhatzaki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mediasklep24.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -162478,7 +162010,6 @@ { "name": "progresszivnyomda.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "projekt-manufaktur.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "projetsvl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "prolocovalsambro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "propertylisthub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "proton.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pruchovi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -162582,7 +162113,6 @@ { "name": "seedsystemcoaching.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "selfmag.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "semanaacademica.org.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "senffabrik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "senkyo.watch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "seowebcreative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "server21.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -162593,7 +162123,6 @@ { "name": "shazamkitpro.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shmilyhua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shoplus.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "shrapnel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sidepocket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sidingsmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sightconnection.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -162760,7 +162289,6 @@ { "name": "tures-aurina.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "twa.travel", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "twinstudiosparis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "uhingaro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uirysa.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ujyalonetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uklidgaraze.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -162980,7 +162508,6 @@ { "name": "blankspade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blocked.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boulebar.duckdns.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "braeden.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bramfri.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brightideaspromotional.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brightwakeintranet.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -163075,7 +162602,6 @@ { "name": "espirituracer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eupropertysolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ev-greentech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "eveaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "everything-mdaemon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "exonip.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "exosama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -163174,7 +162700,6 @@ { "name": "iwant.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iww.org.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "izapi4.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "izstore.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ja-jirei-ienohikari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jefaisdelordi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jenn-pro-graphics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -163272,7 +162797,6 @@ { "name": "nowar72.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nrj-plomberie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nrvn.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nw-risk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nycgastroenterologists.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nycpac.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nyiooc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -163485,7 +163009,6 @@ { "name": "zolw.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zorgonderwijsnu.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zulybot.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "100fss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "100fss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "123-ticketsystem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "215advisors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -164626,7 +164149,6 @@ { "name": "cijf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ciji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cilat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cin.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cindy.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ciochina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "circuitchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -164801,7 +164323,6 @@ { "name": "cousot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cpm-steuerberater.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cpm-steuerberater.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cpm-steuerberater.support", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cpumate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cqbrand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cqep.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -165215,7 +164736,6 @@ { "name": "elecfair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "electrical.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "electricgatemotorboksburg.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "electroredes.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elegantperfume.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elektrikal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elevanhairdressing.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -168128,7 +167648,6 @@ { "name": "private.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "privatecolor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "privateexpert.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pro-moed.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "proacksecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "proantab.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "profese.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -170373,7 +169892,6 @@ { "name": "31fss.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "32y.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "379efss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "3dfiguur.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3niu928.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3u15.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "4-ae.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -170480,7 +169998,6 @@ { "name": "al3ilm.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alaska.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alberttonrubbleremovals.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "algbra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "all4games.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "allappliancerepairsandiego.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "allmco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -170630,7 +170147,6 @@ { "name": "bukowski.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bulatlat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "burner.gay", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cabcard.services", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cablogrammes.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cafpatronato.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "caldaia.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -170727,7 +170243,6 @@ { "name": "connollycove.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "conqi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "conservadoracbe.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "controladores.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "corarain.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "corbax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cornday.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -170835,7 +170350,6 @@ { "name": "easydmarc.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eautocash.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ebis.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "echoeshq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eckindustries.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "edenvalerubbleremovals.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "edsonreis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -170900,7 +170414,6 @@ { "name": "fastphox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fastproxycat.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fatlabwebsupport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "fatturaelettronica-app.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fawtrucksecuador.com.ec", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fcd.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fcijobportalodisha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -170919,7 +170432,6 @@ { "name": "financepreneur.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "findedeinencoach.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fireflygatlinburg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "firesprite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "firmanali.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fit81.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fit81.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -171196,7 +170708,6 @@ { "name": "liveencounters.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "liveit.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "livsta.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lizcheney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "localserver.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "locomotiveworks.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "log4shell.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -171499,7 +171010,6 @@ { "name": "relationalplayground.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "relationsatwork.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "remodelhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "reseau.je", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "resoon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "returnlogic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rex.red", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -171512,20 +171022,17 @@ { "name": "rollerwarehouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ronasit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "roodarvasi.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rookie.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "roskillcv.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "roskillcv.org.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rotasurbanas.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rpm-oldtimer-events.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rray.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rubenarakelyan.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rueckbeil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "runar-data.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "runmyqubit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "runmyqubit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rutik.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rutik.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rx-diet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ryanwordpress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sadespor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "saifoundation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -171849,7 +171356,6 @@ { "name": "yumtaro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "z.mom", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "z.ps", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "zachyang.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zalamura.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zandmhomes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zanreal.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -172094,7 +171600,6 @@ { "name": "e8space.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eagleled.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eainjurycenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "easttower-uc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eatwith.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ebookpdf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ec.gov.sl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -172202,7 +171707,6 @@ { "name": "gapalmoil.com.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gartengutachter.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "geekwanderer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "geoscout.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getemail.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getupwakeclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gglinka.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -172449,16 +171953,10 @@ { "name": "ochoymedio.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ocsbl.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "octane.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "officialdbay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "officialdistrict5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "officialdose.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "officialgaiasabbour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "officialilmonte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "officialmountainview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "officialrivan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oficinadanet.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "olffi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "olibarcenas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ombrazur.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "omid16b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oncecocuklar.org.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -172491,7 +171989,6 @@ { "name": "page-audit.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "palpitediario.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pantaleon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "parkpoint-capitalhills.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "passionsorigen.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "patchstack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pavlajansvatba.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -172516,7 +172013,6 @@ { "name": "podivilov.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "podqueue.fm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "poneiras.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "porcelanosamallorca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pornaizle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "poseidon-giesing.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pravac.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -172530,7 +172026,6 @@ { "name": "ps5.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "psicoanalisi-pratica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pubmed2xl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "putokaz.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "putzigdesign.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pvportal.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pxtwitter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -172630,7 +172125,6 @@ { "name": "telesales.guru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "test-do.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tf2b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "theablemind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theapj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theblog.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thebobcoin.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -172690,7 +172184,6 @@ { "name": "verwarming-installateur.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "videoxpnet.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "viethotnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "vinsonconsulting.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vocably.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "voltrix.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vomsee.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -172711,7 +172204,6 @@ { "name": "xlrsecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xn--80adydmce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xn--tftel-tom-q9a.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "xn--uir160dxn2a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yacg.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yateam.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "youthmarketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -172871,7 +172363,6 @@ { "name": "foodtruckconnections.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "furkanmudanyali.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fxtwitter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gavintang.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "generali-investments-portal.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getlessgivemore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grupomultiservicio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -172950,7 +172441,6 @@ { "name": "maintenanceservice.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "malyjakub.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mango3.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "maquiguarda.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mashrmail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "massiveink.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mastertent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -173045,7 +172535,6 @@ { "name": "ptmco.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ptserver.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pygos.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pyramids-megacity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qbookstaxpros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quartsandlugnuts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "radicallycanadian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -173135,7 +172624,6 @@ { "name": "t1cloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taipei2025.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taipei2038.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tajtower-tajmisr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "takehomepay.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tangentnet.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tassio.eti.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -173163,7 +172651,6 @@ { "name": "tvgsc.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tvk.tirol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tzinsurance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ua-fediland.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ukrnames.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ultra.law", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ultrarare.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -173271,7 +172758,6 @@ { "name": "ayudacontenedores.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "azhadev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bagso.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bancobica.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bankiros.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "banlitang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "basic.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -173282,13 +172768,11 @@ { "name": "bellevilleboot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "benefeds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "benprisby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bfoliver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "billview.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "black-flirt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bloemendaalsamen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bluestarbus.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blw-eschwege.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bonsaicrm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boydcorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "breederworld.dog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bubsngrubs.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -173369,7 +172853,6 @@ { "name": "emo.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ericdobson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "essaandmore.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "eviamv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ezec.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "faasviddy.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fabickcat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -173555,7 +173038,6 @@ { "name": "proxy-bay.onl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "puettba.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quemvende.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "radverkehr-kelsterbach.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rama.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "randompasswordgenerator.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rapidlegal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -173613,7 +173095,6 @@ { "name": "stroymart.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "summitseodesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "swindonbus.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sxcvid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "symatrix.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "szalaiterko.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tactile.love", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -173682,14 +173163,12 @@ { "name": "xn--72c1ar3gd6fvd.xn--o3cw4h", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xn--q3cb3bxa0b7h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xn--y3cac7d1d.xn--o3cw4h", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "xpremium.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yeti.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yeti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yoannlatzer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "younglabour.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "younglabour.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yovada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "zeeshan.website", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1001fonts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "21appart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "21kampus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -173952,7 +173431,6 @@ { "name": "edit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eduium.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eduspiresolutions.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ee.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "effectualness.web.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ekamfoundationmumbai.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "electroschematics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -173970,7 +173448,6 @@ { "name": "epsilonhomebasedqualitycare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eshappy.tours", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eskandarient.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "espaciohebe.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "estetica.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eternl.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eurekapools.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -174059,7 +173536,6 @@ { "name": "gps-coordinates.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grafana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grundschulratgeber.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gtc.com.gt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "guilded.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "guzgu.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gw-uks-app-test-coreapi-02.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -174215,13 +173691,11 @@ { "name": "manualowl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "martinsvillebulletin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "masinaspalat.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "masqueless.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mat6tube.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mazcue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mccannhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mcdean.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mcnav.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "meatybubbles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "media-fleet.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "medmark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "meetmarlo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -174240,7 +173714,6 @@ { "name": "millenniumhotels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "milmesetas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "milvus.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "minebbs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "minewiki.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "missoulian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mobile-discothek.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -174320,7 +173793,6 @@ { "name": "ofisas.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ofpad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ogilvy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "oier-meet.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oldvps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "olsenban.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "on-tandemdrive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -174412,7 +173884,6 @@ { "name": "reichelt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reimsmediaslibres.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reisdemuthwiltgen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "reisuke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "remontstrong.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reserveandreceive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "resumidus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -174657,7 +174128,6 @@ { "name": "yuucdn.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "z-e.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zandu360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "zapier-staging.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zarabotok24obzor.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zawodowe-szkolenia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zaxbys-web-backend.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -175236,6 +174706,1535 @@ { "name": "zarof-fkf.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zlatamira.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zrali.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0milemarathon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "101023.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "10canada.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1174healing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1a-hyp.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1ahyp.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2137.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2333boy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "233boy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "233boy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "360saxess.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3dcubx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "42degrees.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4o.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52xuanmi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66gal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "740424.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "888dhw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918kisse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a-lexx.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a0s.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abasteo.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abdelrahmanzaki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abigailfriedland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abortionprotest.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abseher-technology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "accaindia.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "accountsfilingmadesimple.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "accurx.nhs.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "acscargo.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "actoragecheck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adaoconde.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adhadse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "advancedbuildings.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "advertizz.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "advinix.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "afianzamientos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "afzetbak.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agiftinside.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agilecoldstorage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agrarkredit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ahbvlp.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ahccmadison.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ahoj.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aidenashleypornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aircgroup.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airfarestoamerica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airfarestogermany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airfaretousa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airflightsdeals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlineafrica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlineairplane.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlineandtickets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinebestprices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinebookingonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinebookingtickets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinecheaptravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlineflights.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlineflightsinternational.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlineflightsprices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlineflightsreservations.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlineforsale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinefr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinegermany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlineitaly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinekorea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinenationwide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinenewzealand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinep.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesamsterdam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesandhotel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesandtickets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesandtravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesargentina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesboston.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesbrussels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlineschicago.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinescincinnati.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesdallas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesdc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesdetroit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesdomestic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlineseast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesfirstclass.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlineshouston.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesinlasvegas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesjordan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlineslosangeles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesmiddleeast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesname.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesnewyork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesnorthamerica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesofdubai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesofmexico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinespackages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesparis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesphonenumber.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinessa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinessanfrancisco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinestexas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinestoalaska.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinestoatlanta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinestocanada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinestochicago.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinestocostarica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinestoeurope.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinestoflorida.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinestofrance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinestogermany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinestoitaly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinestojapan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinestolosangeles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinestomiami.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinestoturkey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinestousa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinestovegas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesturkey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesvegas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinesvietnam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlineticketspurchase.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlineticketswith.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinetocanada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinetomiami.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinetour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinetravelinternational.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinetx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinevegas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airlinewholesale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airplanetic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airportcdgparis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airportdc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airportfrankfurtgermany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airportgrandhotel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airportholiday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airporthotelsgatwick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airportknoxville.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airportlas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airportnigeria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airportnz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airportofdubai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airportperth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airportsbarcelona.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airportsflights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airportstickets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airportstockholm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airscope.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ajaxmfs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ajvandeven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akamu.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akvakm.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alamen.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alancolephotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "albertovr.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "albinonderdelen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alega.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alex-werbung.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alexmathews.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alfa-pack.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alfapack-shop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alignforce.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "allactionsecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "allianceairlinesflights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "allier-vichy-moulins-expert-comptable.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alloheim.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "almette.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aloalosalomao.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alpha-kamera.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alphabetaflora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alrioart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "altiup.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "altiup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alwistra.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amartours.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "americatracker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amishealthcareservicesinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amisun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anbaicreative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anclarma.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "andyattorney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "animecasepremium.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "animemangaupdates.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "animotica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anteros.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "antirouillevelevis.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anunciosclasificados.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "any-id.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anytimeicon.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anztb.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apcassistant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apotheke.nrw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apotheke.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aptern.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aptient.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aquantia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "archivi.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arduino.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arge-bilisim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "argyrouminas.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aris.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "armo.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "artikel5ev.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arturojimenez.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aru.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "as202413.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asbisafrica.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asburyparkreporter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asesoresvaro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ashlynpeakspornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asiansnus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aspenpsychologywy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aspews.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "associazioneterra.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "astralus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "astralus.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "astroluna.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "astutetm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "atla2022-event.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "atlasbus.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "atlasbus.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "audiokomis.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aufeerjob.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "augeo.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "augusta-apotheke.nrw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ausbildungsmesse-digital.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "australiainvest.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "auxilius.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avangardmobile.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aveamcorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "awmb.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b-wartburg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b1drivers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b2bhint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "babyzoet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baer-concepts.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bafito.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "balancingbirthbaby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bar2mannheim.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baufi-express.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baufi-express.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baufi-express.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baufiexpress.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baufiexpress.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bcakuwait.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beautyspacestore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beehive.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beeremovalpretoria.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beetwix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bellaskino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "benchmark-dental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "benilebusinesscity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bernayslab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bert.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bertgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bertusengelbrecht.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betweenland.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bggcapital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bhtechconnection.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bicistore.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bilderrahmen-baer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bilderrahmen-schluechtern-sinntal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "billchen.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "billwerk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "billwerk.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biologynest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bironthemes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bitedu.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bitfashion.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bitiobmen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blackcatcard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blanksreload.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blazor.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blitztesting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blue2purple.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bokaldo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "boldorion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bonnepart.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bookcheapairline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bookginawest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bookingdjparis.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "borderlens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bordonisport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "borealis.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "borealis.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "borhunter.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "botpago.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "boutique.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "branchtobox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "breadheads.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "britishairlinesflights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "briween.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "broomorchard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brzc.st", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bss-solutions.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btwdatabase.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bubalova.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bugprove.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "busarm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "businesschances.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buydirectonline.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buymycomics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buzhi.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bvlos.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bwsolar.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bywencke.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "c-dome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cadencescience.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cakessl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "campaignzee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "candicedarepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "canstar.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cantinhodabia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "capetownelite.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "capitolcounseling.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "capsulafinanciera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cardiffviolins.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "caroillab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carottage-beton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carstub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carty.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casasensunbridge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "caseycalvertpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cashservices.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casinoscout.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casinoscout.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casuallyblue.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ccad.edu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ccdenver.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cdlandb1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cdnrecords.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cebolinha-imaginaria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ceew.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "celinepsychotherapie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "centuria.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "centuria.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cfdata.lol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chadwhitepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chakrastone.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chanelprestonpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "charcoalmachines.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chase.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cheapairfarefrom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cheapairfaresdeals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cheapairlinesuk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cheapestwaytofly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cheapfareto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cheapflightatlanta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cheapflightla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cheapflightmexico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cheapflightsengland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cheapflightsticketstoindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cheapflightsunitedstates.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cheapinternationalair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cherritravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chill.bet", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chriskthomas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "christysstampingspot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cia-gaming.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cinziamacchi.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cirasul.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "circleci.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cisprague.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "citracctv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clairebabai.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clawington.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "click2affiliate.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "climb4achild.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cloeri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cloudevolutionforum.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cloudsecurityalliance.events", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clun.gay", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coasa.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cockroachesremoval.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "codepwn.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "codeysteelepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coincabin.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coinliq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coldsteelsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "collinlove.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "collinlove.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "collinlove.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "collinlove.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "colorcomm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "columbuscoffeefest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "comefareper.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "comfortsleepclinic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "comp4u.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "complycheck.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "compoundc.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "computer-service-remscheid.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "connecticallc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "connectto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "consiglidisalute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "consuladospanama.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "convoyin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cordalife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "courage.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coveragespecialist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cozmerce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cozumelairlines.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cozumelflight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cratexind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "createstudios.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cris.org.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crnajobsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cumlaudegent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "curbsoftware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cure.finance", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cursofuturosresidentes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cvpartner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cyberassurance.run", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cybersecurityforum.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cycc.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cypressxm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "czqu.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dadoilustrado.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dali-boli.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dambachpeacebuilderfellowships.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "danasweed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dandelion-seeds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "danielcardoso.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "danielh.codes", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "darkinfo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "daseinsfreu.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dasler.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "datasunrise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dawnlydialnyc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dcnews.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ddf.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deepl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "demascotas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "demorgen.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dengjunhui.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "denisdftnewyorklife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dentsugrantgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "depiratas.com.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deratisation.maison", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "derpteam.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "desaretreat.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "desic-sl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "detourxp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dev-soft.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dev-woenenn-node-server.herokuapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "devonportairport.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "devtambayan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dhurbabaral.com.np", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "diabdis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "diamir.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "diaweb.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dictum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dig.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digitalmanager.guru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dinkoreskolesilkeborg.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dinkoreskoleviborg.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "directairlineflights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "directright.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "discoverradiance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "discpersonalitytesting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "disposalqa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "district5marakez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "divanogiusto.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dm-918kiss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dmcasorry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dmslog.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dmz.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doboszynski.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doctrine.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dotzauer-stb.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "douglasgreenberg.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "drehpartner-werden.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "driveandpark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dtmedia.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dumfriespropertyservices.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dustandsand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dutchcan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dwightd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dynamicentertainmentdjs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eadea.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eaglehaslended.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "earthlink.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "easiest-way.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eastpershingdental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "easttamakiauto.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eccouncil.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ecfnj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "edefrutos2020.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "edu3w.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "educard.co.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eduflow.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "edupay.co.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "edusuite.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "efootball4u.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "egnitehealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "egos-online.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ekospajzka.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elanza.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elektri-sch.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elhuesero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eliteimsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elizaevespornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ellanovapornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elrefugiodelpirata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elusivetranslations.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enefitrenewables.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "engelzicht.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "entabe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enuchi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "envelopegroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "erafocus.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "erebuildings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ergoserv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eric.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eris-bj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "erreguete.gal", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "esgforum.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "esquirelaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "estiloelevadores.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "etherpoap.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eurofoods.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "evalongpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eventlocation2.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "exclusivacademy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "exclusivetransferspuntacana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "exeltis.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "expediteplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "expert-comptable-vichy-moulins-allier.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "expertoseninversiones.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "expresshsp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ezcesspoollongisland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88ok01.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88ok05.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88ok11.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88ok114.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88ok118.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88ok134.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88ok145.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88ok22.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88ok52.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "familiekusch.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "faresfrom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "farmacovigilancia-exeltis.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fasterfront.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fasterfront.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "faszination-fankurve.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fayffersons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "feelbycubanas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "felly.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fersedo.mk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fic.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "figshare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "filmsleague.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "findscan.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "findschool.ge", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fitlinewellnesscoach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fitness.edu.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flagthis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flightairport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flightfaretoindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flightfrankfurt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flighthonolulu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flightstimes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flipflop.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flissinger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "floatypants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "floresparafuneral.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flowerwholesale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flughafenairport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flynumber.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "folkmusicworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "foreignaffairsmotorsports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "forresskatepark.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "forumhub.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fotobrinke.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fotocoach.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fraeuleinmeerbackt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fredericosaraiva.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freecom.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "friv31games.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fromthetopsalonnh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ftcscout.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "funding-zone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "furnitureiloilo.com.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "furuse-shika.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "futurains.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "futurainsurance.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fwaux.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fyziotonka.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gablermade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "galiuzvejoti.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "galleriadental.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gamingforecast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gaminglaptop.deals", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ganardinerofacil.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gastroboss.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gatewaytire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gaycock4u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gbmcoffee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gendrin.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "generiscorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "genneperafscheidshuis.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "georgex.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geotab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "getlawsinfo.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gg.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ghcma.vic.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "giacomodebidda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "giornalisportivi.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gites-melaual.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gkdworld.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gl-operacion.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "globallyunited.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "globalvision.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "globeprotocolecosystem.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "glocken-apotheke.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gmc.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gnzsnz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goarnlms.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goatrisksolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gofabcnc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gogreece.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "golosperemen.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "googlecom.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gorebayairport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gowpcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gradinitasamariteanulcluj.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "graeskmad.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grahamfamilydentalwy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grandiscontionline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "graphql-on-aws-appsync-book.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gratefulwanderertravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "graymuzzlesociety.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greatrichmond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greenit.eco", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greenlifecannabis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greenwood-it.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greta-fischer-schule.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gridfuse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "groupeleven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gsd.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gslate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gtk-tim.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "guiatelefone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gustaveeiffel-arruda.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "guttergurugeelong.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "h-advisors.global", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "h8c.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "haleyreedpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "haleywinterspornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "handballinside.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "handmadeselling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hardisondowney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "harleyhazepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hatbo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hawkbiosystems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hcaptcha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hdc.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hdm-bogensport.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "healingwithvibrationsummit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "healthcarestaffingacademy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "heartlandbraidedrugs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "heaslip-aluminium-smelter-engineering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "heimdallsensors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hellosixpackabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "heritagehandicraft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hermandevries.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "herzpfa.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hexstream.expert", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "highburycorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "himemariepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hiob.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hirechrisfinazzo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hjaltespizza.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hochland.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hochlandkanapkowy.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "holiday-home-baer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hollywoodsmilesfl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "homecareserviceindiana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "homegrouporlando.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "homehealthbookshelf.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hondadigitalevent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hookedoncraftswaterford.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hopasports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "horsa.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hospitalsanjuandedios.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hospitalsineachstate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hotelsingaporeairport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hotspot.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hstoyanov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "htl-anmeldung.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "humo.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hyderabaddccb.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hydnandlloyd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hyperionms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iconexperience.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iitranslation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ikarus-itkurs.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ilgazhaliyikama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "illinitechservice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "imaginebelfast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "imzye.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "indamail.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "indicure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "indieweb.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "industrydecarbonization.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "infinitycleaningsolutionsfl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "infopercept.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "initiative20x20.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inmobiliariamarino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "innisfildental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "insa.or.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "insureneb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "integralschool.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inter-design.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "internationalairlinestickets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "internationalgse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "intervista-rh.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inventify.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inzetbo.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iotbusinessforum.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "islamiyet.gen.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "issea.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "it-started.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "it2match.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itcomlanger.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itcybersecurity.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itgadgetsonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itinero.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itportal.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ivywolfepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jakobhildebrand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jakobhildebrand.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jambox.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "japanese-dominatrix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jaris.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jarlstrom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jarry.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jbarzoutfitters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jbloomphotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jeanstastytreats.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jeney.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jersec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jgoldbergmd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jhfunerals.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jialiangkang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jibe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jibeapply.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jiminny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jiobp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jirehlov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jl-k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jobcorps.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jobsineachstate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jordancards.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jordanlys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jpixta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jucator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "julia-spriggs.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jzz.cool", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jzzfyw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "k-moto.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kacang-bali.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaedehara.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kagithanemantolama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kameryzababku.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kasinopartio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaskadee.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "katycollection.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kawawete.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kcucs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kdoslavi.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "keioni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "keishicho-mirai-method.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kenziemadisonpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kenziereevespornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kenzietaylorpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "keshavnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kevinji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "key-right.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kfsc.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kinden-giankyou.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kinden-kizuna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kindermarket.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kinison.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kinoapollo.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kitmercerpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kkdesignsco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "klxm.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "komsomolka.works", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kozuna.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "krissylynnpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kupone.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kurtneuweiler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kxbot.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kynjatshai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kyoox.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kyounoryouri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lablaser.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lacontrevoie.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lacylennonpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ladislav.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lameusame.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "landkind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "laneygreypornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lanyundev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lapierrecabinetry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "latourist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "latrobedirect.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "latrobefinancial.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "laurenphillipspornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "laurentskyepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lawod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leapspace.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "led.my.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "legalconnect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "levelupdisability.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lexgo.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lexilowepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lexilunapornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libanswers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libapps.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libchat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libconnect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libconnect.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libcrm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libcrm.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libelle.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libguides.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libinsight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libinsight.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libstaffer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libstaffer.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libwizard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libwizard.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "life20.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lifepress.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lifestory.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ligneetlumiere.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lilylarimarpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "linmarrdavao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "linuxinfo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "linz.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lirui.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lisapinder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "little-luk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "littlepartyshoppe.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "liukang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "liups.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "livepornguide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lixi.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lm-architecture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lnsolucoesfinanceiras.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "loadit.lol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "locadoraequiloc.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "loganpiercepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lognetjobs.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "logydice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lommers.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "longsexyshop.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "loststudios.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "losvideosdemisol.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "loveinabox.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lpnjobsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "luisvmf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "luisvmf.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "luluchupornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lumsa.university", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lydianibley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lyncag.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lyonsmotelonaway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lyrique.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "m-918kiss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "m-fashion.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "madridistas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "magic-cakes.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "magnuspro.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "magnuspro.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "magornitho.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maitlandwardpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "makemoney.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "malevus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mamagreenindustrial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "manhattanfruitier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "manitoulingolf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "manitoulingroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "manitoulintransport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "manitoulinusedequipment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "manjaro.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "manwithavanservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "margriet.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mariemccaig.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marienoellegendron.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marketlooker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "markmorris.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "masfloss.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "matco.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "matematikformulleri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "material-ui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "matthewoliver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "matureporn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maverickmobilemechanics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mbudy.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mcdonalds.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mdjobsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meda.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meddata.pp.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mediassist.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "medihost.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "medihostsolutions.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mediosavs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meditacionesparasanar.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mega888new.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "megabooker.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "megacellenerji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mejor-vpn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "melivon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "menuvox.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mepcoeng.ac.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mercuretv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mfinanse.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mgfgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "miaairportvillas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mijnafspraak.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mikunov.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mikunova.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "milesconstruction.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "milosguide.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mimoesthetic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "minibabi.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "minxmine.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "misjoyas.com.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mit.edu.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mitrausahagoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mividalaboral.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mixilab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mladypodnikatel.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mmzztt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mobil-badwimpfen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mod.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "modernwebz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "momondersteuning.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "monasshahzad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "monawalespornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "montevue.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "morphitattachments.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "movaldesigns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mrhori.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "multifamily.loans", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "munroads.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "musikvaerftet.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mv-icity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mycolo.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myconsultingresources.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mycts.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myelitetravelclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myhotel.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myschoolitaly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myworkplaceperks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "na1.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nanolash.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nationwide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "naulakhafellowship.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ndisreview.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nearnorthcustoms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nechakoconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nedraho.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nekonet.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "neroteknik.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nettoyage-apres-deces-crime.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nettunoguide.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "neucadlazdrowia.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "neutralvehicle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newoldboughtsold.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newoldstock.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newsinfrance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newsingermany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newsinitaly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newwise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nextlevel-forum.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nextlevelforum.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nfobar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ngroupllc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "niagaraconstruction.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nilebusinesscity-nc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nmbhgc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nodecore.mine.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nomerodekors.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "noraahost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "northeastcontractorsltd.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "notrated.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "novageracao2021.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "npjobsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nplc.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nserrao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "obsica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ocenka-msfo.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ochotnicky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "odishassc.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ofracar.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "olafbrzeski.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "olddominionspeedway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oldjungle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "omahagutterandsiding.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "omanair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "omatoimi.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onlinecannabiseducation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onlinecasinokoning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onlinemediamasters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onlinesynlighed.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onurerhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onx.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "op.ninja", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "opacity.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "open-prod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "openalt.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "operatoresanitario.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "opnay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "opportunity.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "optikoscolombia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "optionskredit.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "optionskredit.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "optionskredit.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "optionskredit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "organizalpha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oriocdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "orlandopmf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "osaamiskartoitus.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "osiedlemalownicze.wroc.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "otsfurniture.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oviedoacrepair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p4c-admin.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pace.cool", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pack.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "packagestours.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pahadee.coffee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pajobsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "palmatin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paperandpage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parabooking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paremedical.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parool.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "partsgeek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "partydecoration-bg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paulomonteiro.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pauloneto.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pawn.inc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pcwiz2u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pearle.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pediatricorthopedic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pelata.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pepperandmurphys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "perera.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "perssonsgarn.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pesc.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "petitsouffle.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pfandbriefsparen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pfnpc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pgmjr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "philcare.com.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "phillyhometech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "phoneaccessories.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "photo-booth-hire-uk.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "photoscotland.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "phrlegal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "phyrai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pic-sl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "picksshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "picofme.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "picrew.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pikafan.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pilotinterviews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pioneerdr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pipetobacco.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pisaparaasescolas.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "planetickettravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "platinumpoolsaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "playparkhotels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pleiospilos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "policeauctionsusa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "polzaune.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pornpics.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "portiva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "powerseo.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pradyumnashome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prefect.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prepa-in.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pressurewashersandiego.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "primetouchimprovements.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "primrosehillvets.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "printplanlive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "privacyfenceanddeckllc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "priyan.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "probably.group", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "procomservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "profian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "program-ace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "promentesalzburg.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "propaganda.love", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prototech.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prouveonline.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prpbenevolent.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prpr.icu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prpr.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "psd-vfx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ptjobsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ptservidor.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ptway.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "punjabsind.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pussyspace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pusztul.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qcwz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qikio.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qu.ax", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "queerdelta.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "query.gov.ps", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "quiq-in.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qwerty-store.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qxazusa.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "racquetdepot.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rafix.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ragt.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rahil-p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "railroadhistory.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rajkotupdates.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ramonnomarpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "randomideas.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rare-x.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "raumausstatter-fangmann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rawmathub.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rdmc.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "really-simple-plugins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "realtyofnaples.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rebellyon.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "redalertpt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "redlightmanagement.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "refinery.services", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "regal.radio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rehberlikservisim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reislustigeuropa.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rekorhaliyikama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rentandgofalcade.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "report.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reporters.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reservationsair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "respondeck.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "retailnext.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "revenuegrid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reviewskia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reviewskia.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ridingthetigerpro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ris2048.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "riskspecific.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rittersprinting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ritual.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rjia.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rnjobsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rnz3.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "roayahnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "robindirksen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "roboticsummit.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "roodepoortplumber24-7.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "roofingsolutionsla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "room8group.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "roomforliving.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "roroos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "roxanaramirez.love", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "royaleafrica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rtjobsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rucheentreprise.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ruffcuts.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rugbynow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "russiasnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ruthhaloho.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "s.team", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saap.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sadurscy.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sagasailing.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sahb.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sailormoonfansubs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sairadio.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "salce.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "samson.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sanaphone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sanjuandediosburgos.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "santacruzimoveis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sarah-jones.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saraimnhd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sardinhagarcia.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saresegur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "schafspieker.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "schafspieker.ddnsking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "schlossberg-hotel-wernigerode.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "schoolsineachstate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "schramm.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scoolio.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scorebet24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scott-smith.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "screenrant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sealvault.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "searchdogs.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seattlecannabis.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "securesense.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "securiteproximite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seetow.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seisthewaytobe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "selltogaprime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "semicon.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sence.gob.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seniorenbeirat-murnau.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seogood.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seotesty.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seotoolsearth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "serifosguide.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "servtepstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "setupstreamers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sevenrooms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sevgitesisat.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sfmason.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sgtrains.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shadrinsk-city.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "she.kiwi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sheaorganics7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sheds.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sheetsindonesia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shgf.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shgf.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shitleft.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shoalcreekoutfitters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shopmlr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shuxiaoyi.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shy4evr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sidas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "siega.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sifnosguide.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "signaldp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "silbox.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "simonparrillaorlando.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "simpelkredit.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sizzlermagazine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skoilly.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skyebluepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skylimitmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skyrocketfinancial.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skysprouts.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "slaninka.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "slatteryassetadvisory.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "slayersonline.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smartsteelus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smedix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smoe.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smokefreeclinic.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "snoemusic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "socialmovementtechnologies.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sociohosting.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "solocorse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soluruse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "solware.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sommer-reitmajer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sonosguide.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sota.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "southwesttest.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sozole.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spdrdng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "speedable.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spielefant.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spiraldynamics.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spookies-w202.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sportservice.bz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "springbreak.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spstechnical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stadionwelt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "standard-wohnungsbaukredit.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "standard-wohnungsbaukredit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "standardwohnungsbaukredit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "start.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "startupislandtaiwan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "statinfer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staygoldenphotobooth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stbk.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stdssr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "steampoweredlawngnome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stitchersvillage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stonebriarpropertyinspections.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stopautoshop.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "storvault.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "strangers-team.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stratahealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "studiogronda.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stuffsearth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sudoless.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sudoless.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sudoless.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "suessenbecker.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sunytool.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "super-silicon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "surgicalassociates.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "susanacruzdesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sushiprints.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "suter.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "suter.id.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "swarozyca.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "swiezastrona.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "swtp-p-appsrv-coordination-frontend-businessservices1.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "swtp-p-appsrv-donorevaluation-api-businessservices1.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "swtp-p-appsrv-protocol-api-businessservices1.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "swxtd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "synergiamedicalcare.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "systemswizard.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t630.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tafdi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tajcitymnhd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tamalcloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tamerx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tango.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "targettrend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tasarimrehberi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tasports.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tc-tsc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tcgcardcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tci-thailand.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tdshop.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teachjam.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "team7-home.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tecdoor.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techproland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tedxencgf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teier.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teier.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "telemind.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teleta.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tem-multibanco.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "temporarytattoosguru.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teofix.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tetontherapypc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tfrei.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thailandblogger.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "the-top.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thebenstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theeducationalequalityinstitute.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thefrenchbeautyacademy.edu.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thelandsite.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "themakers.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theologique.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theorlandocriminaldefense.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thepollitochicken.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theretirementincomecalculator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theriverspecialist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thewebsiteshark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thierrymazue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thissimplifiedhome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ticketscheapairfare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ticketscheapairline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ticketscheapflights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tidit.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tidydiary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tierramarca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tiptopplastics.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tki.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tlccourses.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tllgh.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tm2ts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toprating.casino", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toroguapo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "touchfoundation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toughguyswyo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tourporelcaribe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tqdn.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "transfermate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "travelairtravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "travelbyprice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "travelcheapdeals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "travelflighthotel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "travellingplanetearth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "travelnotoria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "treeremovalfourways.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "triathlon.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trinhhoangtien.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trouw.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tsukikoh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tuxcloud.duckdns.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tweedehandskledij.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tweedehandsmerkkledij.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "twospirits.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ua577.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ubiqubit.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ubytovnastrazske.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uc-developmentseg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unblockit.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unchex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uplinkrev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uprawnienia-pomiary.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "urbanhost.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "urlrating.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "usaisilanlari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vacationsforcouples.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "valbon.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "valentinabelluccipornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "valentinanappipornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vanessasenior.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vanessaskypornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vannabardotpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "velo-doktor.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vertextape.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "veski.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vetres.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "via-tygo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "victortellsall.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vikc.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vindeurgent.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "violetmyerspornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vipframesandtrusses.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "viprsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "visceralsound.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "visithistoricbethlehem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "visitsyv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "visitvictorharbor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "visualtec.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vivianvita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vlos.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "volkskrant.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vrbl.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vys.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "waka-vapes.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "waldorf-augsburg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "waldorfdiary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wallmounttvinstallation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wanghong.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wattpad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wcss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wdstrings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "weareallconnected.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webcamara.sytes.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webuyloansfast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webx5.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "welldoc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "welldocinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wellesleycosmeticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "westcoastdrones.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "westmodernclinic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "westsidewinemsp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wg2023.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whatairdefencedoing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whimsical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whirr.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whitespace.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whitespider.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whitespider.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whitespider.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whitespider.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whitespider.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whoplusyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wikikeeps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "willis-brown.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "willowcreektrucking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "windriverpediatrics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wingertmd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wisewaynutrition.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wkwsafetysolution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wmelon.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "womblesemporium.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "woodmaster23.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "woodsbagot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "worn.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wphost.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wrightslawfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x-kamera.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xandercorvuspornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xarardheere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xbortov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xgreatben.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xlnaudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--061az77a.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--061az77a.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--45i.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--95qy23o.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--95qy23o.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--bwx.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--bwx.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--h7t906ca.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--h7t906ca.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--itt6x.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--itts1a.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--itts1a.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--nts.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--nts.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--p2v.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--p2v.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--qm1a.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--qm1a.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--rl-wka.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--vwsv89g.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--vwsv89g.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--vwsw0b.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--vwsw0b192f.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yaourtiere.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yesasia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yorkshirehousing.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yourlust.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yourshoppingnetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yousuccesskenya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "youtubebulkviews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ystral.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yueeeyueee.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yunookami.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yuriylysyuk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zacwildpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zahnarztpraxis-schaerding.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zapatilla.com.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zasekafe.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zatepli.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zdeneklavicky.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zecanard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zenlinez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zer0systems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zgw.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zhangjing.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zhujike.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zhujike.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zippyanimation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "znowuwrocisz.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zoeysinnpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zorkin.uz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zwit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zwitterion.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, // END OF 1-YEAR BULK HSTS ENTRIES // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/services/audio/public/cpp/BUILD.gn b/services/audio/public/cpp/BUILD.gn index b2d1c88..76e79e1 100644 --- a/services/audio/public/cpp/BUILD.gn +++ b/services/audio/public/cpp/BUILD.gn
@@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -source_set("cpp") { +component("cpp") { sources = [ "audio_system_to_service_adapter.cc", "audio_system_to_service_adapter.h", @@ -22,6 +22,8 @@ "sounds/sounds_manager.h", ] + defines = [ "IS_AUDIO_PUBLIC_CPP_IMPL" ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] public_deps = [ @@ -30,6 +32,8 @@ "//media/mojo/common", "//services/audio/public/mojom", ] + + output_name = "audio_public_cpp" } source_set("test_support") {
diff --git a/services/audio/public/cpp/audio_system_to_service_adapter.h b/services/audio/public/cpp/audio_system_to_service_adapter.h index 3628801..9bb893c 100644 --- a/services/audio/public/cpp/audio_system_to_service_adapter.h +++ b/services/audio/public/cpp/audio_system_to_service_adapter.h
@@ -9,6 +9,7 @@ #include <string> #include "base/callback.h" +#include "base/component_export.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" #include "base/timer/timer.h" @@ -22,7 +23,8 @@ // Provides media::AudioSystem implementation on top of Audio service. // In case connection to Audio service is lost, reply callbacks will run with // empty optionals / false booleans. -class AudioSystemToServiceAdapter : public media::AudioSystem { +class COMPONENT_EXPORT(AUDIO_PUBLIC_CPP) AudioSystemToServiceAdapter + : public media::AudioSystem { public: // A callback which can be used to acquire a new SystemInfo interface pipe // lazily as needed.
diff --git a/services/audio/public/cpp/debug_recording_session.h b/services/audio/public/cpp/debug_recording_session.h index 1a676d4..2641e2f8 100644 --- a/services/audio/public/cpp/debug_recording_session.h +++ b/services/audio/public/cpp/debug_recording_session.h
@@ -7,6 +7,7 @@ #include <memory> +#include "base/component_export.h" #include "media/audio/audio_debug_recording_helper.h" #include "media/audio/audio_debug_recording_session.h" #include "mojo/public/cpp/bindings/pending_receiver.h" @@ -28,9 +29,11 @@ // class' instances need permission to create files in |file_name_base| path // passed in constructor in order to start debug recording. If file creation // fails, debug recording will silently not start. -class DebugRecordingSession : public media::AudioDebugRecordingSession { +class COMPONENT_EXPORT(AUDIO_PUBLIC_CPP) DebugRecordingSession + : public media::AudioDebugRecordingSession { public: - class DebugRecordingFileProvider : public mojom::DebugRecordingFileProvider { + class COMPONENT_EXPORT(AUDIO_PUBLIC_CPP) DebugRecordingFileProvider + : public mojom::DebugRecordingFileProvider { public: DebugRecordingFileProvider( mojo::PendingReceiver<mojom::DebugRecordingFileProvider> receiver,
diff --git a/services/audio/public/cpp/debug_recording_session_factory.h b/services/audio/public/cpp/debug_recording_session_factory.h index 01d74ca..e10ce47 100644 --- a/services/audio/public/cpp/debug_recording_session_factory.h +++ b/services/audio/public/cpp/debug_recording_session_factory.h
@@ -7,6 +7,7 @@ #include <memory> +#include "base/component_export.h" #include "services/audio/public/mojom/debug_recording.mojom.h" namespace base { @@ -19,6 +20,7 @@ namespace audio { +COMPONENT_EXPORT(AUDIO_PUBLIC_CPP) std::unique_ptr<media::AudioDebugRecordingSession> CreateAudioDebugRecordingSession( const base::FilePath& debug_recording_file_path,
diff --git a/services/audio/public/cpp/device_factory.h b/services/audio/public/cpp/device_factory.h index 84b1824..564b92a 100644 --- a/services/audio/public/cpp/device_factory.h +++ b/services/audio/public/cpp/device_factory.h
@@ -8,6 +8,7 @@ #include <memory> #include <string> +#include "base/component_export.h" #include "media/audio/audio_input_device.h" #include "media/mojo/mojom/audio_stream_factory.mojom.h" #include "mojo/public/cpp/bindings/pending_remote.h" @@ -16,11 +17,13 @@ using DeadStreamDetection = media::AudioInputDevice::DeadStreamDetection; +COMPONENT_EXPORT(AUDIO_PUBLIC_CPP) scoped_refptr<media::AudioCapturerSource> CreateInputDevice( mojo::PendingRemote<media::mojom::AudioStreamFactory> stream_factory, const std::string& device_id, DeadStreamDetection detect_dead_stream); +COMPONENT_EXPORT(AUDIO_PUBLIC_CPP) scoped_refptr<media::AudioCapturerSource> CreateInputDevice( mojo::PendingRemote<media::mojom::AudioStreamFactory> stream_factory, const std::string& device_id,
diff --git a/services/audio/public/cpp/input_ipc.h b/services/audio/public/cpp/input_ipc.h index 92088e8..f96a524 100644 --- a/services/audio/public/cpp/input_ipc.h +++ b/services/audio/public/cpp/input_ipc.h
@@ -9,6 +9,7 @@ #include <string> #include "base/callback_helpers.h" +#include "base/component_export.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" @@ -25,8 +26,9 @@ // InputIPC is a client-side class for handling creation, // initialization and control of an input stream. May only be used on a single // thread. -class InputIPC : public media::AudioInputIPC, - public media::mojom::AudioInputStreamClient { +class COMPONENT_EXPORT(AUDIO_PUBLIC_CPP) InputIPC + : public media::AudioInputIPC, + public media::mojom::AudioInputStreamClient { public: InputIPC(mojo::PendingRemote<media::mojom::AudioStreamFactory> stream_factory, const std::string& device_id,
diff --git a/services/audio/public/cpp/output_device.h b/services/audio/public/cpp/output_device.h index 295cd01..cc956c5 100644 --- a/services/audio/public/cpp/output_device.h +++ b/services/audio/public/cpp/output_device.h
@@ -8,6 +8,7 @@ #include <memory> #include <string> +#include "base/component_export.h" #include "base/memory/raw_ptr.h" #include "media/base/audio_renderer_sink.h" #include "media/mojo/mojom/audio_output_stream.mojom.h" @@ -22,7 +23,7 @@ namespace audio { -class OutputDevice { +class COMPONENT_EXPORT(AUDIO_PUBLIC_CPP) OutputDevice { public: // media::AudioRendererSink::RenderCallback must outlive |this|. OutputDevice(
diff --git a/services/audio/public/cpp/sounds/audio_stream_handler.h b/services/audio/public/cpp/sounds/audio_stream_handler.h index 1b991b9..e3b2534 100644 --- a/services/audio/public/cpp/sounds/audio_stream_handler.h +++ b/services/audio/public/cpp/sounds/audio_stream_handler.h
@@ -9,6 +9,7 @@ #include <memory> #include "base/compiler_specific.h" +#include "base/component_export.h" #include "base/memory/scoped_refptr.h" #include "base/sequence_checker.h" #include "base/strings/string_piece.h" @@ -22,7 +23,7 @@ namespace audio { // This class sends a sound to the audio output device. -class AudioStreamHandler { +class COMPONENT_EXPORT(AUDIO_PUBLIC_CPP) AudioStreamHandler { public: class TestObserver { public:
diff --git a/services/audio/public/cpp/sounds/sounds_manager.h b/services/audio/public/cpp/sounds/sounds_manager.h index a3320dacd..ae5d079 100644 --- a/services/audio/public/cpp/sounds/sounds_manager.h +++ b/services/audio/public/cpp/sounds/sounds_manager.h
@@ -6,6 +6,7 @@ #define SERVICES_AUDIO_PUBLIC_CPP_SOUNDS_SOUNDS_MANAGER_H_ #include "base/callback.h" +#include "base/component_export.h" #include "base/sequence_checker.h" #include "base/strings/string_piece.h" #include "base/time/time.h" @@ -17,7 +18,7 @@ // This class is used for reproduction of system sounds. All methods // should be accessed from the Audio thread. -class SoundsManager { +class COMPONENT_EXPORT(AUDIO_PUBLIC_CPP) SoundsManager { public: typedef int SoundKey;
diff --git a/services/device/geolocation/geolocation_impl.cc b/services/device/geolocation/geolocation_impl.cc index e6d4c2f..13ee127 100644 --- a/services/device/geolocation/geolocation_impl.cc +++ b/services/device/geolocation/geolocation_impl.cc
@@ -7,58 +7,11 @@ #include <utility> #include "base/bind.h" -#include "base/metrics/histogram_macros.h" #include "services/device/geolocation/geolocation_context.h" #include "services/device/public/cpp/geolocation/geoposition.h" namespace device { -namespace { - -// Geoposition error codes for reporting in UMA. -enum GeopositionErrorCode { - // NOTE: Do not renumber these as that would confuse interpretation of - // previously logged data. When making changes, also update the enum list - // in tools/metrics/histograms/histograms.xml to keep it in sync. - - // There was no error. - GEOPOSITION_ERROR_CODE_NONE = 0, - - // User denied use of geolocation. - GEOPOSITION_ERROR_CODE_PERMISSION_DENIED = 1, - - // Geoposition could not be determined. - GEOPOSITION_ERROR_CODE_POSITION_UNAVAILABLE = 2, - - // Timeout. - GEOPOSITION_ERROR_CODE_TIMEOUT = 3, - - // NOTE: Add entries only immediately above this line. - GEOPOSITION_ERROR_CODE_COUNT = 4 -}; - -void RecordGeopositionErrorCode(mojom::Geoposition::ErrorCode error_code) { - GeopositionErrorCode code = GEOPOSITION_ERROR_CODE_NONE; - switch (error_code) { - case mojom::Geoposition::ErrorCode::NONE: - code = GEOPOSITION_ERROR_CODE_NONE; - break; - case mojom::Geoposition::ErrorCode::PERMISSION_DENIED: - code = GEOPOSITION_ERROR_CODE_PERMISSION_DENIED; - break; - case mojom::Geoposition::ErrorCode::POSITION_UNAVAILABLE: - code = GEOPOSITION_ERROR_CODE_POSITION_UNAVAILABLE; - break; - case mojom::Geoposition::ErrorCode::TIMEOUT: - code = GEOPOSITION_ERROR_CODE_TIMEOUT; - break; - } - UMA_HISTOGRAM_ENUMERATION("Geolocation.LocationUpdate.ErrorCode", code, - GEOPOSITION_ERROR_CODE_COUNT); -} - -} // namespace - GeolocationImpl::GeolocationImpl(mojo::PendingReceiver<Geolocation> receiver, GeolocationContext* context) : receiver_(this, std::move(receiver)), @@ -74,8 +27,8 @@ // Make sure to respond to any pending callback even without a valid position. if (!position_callback_.is_null()) { if (ValidateGeoposition(current_position_)) { - current_position_.error_code = mojom::Geoposition::ErrorCode( - GEOPOSITION_ERROR_CODE_POSITION_UNAVAILABLE); + current_position_.error_code = + mojom::Geoposition::ErrorCode::POSITION_UNAVAILABLE; current_position_.error_message.clear(); } ReportCurrentPosition(); @@ -152,7 +105,6 @@ } void GeolocationImpl::OnLocationUpdate(const mojom::Geoposition& position) { - RecordGeopositionErrorCode(position.error_code); DCHECK(context_); current_position_ = position;
diff --git a/storage/browser/file_system/filesystem_proxy_file_stream_reader.cc b/storage/browser/file_system/filesystem_proxy_file_stream_reader.cc index 3d87045..876c531b 100644 --- a/storage/browser/file_system/filesystem_proxy_file_stream_reader.cc +++ b/storage/browser/file_system/filesystem_proxy_file_stream_reader.cc
@@ -34,13 +34,13 @@ scoped_refptr<FilesystemProxyFileStreamReader::SharedFilesystemProxy> shared_filesystem_proxy) { if (!shared_filesystem_proxy->data->PathExists(path)) { - return base::File::FILE_ERROR_NOT_FOUND; + return base::unexpected(base::File::FILE_ERROR_NOT_FOUND); } absl::optional<base::File::Info> info = shared_filesystem_proxy->data->GetFileInfo(path); if (!info.has_value()) { - return base::File::FILE_ERROR_FAILED; + return base::unexpected(base::File::FILE_ERROR_FAILED); } return std::move(*info); @@ -161,7 +161,7 @@ void FilesystemProxyFileStreamReader::DidOpenFile( base::FileErrorOr<base::File> open_result) { - if (open_result.is_error()) { + if (!open_result.has_value()) { std::move(callback_).Run(open_result.error()); return; } @@ -217,13 +217,13 @@ base::FileErrorOr<base::File::Info> result) { // TODO(enne): track rate of missing blobs for http://crbug.com/1131151 if (emit_metrics_) { - bool file_was_found = !result.is_error() || + bool file_was_found = result.has_value() || result.error() != base::File::FILE_ERROR_NOT_FOUND; UMA_HISTOGRAM_BOOLEAN("WebCore.IndexedDB.FoundBlobFileForValue", file_was_found); } - if (result.is_error()) { + if (!result.has_value()) { std::move(callback).Run(net::FileErrorToNetError(result.error())); return; }
diff --git a/storage/browser/file_system/local_file_stream_reader.cc b/storage/browser/file_system/local_file_stream_reader.cc index 53d752f..c5654bbb 100644 --- a/storage/browser/file_system/local_file_stream_reader.cc +++ b/storage/browser/file_system/local_file_stream_reader.cc
@@ -32,12 +32,12 @@ base::FileErrorOr<base::File::Info> DoGetFileInfo(const base::FilePath& path) { if (!base::PathExists(path)) - return base::File::FILE_ERROR_NOT_FOUND; + return base::unexpected(base::File::FILE_ERROR_NOT_FOUND); base::File::Info info; bool success = base::GetFileInfo(path, &info); if (!success) - return base::File::FILE_ERROR_FAILED; + return base::unexpected(base::File::FILE_ERROR_FAILED); return info; } @@ -199,7 +199,7 @@ void LocalFileStreamReader::DidGetFileInfoForGetLength( net::Int64CompletionOnceCallback callback, base::FileErrorOr<base::File::Info> result) { - if (result.is_error()) { + if (!result.has_value()) { std::move(callback).Run(net::FileErrorToNetError(result.error())); return; }
diff --git a/storage/browser/file_system/obfuscated_file_util.cc b/storage/browser/file_system/obfuscated_file_util.cc index e9b04cd..b57e5dc4 100644 --- a/storage/browser/file_system/obfuscated_file_util.cc +++ b/storage/browser/file_system/obfuscated_file_util.cc
@@ -927,7 +927,7 @@ } base::File::Error error = GetDirectoryHelper(path, create); if (error != base::File::FILE_OK) - return error; + return base::unexpected(error); return path; } @@ -939,7 +939,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); base::FileErrorOr<base::FilePath> dir = GetDirectoryForStorageKey(storage_key, create); - if (dir.is_error()) { + if (!dir.has_value()) { return dir; } DCHECK(!dir->empty()); @@ -954,7 +954,7 @@ } base::File::Error error = GetDirectoryHelper(path, create); if (error != base::File::FILE_OK) - return error; + return base::unexpected(error); return path; } @@ -966,18 +966,18 @@ base::FileErrorOr<base::FilePath> origin_path = GetDirectoryForStorageKey(storage_key, false); - if (origin_path.is_error() || origin_path->empty()) + if (!origin_path.has_value() || origin_path->empty()) return true; if (type) { // Delete the filesystem type directory. const base::FileErrorOr<base::FilePath> origin_type_path = GetDirectoryForStorageKeyAndType(storage_key, type.value(), false); - if (origin_type_path.is_error() && + if (!origin_type_path.has_value() && origin_type_path.error() == base::File::FILE_ERROR_FAILED) { return false; } - if (!origin_type_path.is_error() && !origin_type_path->empty() && + if (origin_type_path.has_value() && !origin_type_path->empty() && !delegate_->DeleteFileOrDirectory(origin_type_path.value(), true /* recursive */)) { return false; @@ -1034,7 +1034,7 @@ // Delete the filesystem type directory. const base::FileErrorOr<base::FilePath> path_with_type = GetDirectoryForBucketAndType(bucket_locator, type.value(), false); - if (path_with_type.is_error()) + if (!path_with_type.has_value()) return false; if (!path_with_type->empty() && !delegate_->DeleteFileOrDirectory(path_with_type.value(), @@ -1351,7 +1351,7 @@ const base::FilePath& data_path) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); base::FileErrorOr<base::FilePath> root = GetDirectoryForURL(url, false); - if (root.is_error()) + if (!root.has_value()) return base::FilePath(); return root.value().Append(data_path); } @@ -1393,7 +1393,7 @@ } base::FileErrorOr<base::FilePath> path = GetDirectoryForURL(url, create); - if (path.is_error()) { + if (!path.has_value()) { LOG(WARNING) << "Failed to get origin+type directory: " << url.DebugString() << " error:" << path.error(); return nullptr; @@ -1413,39 +1413,40 @@ // Retrieve the default bucket value for `storage_key`. QuotaErrorOr<BucketLocator> bucket = GetOrCreateDefaultBucket(storage_key); if (!bucket.ok()) - return base::File::FILE_ERROR_FAILED; + return base::unexpected(base::File::FILE_ERROR_FAILED); // Get the path and verify it is valid. base::FileErrorOr<base::FilePath> path = sandbox_delegate_->quota_manager_proxy()->GetClientBucketPath( bucket.value(), QuotaClientType::kFileSystem); - if (path.is_error()) - return path.error(); + if (!path.has_value()) + return base::unexpected(path.error()); base::File::Error error = GetDirectoryHelper(path.value(), create); if (error != base::File::FILE_OK) - return error; + return base::unexpected(error); return path; } if (!InitOriginDatabase(storage_key.origin(), create)) { - return create ? base::File::FILE_ERROR_FAILED - : base::File::FILE_ERROR_NOT_FOUND; + return base::FileErrorOr<base::FilePath>( + base::unexpected(create ? base::File::FILE_ERROR_FAILED + : base::File::FILE_ERROR_NOT_FOUND)); } base::FilePath directory_name; std::string id = GetIdentifierFromOrigin(storage_key.origin()); bool exists_in_db = origin_database_->HasOriginPath(id); if (!exists_in_db && !create) { - return base::File::FILE_ERROR_NOT_FOUND; + return base::unexpected(base::File::FILE_ERROR_NOT_FOUND); } if (!origin_database_->GetPathForOrigin(id, &directory_name)) { - return base::File::FILE_ERROR_FAILED; + return base::unexpected(base::File::FILE_ERROR_FAILED); } base::FilePath path = file_system_directory_.Append(directory_name); bool exists_in_fs = delegate_->DirectoryExists(path); if (!exists_in_db && exists_in_fs) { if (!delegate_->DeleteFileOrDirectory(path, true)) { - return base::File::FILE_ERROR_FAILED; + return base::unexpected(base::File::FILE_ERROR_FAILED); } exists_in_fs = false; } @@ -1454,8 +1455,8 @@ if (!create || delegate_->CreateDirectory(path, false /* exclusive */, true /* recursive */) != base::File::FILE_OK) { - return create ? base::File::FILE_ERROR_FAILED - : base::File::FILE_ERROR_NOT_FOUND; + return base::unexpected(create ? base::File::FILE_ERROR_FAILED + : base::File::FILE_ERROR_NOT_FOUND); } } return path; @@ -1580,7 +1581,7 @@ base::FileErrorOr<base::FilePath> directory_for_url = GetDirectoryForURL(url, false); - if (directory_for_url.is_error()) + if (!directory_for_url.has_value()) return directory_for_url.error(); *root = directory_for_url.value();
diff --git a/storage/browser/file_system/obfuscated_file_util_unittest.cc b/storage/browser/file_system/obfuscated_file_util_unittest.cc index df29875..feb9a80 100644 --- a/storage/browser/file_system/obfuscated_file_util_unittest.cc +++ b/storage/browser/file_system/obfuscated_file_util_unittest.cc
@@ -417,7 +417,7 @@ quota_manager_, &sandbox_file_system_)); base::FileErrorOr<base::FilePath> path = sandbox_file_system_.GetUsageCachePath(); - if (!path.is_error()) + if (path.has_value()) usage_cache()->Delete(path.value()); } @@ -428,7 +428,7 @@ int64_t usage = 0; base::FileErrorOr<base::FilePath> path = sandbox_file_system_.GetUsageCachePath(); - if (path.is_error()) + if (!path.has_value()) return -1; return usage_cache()->GetUsage(path.value(), &usage) ? usage : -1; } @@ -2565,28 +2565,28 @@ NewFileSystem(custom_bucket_, kFileSystemTypePersistent); // Make sure directories for default_bucket_ exist. - ASSERT_FALSE(ofu() - ->GetDirectoryForBucketAndType(default_bucket_, - kFileSystemTypeTemporary, - /*create=*/false) - .is_error()); - ASSERT_FALSE(ofu() - ->GetDirectoryForBucketAndType(default_bucket_, - kFileSystemTypePersistent, - /*create=*/false) - .is_error()); + ASSERT_TRUE(ofu() + ->GetDirectoryForBucketAndType(default_bucket_, + kFileSystemTypeTemporary, + /*create=*/false) + .has_value()); + ASSERT_TRUE(ofu() + ->GetDirectoryForBucketAndType(default_bucket_, + kFileSystemTypePersistent, + /*create=*/false) + .has_value()); // Make sure directories for custom_bucket_ exist. - ASSERT_FALSE(ofu() - ->GetDirectoryForBucketAndType(custom_bucket_, - kFileSystemTypeTemporary, - /*create=*/false) - .is_error()); - ASSERT_FALSE(ofu() - ->GetDirectoryForBucketAndType(custom_bucket_, - kFileSystemTypePersistent, - /*create=*/false) - .is_error()); + ASSERT_TRUE(ofu() + ->GetDirectoryForBucketAndType(custom_bucket_, + kFileSystemTypeTemporary, + /*create=*/false) + .has_value()); + ASSERT_TRUE(ofu() + ->GetDirectoryForBucketAndType(custom_bucket_, + kFileSystemTypePersistent, + /*create=*/false) + .has_value()); // Delete a directory for default_bucket_'s persistent filesystem. ASSERT_TRUE(ofu()->DeleteDirectoryForBucketAndType( @@ -2594,11 +2594,11 @@ // The directory for default_bucket_'s temporary filesystem should not be // removed. - ASSERT_FALSE(ofu() - ->GetDirectoryForBucketAndType(default_bucket_, - kFileSystemTypeTemporary, - /*create=*/false) - .is_error()); + ASSERT_TRUE(ofu() + ->GetDirectoryForBucketAndType(default_bucket_, + kFileSystemTypeTemporary, + /*create=*/false) + .has_value()); // The directory for default_bucket_'s persistent filesystem should be // removed. @@ -2610,16 +2610,16 @@ base::File::FILE_ERROR_NOT_FOUND); // The directories for custom_bucket_ should not be removed. - ASSERT_FALSE(ofu() - ->GetDirectoryForBucketAndType(custom_bucket_, - kFileSystemTypeTemporary, - /*create=*/false) - .is_error()); - ASSERT_FALSE(ofu() - ->GetDirectoryForBucketAndType(custom_bucket_, - kFileSystemTypePersistent, - /*create=*/false) - .is_error()); + ASSERT_TRUE(ofu() + ->GetDirectoryForBucketAndType(custom_bucket_, + kFileSystemTypeTemporary, + /*create=*/false) + .has_value()); + ASSERT_TRUE(ofu() + ->GetDirectoryForBucketAndType(custom_bucket_, + kFileSystemTypePersistent, + /*create=*/false) + .has_value()); // Deleting directories which don't exist is not an error. ASSERT_TRUE(ofu()->DeleteDirectoryForBucketAndType( @@ -2647,28 +2647,28 @@ NewFileSystem(storage_key2, kFileSystemTypePersistent); // Make sure directories for storage_key1 exist. - ASSERT_FALSE(ofu() - ->GetDirectoryForStorageKeyAndType(storage_key1, - kFileSystemTypeTemporary, - /*create=*/false) - .is_error()); - ASSERT_FALSE(ofu() - ->GetDirectoryForStorageKeyAndType(storage_key1, - kFileSystemTypePersistent, - /*create=*/false) - .is_error()); + ASSERT_TRUE(ofu() + ->GetDirectoryForStorageKeyAndType(storage_key1, + kFileSystemTypeTemporary, + /*create=*/false) + .has_value()); + ASSERT_TRUE(ofu() + ->GetDirectoryForStorageKeyAndType(storage_key1, + kFileSystemTypePersistent, + /*create=*/false) + .has_value()); // Make sure directories for storage_key2 exist. - ASSERT_FALSE(ofu() - ->GetDirectoryForStorageKeyAndType(storage_key2, - kFileSystemTypeTemporary, - /*create=*/false) - .is_error()); - ASSERT_FALSE(ofu() - ->GetDirectoryForStorageKeyAndType(storage_key2, - kFileSystemTypePersistent, - /*create=*/false) - .is_error()); + ASSERT_TRUE(ofu() + ->GetDirectoryForStorageKeyAndType(storage_key2, + kFileSystemTypeTemporary, + /*create=*/false) + .has_value()); + ASSERT_TRUE(ofu() + ->GetDirectoryForStorageKeyAndType(storage_key2, + kFileSystemTypePersistent, + /*create=*/false) + .has_value()); // Delete a directory for storage_key1's persistent filesystem. ASSERT_TRUE(ofu()->DeleteDirectoryForStorageKeyAndType( @@ -2676,11 +2676,11 @@ // The directory for storage_key1's temporary filesystem should not be // removed. - ASSERT_FALSE(ofu() - ->GetDirectoryForStorageKeyAndType(storage_key1, - kFileSystemTypeTemporary, - /*create=*/false) - .is_error()); + ASSERT_TRUE(ofu() + ->GetDirectoryForStorageKeyAndType(storage_key1, + kFileSystemTypeTemporary, + /*create=*/false) + .has_value()); // The directory for storage_key1's persistent filesystem should be removed. ASSERT_EQ(ofu() @@ -2691,16 +2691,16 @@ base::File::FILE_ERROR_NOT_FOUND); // The directories for storage_key2 should not be removed. - ASSERT_FALSE(ofu() - ->GetDirectoryForStorageKeyAndType(storage_key2, - kFileSystemTypeTemporary, - /*create=*/false) - .is_error()); - ASSERT_FALSE(ofu() - ->GetDirectoryForStorageKeyAndType(storage_key2, - kFileSystemTypePersistent, - /*create=*/false) - .is_error()); + ASSERT_TRUE(ofu() + ->GetDirectoryForStorageKeyAndType(storage_key2, + kFileSystemTypeTemporary, + /*create=*/false) + .has_value()); + ASSERT_TRUE(ofu() + ->GetDirectoryForStorageKeyAndType(storage_key2, + kFileSystemTypePersistent, + /*create=*/false) + .has_value()); // Make sure storage_key3's directories don't exist. ASSERT_EQ(ofu() @@ -2735,28 +2735,28 @@ NewFileSystem(custom_bucket_, kFileSystemTypePersistent); // Make sure directories for default_bucket_ exist. - ASSERT_FALSE(ofu() - ->GetDirectoryForBucketAndType(default_bucket_, - kFileSystemTypeTemporary, - /*create=*/false) - .is_error()); - ASSERT_FALSE(ofu() - ->GetDirectoryForBucketAndType(default_bucket_, - kFileSystemTypePersistent, - /*create=*/false) - .is_error()); + ASSERT_TRUE(ofu() + ->GetDirectoryForBucketAndType(default_bucket_, + kFileSystemTypeTemporary, + /*create=*/false) + .has_value()); + ASSERT_TRUE(ofu() + ->GetDirectoryForBucketAndType(default_bucket_, + kFileSystemTypePersistent, + /*create=*/false) + .has_value()); // Make sure directories for custom_bucket_ exist. - ASSERT_FALSE(ofu() - ->GetDirectoryForBucketAndType(custom_bucket_, - kFileSystemTypeTemporary, - /*create=*/false) - .is_error()); - ASSERT_FALSE(ofu() - ->GetDirectoryForBucketAndType(custom_bucket_, - kFileSystemTypePersistent, - /*create=*/false) - .is_error()); + ASSERT_TRUE(ofu() + ->GetDirectoryForBucketAndType(custom_bucket_, + kFileSystemTypeTemporary, + /*create=*/false) + .has_value()); + ASSERT_TRUE(ofu() + ->GetDirectoryForBucketAndType(custom_bucket_, + kFileSystemTypePersistent, + /*create=*/false) + .has_value()); // Delete all directories for default_bucket_. ofu()->DeleteDirectoryForBucketAndType(default_bucket_, absl::nullopt); @@ -2776,16 +2776,16 @@ base::File::FILE_ERROR_NOT_FOUND); // The directories for custom_bucket_ should not be removed. - ASSERT_FALSE(ofu() - ->GetDirectoryForBucketAndType(custom_bucket_, - kFileSystemTypeTemporary, - /*create=*/false) - .is_error()); - ASSERT_FALSE(ofu() - ->GetDirectoryForBucketAndType(custom_bucket_, - kFileSystemTypePersistent, - /*create=*/false) - .is_error()); + ASSERT_TRUE(ofu() + ->GetDirectoryForBucketAndType(custom_bucket_, + kFileSystemTypeTemporary, + /*create=*/false) + .has_value()); + ASSERT_TRUE(ofu() + ->GetDirectoryForBucketAndType(custom_bucket_, + kFileSystemTypePersistent, + /*create=*/false) + .has_value()); } TEST_P(ObfuscatedFileUtilTest, DeleteDirectoryForStorageKeyAndType_DeleteAll) { @@ -2807,28 +2807,28 @@ NewFileSystem(storage_key2, kFileSystemTypePersistent); // Make sure directories for storage_key1 exist. - ASSERT_FALSE(ofu() - ->GetDirectoryForStorageKeyAndType(storage_key1, - kFileSystemTypeTemporary, - /*create=*/false) - .is_error()); - ASSERT_FALSE(ofu() - ->GetDirectoryForStorageKeyAndType(storage_key1, - kFileSystemTypePersistent, - /*create=*/false) - .is_error()); + ASSERT_TRUE(ofu() + ->GetDirectoryForStorageKeyAndType(storage_key1, + kFileSystemTypeTemporary, + /*create=*/false) + .has_value()); + ASSERT_TRUE(ofu() + ->GetDirectoryForStorageKeyAndType(storage_key1, + kFileSystemTypePersistent, + /*create=*/false) + .has_value()); // Make sure directories for storage_key2 exist. - ASSERT_FALSE(ofu() - ->GetDirectoryForStorageKeyAndType(storage_key2, - kFileSystemTypeTemporary, - /*create=*/false) - .is_error()); - ASSERT_FALSE(ofu() - ->GetDirectoryForStorageKeyAndType(storage_key2, - kFileSystemTypePersistent, - /*create=*/false) - .is_error()); + ASSERT_TRUE(ofu() + ->GetDirectoryForStorageKeyAndType(storage_key2, + kFileSystemTypeTemporary, + /*create=*/false) + .has_value()); + ASSERT_TRUE(ofu() + ->GetDirectoryForStorageKeyAndType(storage_key2, + kFileSystemTypePersistent, + /*create=*/false) + .has_value()); // Delete all directories for storage_key1. ofu()->DeleteDirectoryForStorageKeyAndType(storage_key1, absl::nullopt); @@ -2848,16 +2848,16 @@ base::File::FILE_ERROR_NOT_FOUND); // The directories for storage_key2 should not be removed. - ASSERT_FALSE(ofu() - ->GetDirectoryForStorageKeyAndType(storage_key2, - kFileSystemTypeTemporary, - /*create=*/false) - .is_error()); - ASSERT_FALSE(ofu() - ->GetDirectoryForStorageKeyAndType(storage_key2, - kFileSystemTypePersistent, - /*create=*/false) - .is_error()); + ASSERT_TRUE(ofu() + ->GetDirectoryForStorageKeyAndType(storage_key2, + kFileSystemTypeTemporary, + /*create=*/false) + .has_value()); + ASSERT_TRUE(ofu() + ->GetDirectoryForStorageKeyAndType(storage_key2, + kFileSystemTypePersistent, + /*create=*/false) + .has_value()); } } // namespace storage
diff --git a/storage/browser/file_system/quota/quota_backend_impl.cc b/storage/browser/file_system/quota/quota_backend_impl.cc index e7266b2..979823e 100644 --- a/storage/browser/file_system/quota/quota_backend_impl.cc +++ b/storage/browser/file_system/quota/quota_backend_impl.cc
@@ -78,7 +78,7 @@ return; ReserveQuotaInternal(QuotaReservationInfo(origin, type, delta)); base::FileErrorOr<base::FilePath> path = GetUsageCachePath(origin, type); - if (path.is_error()) + if (!path.has_value()) return; bool result = file_system_usage_cache_->AtomicUpdateUsageByDelta(path.value(), delta); @@ -90,7 +90,7 @@ DCHECK(file_task_runner_->RunsTasksInCurrentSequence()); DCHECK(!origin.opaque()); base::FileErrorOr<base::FilePath> path = GetUsageCachePath(origin, type); - if (path.is_error()) + if (!path.has_value()) return; DCHECK(file_system_usage_cache_); file_system_usage_cache_->IncrementDirty(path.value()); @@ -101,7 +101,7 @@ DCHECK(file_task_runner_->RunsTasksInCurrentSequence()); DCHECK(!origin.opaque()); base::FileErrorOr<base::FilePath> path = GetUsageCachePath(origin, type); - if (path.is_error()) + if (!path.has_value()) return; DCHECK(file_system_usage_cache_); file_system_usage_cache_->DecrementDirty(path.value());
diff --git a/storage/browser/file_system/quota/quota_backend_impl_unittest.cc b/storage/browser/file_system/quota/quota_backend_impl_unittest.cc index d0028570..0788811 100644 --- a/storage/browser/file_system/quota/quota_backend_impl_unittest.cc +++ b/storage/browser/file_system/quota/quota_backend_impl_unittest.cc
@@ -141,7 +141,7 @@ base::FileErrorOr<base::FilePath> path = file_util_->GetDirectoryForStorageKeyAndType(blink::StorageKey(origin), type, true /* create */); - ASSERT_FALSE(path.is_error()); + ASSERT_TRUE(path.has_value()); ASSERT_TRUE(file_system_usage_cache_.UpdateUsage( GetUsageCachePath(origin, type), 0)); @@ -155,7 +155,7 @@ FileSystemType type) { base::FileErrorOr<base::FilePath> path = backend_->GetUsageCachePath(origin, type); - EXPECT_FALSE(path.is_error()); + EXPECT_TRUE(path.has_value()); EXPECT_FALSE(path->empty()); return path.value(); }
diff --git a/storage/browser/file_system/sandbox_file_system_backend_delegate.cc b/storage/browser/file_system/sandbox_file_system_backend_delegate.cc index a556ba2..71caf128 100644 --- a/storage/browser/file_system/sandbox_file_system_backend_delegate.cc +++ b/storage/browser/file_system/sandbox_file_system_backend_delegate.cc
@@ -121,12 +121,12 @@ base::FileErrorOr<base::FilePath> path = file_util->GetDirectoryForBucketAndType(bucket_locator.value(), type, create); - error = (path.is_error()) ? path.error() : base::File::FILE_OK; + error = path.has_value() ? base::File::FILE_OK : path.error(); } else { base::FileErrorOr<base::FilePath> path = file_util->GetDirectoryForStorageKeyAndType( blink::StorageKey(url::Origin::Create(origin_url)), type, create); - error = (path.is_error()) ? path.error() : base::File::FILE_OK; + error = path.has_value() ? base::File::FILE_OK : path.error(); } if (error != base::File::FILE_OK) { UMA_HISTOGRAM_ENUMERATION(kOpenFileSystemLabel, kCreateDirectoryError, @@ -240,9 +240,7 @@ base::FileErrorOr<base::FilePath> path = obfuscated_file_util()->GetDirectoryForStorageKeyAndType(storage_key, type, create); - if (path.is_error()) - return base::FilePath(); - return path.value(); + return path.value_or(base::FilePath()); } base::FilePath @@ -253,9 +251,7 @@ base::FileErrorOr<base::FilePath> path = obfuscated_file_util()->GetDirectoryForBucketAndType(bucket_locator, type, create); - if (path.is_error()) - return base::FilePath(); - return path.value(); + return path.value_or(base::FilePath()); } void SandboxFileSystemBackendDelegate::OpenFileSystem( @@ -491,7 +487,7 @@ if (bucket_locator.has_value()) { base::FileErrorOr<base::FilePath> result = GetBaseDirectoryForBucketAndType(bucket_locator.value(), type, false); - if (result.is_error() || + if (!result.has_value() || !obfuscated_file_util()->delegate()->DirectoryExists(result.value())) return 0; path = result.value(); @@ -605,7 +601,7 @@ base::FileErrorOr<base::FilePath> usage_file_path = GetUsageCachePathForStorageKeyAndType(obfuscated_file_util(), storage_key, type); - if (usage_file_path.is_error()) + if (!usage_file_path.has_value()) return; usage_cache()->IncrementDirty(usage_file_path.value()); } @@ -688,7 +684,7 @@ base::FileErrorOr<base::FilePath> base_path = sandbox_file_util->GetDirectoryForStorageKeyAndType(storage_key, type, false /* create */); - if (base_path.is_error()) { + if (!base_path.has_value()) { return base_path; } return base_path->Append(FileSystemUsageCache::kUsageFileName); @@ -711,7 +707,7 @@ base::FileErrorOr<base::FilePath> base_path = sandbox_file_util->GetDirectoryForBucketAndType(bucket_locator, type, /*create=*/false); - if (base_path.is_error()) { + if (!base_path.has_value()) { return base_path; } return base_path->Append(FileSystemUsageCache::kUsageFileName);
diff --git a/storage/browser/file_system/sandbox_quota_observer.cc b/storage/browser/file_system/sandbox_quota_observer.cc index f874b01..ba12dc8 100644 --- a/storage/browser/file_system/sandbox_quota_observer.cc +++ b/storage/browser/file_system/sandbox_quota_observer.cc
@@ -35,7 +35,7 @@ void SandboxQuotaObserver::OnStartUpdate(const FileSystemURL& url) { DCHECK(update_notify_runner_->RunsTasksInCurrentSequence()); base::FileErrorOr<base::FilePath> usage_file_path = GetUsageCachePath(url); - if (usage_file_path.is_error() || usage_file_path->empty()) + if (!usage_file_path.has_value() || usage_file_path->empty()) return; file_system_usage_cache_->IncrementDirty(usage_file_path.value()); } @@ -51,7 +51,7 @@ } base::FileErrorOr<base::FilePath> usage_file_path = GetUsageCachePath(url); - if (usage_file_path.is_error() || usage_file_path->empty()) + if (!usage_file_path.has_value() || usage_file_path->empty()) return; pending_update_notification_[usage_file_path.value()] += delta; @@ -68,7 +68,7 @@ DCHECK(update_notify_runner_->RunsTasksInCurrentSequence()); base::FileErrorOr<base::FilePath> usage_file_path = GetUsageCachePath(url); - if (usage_file_path.is_error() || usage_file_path->empty()) + if (!usage_file_path.has_value() || usage_file_path->empty()) return; auto found = pending_update_notification_.find(usage_file_path.value()); @@ -110,7 +110,7 @@ SandboxFileSystemBackendDelegate::GetUsageCachePathForStorageKeyAndType( sandbox_file_util_, url.storage_key(), url.type()); } - if (path.is_error()) { + if (!path.has_value()) { LOG(WARNING) << "Could not get usage cache path for: " << url.DebugString(); } return path;
diff --git a/storage/browser/test/sandbox_file_system_test_helper.cc b/storage/browser/test/sandbox_file_system_test_helper.cc index 8822bf4..8d592ea2 100644 --- a/storage/browser/test/sandbox_file_system_test_helper.cc +++ b/storage/browser/test/sandbox_file_system_test_helper.cc
@@ -139,7 +139,7 @@ int64_t size = file_util_delegate()->ComputeDirectorySize(GetRootPath()); base::FileErrorOr<base::FilePath> path = GetUsageCachePath(); - if (!path.is_error() && file_util_delegate()->PathExists(path.value())) + if (path.has_value() && file_util_delegate()->PathExists(path.value())) size -= FileSystemUsageCache::kUsageFileSize; return size; @@ -203,7 +203,7 @@ /*create=*/true); } base::FileErrorOr<base::FilePath> usage_cache_path = GetUsageCachePath(); - if (!usage_cache_path.is_error() && !usage_cache_path->empty()) + if (usage_cache_path.has_value() && !usage_cache_path->empty()) usage_cache()->UpdateUsage(usage_cache_path.value(), 0); }
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 16b2f9ac..4bbb59b 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -110078,44 +110078,6 @@ "--git-revision=${got_revision}" ], "check_flakiness_for_new_tests": false, - "isolate_name": "blink_web_tests", - "merge": { - "args": [ - "--verbose" - ], - "script": "//third_party/blink/tools/merge_web_test_results.py" - }, - "name": "blink_web_tests", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true - }, - "results_handler": "layout tests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-13" - } - ], - "expiration": 21600, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 5 - }, - "test_id_prefix": "ninja://:blink_web_tests/" - }, - { - "args": [ - "--num-retries=3", - "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", - "--git-revision=${got_revision}" - ], - "check_flakiness_for_new_tests": false, "isolate_name": "blink_wpt_tests", "merge": { "args": [
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 1e2d4e7..088fdc75 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -205,6 +205,7 @@ 'Win 7 Tests x64 (1)', # 64-bit win is unsupported by the layout tests. 'Win7 Tests (1)', 'Win10 Tests x64 (dbg)', + 'mac-osxbeta-rel', ], 'modifications': { 'Linux Tests': {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index aa90fea..f6475c64 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -4560,6 +4560,25 @@ ] } ], + "EnableShoppingListDesktop": [ + { + "platforms": [ + "chromeos", + "chromeos_lacros", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled_20221005", + "enable_features": [ + "ShoppingList" + ] + } + ] + } + ], "ExploreSitesDense": [ { "platforms": [ @@ -4851,9 +4870,6 @@ "name": "ForceGpuMainThreadToNormalPriorityDrDc", "enable_features": [ "ForceGpuMainThreadToNormalPriorityDrDc" - ], - "disable_features": [ - "RawDraw" ] } ] @@ -8944,6 +8960,9 @@ }, "enable_features": [ "EnableDrDcVulkan" + ], + "disable_features": [ + "RawDraw" ] } ] @@ -9762,25 +9781,6 @@ ] } ], - "ShoppingList": [ - { - "platforms": [ - "chromeos", - "chromeos_lacros", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled_20221005", - "enable_features": [ - "ShoppingList" - ] - } - ] - } - ], "ShowScrollableMVTOnNTPAndroid": [ { "platforms": [ @@ -12123,6 +12123,21 @@ ] } ], + "WebRTCPipeWireCapturer": [ + { + "platforms": [ + "linux" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "WebRTCPipeWireCapturer" + ] + } + ] + } + ], "WebRtcAllowWgcDesktopCapturer": [ { "platforms": [
diff --git a/third_party/abseil-cpp/CMake/AbseilHelpers.cmake b/third_party/abseil-cpp/CMake/AbseilHelpers.cmake index e1196fd7..6d402872 100644 --- a/third_party/abseil-cpp/CMake/AbseilHelpers.cmake +++ b/third_party/abseil-cpp/CMake/AbseilHelpers.cmake
@@ -32,7 +32,7 @@ set(ABSL_INTERNAL_INCLUDE_WARNING_GUARD "") endif() -function(_target_compile_features_if_available TARGET TYPE FEATURE) +function(_absl_target_compile_features_if_available TARGET TYPE FEATURE) if(FEATURE IN_LIST CMAKE_CXX_COMPILE_FEATURES) target_compile_features(${TARGET} ${TYPE} ${FEATURE}) else() @@ -300,7 +300,7 @@ # Abseil libraries require C++14 as the current minimum standard. # Top-level application CMake projects should ensure a consistent C++ # standard for all compiled sources by setting CMAKE_CXX_STANDARD. - _target_compile_features_if_available(${_NAME} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE}) + _absl_target_compile_features_if_available(${_NAME} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE}) else() # Note: This is legacy (before CMake 3.8) behavior. Setting the # target-level CXX_STANDARD property to ABSL_CXX_STANDARD (which is @@ -348,7 +348,7 @@ # Abseil libraries require C++14 as the current minimum standard. # Top-level application CMake projects should ensure a consistent C++ # standard for all compiled sources by setting CMAKE_CXX_STANDARD. - _target_compile_features_if_available(${_NAME} INTERFACE ${ABSL_INTERNAL_CXX_STD_FEATURE}) + _absl_target_compile_features_if_available(${_NAME} INTERFACE ${ABSL_INTERNAL_CXX_STD_FEATURE}) # (INTERFACE libraries can't have the CXX_STANDARD property set, so there # is no legacy behavior else case). @@ -460,7 +460,7 @@ # Abseil libraries require C++14 as the current minimum standard. # Top-level application CMake projects should ensure a consistent C++ # standard for all compiled sources by setting CMAKE_CXX_STANDARD. - _target_compile_features_if_available(${_NAME} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE}) + _absl_target_compile_features_if_available(${_NAME} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE}) else() # Note: This is legacy (before CMake 3.8) behavior. Setting the # target-level CXX_STANDARD property to ABSL_CXX_STANDARD (which is @@ -476,11 +476,3 @@ add_test(NAME ${_NAME} COMMAND ${_NAME}) endfunction() - - -function(check_target my_target) - if(NOT TARGET ${my_target}) - message(FATAL_ERROR " ABSL: compiling absl requires a ${my_target} CMake target in your project, - see CMake/README.md for more details") - endif(NOT TARGET ${my_target}) -endfunction()
diff --git a/third_party/abseil-cpp/CMakeLists.txt b/third_party/abseil-cpp/CMakeLists.txt index 3b67d8f..9e10257 100644 --- a/third_party/abseil-cpp/CMakeLists.txt +++ b/third_party/abseil-cpp/CMakeLists.txt
@@ -140,7 +140,6 @@ ) if((BUILD_TESTING AND ABSL_BUILD_TESTING) OR ABSL_BUILD_TEST_HELPERS) - ## check targets if (ABSL_USE_EXTERNAL_GOOGLETEST) if (ABSL_FIND_GOOGLETEST) find_package(GTest REQUIRED) @@ -172,11 +171,6 @@ endif() include(CMake/Googletest/DownloadGTest.cmake) endif() - - check_target(GTest::gtest) - check_target(GTest::gtest_main) - check_target(GTest::gmock) - check_target(GTest::gmock_main) endif() add_subdirectory(absl)
diff --git a/third_party/abseil-cpp/README.chromium b/third_party/abseil-cpp/README.chromium index 4a78fb33..24d5dd6 100644 --- a/third_party/abseil-cpp/README.chromium +++ b/third_party/abseil-cpp/README.chromium
@@ -4,7 +4,7 @@ License: Apache 2.0 License File: LICENSE Version: 0 -Revision: d24156f63ca6d44a0dc05e260ad7810b2fcf3405 +Revision: e58d05efe0b3b1dfff3faf5b8b58c43bd8e6e29f Security Critical: yes Description:
diff --git a/third_party/abseil-cpp/absl/base/config.h b/third_party/abseil-cpp/absl/base/config.h index 95131068..1058ce7 100644 --- a/third_party/abseil-cpp/absl/base/config.h +++ b/third_party/abseil-cpp/absl/base/config.h
@@ -243,6 +243,7 @@ #ifdef ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE #error ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE cannot be directly set #elif defined(_LIBCPP_VERSION) || defined(_MSC_VER) || \ + (defined(__clang__) && __clang_major__ >= 15) || \ (!defined(__clang__) && defined(__GLIBCXX__) && \ ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(4, 8)) #define ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE 1 @@ -264,6 +265,7 @@ #elif defined(ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE) #error ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE cannot directly set #elif (defined(__clang__) && defined(_LIBCPP_VERSION)) || \ + (defined(__clang__) && __clang_major__ >= 15) || \ (!defined(__clang__) && \ ((ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(7, 4) && defined(__GLIBCXX__)) || \ (ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(8, 2) && \
diff --git a/third_party/abseil-cpp/absl/base/optimization.h b/third_party/abseil-cpp/absl/base/optimization.h index db5cc09..d706100c 100644 --- a/third_party/abseil-cpp/absl/base/optimization.h +++ b/third_party/abseil-cpp/absl/base/optimization.h
@@ -91,6 +91,7 @@ #define ABSL_CACHELINE_SIZE 64 #endif #endif +#endif #ifndef ABSL_CACHELINE_SIZE // A reasonable default guess. Note that overestimates tend to waste more @@ -141,12 +142,11 @@ // the generated machine code. // 3) Prefer applying this attribute to individual variables. Avoid // applying it to types. This tends to localize the effect. +#if defined(__clang__) || defined(__GNUC__) #define ABSL_CACHELINE_ALIGNED __attribute__((aligned(ABSL_CACHELINE_SIZE))) #elif defined(_MSC_VER) -#define ABSL_CACHELINE_SIZE 64 #define ABSL_CACHELINE_ALIGNED __declspec(align(ABSL_CACHELINE_SIZE)) #else -#define ABSL_CACHELINE_SIZE 64 #define ABSL_CACHELINE_ALIGNED #endif
diff --git a/third_party/abseil-cpp/absl/container/BUILD.bazel b/third_party/abseil-cpp/absl/container/BUILD.bazel index 15162f28..d8dad8e8 100644 --- a/third_party/abseil-cpp/absl/container/BUILD.bazel +++ b/third_party/abseil-cpp/absl/container/BUILD.bazel
@@ -134,6 +134,7 @@ "//absl/base:core_headers", "//absl/base:throw_delegate", "//absl/memory", + "//absl/meta:type_traits", ], ) @@ -1011,8 +1012,8 @@ ":flat_hash_set", ":hashtable_debug", "//absl/base:raw_logging_internal", - "//absl/flags:flag", "//absl/hash", + "//absl/log", "//absl/memory", "//absl/strings:cord", "//absl/strings:str_format",
diff --git a/third_party/abseil-cpp/absl/container/BUILD.gn b/third_party/abseil-cpp/absl/container/BUILD.gn index 061b650..d4255a5 100644 --- a/third_party/abseil-cpp/absl/container/BUILD.gn +++ b/third_party/abseil-cpp/absl/container/BUILD.gn
@@ -41,6 +41,7 @@ "//third_party/abseil-cpp/absl/base:core_headers", "//third_party/abseil-cpp/absl/base:throw_delegate", "//third_party/abseil-cpp/absl/memory", + "//third_party/abseil-cpp/absl/meta:type_traits", ] }
diff --git a/third_party/abseil-cpp/absl/container/CMakeLists.txt b/third_party/abseil-cpp/absl/container/CMakeLists.txt index 6c2931b..2521646 100644 --- a/third_party/abseil-cpp/absl/container/CMakeLists.txt +++ b/third_party/abseil-cpp/absl/container/CMakeLists.txt
@@ -194,6 +194,7 @@ absl::inlined_vector_internal absl::throw_delegate absl::memory + absl::type_traits PUBLIC )
diff --git a/third_party/abseil-cpp/absl/container/btree_benchmark.cc b/third_party/abseil-cpp/absl/container/btree_benchmark.cc index 0ca497c..cc9a106 100644 --- a/third_party/abseil-cpp/absl/container/btree_benchmark.cc +++ b/third_party/abseil-cpp/absl/container/btree_benchmark.cc
@@ -34,8 +34,8 @@ #include "absl/container/flat_hash_map.h" #include "absl/container/flat_hash_set.h" #include "absl/container/internal/hashtable_debug.h" -#include "absl/flags/flag.h" #include "absl/hash/hash.h" +#include "absl/log/log.h" #include "absl/memory/memory.h" #include "absl/strings/cord.h" #include "absl/strings/str_format.h"
diff --git a/third_party/abseil-cpp/absl/container/inlined_vector.h b/third_party/abseil-cpp/absl/container/inlined_vector.h index 60f1246..10b1896 100644 --- a/third_party/abseil-cpp/absl/container/inlined_vector.h +++ b/third_party/abseil-cpp/absl/container/inlined_vector.h
@@ -52,6 +52,7 @@ #include "absl/base/port.h" #include "absl/container/internal/inlined_vector.h" #include "absl/memory/memory.h" +#include "absl/meta/type_traits.h" namespace absl { ABSL_NAMESPACE_BEGIN @@ -77,6 +78,8 @@ using MoveIterator = inlined_vector_internal::MoveIterator<TheA>; template <typename TheA> using IsMemcpyOk = inlined_vector_internal::IsMemcpyOk<TheA>; + template <typename TheA> + using IsMoveAssignOk = inlined_vector_internal::IsMoveAssignOk<TheA>; template <typename TheA, typename Iterator> using IteratorValueAdapter = @@ -94,6 +97,15 @@ using DisableIfAtLeastForwardIterator = absl::enable_if_t< !inlined_vector_internal::IsAtLeastForwardIterator<Iterator>::value, int>; + struct MemcpyPolicy {}; + struct ElementwiseAssignPolicy {}; + struct ElementwiseConstructPolicy {}; + + using MoveAssignmentPolicy = absl::conditional_t< + IsMemcpyOk<A>::value, MemcpyPolicy, + absl::conditional_t<IsMoveAssignOk<A>::value, ElementwiseAssignPolicy, + ElementwiseConstructPolicy>>; + public: using allocator_type = A; using value_type = inlined_vector_internal::ValueType<A>; @@ -486,18 +498,7 @@ // unspecified state. InlinedVector& operator=(InlinedVector&& other) { if (ABSL_PREDICT_TRUE(this != std::addressof(other))) { - if (IsMemcpyOk<A>::value || other.storage_.GetIsAllocated()) { - inlined_vector_internal::DestroyAdapter<A>::DestroyElements( - storage_.GetAllocator(), data(), size()); - storage_.DeallocateIfAllocated(); - storage_.MemcpyFrom(other.storage_); - - other.storage_.SetInlinedSize(0); - } else { - storage_.Assign(IteratorValueAdapter<A, MoveIterator<A>>( - MoveIterator<A>(other.storage_.GetInlinedData())), - other.size()); - } + MoveAssignment(MoveAssignmentPolicy{}, std::move(other)); } return *this; @@ -773,6 +774,42 @@ template <typename H, typename TheT, size_t TheN, typename TheA> friend H AbslHashValue(H h, const absl::InlinedVector<TheT, TheN, TheA>& a); + void MoveAssignment(MemcpyPolicy, InlinedVector&& other) { + inlined_vector_internal::DestroyAdapter<A>::DestroyElements( + storage_.GetAllocator(), data(), size()); + storage_.DeallocateIfAllocated(); + storage_.MemcpyFrom(other.storage_); + + other.storage_.SetInlinedSize(0); + } + + void MoveAssignment(ElementwiseAssignPolicy, InlinedVector&& other) { + if (other.storage_.GetIsAllocated()) { + MoveAssignment(MemcpyPolicy{}, std::move(other)); + } else { + storage_.Assign(IteratorValueAdapter<A, MoveIterator<A>>( + MoveIterator<A>(other.storage_.GetInlinedData())), + other.size()); + } + } + + void MoveAssignment(ElementwiseConstructPolicy, InlinedVector&& other) { + if (other.storage_.GetIsAllocated()) { + MoveAssignment(MemcpyPolicy{}, std::move(other)); + } else { + inlined_vector_internal::DestroyAdapter<A>::DestroyElements( + storage_.GetAllocator(), data(), size()); + storage_.DeallocateIfAllocated(); + + IteratorValueAdapter<A, MoveIterator<A>> other_values( + MoveIterator<A>(other.storage_.GetInlinedData())); + inlined_vector_internal::ConstructElements<A>( + storage_.GetAllocator(), storage_.GetInlinedData(), other_values, + other.storage_.GetSize()); + storage_.SetInlinedSize(other.storage_.GetSize()); + } + } + Storage storage_; };
diff --git a/third_party/abseil-cpp/absl/container/inlined_vector_test.cc b/third_party/abseil-cpp/absl/container/inlined_vector_test.cc index b872eb4..65ddbab6 100644 --- a/third_party/abseil-cpp/absl/container/inlined_vector_test.cc +++ b/third_party/abseil-cpp/absl/container/inlined_vector_test.cc
@@ -16,12 +16,14 @@ #include <algorithm> #include <forward_list> +#include <iterator> #include <list> #include <memory> #include <scoped_allocator> #include <sstream> #include <stdexcept> #include <string> +#include <utility> #include <vector> #include "gmock/gmock.h" @@ -49,6 +51,7 @@ using testing::ElementsAreArray; using testing::Eq; using testing::Gt; +using testing::Pointwise; using testing::PrintToString; using IntVec = absl::InlinedVector<int, 8>; @@ -1824,4 +1827,112 @@ EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(cases)); } +class MoveConstructibleOnlyInstance + : public absl::test_internal::BaseCountedInstance { + public: + explicit MoveConstructibleOnlyInstance(int x) : BaseCountedInstance(x) {} + MoveConstructibleOnlyInstance(MoveConstructibleOnlyInstance&& other) = + default; + MoveConstructibleOnlyInstance& operator=( + MoveConstructibleOnlyInstance&& other) = delete; +}; + +MATCHER(HasValue, "") { + return ::testing::get<0>(arg).value() == ::testing::get<1>(arg); +} + +TEST(MoveAssignment, NonAssignable) { + using X = MoveConstructibleOnlyInstance; + { + InstanceTracker tracker; + absl::InlinedVector<X, 2> inlined; + inlined.emplace_back(1); + absl::InlinedVector<X, 2> allocated; + allocated.emplace_back(1); + allocated.emplace_back(2); + allocated.emplace_back(3); + tracker.ResetCopiesMovesSwaps(); + + inlined = std::move(allocated); + // passed ownership of the allocated storage + EXPECT_EQ(tracker.moves(), 0); + EXPECT_EQ(tracker.live_instances(), 3); + + EXPECT_THAT(inlined, Pointwise(HasValue(), {1, 2, 3})); + } + + { + InstanceTracker tracker; + absl::InlinedVector<X, 2> inlined; + inlined.emplace_back(1); + absl::InlinedVector<X, 2> allocated; + allocated.emplace_back(1); + allocated.emplace_back(2); + allocated.emplace_back(3); + tracker.ResetCopiesMovesSwaps(); + + allocated = std::move(inlined); + // Moved elements + EXPECT_EQ(tracker.moves(), 1); + EXPECT_EQ(tracker.live_instances(), 1); + + EXPECT_THAT(allocated, Pointwise(HasValue(), {1})); + } + + { + InstanceTracker tracker; + absl::InlinedVector<X, 2> inlined_a; + inlined_a.emplace_back(1); + absl::InlinedVector<X, 2> inlined_b; + inlined_b.emplace_back(1); + tracker.ResetCopiesMovesSwaps(); + + inlined_a = std::move(inlined_b); + // Moved elements + EXPECT_EQ(tracker.moves(), 1); + EXPECT_EQ(tracker.live_instances(), 1); + + EXPECT_THAT(inlined_a, Pointwise(HasValue(), {1})); + } + + { + InstanceTracker tracker; + absl::InlinedVector<X, 2> allocated_a; + allocated_a.emplace_back(1); + allocated_a.emplace_back(2); + allocated_a.emplace_back(3); + absl::InlinedVector<X, 2> allocated_b; + allocated_b.emplace_back(4); + allocated_b.emplace_back(5); + allocated_b.emplace_back(6); + allocated_b.emplace_back(7); + tracker.ResetCopiesMovesSwaps(); + + allocated_a = std::move(allocated_b); + // passed ownership of the allocated storage + EXPECT_EQ(tracker.moves(), 0); + EXPECT_EQ(tracker.live_instances(), 4); + + EXPECT_THAT(allocated_a, Pointwise(HasValue(), {4, 5, 6, 7})); + } + + { + InstanceTracker tracker; + absl::InlinedVector<X, 2> v; + v.emplace_back(1); + v.emplace_back(2); + v.emplace_back(3); + + tracker.ResetCopiesMovesSwaps(); + + // Obfuscated in order to pass -Wself-move. + v = std::move(*std::addressof(v)); + // nothing happens + EXPECT_EQ(tracker.moves(), 0); + EXPECT_EQ(tracker.live_instances(), 3); + + EXPECT_THAT(v, Pointwise(HasValue(), {1, 2, 3})); + } +} + } // anonymous namespace
diff --git a/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h b/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h index c99e68f4..0fd4866e 100644 --- a/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +++ b/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h
@@ -93,11 +93,12 @@ slot_type* old_slot, char) { #if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606 if (absl::is_trivially_relocatable<value_type>()) { - // TODO(b/247130232): remove cast after fixing class-memaccess warning. + // TODO(b/247130232,b/251814870): remove casts after fixing warnings. std::memcpy(static_cast<void*>( std::launder(const_cast<std::remove_const_t<value_type>*>( &element(new_slot)))), - &element(old_slot), sizeof(value_type)); + static_cast<const void*>(&element(old_slot)), + sizeof(value_type)); return; } #endif
diff --git a/third_party/abseil-cpp/absl/container/internal/container_memory.h b/third_party/abseil-cpp/absl/container/internal/container_memory.h index c29c533b..bfa4ff93 100644 --- a/third_party/abseil-cpp/absl/container/internal/container_memory.h +++ b/third_party/abseil-cpp/absl/container/internal/container_memory.h
@@ -428,9 +428,10 @@ emplace(new_slot); #if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606 if (absl::is_trivially_relocatable<value_type>()) { - // TODO(b/247130232): remove cast after fixing class-memaccess warning. + // TODO(b/247130232,b/251814870): remove casts after fixing warnings. std::memcpy(static_cast<void*>(std::launder(&new_slot->value)), - &old_slot->value, sizeof(value_type)); + static_cast<const void*>(&old_slot->value), + sizeof(value_type)); return; } #endif
diff --git a/third_party/abseil-cpp/absl/container/internal/inlined_vector.h b/third_party/abseil-cpp/absl/container/internal/inlined_vector.h index a56b7573..f623494 100644 --- a/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +++ b/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
@@ -83,6 +83,9 @@ absl::is_trivially_copy_assignable<ValueType<A>>, absl::is_trivially_destructible<ValueType<A>>>; +template <typename A> +using IsMoveAssignOk = std::is_move_assignable<ValueType<A>>; + template <typename T> struct TypeIdentity { using type = T;
diff --git a/third_party/abseil-cpp/absl/functional/any_invocable.h b/third_party/abseil-cpp/absl/functional/any_invocable.h index 040418d..3e783c8 100644 --- a/third_party/abseil-cpp/absl/functional/any_invocable.h +++ b/third_party/abseil-cpp/absl/functional/any_invocable.h
@@ -148,6 +148,9 @@ // // rvalue-reference qualified. // std::move(continuation)(result_of_foo); // } +// +// Attempting to call `absl::AnyInvocable` multiple times in such a case +// results in undefined behavior. template <class Sig> class AnyInvocable : private internal_any_invocable::Impl<Sig> { private:
diff --git a/third_party/abseil-cpp/absl/functional/any_invocable_test.cc b/third_party/abseil-cpp/absl/functional/any_invocable_test.cc index dabaae9..1ed8540 100644 --- a/third_party/abseil-cpp/absl/functional/any_invocable_test.cc +++ b/third_party/abseil-cpp/absl/functional/any_invocable_test.cc
@@ -16,6 +16,7 @@ #include <cstddef> #include <initializer_list> +#include <memory> #include <numeric> #include <type_traits> @@ -1156,9 +1157,6 @@ EXPECT_TRUE(static_cast<bool>(fun)); EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value); - - EXPECT_TRUE(static_cast<bool>(fun)); - EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value); } TYPED_TEST_P(AnyInvTestMovable, ConversionConstructionVoidCovariance) { @@ -1179,9 +1177,6 @@ EXPECT_TRUE(static_cast<bool>(fun)); EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value); - - EXPECT_TRUE(static_cast<bool>(fun)); - EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value); } TYPED_TEST_P(AnyInvTestMovable, ConversionAssignUserDefinedTypeNonemptyLhs) { @@ -1193,9 +1188,6 @@ EXPECT_TRUE(static_cast<bool>(fun)); EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value); - - EXPECT_TRUE(static_cast<bool>(fun)); - EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value); } TYPED_TEST_P(AnyInvTestMovable, ConversionAssignVoidCovariance) { @@ -1414,6 +1406,41 @@ std::is_assignable<AnyInvType&, std::reference_wrapper<AddType>>::value)); } +TYPED_TEST_P(AnyInvTestRvalue, NonConstCrashesOnSecondCall) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + AnyInvType fun(absl::in_place_type<AddType>, 5); + + EXPECT_TRUE(static_cast<bool>(fun)); + std::move(fun)(7, 8, 9); + + // Ensure we're still valid + EXPECT_TRUE(static_cast<bool>(fun)); // NOLINT(bugprone-use-after-move) + +#if !defined(NDEBUG) || ABSL_OPTION_HARDENED == 1 + EXPECT_DEATH_IF_SUPPORTED(std::move(fun)(7, 8, 9), ""); +#endif +} + +// Ensure that any qualifiers (in particular &&-qualifiers) do not affect +// when the destructor is actually run. +TYPED_TEST_P(AnyInvTestRvalue, QualifierIndependentObjectLifetime) { + using AnyInvType = typename TypeParam::AnyInvType; + + auto refs = std::make_shared<std::nullptr_t>(); + { + AnyInvType fun([refs](auto&&...) noexcept { return 0; }); + EXPECT_FALSE(refs.unique()); + + std::move(fun)(7, 8, 9); + + // Ensure destructor hasn't run even if rref-qualified + EXPECT_FALSE(refs.unique()); + } + EXPECT_TRUE(refs.unique()); +} + // NOTE: This test suite originally attempted to enumerate all possible // combinations of type properties but the build-time started getting too large. // Instead, it is now assumed that certain parameters are orthogonal and so @@ -1670,7 +1697,9 @@ REGISTER_TYPED_TEST_SUITE_P(AnyInvTestRvalue, ConversionConstructionReferenceWrapper, NonMoveableResultType, - ConversionAssignReferenceWrapper); + ConversionAssignReferenceWrapper, + NonConstCrashesOnSecondCall, + QualifierIndependentObjectLifetime); INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallMayThrow, AnyInvTestRvalue, TestParameterListRvalueQualifiersCallMayThrow);
diff --git a/third_party/abseil-cpp/absl/functional/internal/any_invocable.h b/third_party/abseil-cpp/absl/functional/internal/any_invocable.h index 35b389d..8fce4bf6 100644 --- a/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +++ b/third_party/abseil-cpp/absl/functional/internal/any_invocable.h
@@ -809,11 +809,31 @@ : Core(absl::in_place_type<absl::decay_t<T> inv_quals>, \ std::forward<Args>(args)...) {} \ \ + InvokerType<noex, ReturnType, P...>* ExtractInvoker() cv { \ + using QualifiedTestType = int cv ref; \ + auto* invoker = this->invoker_; \ + if (!std::is_const<QualifiedTestType>::value && \ + std::is_rvalue_reference<QualifiedTestType>::value) { \ + ABSL_HARDENING_ASSERT([this]() { \ + /* We checked that this isn't const above, so const_cast is safe */ \ + const_cast<Impl*>(this)->invoker_ = \ + [](TypeErasedState*, \ + ForwardedParameterType<P>...) noexcept(noex) -> ReturnType { \ + ABSL_HARDENING_ASSERT(false && "AnyInvocable use-after-move"); \ + std::terminate(); \ + }; \ + return this->HasValue(); \ + }()); \ + } \ + return invoker; \ + } \ + \ /*The actual invocation operation with the proper signature*/ \ ReturnType operator()(P... args) cv ref noexcept(noex) { \ assert(this->invoker_ != nullptr); \ - return this->invoker_(const_cast<TypeErasedState*>(&this->state_), \ - static_cast<ForwardedParameterType<P>>(args)...); \ + return this->ExtractInvoker()( \ + const_cast<TypeErasedState*>(&this->state_), \ + static_cast<ForwardedParameterType<P>>(args)...); \ } \ }
diff --git a/third_party/abseil-cpp/absl/log/internal/conditions.cc b/third_party/abseil-cpp/absl/log/internal/conditions.cc index 70f2ace..a9f4966 100644 --- a/third_party/abseil-cpp/absl/log/internal/conditions.cc +++ b/third_party/abseil-cpp/absl/log/internal/conditions.cc
@@ -37,7 +37,7 @@ } // namespace bool LogEveryNState::ShouldLog(int n) { - return n != 0 && (LossyIncrement(&counter_) % n) == 0; + return n > 0 && (LossyIncrement(&counter_) % static_cast<uint32_t>(n)) == 0; } bool LogFirstNState::ShouldLog(int n) {
diff --git a/third_party/abseil-cpp/absl/log/internal/log_format.cc b/third_party/abseil-cpp/absl/log/internal/log_format.cc index b10a656b..5d40d25 100644 --- a/third_party/abseil-cpp/absl/log/internal/log_format.cc +++ b/third_party/abseil-cpp/absl/log/internal/log_format.cc
@@ -78,7 +78,7 @@ absl::LogSeverityName(severity)[0], static_cast<int>(tv.tv_sec), static_cast<int>(tv.tv_usec), static_cast<int>(tid)); if (snprintf_result >= 0) { - buf.remove_prefix(snprintf_result); + buf.remove_prefix(static_cast<size_t>(snprintf_result)); return static_cast<size_t>(snprintf_result); } return 0; @@ -87,26 +87,27 @@ char* p = buf.data(); *p++ = absl::LogSeverityName(severity)[0]; const absl::TimeZone::CivilInfo ci = tz->At(timestamp); - absl::numbers_internal::PutTwoDigits(ci.cs.month(), p); + absl::numbers_internal::PutTwoDigits(static_cast<size_t>(ci.cs.month()), p); p += 2; - absl::numbers_internal::PutTwoDigits(ci.cs.day(), p); + absl::numbers_internal::PutTwoDigits(static_cast<size_t>(ci.cs.day()), p); p += 2; *p++ = ' '; - absl::numbers_internal::PutTwoDigits(ci.cs.hour(), p); + absl::numbers_internal::PutTwoDigits(static_cast<size_t>(ci.cs.hour()), p); p += 2; *p++ = ':'; - absl::numbers_internal::PutTwoDigits(ci.cs.minute(), p); + absl::numbers_internal::PutTwoDigits(static_cast<size_t>(ci.cs.minute()), p); p += 2; *p++ = ':'; - absl::numbers_internal::PutTwoDigits(ci.cs.second(), p); + absl::numbers_internal::PutTwoDigits(static_cast<size_t>(ci.cs.second()), p); p += 2; *p++ = '.'; const int64_t usecs = absl::ToInt64Microseconds(ci.subsecond); - absl::numbers_internal::PutTwoDigits(usecs / 10000, p); + absl::numbers_internal::PutTwoDigits(static_cast<size_t>(usecs / 10000), p); p += 2; - absl::numbers_internal::PutTwoDigits(usecs / 100 % 100, p); + absl::numbers_internal::PutTwoDigits(static_cast<size_t>(usecs / 100 % 100), + p); p += 2; - absl::numbers_internal::PutTwoDigits(usecs % 100, p); + absl::numbers_internal::PutTwoDigits(static_cast<size_t>(usecs % 100), p); p += 2; *p++ = ' '; constexpr bool unsigned_tid_t = !std::is_signed<log_internal::Tid>::value; @@ -118,7 +119,7 @@ if ((unsigned_tid_t || tid > -100000) && tid < 1000000) *p++ = ' '; p = absl::numbers_internal::FastIntToBuffer(tid, p); *p++ = ' '; - const size_t bytes_formatted = p - buf.data(); + const size_t bytes_formatted = static_cast<size_t>(p - buf.data()); buf.remove_prefix(bytes_formatted); return bytes_formatted; } @@ -146,7 +147,7 @@ p = absl::numbers_internal::FastIntToBuffer(line, p); *p++ = ']'; *p++ = ' '; - const size_t bytes_formatted = p - buf.data(); + const size_t bytes_formatted = static_cast<size_t>(p - buf.data()); buf.remove_prefix(bytes_formatted); return bytes_formatted; }
diff --git a/third_party/abseil-cpp/absl/log/internal/log_message.cc b/third_party/abseil-cpp/absl/log/internal/log_message.cc index 9ef0c29e..82833af0 100644 --- a/third_party/abseil-cpp/absl/log/internal/log_message.cc +++ b/third_party/abseil-cpp/absl/log/internal/log_message.cc
@@ -118,20 +118,23 @@ // If no data were ever streamed in, this is where we must write the prefix. if (pbase() == nullptr) Initialize(); // Here we reclaim the two bytes we reserved. - size_t idx = pptr() - pbase(); + ptrdiff_t idx = pptr() - pbase(); setp(buf_.data(), buf_.data() + buf_.size()); - pbump(idx); + pbump(static_cast<int>(idx)); sputc('\n'); sputc('\0'); finalized_ = true; - return absl::Span<const char>(pbase(), pptr() - pbase()); + return absl::Span<const char>(pbase(), + static_cast<size_t>(pptr() - pbase())); } size_t prefix_len() const { return prefix_len_; } protected: std::streamsize xsputn(const char* s, std::streamsize n) override { + if (n < 0) return 0; if (pbase() == nullptr) Initialize(); - return Append(absl::string_view(s, n)); + return static_cast<std::streamsize>( + Append(absl::string_view(s, static_cast<size_t>(n)))); } int overflow(int ch = EOF) override { @@ -154,14 +157,14 @@ prefix_len_ = log_internal::FormatLogPrefix( entry_.log_severity(), entry_.timestamp(), entry_.tid(), entry_.source_basename(), entry_.source_line(), remaining); - pbump(prefix_len_); + pbump(static_cast<int>(prefix_len_)); } } size_t Append(absl::string_view data) { - absl::Span<char> remaining(pptr(), epptr() - pptr()); + absl::Span<char> remaining(pptr(), static_cast<size_t>(epptr() - pptr())); const size_t written = AppendTruncated(data, &remaining); - pbump(written); + pbump(static_cast<int>(written)); return written; }
diff --git a/third_party/abseil-cpp/absl/log/log_entry.h b/third_party/abseil-cpp/absl/log/log_entry.h index d90961f..30114c3 100644 --- a/third_party/abseil-cpp/absl/log/log_entry.h +++ b/third_party/abseil-cpp/absl/log/log_entry.h
@@ -58,8 +58,10 @@ static constexpr int kNoVerbosityLevel = -1; static constexpr int kNoVerboseLevel = -1; // TO BE removed - LogEntry(const LogEntry&) = default; - LogEntry& operator=(const LogEntry&) = default; + // Pass `LogEntry` by reference, and do not store it as its state does not + // outlive the call to `LogSink::Send()`. + LogEntry(const LogEntry&) = delete; + LogEntry& operator=(const LogEntry&) = delete; // Source file and line where the log message occurred. Taken from `__FILE__` // and `__LINE__` unless overridden by `LOG(...).AtLocation(...)`.
diff --git a/third_party/abseil-cpp/absl/log/log_entry_test.cc b/third_party/abseil-cpp/absl/log/log_entry_test.cc index b19794e..8d0afb3c 100644 --- a/third_party/abseil-cpp/absl/log/log_entry_test.cc +++ b/third_party/abseil-cpp/absl/log/log_entry_test.cc
@@ -101,13 +101,14 @@ entry_.source_basename(), entry_.source_line(), view) : 0; - EXPECT_THAT(entry_.prefix_len_, Eq(view.data() - buf_.data())); + EXPECT_THAT(entry_.prefix_len_, + Eq(static_cast<size_t>(view.data() - buf_.data()))); AppendTruncated(text_message, view); view = absl::Span<char>(view.data(), view.size() + 2); view[0] = '\n'; view[1] = '\0'; view.remove_prefix(2); - buf_.resize(view.data() - buf_.data()); + buf_.resize(static_cast<size_t>(view.data() - buf_.data())); entry_.text_message_with_prefix_and_newline_and_nul_ = absl::MakeSpan(buf_); } LogEntryTestPeer(const LogEntryTestPeer&) = delete; @@ -124,7 +125,7 @@ const size_t prefix_size = log_internal::FormatLogPrefix( entry_.log_severity(), entry_.timestamp(), entry_.tid(), entry_.source_basename(), entry_.source_line(), buf); - EXPECT_THAT(prefix_size, Eq(buf.data() - str.data())); + EXPECT_THAT(prefix_size, Eq(static_cast<size_t>(buf.data() - str.data()))); str.resize(prefix_size); return str; }
diff --git a/third_party/abseil-cpp/absl/log/log_format_test.cc b/third_party/abseil-cpp/absl/log/log_format_test.cc index 3fdb358..c629fce 100644 --- a/third_party/abseil-cpp/absl/log/log_format_test.cc +++ b/third_party/abseil-cpp/absl/log/log_format_test.cc
@@ -108,7 +108,7 @@ TYPED_TEST(CharLogFormatTest, Unprintable) { absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected); - const TypeParam value = 0xeeu; + constexpr auto value = static_cast<TypeParam>(0xeeu); auto comparison_stream = ComparisonStream(); comparison_stream << value;
diff --git a/third_party/abseil-cpp/absl/strings/BUILD.bazel b/third_party/abseil-cpp/absl/strings/BUILD.bazel index 5a40887..5b12c01 100644 --- a/third_party/abseil-cpp/absl/strings/BUILD.bazel +++ b/third_party/abseil-cpp/absl/strings/BUILD.bazel
@@ -963,8 +963,8 @@ copts = ABSL_TEST_COPTS, visibility = ["//visibility:private"], deps = [ + ":str_format", ":strings", - "//absl/base:core_headers", "@com_google_googletest//:gtest_main", ], ) @@ -1164,7 +1164,6 @@ ":cord", ":str_format", ":strings", - "//absl/base:core_headers", "@com_google_googletest//:gtest_main", ], )
diff --git a/third_party/abseil-cpp/absl/strings/CMakeLists.txt b/third_party/abseil-cpp/absl/strings/CMakeLists.txt index e1c2093..01f86184 100644 --- a/third_party/abseil-cpp/absl/strings/CMakeLists.txt +++ b/third_party/abseil-cpp/absl/strings/CMakeLists.txt
@@ -281,6 +281,7 @@ ${ABSL_TEST_COPTS} DEPS absl::strings + absl::str_format absl::core_headers GTest::gmock_main )
diff --git a/third_party/abseil-cpp/absl/strings/charconv.cc b/third_party/abseil-cpp/absl/strings/charconv.cc index 9b4bc5e..c08623c 100644 --- a/third_party/abseil-cpp/absl/strings/charconv.cc +++ b/third_party/abseil-cpp/absl/strings/charconv.cc
@@ -339,14 +339,19 @@ bool HandleEdgeCase(const strings_internal::ParsedFloat& input, bool negative, FloatType* value) { if (input.type == strings_internal::FloatType::kNan) { - // A bug in both clang and gcc would cause the compiler to optimize away the - // buffer we are building below. Declaring the buffer volatile avoids the - // issue, and has no measurable performance impact in microbenchmarks. + // A bug in both clang < 7 and gcc would cause the compiler to optimize + // away the buffer we are building below. Declaring the buffer volatile + // avoids the issue, and has no measurable performance impact in + // microbenchmarks. // // https://bugs.llvm.org/show_bug.cgi?id=37778 // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86113 constexpr ptrdiff_t kNanBufferSize = 128; +#if defined(__GNUC__) || (defined(__clang__) && __clang_major__ < 7) volatile char n_char_sequence[kNanBufferSize]; +#else + char n_char_sequence[kNanBufferSize]; +#endif if (input.subrange_begin == nullptr) { n_char_sequence[0] = '\0'; } else {
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_internal.h b/third_party/abseil-cpp/absl/strings/internal/cord_internal.h index f32fd41..eca747c8 100644 --- a/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +++ b/third_party/abseil-cpp/absl/strings/internal/cord_internal.h
@@ -423,8 +423,8 @@ return pos < data.size() ? data[pos] : '\0'; } -// We store cordz_info as 64 bit pointer value in big endian format. This -// guarantees that the least significant byte of cordz_info matches the last +// We store cordz_info as 64 bit pointer value in little endian format. This +// guarantees that the least significant byte of cordz_info matches the first // byte of the inline data representation in as_chars_, which holds the inlined // size or the 'is_tree' bit. using cordz_info_t = int64_t; @@ -434,14 +434,14 @@ static_assert(sizeof(cordz_info_t) * 2 == kMaxInline + 1, ""); static_assert(sizeof(cordz_info_t) >= sizeof(intptr_t), ""); -// BigEndianByte() creates a big endian representation of 'value', i.e.: a big -// endian value where the last byte in the host's representation holds 'value`, -// with all other bytes being 0. -static constexpr cordz_info_t BigEndianByte(unsigned char value) { +// LittleEndianByte() creates a little endian representation of 'value', i.e.: +// a little endian value where the first byte in the host's representation +// holds 'value`, with all other bytes being 0. +static constexpr cordz_info_t LittleEndianByte(unsigned char value) { #if defined(ABSL_IS_BIG_ENDIAN) - return value; -#else return static_cast<cordz_info_t>(value) << ((sizeof(cordz_info_t) - 1) * 8); +#else + return value; #endif } @@ -450,25 +450,37 @@ // DefaultInitType forces the use of the default initialization constructor. enum DefaultInitType { kDefaultInit }; - // kNullCordzInfo holds the big endian representation of intptr_t(1) + // kNullCordzInfo holds the little endian representation of intptr_t(1) // This is the 'null' / initial value of 'cordz_info'. The null value // is specifically big endian 1 as with 64-bit pointers, the last // byte of cordz_info overlaps with the last byte holding the tag. - static constexpr cordz_info_t kNullCordzInfo = BigEndianByte(1); + static constexpr cordz_info_t kNullCordzInfo = LittleEndianByte(1); + + // kTagOffset contains the offset of the control byte / tag. This constant is + // intended mostly for debugging purposes: do not remove this constant as it + // is actively inspected and used by gdb pretty printing code. + static constexpr size_t kTagOffset = 0; constexpr InlineData() : as_chars_{0} {} explicit InlineData(DefaultInitType) {} explicit constexpr InlineData(CordRep* rep) : as_tree_(rep) {} explicit constexpr InlineData(absl::string_view chars) - : as_chars_{ - GetOrNull(chars, 0), GetOrNull(chars, 1), - GetOrNull(chars, 2), GetOrNull(chars, 3), - GetOrNull(chars, 4), GetOrNull(chars, 5), - GetOrNull(chars, 6), GetOrNull(chars, 7), - GetOrNull(chars, 8), GetOrNull(chars, 9), - GetOrNull(chars, 10), GetOrNull(chars, 11), - GetOrNull(chars, 12), GetOrNull(chars, 13), - GetOrNull(chars, 14), static_cast<char>((chars.size() << 1))} {} + : as_chars_{static_cast<char>((chars.size() << 1)), + GetOrNull(chars, 0), + GetOrNull(chars, 1), + GetOrNull(chars, 2), + GetOrNull(chars, 3), + GetOrNull(chars, 4), + GetOrNull(chars, 5), + GetOrNull(chars, 6), + GetOrNull(chars, 7), + GetOrNull(chars, 8), + GetOrNull(chars, 9), + GetOrNull(chars, 10), + GetOrNull(chars, 11), + GetOrNull(chars, 12), + GetOrNull(chars, 13), + GetOrNull(chars, 14)} {} // Returns true if the current instance is empty. // The 'empty value' is an inlined data value of zero length. @@ -499,8 +511,8 @@ // Requires the current instance to hold a tree value. CordzInfo* cordz_info() const { assert(is_tree()); - intptr_t info = static_cast<intptr_t>( - absl::big_endian::ToHost64(static_cast<uint64_t>(as_tree_.cordz_info))); + intptr_t info = static_cast<intptr_t>(absl::little_endian::ToHost64( + static_cast<uint64_t>(as_tree_.cordz_info))); assert(info & 1); return reinterpret_cast<CordzInfo*>(info - 1); } @@ -512,7 +524,7 @@ assert(is_tree()); uintptr_t info = reinterpret_cast<uintptr_t>(cordz_info) | 1; as_tree_.cordz_info = - static_cast<cordz_info_t>(absl::big_endian::FromHost64(info)); + static_cast<cordz_info_t>(absl::little_endian::FromHost64(info)); } // Resets the current cordz_info to null / empty. @@ -525,7 +537,7 @@ // Requires the current instance to hold inline data. const char* as_chars() const { assert(!is_tree()); - return as_chars_; + return &as_chars_[1]; } // Returns a mutable pointer to the character data inside this instance. @@ -543,7 +555,7 @@ // // It's an error to read from the returned pointer without a preceding write // if the current instance does not hold inline data, i.e.: is_tree() == true. - char* as_chars() { return as_chars_; } + char* as_chars() { return &as_chars_[1]; } // Returns the tree value of this value. // Requires the current instance to hold a tree value. @@ -608,20 +620,13 @@ private: // See cordz_info_t for forced alignment and size of `cordz_info` details. struct AsTree { - explicit constexpr AsTree(absl::cord_internal::CordRep* tree) - : rep(tree), cordz_info(kNullCordzInfo) {} - // This union uses up extra space so that whether rep is 32 or 64 bits, - // cordz_info will still start at the eighth byte, and the last - // byte of cordz_info will still be the last byte of InlineData. - union { - absl::cord_internal::CordRep* rep; - cordz_info_t unused_aligner; - }; - cordz_info_t cordz_info; + explicit constexpr AsTree(absl::cord_internal::CordRep* tree) : rep(tree) {} + cordz_info_t cordz_info = kNullCordzInfo; + absl::cord_internal::CordRep* rep; }; - char& tag() { return reinterpret_cast<char*>(this)[kMaxInline]; } - char tag() const { return reinterpret_cast<const char*>(this)[kMaxInline]; } + int8_t& tag() { return reinterpret_cast<int8_t*>(this)[0]; } + int8_t tag() const { return reinterpret_cast<const int8_t*>(this)[0]; } // If the data has length <= kMaxInline, we store it in `as_chars_`, and // store the size in the last char of `as_chars_` shifted left + 1.
diff --git a/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc b/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc index f9bb661..13731ee 100644 --- a/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +++ b/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc
@@ -202,9 +202,7 @@ auto tag = GetTagForChar(c); - if (*(pos - 1) == 'v' && *(pos - 2) != '%') { - return nullptr; - } + if (ABSL_PREDICT_FALSE(c == 'v' && (pos - original_pos) != 1)) return nullptr; if (ABSL_PREDICT_FALSE(!tag.is_conv())) { if (ABSL_PREDICT_FALSE(!tag.is_length())) return nullptr; @@ -223,6 +221,8 @@ conv->length_mod = length_mod; } tag = GetTagForChar(c); + + if (ABSL_PREDICT_FALSE(c == 'v')) return nullptr; if (ABSL_PREDICT_FALSE(!tag.is_conv())) return nullptr; }
diff --git a/third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc b/third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc index fe0d296..c3e825fe 100644 --- a/third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc +++ b/third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc
@@ -110,10 +110,13 @@ {__LINE__, "ba", "", "ba"}, // 'b' is invalid {__LINE__, "l", "", "l" }, // just length mod isn't okay {__LINE__, "d", "d", "" }, // basic + {__LINE__, "v", "v", "" }, // basic {__LINE__, "d ", "d", " " }, // leave suffix {__LINE__, "dd", "d", "d" }, // don't be greedy {__LINE__, "d9", "d", "9" }, // leave non-space suffix {__LINE__, "dzz", "d", "zz"}, // length mod as suffix + {__LINE__, "3v", "", "3v"}, // 'v' cannot have modifiers + {__LINE__, "hv", "", "hv"}, // 'v' cannot have modifiers {__LINE__, "1$*2$d", "1$*2$d", "" }, // arg indexing and * allowed. {__LINE__, "0-14.3hhd", "0-14.3hhd", ""}, // precision, width {__LINE__, " 0-+#14.3hhd", " 0-+#14.3hhd", ""}, // flags
diff --git a/third_party/abseil-cpp/absl/strings/str_cat.h b/third_party/abseil-cpp/absl/strings/str_cat.h index 05728ab..8a63be0d 100644 --- a/third_party/abseil-cpp/absl/strings/str_cat.h +++ b/third_party/abseil-cpp/absl/strings/str_cat.h
@@ -77,6 +77,43 @@ size_t size; }; +//------------------------------------------------------------------------------ +// StrCat Extension +//------------------------------------------------------------------------------ +// +// AbslStringify() +// +// A simple customization API for formatting user-defined types using +// absl::StrCat(). The API relies on detecting an overload in the +// user-defined type's namespace of a free (non-member) `AbslStringify()` +// function as a friend definition with the following signature: +// +// template <typename Sink> +// void AbslStringify(Sink& sink, const X& value); +// +// An `AbslStringify()` overload for a type should only be declared in the same +// file and namespace as said type. +// +// Note that AbslStringify() also supports use with absl::StrFormat(). +// +// Example: +// +// struct Point { +// // To add formatting support to `Point`, we simply need to add a free +// // (non-member) function `AbslStringify()`. This method specifies how +// // Point should be printed when absl::StrCat() is called on it. You can add +// // such a free function using a friend declaration within the body of the +// // class. The sink parameter is a templated type to avoid requiring +// // dependencies. +// template <typename Sink> friend void AbslStringify(Sink& +// sink, const Point& p) { +// absl::Format(&sink, "(%v, %v)", p.x, p.y); +// } +// +// int x; +// int y; +// }; + class StringifySink { public: void Append(size_t count, char ch); @@ -85,6 +122,11 @@ bool PutPaddedString(string_view v, int width, int precision, bool left); + // Support `absl::Format(&sink, format, args...)`. + friend void AbslFormatFlush(StringifySink* sink, absl::string_view v) { + sink->Append(v); + } + template <typename T> friend string_view ExtractStringification(StringifySink& sink, const T& v);
diff --git a/third_party/abseil-cpp/absl/strings/str_cat_test.cc b/third_party/abseil-cpp/absl/strings/str_cat_test.cc index 868b9bc..1b3b7ec 100644 --- a/third_party/abseil-cpp/absl/strings/str_cat_test.cc +++ b/third_party/abseil-cpp/absl/strings/str_cat_test.cc
@@ -21,6 +21,7 @@ #include <vector> #include "gtest/gtest.h" +#include "absl/strings/str_format.h" #include "absl/strings/substitute.h" #ifdef __ANDROID__ @@ -632,4 +633,21 @@ EXPECT_EQ(absl::StrCat("a ", p, " z"), "a (10, 20) z"); } +struct PointStringifyUsingFormat { + template <typename FormatSink> + friend void AbslStringify(FormatSink& sink, + const PointStringifyUsingFormat& p) { + absl::Format(&sink, "(%g, %g)", p.x, p.y); + } + + double x = 10.0; + double y = 20.0; +}; + +TEST(StrCat, AbslStringifyExampleUsingFormat) { + PointStringifyUsingFormat p; + EXPECT_EQ(absl::StrCat(p), "(10, 20)"); + EXPECT_EQ(absl::StrCat("a ", p, " z"), "a (10, 20) z"); +} + } // namespace
diff --git a/third_party/abseil-cpp/absl/strings/str_format.h b/third_party/abseil-cpp/absl/strings/str_format.h index e6537ea..43d8618 100644 --- a/third_party/abseil-cpp/absl/strings/str_format.h +++ b/third_party/abseil-cpp/absl/strings/str_format.h
@@ -570,6 +570,41 @@ // StrFormat Extensions //------------------------------------------------------------------------------ // +// AbslStringify() +// +// A simpler customization API for formatting user-defined types using +// absl::StrFormat(). The API relies on detecting an overload in the +// user-defined type's namespace of a free (non-member) `AbslStringify()` +// function as a friend definition with the following signature: +// +// template <typename Sink> +// void AbslStringify(Sink& sink, const X& value); +// +// An `AbslStringify()` overload for a type should only be declared in the same +// file and namespace as said type. +// +// Note that unlike with AbslFormatConvert(), AbslStringify() does not allow +// customization of allowed conversion characters. AbslStringify() uses `%v` as +// the underlying conversion specififer. Additionally, AbslStringify() supports +// use with absl::StrCat while AbslFormatConvert() does not. +// +// Example: +// +// struct Point { +// // To add formatting support to `Point`, we simply need to add a free +// // (non-member) function `AbslStringify()`. This method prints in the +// // request format using the underlying `%v` specifier. You can add such a +// // free function using a friend declaration within the body of the class. +// // The sink parameter is a templated type to avoid requiring dependencies. +// template <typename Sink> +// friend void AbslStringify(Sink& sink, const Point& p) { +// absl::Format(&sink, "(%v, %v)", p.x, p.y); +// } +// +// int x; +// int y; +// }; +// // AbslFormatConvert() // // The StrFormat library provides a customization API for formatting @@ -616,9 +651,9 @@ // AbslFormatConvert(const Point& p, const absl::FormatConversionSpec& spec, // absl::FormatSink* s) { // if (spec.conversion_char() == absl::FormatConversionChar::s) { -// s->Append(absl::StrCat("x=", p.x, " y=", p.y)); +// absl::Format(s, "x=%vy=%v", p.x, p.y); // } else { -// s->Append(absl::StrCat(p.x, ",", p.y)); +// absl::Format(s, "%v,%v", p.x, p.y); // } // return {true}; // } @@ -789,6 +824,11 @@ return sink_->PutPaddedString(v, width, precision, left); } + // Support `absl::Format(&sink, format, args...)`. + friend void AbslFormatFlush(FormatSink* sink, absl::string_view v) { + sink->Append(v); + } + private: friend str_format_internal::FormatSinkImpl; explicit FormatSink(str_format_internal::FormatSinkImpl* s) : sink_(s) {}
diff --git a/third_party/abseil-cpp/absl/strings/str_format_test.cc b/third_party/abseil-cpp/absl/strings/str_format_test.cc index 0c4f10c8..62ed262 100644 --- a/third_party/abseil-cpp/absl/strings/str_format_test.cc +++ b/third_party/abseil-cpp/absl/strings/str_format_test.cc
@@ -1118,6 +1118,23 @@ PointStringify p; EXPECT_EQ(absl::StrFormat("a %v z", p), "a (10, 20) z"); } + +struct PointStringifyUsingFormat { + template <typename FormatSink> + friend void AbslStringify(FormatSink& sink, + const PointStringifyUsingFormat& p) { + absl::Format(&sink, "(%g, %g)", p.x, p.y); + } + + double x = 10.0; + double y = 20.0; +}; + +TEST_F(FormatExtensionTest, AbslStringifyExampleUsingFormat) { + PointStringifyUsingFormat p; + EXPECT_EQ(absl::StrFormat("a %v z", p), "a (10, 20) z"); +} + } // namespace // Some codegen thunks that we can use to easily dump the generated assembly for
diff --git a/third_party/abseil-cpp/absl/synchronization/mutex.cc b/third_party/abseil-cpp/absl/synchronization/mutex.cc index c0268b62..69103ed8 100644 --- a/third_party/abseil-cpp/absl/synchronization/mutex.cc +++ b/third_party/abseil-cpp/absl/synchronization/mutex.cc
@@ -2342,22 +2342,26 @@ } // end of for(;;)-loop if (wake_list != kPerThreadSynchNull) { - int64_t wait_cycles = 0; + int64_t total_wait_cycles = 0; + int64_t max_wait_cycles = 0; int64_t now = base_internal::CycleClock::Now(); do { - // Sample lock contention events only if the waiter was trying to acquire + // Profile lock contention events only if the waiter was trying to acquire // the lock, not waiting on a condition variable or Condition. if (!wake_list->cond_waiter) { - wait_cycles += (now - wake_list->waitp->contention_start_cycles); + int64_t cycles_waited = + (now - wake_list->waitp->contention_start_cycles); + total_wait_cycles += cycles_waited; + if (max_wait_cycles == 0) max_wait_cycles = cycles_waited; wake_list->waitp->contention_start_cycles = now; wake_list->waitp->should_submit_contention_data = true; } wake_list = Wakeup(wake_list); // wake waiters } while (wake_list != kPerThreadSynchNull); - if (wait_cycles > 0) { - mutex_tracer("slow release", this, wait_cycles); + if (total_wait_cycles > 0) { + mutex_tracer("slow release", this, total_wait_cycles); ABSL_TSAN_MUTEX_PRE_DIVERT(this, 0); - submit_profile_data(wait_cycles); + submit_profile_data(total_wait_cycles); ABSL_TSAN_MUTEX_POST_DIVERT(this, 0); } }
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/version b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/version index 9caed31..13ad873 100644 --- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/version +++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/version
@@ -1 +1 @@ -2022d +2022e
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Bahia_Banderas b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Bahia_Banderas index cbe22a7..179937f 100644 --- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Bahia_Banderas +++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Bahia_Banderas Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua index e1780a5..b331737 100644 --- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua +++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada index 19ccd357..e8be26b1 100644 --- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada +++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Hermosillo b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Hermosillo index 8283239e..5c92e296 100644 --- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Hermosillo +++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Hermosillo Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Matamoros b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Matamoros index 722751b..88cabcd1 100644 --- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Matamoros +++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Matamoros Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mazatlan b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mazatlan index 4c819fa..6b41102 100644 --- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mazatlan +++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mazatlan Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mexico_City b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mexico_City index ffcf8be..6542c9c5 100644 --- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mexico_City +++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mexico_City Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ojinaga b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ojinaga index da0909c..2ee585c 100644 --- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ojinaga +++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ojinaga Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel index 19ccd357..e8be26b1 100644 --- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel +++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana index 19ccd357..e8be26b1 100644 --- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana +++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Amman b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Amman index d97d308d..a3f9dff 100644 --- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Amman +++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Amman Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Damascus b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Damascus index 168ef9ba..bd1624d 100644 --- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Damascus +++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Damascus Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte index 19ccd357..e8be26b1 100644 --- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte +++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaSur b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaSur index 4c819fa..6b41102 100644 --- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaSur +++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaSur Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/General b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/General index ffcf8be..6542c9c5 100644 --- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/General +++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/General Binary files differ
diff --git a/third_party/abseil-cpp/symbols_arm64_dbg.def b/third_party/abseil-cpp/symbols_arm64_dbg.def index f83e494..0ee8b8f 100644 --- a/third_party/abseil-cpp/symbols_arm64_dbg.def +++ b/third_party/abseil-cpp/symbols_arm64_dbg.def
@@ -1845,7 +1845,6 @@ ?FromChrono@absl@@YA?AVDuration@1@AEBV?$duration@_JV?$ratio@$00$0PECEA@@Cr@std@@@chrono@Cr@std@@@Z ?FromChrono@absl@@YA?AVTime@1@AEBV?$time_point@Vsystem_clock@chrono@Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@Cr@std@@@234@@chrono@Cr@std@@@Z ?FromCivil@absl@@YA?AVTime@1@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@VTimeZone@1@@Z - ?FromHost64@big_endian@absl@@YA_K_K@Z ?FromHost64@little_endian@absl@@YA_K_K@Z ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0DM@$00@Cr@std@@@Z ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0OBA@$00@Cr@std@@@Z @@ -2418,7 +2417,7 @@ ?ToDoubleSeconds@absl@@YANVDuration@1@@Z ?ToHost16@big_endian@absl@@YAGG@Z ?ToHost32@big_endian@absl@@YAII@Z - ?ToHost64@big_endian@absl@@YA_K_K@Z + ?ToHost64@little_endian@absl@@YA_K_K@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$00@Cr@std@@@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DLJKMKAA@@Cr@std@@@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DOI@@Cr@std@@@Z @@ -3446,8 +3445,8 @@ ?substr@string_view@absl@@QEBA?AV12@_K0@Z ?substring@CordRep@cord_internal@absl@@QEAAPEAUCordRepSubstring@23@XZ ?substring@CordRep@cord_internal@absl@@QEBAPEBUCordRepSubstring@23@XZ - ?tag@InlineData@cord_internal@absl@@AEAAAEADXZ - ?tag@InlineData@cord_internal@absl@@AEBADXZ + ?tag@InlineData@cord_internal@absl@@AEAAAEACXZ + ?tag@InlineData@cord_internal@absl@@AEBACXZ ?tail@CordRepRing@cord_internal@absl@@QEBAIXZ ?thread_identity@PerThreadSynch@base_internal@absl@@QEAAPEAUThreadIdentity@23@XZ ?throw_bad_optional_access@optional_internal@absl@@YAXXZ
diff --git a/third_party/abseil-cpp/symbols_x64_dbg.def b/third_party/abseil-cpp/symbols_x64_dbg.def index 5bc82f1..4781d91c 100644 --- a/third_party/abseil-cpp/symbols_x64_dbg.def +++ b/third_party/abseil-cpp/symbols_x64_dbg.def
@@ -1848,7 +1848,7 @@ ?FromChrono@absl@@YA?AVDuration@1@AEBV?$duration@_JV?$ratio@$00$0PECEA@@Cr@std@@@chrono@Cr@std@@@Z ?FromChrono@absl@@YA?AVTime@1@AEBV?$time_point@Vsystem_clock@chrono@Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@Cr@std@@@234@@chrono@Cr@std@@@Z ?FromCivil@absl@@YA?AVTime@1@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@VTimeZone@1@@Z - ?FromHost64@big_endian@absl@@YA_K_K@Z + ?FromHost64@little_endian@absl@@YA_K_K@Z ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0DM@$00@Cr@std@@@Z ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0OBA@$00@Cr@std@@@Z ?FromTM@absl@@YA?AVTime@1@AEBUtm@@VTimeZone@1@@Z @@ -2419,7 +2419,7 @@ ?ToDoubleSeconds@absl@@YANVDuration@1@@Z ?ToHost16@big_endian@absl@@YAGG@Z ?ToHost32@big_endian@absl@@YAII@Z - ?ToHost64@big_endian@absl@@YA_K_K@Z + ?ToHost64@little_endian@absl@@YA_K_K@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$00@Cr@std@@@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DLJKMKAA@@Cr@std@@@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DOI@@Cr@std@@@Z @@ -3447,8 +3447,8 @@ ?substr@string_view@absl@@QEBA?AV12@_K0@Z ?substring@CordRep@cord_internal@absl@@QEAAPEAUCordRepSubstring@23@XZ ?substring@CordRep@cord_internal@absl@@QEBAPEBUCordRepSubstring@23@XZ - ?tag@InlineData@cord_internal@absl@@AEAAAEADXZ - ?tag@InlineData@cord_internal@absl@@AEBADXZ + ?tag@InlineData@cord_internal@absl@@AEAAAEACXZ + ?tag@InlineData@cord_internal@absl@@AEBACXZ ?tail@CordRepRing@cord_internal@absl@@QEBAIXZ ?thread_identity@PerThreadSynch@base_internal@absl@@QEAAPEAUThreadIdentity@23@XZ ?throw_bad_optional_access@optional_internal@absl@@YAXXZ
diff --git a/third_party/abseil-cpp/symbols_x86_dbg.def b/third_party/abseil-cpp/symbols_x86_dbg.def index 5a1b2a1f3..a696507 100644 --- a/third_party/abseil-cpp/symbols_x86_dbg.def +++ b/third_party/abseil-cpp/symbols_x86_dbg.def
@@ -1836,7 +1836,7 @@ ?FromChrono@absl@@YA?AVDuration@1@ABV?$duration@_JV?$ratio@$00$0PECEA@@Cr@std@@@chrono@Cr@std@@@Z ?FromChrono@absl@@YA?AVTime@1@ABV?$time_point@Vsystem_clock@chrono@Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@Cr@std@@@234@@chrono@Cr@std@@@Z ?FromCivil@absl@@YA?AVTime@1@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@VTimeZone@1@@Z - ?FromHost64@big_endian@absl@@YA_K_K@Z + ?FromHost64@little_endian@absl@@YA_K_K@Z ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0DM@$00@Cr@std@@@Z ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0OBA@$00@Cr@std@@@Z ?FromTM@absl@@YA?AVTime@1@ABUtm@@VTimeZone@1@@Z @@ -2407,7 +2407,7 @@ ?ToDoubleSeconds@absl@@YANVDuration@1@@Z ?ToHost16@big_endian@absl@@YAGG@Z ?ToHost32@big_endian@absl@@YAII@Z - ?ToHost64@big_endian@absl@@YA_K_K@Z + ?ToHost64@little_endian@absl@@YA_K_K@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$00@Cr@std@@@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DLJKMKAA@@Cr@std@@@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DOI@@Cr@std@@@Z @@ -3435,8 +3435,8 @@ ?substr@string_view@absl@@QBE?AV12@II@Z ?substring@CordRep@cord_internal@absl@@QAEPAUCordRepSubstring@23@XZ ?substring@CordRep@cord_internal@absl@@QBEPBUCordRepSubstring@23@XZ - ?tag@InlineData@cord_internal@absl@@AAEAADXZ - ?tag@InlineData@cord_internal@absl@@ABEDXZ + ?tag@InlineData@cord_internal@absl@@AAEAACXZ + ?tag@InlineData@cord_internal@absl@@ABECXZ ?tail@CordRepRing@cord_internal@absl@@QBEIXZ ?thread_identity@PerThreadSynch@base_internal@absl@@QAEPAUThreadIdentity@23@XZ ?throw_bad_optional_access@optional_internal@absl@@YAXXZ
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index ef2dad1..4bccf05 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -309,6 +309,10 @@ kSharedStorageOriginStalenessThreshold = { &kSharedStorageAPI, "SharedStorageOriginStalenessThreshold", base::Days(30)}; +const base::FeatureParam<int> + kSharedStorageMaxAllowedFencedFrameDepthForSelectURL = { + &kSharedStorageAPI, + "SharedStorageMaxAllowedFencedFrameDepthForSelectURL", 1}; BASE_FEATURE(kSameSiteCrossOriginForSpeculationRulesPrerender, "SameSiteCrossOriginForSpeculationRulesPrerender",
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index ea308ef..478cf8b 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -142,6 +142,13 @@ // origin's data is older than this threshold, it will be auto-purged. BLINK_COMMON_EXPORT extern const base::FeatureParam<base::TimeDelta> kSharedStorageOriginStalenessThreshold; +// Maximum depth of fenced frame where sharedStorage.selectURL() is allowed to +// be invoked. The depth of a fenced frame is the number of the fenced frame +// boundaries above that frame (i.e. the outermost main frame's frame tree has +// fenced frame depth 0, a topmost fenced frame tree embedded in the outermost +// main frame has fenced frame depth 1, etc). +BLINK_COMMON_EXPORT extern const base::FeatureParam<int> + kSharedStorageMaxAllowedFencedFrameDepthForSelectURL; // Enables the multiple prerendering in a sequential way: // https://crbug.com/1355151
diff --git a/third_party/blink/public/mojom/shared_storage/shared_storage.mojom b/third_party/blink/public/mojom/shared_storage/shared_storage.mojom index c8688194..2654209 100644 --- a/third_party/blink/public/mojom/shared_storage/shared_storage.mojom +++ b/third_party/blink/public/mojom/shared_storage/shared_storage.mojom
@@ -59,11 +59,10 @@ // Handle sharedStorage.runURLSelectionOperation(): run the operation // previously registered by registerURLSelectionOperation() with matching - // `name`. Restrictions be checked at the renderer and be enforced at the - // browser: 1) This is not allowed in fenced frame. 2) The length of the - // `urls` array is below the configured limit number - // `kSharedStorageURLSelectionOperationInputURLSizeLimit`. `serialized_data` - // is the serialization result of JavaScript value + // `name`. Restrictions will be checked at the renderer and enforced at the + // browser: the length of the `urls` array is below the configured limit + // number `kSharedStorageURLSelectionOperationInputURLSizeLimit`. + // `serialized_data` is the serialization result of JavaScript value // SharedStorageRunOperationMethodOptions.data using v8::ValueSerializer. // There's no need to sanitize `serialized_data` at the browser process as the // data will be only consumed in an environment (i.e. the worklet) in control
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc index c1282af8..90f898e 100644 --- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc +++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
@@ -4612,9 +4612,10 @@ if (token.Id() >= CSSValueID::kNormal && token.Id() <= CSSValueID::kLighter) return ConsumeIdent(range); } else { - if (RuntimeEnabledFeatures::CSSFontFaceAutoVariableRangeEnabled() && - (token.Id() == CSSValueID::kAuto || token.Id() == CSSValueID::kNormal || - token.Id() == CSSValueID::kBold)) + if ((token.Id() == CSSValueID::kNormal || + token.Id() == CSSValueID::kBold) || + (RuntimeEnabledFeatures::CSSFontFaceAutoVariableRangeEnabled() && + token.Id() == CSSValueID::kAuto)) return ConsumeIdent(range); }
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc index 1fd2304..67bc27b3 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element.cc +++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -3949,10 +3949,14 @@ if (state == mojom::FrameLifecycleState::kFrozenAutoResumeMedia && playing_) { paused_by_context_paused_ = true; pause(); - GetWebMediaPlayer()->OnFrozen(); + if (auto* web_player = GetWebMediaPlayer()) { + web_player->OnFrozen(); + } } else if (state == mojom::FrameLifecycleState::kFrozen && playing_) { pause(); - GetWebMediaPlayer()->OnFrozen(); + if (auto* web_player = GetWebMediaPlayer()) { + web_player->OnFrozen(); + } } else if (state == mojom::FrameLifecycleState::kRunning && paused_by_context_paused_) { paused_by_context_paused_ = false;
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc index 13e3e2e7..420886e 100644 --- a/third_party/blink/renderer/core/layout/layout_object.cc +++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -271,10 +271,10 @@ struct SameSizeAsLayoutObject : public GarbageCollected<SameSizeAsLayoutObject>, ImageResourceObserver, DisplayItemClient { - // Normally this field uses the gap between DisplayItemClient and - // LayoutObject's other fields. - uint8_t paint_invalidation_reason_; - uint8_t extra_bitfields_; + // Normally these additional bitfields can use the gap between + // DisplayItemClient and bitfields_. + uint8_t additional_bitfields_; + uint16_t additional_bitfields2_; #if DCHECK_IS_ON() unsigned debug_bitfields_; #endif @@ -382,9 +382,15 @@ } LayoutObject::LayoutObject(Node* node) - : full_paint_invalidation_reason_(PaintInvalidationReason::kNone), - can_contain_absolute_position_objects_(false), - may_have_anchor_query_(false), + : full_paint_invalidation_reason_( + static_cast<unsigned>(PaintInvalidationReason::kNone)), + positioned_state_(kIsStaticallyPositioned), + selection_state_(static_cast<unsigned>(SelectionState::kNone)), + selection_state_for_paint_(static_cast<unsigned>(SelectionState::kNone)), + subtree_paint_property_update_reasons_( + static_cast<unsigned>(SubtreePaintPropertyUpdateReason::kNone)), + background_paint_location_(kBackgroundPaintInBorderBoxSpace), + overflow_clip_axes_(kNoOverflowClip), #if DCHECK_IS_ON() has_ax_object_(false), set_needs_layout_forbidden_(false), @@ -4535,7 +4541,8 @@ reason = DocumentLifecycleBasedPaintInvalidationReason( GetDocument().Lifecycle()); } - full_paint_invalidation_reason_ = reason; + full_paint_invalidation_reason_ = static_cast<unsigned>(reason); + DCHECK_EQ(reason, FullPaintInvalidationReason()); bitfields_.SetShouldDelayFullPaintInvalidation(false); } @@ -4594,7 +4601,7 @@ void LayoutObject::SetShouldDelayFullPaintInvalidation() { NOT_DESTROYED(); // Should have already set a full paint invalidation reason. - DCHECK(IsFullPaintInvalidationReason(full_paint_invalidation_reason_)); + DCHECK(IsFullPaintInvalidationReason(FullPaintInvalidationReason())); bitfields_.SetShouldDelayFullPaintInvalidation(true); if (!ShouldCheckForPaintInvalidation()) { @@ -4623,7 +4630,8 @@ DCHECK(!ShouldCheckForPaintInvalidation() || PaintInvalidationStateIsDirty()); #endif if (!ShouldDelayFullPaintInvalidation()) { - full_paint_invalidation_reason_ = PaintInvalidationReason::kNone; + full_paint_invalidation_reason_ = + static_cast<unsigned>(PaintInvalidationReason::kNone); bitfields_.SetBackgroundNeedsFullPaintInvalidation(false); } bitfields_.SetShouldCheckForPaintInvalidation(false); @@ -4676,7 +4684,8 @@ bitfields_.SetDescendantNeedsPaintPropertyUpdate(false); bitfields_.SetDescendantEffectiveAllowedTouchActionChanged(false); bitfields_.SetDescendantBlockingWheelEventHandlerChanged(false); - bitfields_.ResetSubtreePaintPropertyUpdateReasons(); + subtree_paint_property_update_reasons_ = + static_cast<unsigned>(SubtreePaintPropertyUpdateReason::kNone); } } @@ -4987,6 +4996,30 @@ return false; } +void LayoutObject::SetSVGDescendantMayHaveTransformRelatedAnimation() { + NOT_DESTROYED(); + auto* object = this; + while (!object->IsSVGRoot()) { + DCHECK(object->IsSVGChild()); + if (object->SVGDescendantMayHaveTransformRelatedAnimation()) + break; + if (object->IsSVGHiddenContainer()) + return; + object->bitfields_.SetSVGDescendantMayHaveTransformRelatedAnimation(true); + object = object->Parent(); + if (!object) + return; + } + // If we have set SetSVGDescendantMayHaveTransformRelatedAnimation() for + // any object, set the enclosing layer needs repaint because some + // LayoutSVGContainer may paint differently by ignoring the cull rect. + // See SVGContainerPainter. + if (object != this) { + if (auto* layer = object->EnclosingLayer()) + layer->SetNeedsRepaint(); + } +} + bool IsMenuList(const LayoutObject* object) { if (!object) return false;
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h index 3a77b9dd..5936685e 100644 --- a/third_party/blink/renderer/core/layout/layout_object.h +++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -1201,11 +1201,11 @@ // not have an |NGPhysicalAnchorQuery|. bool MayHaveAnchorQuery() const { NOT_DESTROYED(); - return may_have_anchor_query_; + return bitfields_.MayHaveAnchorQuery(); } void SetSelfMayHaveAnchorQuery() { NOT_DESTROYED(); - may_have_anchor_query_ = true; + bitfields_.SetMayHaveAnchorQuery(true); } void MarkMayHaveAnchorQuery(); @@ -1512,20 +1512,21 @@ // absolute or fixed positioning bool IsOutOfFlowPositioned() const { NOT_DESTROYED(); - return bitfields_.IsOutOfFlowPositioned(); + return positioned_state_ == kIsOutOfFlowPositioned; } // relative or sticky positioning bool IsInFlowPositioned() const { NOT_DESTROYED(); - return bitfields_.IsInFlowPositioned(); + return positioned_state_ == kIsRelativelyPositioned || + positioned_state_ == kIsStickyPositioned; } bool IsRelPositioned() const { NOT_DESTROYED(); - return bitfields_.IsRelPositioned(); + return positioned_state_ == kIsRelativelyPositioned; } bool IsStickyPositioned() const { NOT_DESTROYED(); - return bitfields_.IsStickyPositioned(); + return positioned_state_ == kIsStickyPositioned; } bool IsFixedPositioned() const { NOT_DESTROYED(); @@ -1539,7 +1540,7 @@ } bool IsPositioned() const { NOT_DESTROYED(); - return bitfields_.IsPositioned(); + return positioned_state_ != kIsStaticallyPositioned; } bool IsText() const { @@ -2072,7 +2073,8 @@ (position == EPosition::kFixed && CanContainFixedPositionObjects()); } - // Returns true if style would make this object an absolute container. + // Returns true if style would make this object an absolute container. This + // value gets cached by bitfields_.can_contain_absolute_position_objects_. bool ComputeIsAbsoluteContainer(const ComputedStyle* style) const; // Returns true if style would make this object a fixed container. @@ -2140,16 +2142,44 @@ void InvalidateIntersectionObserverCachedRects(); + private: + enum PositionedState { + kIsStaticallyPositioned = 0, + kIsRelativelyPositioned = 1, + kIsOutOfFlowPositioned = 2, + kIsStickyPositioned = 3, + }; + + public: void SetPositionState(EPosition position) { NOT_DESTROYED(); DCHECK( (position != EPosition::kAbsolute && position != EPosition::kFixed) || IsBox()); - bitfields_.SetPositionedState(position); + // This maps FixedPosition and AbsolutePosition to + // IsOutOfFlowPositioned, saving one bit. + switch (position) { + case EPosition::kStatic: + positioned_state_ = kIsStaticallyPositioned; + break; + case EPosition::kRelative: + positioned_state_ = kIsRelativelyPositioned; + break; + case EPosition::kAbsolute: + case EPosition::kFixed: + positioned_state_ = kIsOutOfFlowPositioned; + break; + case EPosition::kSticky: + positioned_state_ = kIsStickyPositioned; + break; + default: + NOTREACHED(); + break; + } } void ClearPositionedState() { NOT_DESTROYED(); - bitfields_.ClearPositionedState(); + positioned_state_ = kIsStaticallyPositioned; } void SetFloating(bool is_floating) { @@ -2227,19 +2257,19 @@ } void SetOverflowClipAxes(OverflowClipAxes axes) { NOT_DESTROYED(); - bitfields_.SetOverflowClipAxes(axes); + overflow_clip_axes_ = axes; } OverflowClipAxes GetOverflowClipAxes() const { NOT_DESTROYED(); - return bitfields_.GetOverflowClipAxes(); + return static_cast<OverflowClipAxes>(overflow_clip_axes_); } bool ShouldClipOverflowAlongEitherAxis() const { NOT_DESTROYED(); - return bitfields_.GetOverflowClipAxes() != kNoOverflowClip; + return GetOverflowClipAxes() != kNoOverflowClip; } bool ShouldClipOverflowAlongBothAxis() const { NOT_DESTROYED(); - return bitfields_.GetOverflowClipAxes() == kOverflowClipBothAxis; + return GetOverflowClipAxes() == kOverflowClipBothAxis; } void SetHasLayer(bool has_layer) { NOT_DESTROYED(); @@ -2255,7 +2285,7 @@ } void SetCanContainAbsolutePositionObjects(bool can_contain) { NOT_DESTROYED(); - can_contain_absolute_position_objects_ = can_contain; + bitfields_.SetCanContainAbsolutePositionObjects(can_contain); } void SetCanContainFixedPositionObjects(bool can_contain_fixed_position) { NOT_DESTROYED(); @@ -2469,7 +2499,7 @@ bool CanContainAbsolutePositionObjects() const { NOT_DESTROYED(); - return can_contain_absolute_position_objects_; + return bitfields_.CanContainAbsolutePositionObjects(); } bool CanContainFixedPositionObjects() const { NOT_DESTROYED(); @@ -2821,21 +2851,21 @@ // enum declaration). SelectionState GetSelectionState() const { NOT_DESTROYED(); - return bitfields_.GetSelectionState(); + return static_cast<SelectionState>(selection_state_); } void SetSelectionState(SelectionState state) { NOT_DESTROYED(); - bitfields_.SetSelectionState(state); + selection_state_ = static_cast<unsigned>(state); } bool CanUpdateSelectionOnRootLineBoxes() const; SelectionState GetSelectionStateForPaint() const { NOT_DESTROYED(); - return bitfields_.GetSelectionStateForPaint(); + return static_cast<SelectionState>(selection_state_for_paint_); } void SetSelectionStateForPaint(SelectionState state) { NOT_DESTROYED(); - bitfields_.SetSelectionStateForPaint(state); + selection_state_for_paint_ = static_cast<unsigned>(state); } // A single rectangle that encompasses all of the selected objects within this @@ -3079,13 +3109,14 @@ PaintInvalidationReason FullPaintInvalidationReason() const { NOT_DESTROYED(); - return full_paint_invalidation_reason_; + return static_cast<PaintInvalidationReason>( + full_paint_invalidation_reason_); } bool ShouldDoFullPaintInvalidation() const { NOT_DESTROYED(); if (!ShouldDelayFullPaintInvalidation() && - full_paint_invalidation_reason_ != PaintInvalidationReason::kNone) { - DCHECK(IsFullPaintInvalidationReason(full_paint_invalidation_reason_)); + FullPaintInvalidationReason() != PaintInvalidationReason::kNone) { + DCHECK(IsFullPaintInvalidationReason(FullPaintInvalidationReason())); DCHECK(ShouldCheckForPaintInvalidation()); return true; } @@ -3424,12 +3455,14 @@ void AddSubtreePaintPropertyUpdateReason( SubtreePaintPropertyUpdateReason reason) { NOT_DESTROYED(); - bitfields_.AddSubtreePaintPropertyUpdateReason(reason); + DCHECK_LE(static_cast<unsigned>(reason), + 1u << (kSubtreePaintPropertyUpdateReasonsBitfieldWidth - 1)); + subtree_paint_property_update_reasons_ |= static_cast<unsigned>(reason); SetNeedsPaintPropertyUpdate(); } unsigned SubtreePaintPropertyUpdateReasons() const { NOT_DESTROYED(); - return bitfields_.SubtreePaintPropertyUpdateReasons(); + return subtree_paint_property_update_reasons_; } bool DescendantNeedsPaintPropertyUpdate() const { NOT_DESTROYED(); @@ -3458,13 +3491,14 @@ BackgroundPaintLocation GetBackgroundPaintLocation() const { NOT_DESTROYED(); - return bitfields_.GetBackgroundPaintLocation(); + return static_cast<BackgroundPaintLocation>(background_paint_location_); } void SetBackgroundPaintLocation(BackgroundPaintLocation location) { NOT_DESTROYED(); if (GetBackgroundPaintLocation() != location) { SetBackgroundNeedsFullPaintInvalidation(); - bitfields_.SetBackgroundPaintLocation(location); + background_paint_location_ = static_cast<unsigned>(location); + DCHECK_EQ(location, GetBackgroundPaintLocation()); } } @@ -3603,6 +3637,12 @@ return bitfields_.TransformAffectsVectorEffect(); } + bool SVGDescendantMayHaveTransformRelatedAnimation() const { + NOT_DESTROYED(); + return bitfields_.SVGDescendantMayHaveTransformRelatedAnimation(); + } + void SetSVGDescendantMayHaveTransformRelatedAnimation(); + bool ShouldSkipNextLayoutShiftTracking() const { NOT_DESTROYED(); return bitfields_.ShouldSkipNextLayoutShiftTracking(); @@ -3853,6 +3893,12 @@ bitfields_.SetTransformAffectsVectorEffect(b); } + void ClearSVGDescendantMayHaveTransformRelatedAnimation() { + NOT_DESTROYED(); + DCHECK(IsSVGChild()); + bitfields_.SetSVGDescendantMayHaveTransformRelatedAnimation(false); + } + void SetMightTraversePhysicalFragments(bool b) { NOT_DESTROYED(); bitfields_.SetMightTraversePhysicalFragments(b); @@ -3925,23 +3971,37 @@ void SetShouldDoFullPaintInvalidationWithoutGeometryChangeInternal( PaintInvalidationReason); + // Additional bitfields. + // These are not in LayoutObjectBitfields, to fill the gap between + // the inherited DisplayItemClient data fields and bitfields_. + // This is set by Set[Subtree]ShouldDoFullPaintInvalidation, and cleared // during PrePaint in this object's InvalidatePaint(). It's different from // DisplayItemClient::GetPaintInvalidationReason() which is set during // PrePaint and cleared in PaintController::FinishCycle(). - // It's defined as the first field so that it can use the memory gap between - // DisplayItemClient and LayoutObject's other fields. - PaintInvalidationReason full_paint_invalidation_reason_; + unsigned full_paint_invalidation_reason_ : 6; - // Additional bitfields. - // These are not in LayoutObjectBitfields to avoid to bump its size. These are - // unit8_t in order to pack it together with PaintInvalidationReason. + // This is the cached 'position' value of this object + // (see ComputedStyle::position). + unsigned positioned_state_ : 2; // PositionedState - // This boolean is used to know if this LayoutObject is a container for - // absolute position descendants. - uint8_t can_contain_absolute_position_objects_ : 1; - // See comments for |MayHaveAnchorQuery()|. - uint8_t may_have_anchor_query_ : 1; + // `selection_state_` is direct mapping of the DOM selection into the + // respective LayoutObjects that `CanBeSelectionLeaf()`. + // `selection_state_for_paint_` is adjusted so that the state takes into + // account whether such a LayoutObject will be painted. If selection + // starts/ends in an object that is not painted, we won't be able to record + // the bounds for composited selection state that is pushed to cc. + unsigned selection_state_ : 3; // SelectionState + unsigned selection_state_for_paint_ : 3; // SelectionState + + // Reasons for the full subtree invalidation. + unsigned subtree_paint_property_update_reasons_ + : kSubtreePaintPropertyUpdateReasonsBitfieldWidth; + + // For LayoutBox. It's updated during PrePaint. + unsigned background_paint_location_ : 2; // BackgroundPaintLocation. + + unsigned overflow_clip_axes_ : 2; #if DCHECK_IS_ON() unsigned has_ax_object_ : 1; @@ -3960,13 +4020,6 @@ class LayoutObjectBitfields { DISALLOW_NEW(); - enum PositionedState { - kIsStaticallyPositioned = 0, - kIsRelativelyPositioned = 1, - kIsOutOfFlowPositioned = 2, - kIsStickyPositioned = 3, - }; - public: // LayoutObjectBitfields holds all the boolean values for LayoutObject. // @@ -4023,6 +4076,7 @@ has_non_visible_overflow_(false), has_transform_related_property_(false), has_reflection_(false), + can_contain_absolute_position_objects_(false), can_contain_fixed_position_objects_(false), has_counter_node_map_(false), ever_had_layout_(false), @@ -4060,6 +4114,7 @@ is_table_column_constraints_dirty_(false), is_grid_placement_dirty_(true), transform_affects_vector_effect_(false), + svg_descendant_may_have_transform_related_animation_(false), is_layout_ng_object_for_formatted_text(false), should_skip_next_layout_shift_tracking_(true), should_assume_paint_offset_translation_for_layout_shift_tracking_( @@ -4067,14 +4122,7 @@ might_traverse_physical_fragments_(false), whitespace_children_may_change_(false), needs_devtools_info_(false), - positioned_state_(kIsStaticallyPositioned), - selection_state_(static_cast<unsigned>(SelectionState::kNone)), - selection_state_for_paint_( - static_cast<unsigned>(SelectionState::kNone)), - subtree_paint_property_update_reasons_( - static_cast<unsigned>(SubtreePaintPropertyUpdateReason::kNone)), - background_paint_location_(kBackgroundPaintInBorderBoxSpace), - overflow_clip_axes_(kNoOverflowClip) {} + may_have_anchor_query_(false) {} // Self needs layout for style means that this layout object is marked for a // full layout. This is the default layout but it is expensive as it @@ -4240,6 +4288,10 @@ ADD_BOOLEAN_BITFIELD(has_reflection_, HasReflection); // This boolean is used to know if this LayoutObject is a container for + // absolute position descendants. + ADD_BOOLEAN_BITFIELD(can_contain_absolute_position_objects_, + CanContainAbsolutePositionObjects); + // This boolean is used to know if this LayoutObject is a container for // fixed position descendants. ADD_BOOLEAN_BITFIELD(can_contain_fixed_position_objects_, CanContainFixedPositionObjects); @@ -4385,6 +4437,15 @@ // included). ADD_BOOLEAN_BITFIELD(transform_affects_vector_effect_, TransformAffectsVectorEffect); + + // For SVG child objects, indicates if this object or any descendant may + // have transform-related animation. This flag is set on all ancestors up + // to the SVG root (not included) when an SVG child starts a + // transform-related animation. It's cleared lazily during layout of an + // SVG container if the container doesn't have any animating descendants. + ADD_BOOLEAN_BITFIELD(svg_descendant_may_have_transform_related_animation_, + SVGDescendantMayHaveTransformRelatedAnimation); + ADD_BOOLEAN_BITFIELD(is_layout_ng_object_for_formatted_text, IsLayoutNGObjectForFormattedText); @@ -4415,115 +4476,8 @@ ADD_BOOLEAN_BITFIELD(needs_devtools_info_, NeedsDevtoolsInfo); - private: - // This is the cached 'position' value of this object - // (see ComputedStyle::position). - unsigned positioned_state_ : 2; // PositionedState - - // `selection_state_` is direct mapping of the DOM selection into the - // respective LayoutObjects that `CanBeSelectionLeaf()`. - // `selection_state_for_paint_` is adjusted so that the state takes into - // account whether such a LayoutObject will be painted. If selection - // starts/ends in an object that is not painted, we won't be able to record - // the bounds for composited selection state that is pushed to cc. - unsigned selection_state_ : 3; // SelectionState - unsigned selection_state_for_paint_ : 3; // SelectionState - - // Reasons for the full subtree invalidation. - unsigned subtree_paint_property_update_reasons_ - : kSubtreePaintPropertyUpdateReasonsBitfieldWidth; - - // For LayoutBox. It's updated during PrePaint. - unsigned background_paint_location_ : 2; // BackgroundPaintLocation. - - unsigned overflow_clip_axes_ : 2; - - public: - bool IsOutOfFlowPositioned() const { - return positioned_state_ == kIsOutOfFlowPositioned; - } - bool IsRelPositioned() const { - return positioned_state_ == kIsRelativelyPositioned; - } - bool IsStickyPositioned() const { - return positioned_state_ == kIsStickyPositioned; - } - bool IsInFlowPositioned() const { - return positioned_state_ == kIsRelativelyPositioned || - positioned_state_ == kIsStickyPositioned; - } - bool IsPositioned() const { - return positioned_state_ != kIsStaticallyPositioned; - } - - void SetPositionedState(EPosition position_state) { - // This maps FixedPosition and AbsolutePosition to - // IsOutOfFlowPositioned, saving one bit. - switch (position_state) { - case EPosition::kStatic: - positioned_state_ = kIsStaticallyPositioned; - break; - case EPosition::kRelative: - positioned_state_ = kIsRelativelyPositioned; - break; - case EPosition::kAbsolute: - case EPosition::kFixed: - positioned_state_ = kIsOutOfFlowPositioned; - break; - case EPosition::kSticky: - positioned_state_ = kIsStickyPositioned; - break; - default: - NOTREACHED(); - break; - } - } - void ClearPositionedState() { positioned_state_ = kIsStaticallyPositioned; } - - ALWAYS_INLINE SelectionState GetSelectionState() const { - return static_cast<SelectionState>(selection_state_); - } - ALWAYS_INLINE void SetSelectionState(SelectionState selection_state) { - selection_state_ = static_cast<unsigned>(selection_state); - } - - ALWAYS_INLINE SelectionState GetSelectionStateForPaint() const { - return static_cast<SelectionState>(selection_state_for_paint_); - } - ALWAYS_INLINE void SetSelectionStateForPaint( - SelectionState selection_state) { - selection_state_for_paint_ = static_cast<unsigned>(selection_state); - } - - ALWAYS_INLINE unsigned SubtreePaintPropertyUpdateReasons() const { - return subtree_paint_property_update_reasons_; - } - ALWAYS_INLINE void AddSubtreePaintPropertyUpdateReason( - SubtreePaintPropertyUpdateReason reason) { - DCHECK_LE(static_cast<unsigned>(reason), - 1u << (kSubtreePaintPropertyUpdateReasonsBitfieldWidth - 1)); - subtree_paint_property_update_reasons_ |= static_cast<unsigned>(reason); - } - ALWAYS_INLINE void ResetSubtreePaintPropertyUpdateReasons() { - subtree_paint_property_update_reasons_ = - static_cast<unsigned>(SubtreePaintPropertyUpdateReason::kNone); - } - - ALWAYS_INLINE BackgroundPaintLocation GetBackgroundPaintLocation() const { - return static_cast<BackgroundPaintLocation>(background_paint_location_); - } - ALWAYS_INLINE void SetBackgroundPaintLocation( - BackgroundPaintLocation location) { - background_paint_location_ = static_cast<unsigned>(location); - DCHECK_EQ(location, GetBackgroundPaintLocation()); - } - - ALWAYS_INLINE OverflowClipAxes GetOverflowClipAxes() const { - return static_cast<OverflowClipAxes>(overflow_clip_axes_); - } - ALWAYS_INLINE void SetOverflowClipAxes(OverflowClipAxes axes) { - overflow_clip_axes_ = axes; - } + // See comments for |MayHaveAnchorQuery()|. + ADD_BOOLEAN_BITFIELD(may_have_anchor_query_, MayHaveAnchorQuery); }; #undef ADD_BOOLEAN_BITFIELD
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_block.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_block.cc index 0762145..db9d65f 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_block.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_block.cc
@@ -130,12 +130,19 @@ if (!Parent()) return; + if (diff.BlendModeChanged()) { DCHECK(IsBlendingAllowed()); Parent()->DescendantIsolationRequirementsChanged( StyleRef().HasBlendMode() ? kDescendantIsolationRequired : kDescendantIsolationNeedsUpdate); } + + if (StyleRef().HasCurrentTransformRelatedAnimation() && + !old_style->HasCurrentTransformRelatedAnimation()) { + Parent()->SetSVGDescendantMayHaveTransformRelatedAnimation(); + } + if (diff.HasDifference()) LayoutSVGResourceContainer::StyleChanged(*this, diff); }
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_container.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_container.cc index b0eaa60..7e17f69f6 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_container.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_container.cc
@@ -90,10 +90,13 @@ if (!IsSVGHiddenContainer()) { SetTransformAffectsVectorEffect(false); + ClearSVGDescendantMayHaveTransformRelatedAnimation(); for (auto* child = FirstChild(); child; child = child->NextSibling()) { - if (child->TransformAffectsVectorEffect()) { + if (child->TransformAffectsVectorEffect()) SetTransformAffectsVectorEffect(true); - break; + if (child->StyleRef().HasCurrentTransformRelatedAnimation() || + child->SVGDescendantMayHaveTransformRelatedAnimation()) { + SetSVGDescendantMayHaveTransformRelatedAnimation(); } } }
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.cc index b8ee789..ff099e53 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.cc
@@ -148,12 +148,20 @@ if (!Parent()) return; - if (diff.BlendModeChanged() && !IsSVGHiddenContainer()) { - DCHECK(IsBlendingAllowed()); - Parent()->DescendantIsolationRequirementsChanged( - StyleRef().HasBlendMode() ? kDescendantIsolationRequired - : kDescendantIsolationNeedsUpdate); + + if (!IsSVGHiddenContainer()) { + if (diff.BlendModeChanged()) { + DCHECK(IsBlendingAllowed()); + Parent()->DescendantIsolationRequirementsChanged( + StyleRef().HasBlendMode() ? kDescendantIsolationRequired + : kDescendantIsolationNeedsUpdate); + } + if (StyleRef().HasCurrentTransformRelatedAnimation() && + !old_style->HasCurrentTransformRelatedAnimation()) { + Parent()->SetSVGDescendantMayHaveTransformRelatedAnimation(); + } } + if (diff.HasDifference()) LayoutSVGResourceContainer::StyleChanged(*this, diff); }
diff --git a/third_party/blink/renderer/core/paint/inline_text_box_painter.cc b/third_party/blink/renderer/core/paint/inline_text_box_painter.cc index 9046b19..b05a58a9 100644 --- a/third_party/blink/renderer/core/paint/inline_text_box_painter.cc +++ b/third_party/blink/renderer/core/paint/inline_text_box_painter.cc
@@ -605,7 +605,7 @@ context.DrawHighlightForText( font, inline_text_box_.ConstructTextRun(style), local_origin, sel_height, background_color, - PaintAutoDarkMode(style, DarkModeFilter::ElementRole::kBackground), + PaintAutoDarkMode(style, DarkModeFilter::ElementRole::kSelection), start_pos, end_pos); } @@ -1006,7 +1006,7 @@ context.Clip(gfx::RectF(box_rect)); context.DrawHighlightForText( font, run, gfx::PointF(box_origin), box_rect.Height().ToInt(), color, - PaintAutoDarkMode(style, DarkModeFilter::ElementRole::kBackground), + PaintAutoDarkMode(style, DarkModeFilter::ElementRole::kSelection), paint_offsets.first, paint_offsets.second); }
diff --git a/third_party/blink/renderer/core/paint/ng/ng_highlight_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_highlight_painter.cc index c90fe49c..cd68234 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_highlight_painter.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_highlight_painter.cc
@@ -374,7 +374,7 @@ selection_style_.current_color); AutoDarkMode auto_dark_mode( - PaintAutoDarkMode(style, DarkModeFilter::ElementRole::kBackground)); + PaintAutoDarkMode(style, DarkModeFilter::ElementRole::kSelection)); if (!rotation) { PaintRect(context, RectInPhysicalSpace(), color, auto_dark_mode); @@ -928,9 +928,11 @@ // TODO(dazabani@igalia.com) paint rects pixel-snapped in physical space, // not writing-mode space (SelectionPaintState::PaintSelectionBackground) - PaintRect(paint_info_.context, PhysicalOffset(box_origin_), - fragment_item_.LocalRect(text, clamped_start, clamped_end), - background_color, background_auto_dark_mode_); + PaintRect( + paint_info_.context, PhysicalOffset(box_origin_), + fragment_item_.LocalRect(text, clamped_start, clamped_end), + background_color, + PaintAutoDarkMode(style_, DarkModeFilter::ElementRole::kSelection)); if (layer.text_style.shadow) { text_painter_.Paint(
diff --git a/third_party/blink/renderer/core/paint/svg_container_painter.cc b/third_party/blink/renderer/core/paint/svg_container_painter.cc index 32f67076..eada7f5 100644 --- a/third_party/blink/renderer/core/paint/svg_container_painter.cc +++ b/third_party/blink/renderer/core/paint/svg_container_painter.cc
@@ -33,6 +33,10 @@ // paint its descendants so we cannot skip painting. if (layout_svg_container_.IsSVGHiddenContainer()) return false; + + if (layout_svg_container_.SVGDescendantMayHaveTransformRelatedAnimation()) + return false; + return SVGModelObjectPainter::CanUseCullRect( layout_svg_container_.StyleRef()); }
diff --git a/third_party/blink/renderer/core/paint/svg_container_painter_test.cc b/third_party/blink/renderer/core/paint/svg_container_painter_test.cc index dc0230a..9071c83 100644 --- a/third_party/blink/renderer/core/paint/svg_container_painter_test.cc +++ b/third_party/blink/renderer/core/paint/svg_container_painter_test.cc
@@ -61,4 +61,76 @@ IsPaintChunk(3, 4, after_id, after_properties))); } +TEST_P(SVGContainerPainterTest, ScaleAnimationFrom0) { + SetBodyInnerHTML(R"HTML( + <svg> + <style> + @keyframes scale { to { scale: 1; } } + .scale { animation: 1s scale 1s forwards; } + @keyframes transform-scale { to { transform: scale(1); } } + .transform-scale { animation: 1s transform-scale 1s forwards; } + #rect1 { scale: 0; } + #rect2 { transform: scale(0); } + </style> + <g> + <g> + <rect id="rect1" width="100" height="100"/> + </g> + </g> + <g> + <g> + <rect id="rect2" width="100" height="100"/> + </g> + </g> + </svg> + )HTML"); + + // Initially all <g>s and <rect>s are empty and don't paint. + + EXPECT_THAT(ContentPaintChunks(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON)); + + auto* rect1_element = GetDocument().getElementById("rect1"); + auto* rect2_element = GetDocument().getElementById("rect2"); + rect1_element->setAttribute(html_names::kClassAttr, "scale"); + rect2_element->setAttribute(html_names::kClassAttr, "transform-scale"); + UpdateAllLifecyclePhasesForTest(); + + // Start animations on the rects. + const DisplayItem::Type kSVGTransformPaintPhaseForeground = + static_cast<DisplayItem::Type>(DisplayItem::kSVGTransformPaintPhaseFirst + + 5); + auto* rect1 = GetLayoutObjectByElementId("rect1"); + auto* rect2 = GetLayoutObjectByElementId("rect2"); + PaintChunk::Id rect1_id(rect1->Id(), kSVGTransformPaintPhaseForeground); + auto rect1_properties = rect1->FirstFragment().ContentsProperties(); + PaintChunk::Id rect2_id(rect2->Id(), kSVGTransformPaintPhaseForeground); + auto rect2_properties = rect2->FirstFragment().ContentsProperties(); + // Both rects should be painted to be ready for composited animation. + EXPECT_THAT(ContentPaintChunks(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, + IsPaintChunk(1, 2, rect1_id, rect1_properties), + IsPaintChunk(2, 3, rect2_id, rect2_properties))); + + // Remove the animations. + rect1_element->removeAttribute(html_names::kClassAttr); + rect2_element->removeAttribute(html_names::kClassAttr); + UpdateAllLifecyclePhasesForTest(); + // We don't remove the paintings of the rects immediately because they are + // harmless and we want to avoid repaints. + EXPECT_THAT(ContentPaintChunks(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, + IsPaintChunk(1, 2, rect1_id, rect1_properties), + IsPaintChunk(2, 3, rect2_id, rect2_properties))); + + // We remove the paintings only after anything else trigger a layout and a + // repaint. + rect1->Parent()->SetNeedsLayout("test"); + rect2->Parent()->SetNeedsLayout("test"); + rect1->EnclosingLayer()->SetNeedsRepaint(); + UpdateAllLifecyclePhasesForTest(); + EXPECT_THAT(ContentPaintChunks(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON)); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h index 6ccf9ef..adbdb66 100644 --- a/third_party/blink/renderer/core/style/computed_style.h +++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -2328,19 +2328,21 @@ } // Animation utility functions. + bool HasCurrentTransformRelatedAnimation() const { + return HasCurrentTransformAnimation() || HasCurrentScaleAnimation() || + HasCurrentRotateAnimation() || HasCurrentTranslateAnimation(); + } bool HasCurrentCompositableAnimation() const { - return HasCurrentOpacityAnimation() || HasCurrentTransformAnimation() || - HasCurrentScaleAnimation() || HasCurrentRotateAnimation() || - HasCurrentTranslateAnimation() || HasCurrentFilterAnimation() || - HasCurrentBackdropFilterAnimation() || + return HasCurrentOpacityAnimation() || + HasCurrentTransformRelatedAnimation() || + HasCurrentFilterAnimation() || HasCurrentBackdropFilterAnimation() || (RuntimeEnabledFeatures::CompositeBGColorAnimationEnabled() && HasCurrentBackgroundColorAnimation()); } bool ShouldCompositeForCurrentAnimations() const { - return HasCurrentOpacityAnimation() || HasCurrentTransformAnimation() || - HasCurrentScaleAnimation() || HasCurrentRotateAnimation() || - HasCurrentTranslateAnimation() || HasCurrentFilterAnimation() || - HasCurrentBackdropFilterAnimation(); + return HasCurrentOpacityAnimation() || + HasCurrentTransformRelatedAnimation() || + HasCurrentFilterAnimation() || HasCurrentBackdropFilterAnimation(); } bool RequiresPropertyNodeForAnimation() const { return IsRunningOpacityAnimationOnCompositor() || @@ -2382,9 +2384,8 @@ } bool HasTransform() const { return HasTransformOperations() || HasOffset() || - HasCurrentTransformAnimation() || HasCurrentScaleAnimation() || - HasCurrentRotateAnimation() || HasCurrentTranslateAnimation() || - Translate() || Rotate() || Scale(); + HasCurrentTransformRelatedAnimation() || Translate() || Rotate() || + Scale(); } bool HasTransformOperations() const { return !Transform().Operations().empty();
diff --git a/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc b/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc index 187ab316..e1ff9ef 100644 --- a/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc +++ b/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc
@@ -157,9 +157,7 @@ return; } LocalDOMWindow* window = frame->DomWindow(); - if (!window) { - return; - } + DCHECK(window); // In case of a Soft Navigation using `history.back()`, `history.forward()` or // `history.go()`, `SawURLChange` was called with an empty URL. If that's the // case, don't report the Soft Navigation just yet, and wait for
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.cc b/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.cc index c632abf..343481e7 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.cc +++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.cc
@@ -133,7 +133,7 @@ mojo::ScopedDataPipeProducerHandle producer_handle; mojo::ScopedDataPipeConsumerHandle consumer_handle; if (!CreateDataPipeForSize(data.size(), producer_handle, consumer_handle)) { - return base::File::Error::FILE_ERROR_FAILED; + return base::unexpected(base::File::Error::FILE_ERROR_FAILED); } auto ref_counted_data =
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc b/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc index d4242ff..cb37e1e 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc +++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc
@@ -77,7 +77,7 @@ if (result >= 0) { return result; } - return base::File::GetLastFileError(); + return base::unexpected(base::File::GetLastFileError()); } base::FileErrorOr<int> FileSystemAccessRegularFileDelegate::Write( @@ -90,7 +90,7 @@ int64_t write_end_offset; if (!base::CheckAdd(offset, write_size).AssignIfValid(&write_end_offset)) { - return base::File::FILE_ERROR_NO_SPACE; + return base::unexpected(base::File::FILE_ERROR_NO_SPACE); } int64_t file_size_before = backing_file_.GetLength(); @@ -98,7 +98,7 @@ // Attempt to pre-allocate quota. Do not attempt to write unless we have // enough quota for the whole operation. if (!capacity_tracker_->RequestFileCapacityChangeSync(write_end_offset)) - return base::File::FILE_ERROR_NO_SPACE; + return base::unexpected(base::File::FILE_ERROR_NO_SPACE); } int result = backing_file_.Write(offset, reinterpret_cast<char*>(data.data()), @@ -176,7 +176,7 @@ CHECK_GE(new_length, 0); if (!capacity_tracker_->RequestFileCapacityChangeSync(new_length)) - return base::File::FILE_ERROR_NO_SPACE; + return base::unexpected(base::File::FILE_ERROR_NO_SPACE); #if BUILDFLAG(IS_MAC) // On macOS < 10.15, a sandboxing limitation causes failures in ftruncate() @@ -198,7 +198,7 @@ // Unfortunately we don't have access to the error code when using // the FileUtilitiesHost, so we can say the operation failed but // not why (ex: out of quota). - return base::File::Error::FILE_ERROR_FAILED; + return base::unexpected(base::File::Error::FILE_ERROR_FAILED); } #endif // BUILDFLAG(IS_MAC) @@ -206,7 +206,7 @@ capacity_tracker_->CommitFileSizeChange(new_length); return true; } - return base::File::GetLastFileError(); + return base::unexpected(base::File::GetLastFileError()); } void FileSystemAccessRegularFileDelegate::SetLengthAsync(
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.cc b/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.cc index 4fcb555..3357c2b 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.cc +++ b/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.cc
@@ -217,7 +217,7 @@ << "file delgate invalidated before getSize"; base::FileErrorOr<int64_t> error_or_length = file_delegate()->GetLength(); - if (error_or_length.is_error()) { + if (!error_or_length.has_value()) { exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, "getSize failed"); return 0; @@ -257,7 +257,7 @@ ScriptState::Scope scope(script_state); access_handle->ExitOperation(); - if (error_or_length.is_error()) { + if (!error_or_length.has_value()) { resolver->Reject(V8ThrowDOMException::CreateOrEmpty( script_state->GetIsolate(), DOMExceptionCode::kInvalidStateError, "getSize failed")); @@ -302,7 +302,7 @@ } base::FileErrorOr<bool> result = file_delegate()->SetLength(size); - if (!result.is_error()) + if (result.has_value()) return; base::File::Error file_error = result.error(); @@ -423,7 +423,7 @@ base::FileErrorOr<int> result = file_delegate()->Read(file_offset, {read_data, read_size}); - if (result.is_error()) { + if (!result.has_value()) { exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, "Failed to read the content"); return 0; @@ -488,7 +488,7 @@ base::FileErrorOr<int> result = file_delegate()->Write(file_offset, {write_data, write_size}); - if (result.is_error()) { + if (!result.has_value()) { base::File::Error file_error = result.error(); DCHECK_NE(file_error, base::File::FILE_OK); if (file_error == base::File::FILE_ERROR_NO_SPACE) {
diff --git a/third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.cc b/third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.cc index e1de7f75..e77e0ef 100644 --- a/third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.cc +++ b/third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.cc
@@ -35,7 +35,7 @@ void GetDirectoryImpl(ScriptPromiseResolver* resolver, bool allow_access) { ExecutionContext* context = resolver->GetExecutionContext(); - if (!resolver->GetScriptState()->ContextIsValid()) + if (!context || !resolver->GetScriptState()->ContextIsValid()) return; if (!allow_access) {
diff --git a/third_party/blink/renderer/modules/shared_storage/shared_storage.cc b/third_party/blink/renderer/modules/shared_storage/shared_storage.cc index a7e1c52..9feefa8 100644 --- a/third_party/blink/renderer/modules/shared_storage/shared_storage.cc +++ b/third_party/blink/renderer/modules/shared_storage/shared_storage.cc
@@ -370,16 +370,6 @@ MakeGarbageCollected<ScriptPromiseResolver>(script_state); ScriptPromise promise = resolver->Promise(); - if (frame->IsInFencedFrameTree()) { - // https://github.com/pythagoraskitty/shared-storage/blob/main/README.md#url-selection - resolver->Reject(V8ThrowDOMException::CreateOrEmpty( - script_state->GetIsolate(), DOMExceptionCode::kInvalidAccessError, - "sharedStorage.selectURL() is not allowed in fenced frame.")); - LogSharedStorageWorkletError( - SharedStorageWorkletErrorType::kSelectURLWebVisible); - return promise; - } - // For `selectURL()` to succeed, it is currently enforced in the browser side // that `addModule()` must be called beforehand that passed the early // permission checks. Thus the permissions-policy check here isn't strictly
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc index 81f183e..27a42563 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
@@ -22,127 +22,11 @@ #include "third_party/blink/renderer/platform/graphics/canvas_resource_provider.h" #include "third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context.h" #include "third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.h" +#include "third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.h" #include "third_party/blink/renderer/platform/graphics/unaccelerated_static_bitmap_image.h" namespace blink { -class TextureAlphaClearer final { - public: - TextureAlphaClearer(GPUDevice* device, WGPUTextureFormat format) - : dawn_control_client_(device->GetDawnControlClient()), - device_(device->GetHandle()), - format_(format) { - const auto& procs = dawn_control_client_->GetProcs(); - - procs.deviceReference(device_); - - WGPUShaderModuleWGSLDescriptor wgsl_desc = { - .chain = {.sType = WGPUSType_ShaderModuleWGSLDescriptor}, - .source = R"( - @vertex fn vert_main(@builtin(vertex_index) VertexIndex : u32) -> @builtin(position) vec4<f32> { - var pos = array<vec2<f32>, 3>( - vec2<f32>(-1.0, -1.0), - vec2<f32>( 3.0, -1.0), - vec2<f32>(-1.0, 3.0)); - return vec4<f32>(pos[VertexIndex], 0.0, 1.0); - } - - @fragment fn frag_main() -> @location(0) vec4<f32> { - return vec4<f32>(1.0); - } - )", - }; - WGPUShaderModuleDescriptor shader_module_desc = {.nextInChain = - &wgsl_desc.chain}; - WGPUShaderModule shader_module = - procs.deviceCreateShaderModule(device_, &shader_module_desc); - - WGPUColorTargetState color_target = { - .format = format, - .writeMask = WGPUColorWriteMask_Alpha, - }; - WGPUFragmentState fragment = { - .module = shader_module, - .entryPoint = "frag_main", - .targetCount = 1, - .targets = &color_target, - }; - WGPURenderPipelineDescriptor pipeline_desc = { - .vertex = - { - .module = shader_module, - .entryPoint = "vert_main", - }, - .primitive = {.topology = WGPUPrimitiveTopology_TriangleList}, - .multisample = {.count = 1, .mask = 0xFFFFFFFF}, - .fragment = &fragment, - }; - alpha_to_one_pipeline_ = - procs.deviceCreateRenderPipeline(device_, &pipeline_desc); - procs.shaderModuleRelease(shader_module); - } - - virtual ~TextureAlphaClearer() { - const auto& procs = dawn_control_client_->GetProcs(); - procs.renderPipelineRelease(alpha_to_one_pipeline_); - procs.deviceRelease(device_); - } - - bool IsCompatible(GPUDevice* device, WGPUTextureFormat format) { - return device_ == device->GetHandle() && format_ == format; - } - - void ClearAlpha(GPUTexture* texture) { - const auto& procs = dawn_control_client_->GetProcs(); - - WGPUTextureView attachment_view = - procs.textureCreateView(texture->GetHandle(), nullptr); - - WGPUDawnEncoderInternalUsageDescriptor internal_usage_desc = { - .chain = {.sType = WGPUSType_DawnEncoderInternalUsageDescriptor}, - .useInternalUsages = true, - }; - WGPUCommandEncoderDescriptor command_encoder_desc = { - .nextInChain = &internal_usage_desc.chain, - }; - WGPUCommandEncoder command_encoder = - procs.deviceCreateCommandEncoder(device_, &command_encoder_desc); - - WGPURenderPassColorAttachment color_attachment = { - .view = attachment_view, - .loadOp = WGPULoadOp_Load, - .storeOp = WGPUStoreOp_Store, - }; - WGPURenderPassDescriptor render_pass_desc = { - .colorAttachmentCount = 1, - .colorAttachments = &color_attachment, - }; - WGPURenderPassEncoder pass = - procs.commandEncoderBeginRenderPass(command_encoder, &render_pass_desc); - DCHECK(alpha_to_one_pipeline_); - procs.renderPassEncoderSetPipeline(pass, alpha_to_one_pipeline_); - procs.renderPassEncoderDraw(pass, 3, 1, 0, 0); - procs.renderPassEncoderEnd(pass); - - WGPUCommandBuffer command_buffer = - procs.commandEncoderFinish(command_encoder, nullptr); - - WGPUQueue queue = procs.deviceGetQueue(device_); - procs.queueSubmit(queue, 1, &command_buffer); - - procs.renderPassEncoderRelease(pass); - procs.commandEncoderRelease(command_encoder); - procs.commandBufferRelease(command_buffer); - procs.textureViewRelease(attachment_view); - } - - private: - const scoped_refptr<DawnControlClientHolder> dawn_control_client_; - const WGPUDevice device_; - const WGPUTextureFormat format_; - WGPURenderPipeline alpha_to_one_pipeline_ = nullptr; -}; - GPUCanvasContext::Factory::~Factory() = default; CanvasRenderingContext* GPUCanvasContext::Factory::Create( @@ -171,10 +55,6 @@ texture_descriptor_.sampleCount = 1; } -GPUCanvasContext::~GPUCanvasContext() { - alpha_clearer_ = nullptr; -} - void GPUCanvasContext::Trace(Visitor* visitor) const { visitor->Trace(device_); visitor->Trace(texture_); @@ -506,13 +386,16 @@ case V8GPUCanvasAlphaMode::Enum::kOpaque: { CcLayer()->SetContentsOpaque(true); if (!alpha_clearer_ || - !alpha_clearer_->IsCompatible(device_, texture_descriptor_.format)) { - alpha_clearer_ = std::make_unique<TextureAlphaClearer>( - device_, texture_descriptor_.format); + !alpha_clearer_->IsCompatible(device_->GetHandle(), + texture_descriptor_.format)) { + alpha_clearer_ = base::MakeRefCounted<WebGPUTextureAlphaClearer>( + device_->GetDawnControlClient(), device_->GetHandle(), + texture_descriptor_.format); } break; } case V8GPUCanvasAlphaMode::Enum::kPremultiplied: + alpha_clearer_ = nullptr; CcLayer()->SetContentsOpaque(false); break; } @@ -658,6 +541,7 @@ } mailbox_texture->SetNeedsPresent(true); + mailbox_texture->SetAlphaClearer(alpha_clearer_); texture_ = MakeGarbageCollected<GPUTexture>( device_, texture_descriptor_.format, @@ -680,23 +564,6 @@ // WebGPUSwapBufferProvider::Client implementation void GPUCanvasContext::OnTextureTransferred() { DCHECK(texture_); - - // The texture is about to be transferred to the compositor. - // For alpha mode Opaque, clear the alpha channel to 1.0. - switch (alpha_mode_) { - case V8GPUCanvasAlphaMode::Enum::kOpaque: { - // `alpha_clearer_` will be deleted if OnTextureTransferred is called - // during ~GPUCanvasContext -> ~WebGPUSwapBufferProvider -> - // ~WebGPUMailboxTexture - if (alpha_clearer_) { - alpha_clearer_->ClearAlpha(texture_); - } - break; - } - case V8GPUCanvasAlphaMode::Enum::kPremultiplied: - break; - } - texture_ = nullptr; }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h index 4270f58..225a39d4 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h +++ b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h
@@ -20,7 +20,7 @@ class GPUCanvasConfiguration; class GPUSwapChain; class GPUTexture; -class TextureAlphaClearer; +class WebGPUTextureAlphaClearer; class V8UnionHTMLCanvasElementOrOffscreenCanvas; // A GPUCanvasContext does little by itself and basically just binds a canvas @@ -51,8 +51,6 @@ GPUCanvasContext(const GPUCanvasContext&) = delete; GPUCanvasContext& operator=(const GPUCanvasContext&) = delete; - ~GPUCanvasContext() override; - void Trace(Visitor*) const override; // CanvasRenderingContext implementation @@ -140,7 +138,7 @@ Member<GPUDevice> device_; Member<GPUTexture> texture_; V8GPUCanvasAlphaMode::Enum alpha_mode_; - std::unique_ptr<TextureAlphaClearer> alpha_clearer_; + scoped_refptr<WebGPUTextureAlphaClearer> alpha_clearer_; scoped_refptr<WebGPUSwapBufferProvider> swap_buffers_; bool new_texture_required_ = true;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_device.cc b/third_party/blink/renderer/modules/webgpu/gpu_device.cc index 1953ec4..9e060c8f 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_device.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_device.cc
@@ -393,6 +393,9 @@ void GPUDevice::destroy(ScriptState* script_state) { destroyed_ = true; DestroyAllExternalTextures(); + // Dissociate mailboxes before destroying the device. This ensures that + // mailbox operations which run during dissociation can succeed. + DissociateMailboxes(); UnmapAllMappableBuffers(script_state); GetProcs().deviceDestroy(GetHandle()); FlushNow(); @@ -608,6 +611,7 @@ visitor->Trace(queue_); visitor->Trace(lost_property_); visitor->Trace(active_external_textures_); + visitor->Trace(textures_with_mailbox_); visitor->Trace(mappable_buffers_); ExecutionContextClient::Trace(visitor); EventTargetWithInlineData::Trace(visitor); @@ -626,6 +630,13 @@ active_external_textures_.clear(); } +void GPUDevice::DissociateMailboxes() { + for (auto& texture : textures_with_mailbox_) { + texture->DissociateMailbox(); + } + textures_with_mailbox_.clear(); +} + void GPUDevice::UnmapAllMappableBuffers(ScriptState* script_state) { for (GPUBuffer* buffer : mappable_buffers_) { buffer->unmap(script_state); @@ -651,4 +662,14 @@ active_external_textures_.erase(external_texture); } +void GPUDevice::TrackTextureWithMailbox(GPUTexture* texture) { + DCHECK(texture); + textures_with_mailbox_.insert(texture); +} + +void GPUDevice::UntrackTextureWithMailbox(GPUTexture* texture) { + DCHECK(texture); + textures_with_mailbox_.erase(texture); +} + } // namespace blink
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_device.h b/third_party/blink/renderer/modules/webgpu/gpu_device.h index 03df5e0..318be9b3 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_device.h +++ b/third_party/blink/renderer/modules/webgpu/gpu_device.h
@@ -144,6 +144,9 @@ void AddActiveExternalTexture(GPUExternalTexture* external_texture); void RemoveActiveExternalTexture(GPUExternalTexture* external_texture); + void TrackTextureWithMailbox(GPUTexture* texture); + void UntrackTextureWithMailbox(GPUTexture* texture); + bool ValidateTextureFormatUsage(V8GPUTextureFormat format, ExceptionState& exception_state); std::string formattedLabel() const; @@ -163,7 +166,7 @@ void Dispose(); void DestroyAllExternalTextures(); - + void DissociateMailboxes(); void UnmapAllMappableBuffers(ScriptState* script_state); void OnUncapturedError(WGPUErrorType errorType, const char* message); @@ -213,6 +216,9 @@ // when the device is destroyed (via .destroy) to free the memory. HeapHashSet<WeakMember<GPUExternalTexture>> active_external_textures_; + // Textures with mailboxes that should be dissociated before device.destroy(). + HeapHashSet<WeakMember<GPUTexture>> textures_with_mailbox_; + HeapHashSet<WeakMember<GPUBuffer>> mappable_buffers_; // This attribute records that whether GPUDevice is destroyed (via destroy()).
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_texture.cc b/third_party/blink/renderer/modules/webgpu/gpu_texture.cc index 851b74c8..9146a011 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_texture.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_texture.cc
@@ -240,6 +240,10 @@ format_(format), usage_(usage), mailbox_texture_(std::move(mailbox_texture)) { + if (mailbox_texture_) { + device_->TrackTextureWithMailbox(this); + } + // Mailbox textures are all 2d texture. dimension_ = WGPUTextureDimension_2D; @@ -267,9 +271,16 @@ return view; } +GPUTexture::~GPUTexture() { + DissociateMailbox(); +} + void GPUTexture::destroy() { + if (mailbox_texture_) { + DissociateMailbox(); + device_->UntrackTextureWithMailbox(this); + } GetProcs().textureDestroy(GetHandle()); - mailbox_texture_.reset(); } uint32_t GPUTexture::width() const { @@ -304,4 +315,11 @@ return GetProcs().textureGetUsage(GetHandle()); } +void GPUTexture::DissociateMailbox() { + if (mailbox_texture_) { + mailbox_texture_->Dissociate(); + mailbox_texture_ = nullptr; + } +} + } // namespace blink
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_texture.h b/third_party/blink/renderer/modules/webgpu/gpu_texture.h index 165a8cd..13f98d69 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_texture.h +++ b/third_party/blink/renderer/modules/webgpu/gpu_texture.h
@@ -38,6 +38,8 @@ WGPUTextureUsage usage, scoped_refptr<WebGPUMailboxTexture> mailbox_texture); + ~GPUTexture() override; + GPUTexture(const GPUTexture&) = delete; GPUTexture& operator=(const GPUTexture&) = delete; @@ -58,6 +60,8 @@ WGPUTextureFormat Format() { return format_; } WGPUTextureUsage Usage() { return usage_; } + void DissociateMailbox(); + private: void setLabelImpl(const String& value) override { std::string utf8_label = value.Utf8();
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index ae88e5a..77dc595 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -923,6 +923,8 @@ "graphics/gpu/webgpu_resource_provider_cache.h", "graphics/gpu/webgpu_swap_buffer_provider.cc", "graphics/gpu/webgpu_swap_buffer_provider.h", + "graphics/gpu/webgpu_texture_alpha_clearer.cc", + "graphics/gpu/webgpu_texture_alpha_clearer.h", "graphics/gpu/xr_frame_transport.cc", "graphics/gpu/xr_frame_transport.h", "graphics/gpu/xr_webgl_drawing_buffer.cc",
diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_color_filter.cc b/third_party/blink/renderer/platform/graphics/dark_mode_color_filter.cc index d3a7752..06066090 100644 --- a/third_party/blink/renderer/platform/graphics/dark_mode_color_filter.cc +++ b/third_party/blink/renderer/platform/graphics/dark_mode_color_filter.cc
@@ -10,6 +10,7 @@ #include "third_party/skia/include/core/SkColorFilter.h" #include "third_party/skia/include/effects/SkHighContrastFilter.h" #include "third_party/skia/include/effects/SkTableColorFilter.h" +#include "ui/gfx/color_utils.h" namespace blink { namespace { @@ -73,6 +74,31 @@ return AdjustGray(inverted_color); } + SkColor AdjustColorForHigherConstrast( + SkColor adjusted_color, + SkColor background, + float reference_contrast_ratio) override { + if (color_utils::GetContrastRatio(adjusted_color, background) >= + reference_contrast_ratio) + return adjusted_color; + + SkColor best_color = adjusted_color; + constexpr int MaxLightness = 100; + int min_lightness = GetLabSkV3Data(adjusted_color).x; + for (int low = min_lightness, high = MaxLightness + 1; low < high;) { + const int lightness = (low + high) / 2; + const SkColor color = AdjustColorByLightness(adjusted_color, lightness); + const float contrast = color_utils::GetContrastRatio(color, background); + if (contrast > reference_contrast_ratio) { + high = lightness; + best_color = color; + } else { + low = high + 1; + } + } + return best_color; + } + sk_sp<SkColorFilter> ToSkColorFilter() const override { return filter_; } private: @@ -99,6 +125,36 @@ return color; } + SkColor AdjustColorByLightness(SkColor reference_color, int lightness) { + SkColor new_color = AdjustLightness(reference_color, lightness); + SkScalar hsv[3]; + SkColorToHSV(reference_color, hsv); + const float hue = hsv[0]; + SkColorToHSV(new_color, hsv); + if (hsv[0] != hue) + hsv[0] = hue; + + return SkHSVToColor(SkColorGetA(reference_color), hsv); + } + + SkColor AdjustLightness(SkColor color, int lightness) { + SkV3 lab = GetLabSkV3Data(color); + if (lab.x != lightness) + lab.x = lightness; + SkV3 rgb = transformer_.LABToSRGB(lab); + + return SkColorSetARGB(SkColorGetA(color), + static_cast<unsigned int>(rgb.x * 255 + 0.5), + static_cast<unsigned int>(rgb.y * 255 + 0.5), + static_cast<unsigned int>(rgb.z * 255 + 0.5)); + } + + SkV3 GetLabSkV3Data(SkColor color) { + SkV3 rgb = {SkColorGetR(color) / 255.0f, SkColorGetG(color) / 255.0f, + SkColorGetB(color) / 255.0f}; + return transformer_.SRGBToLAB(rgb); + } + const lab::DarkModeSRGBLABTransformer transformer_; sk_sp<SkColorFilter> filter_; };
diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_color_filter.h b/third_party/blink/renderer/platform/graphics/dark_mode_color_filter.h index 1e1eca8f..70d54dbc 100644 --- a/third_party/blink/renderer/platform/graphics/dark_mode_color_filter.h +++ b/third_party/blink/renderer/platform/graphics/dark_mode_color_filter.h
@@ -25,6 +25,12 @@ virtual ~DarkModeColorFilter(); virtual SkColor InvertColor(SkColor color) const = 0; virtual sk_sp<SkColorFilter> ToSkColorFilter() const = 0; + virtual SkColor AdjustColorForHigherConstrast( + SkColor adjusted_color, + const SkColor background, + float reference_contrast_ratio) { + return adjusted_color; + } }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc b/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc index 21cde0c6..33a89973 100644 --- a/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc +++ b/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc
@@ -137,25 +137,38 @@ return immutable_.settings.image_policy; } -// Heuristic to maintain contrast for borders (see: crbug.com/1263545) +// Heuristic to maintain contrast for borders and selections (see: +// crbug.com/1263545,crbug.com/1298969) SkColor DarkModeFilter::AdjustDarkenColor(SkColor color, DarkModeFilter::ElementRole role, SkColor contrast_background) { - if (role != DarkModeFilter::ElementRole::kBorder) - return color; - if (contrast_background == 0) contrast_background = SK_ColorDark; - if (color == SkColorSetARGB(SkColorGetA(color), 0, 0, 0)) - return color; + switch (role) { + case ElementRole::kBorder: { + if (color == SkColorSetARGB(SkColorGetA(color), 0, 0, 0)) + return color; - if (color_utils::GetContrastRatio(color, contrast_background) < - color_utils::kMinimumReadableContrastRatio) - return color; + if (color_utils::GetContrastRatio(color, contrast_background) < + color_utils::kMinimumReadableContrastRatio) + return color; - return AdjustDarkenColor(Color::FromSkColor(color).Dark().Rgb(), role, - contrast_background); + return AdjustDarkenColor(Color::FromSkColor(color).Dark().Rgb(), role, + contrast_background); + } + case ElementRole::kSelection: { + if (!immutable_.color_filter) + return color; + + return immutable_.color_filter->AdjustColorForHigherConstrast( + color, contrast_background, + color_utils::kMinimumVisibleContrastRatio); + } + default: + return color; + } + NOTREACHED(); } SkColor DarkModeFilter::InvertColorIfNeeded(SkColor color, @@ -270,6 +283,7 @@ return immutable_.foreground_classifier->ShouldInvertColor(color) == DarkModeResult::kApplyFilter; case ElementRole::kBackground: + case ElementRole::kSelection: DCHECK(immutable_.background_classifier); return immutable_.background_classifier->ShouldInvertColor(color) == DarkModeResult::kApplyFilter;
diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_filter.h b/third_party/blink/renderer/platform/graphics/dark_mode_filter.h index 8ecd7a61..2fef40f 100644 --- a/third_party/blink/renderer/platform/graphics/dark_mode_filter.h +++ b/third_party/blink/renderer/platform/graphics/dark_mode_filter.h
@@ -36,7 +36,8 @@ kListSymbol, kBackground, kSVG, - kBorder + kBorder, + kSelection }; enum class ImageType { kNone, kIcon, kSeparator, kPhoto };
diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_filter_test.cc b/third_party/blink/renderer/platform/graphics/dark_mode_filter_test.cc index 9c005d9..b6bdb222 100644 --- a/third_party/blink/renderer/platform/graphics/dark_mode_filter_test.cc +++ b/third_party/blink/renderer/platform/graphics/dark_mode_filter_test.cc
@@ -4,8 +4,6 @@ #include "third_party/blink/renderer/platform/graphics/dark_mode_filter.h" -#include "base/logging.h" -#include "base/time/time.h" #include "cc/paint/paint_flags.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h"
diff --git a/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.cc b/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.cc index 8f2e7c9f..ad0e15b 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.cc
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/platform/graphics/canvas_resource.h" #include "third_party/blink/renderer/platform/graphics/canvas_resource_provider.h" #include "third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context.h" +#include "third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.h" #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h" #include "third_party/blink/renderer/platform/wtf/functional.h" @@ -182,6 +183,10 @@ reinterpret_cast<const GLbyte*>(&mailbox)); } +void WebGPUMailboxTexture::SetAlphaClearer( + scoped_refptr<WebGPUTextureAlphaClearer> alpha_clearer) { + alpha_clearer_ = std::move(alpha_clearer); +} void WebGPUMailboxTexture::Dissociate() { if (wire_texture_id_ == 0) { @@ -191,6 +196,10 @@ dawn_control_client_->GetContextProviderWeakPtr()) { gpu::webgpu::WebGPUInterface* webgpu = context_provider->ContextProvider()->WebGPUInterface(); + if (alpha_clearer_) { + alpha_clearer_->ClearAlpha(texture_); + alpha_clearer_ = nullptr; + } if (needs_present_) { webgpu->DissociateMailboxForPresent( wire_device_id_, wire_device_generation_, wire_texture_id_,
diff --git a/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.h b/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.h index 34a6a4e..69fdac3 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.h +++ b/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.h
@@ -25,6 +25,7 @@ class DawnControlClientHolder; class StaticBitmapImage; +class WebGPUTextureAlphaClearer; class PLATFORM_EXPORT WebGPUMailboxTexture : public RefCounted<WebGPUMailboxTexture> { @@ -60,6 +61,7 @@ scoped_refptr<media::VideoFrame> video_frame); void SetNeedsPresent(bool needs_present) { needs_present_ = needs_present; } + void SetAlphaClearer(scoped_refptr<WebGPUTextureAlphaClearer> alpha_clearer); void Dissociate(); ~WebGPUMailboxTexture(); @@ -90,6 +92,7 @@ uint32_t wire_texture_generation_ = 0; std::unique_ptr<RecyclableCanvasResource> recyclable_canvas_resource_; bool needs_present_ = false; + scoped_refptr<WebGPUTextureAlphaClearer> alpha_clearer_; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.cc b/third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.cc new file mode 100644 index 0000000..1aa6962 --- /dev/null +++ b/third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.cc
@@ -0,0 +1,120 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.h" + +namespace blink { + +WebGPUTextureAlphaClearer::WebGPUTextureAlphaClearer( + scoped_refptr<DawnControlClientHolder> dawn_control_client, + WGPUDevice device, + WGPUTextureFormat format) + : dawn_control_client_(std::move(dawn_control_client)), + device_(device), + format_(format) { + const auto& procs = dawn_control_client_->GetProcs(); + + procs.deviceReference(device_); + + WGPUShaderModuleWGSLDescriptor wgsl_desc = { + .chain = {.sType = WGPUSType_ShaderModuleWGSLDescriptor}, + .source = R"( + @vertex fn vert_main(@builtin(vertex_index) VertexIndex : u32) -> @builtin(position) vec4<f32> { + var pos = array<vec2<f32>, 3>( + vec2<f32>(-1.0, -1.0), + vec2<f32>( 3.0, -1.0), + vec2<f32>(-1.0, 3.0)); + return vec4<f32>(pos[VertexIndex], 0.0, 1.0); + } + + @fragment fn frag_main() -> @location(0) vec4<f32> { + return vec4<f32>(1.0); + } + )", + }; + WGPUShaderModuleDescriptor shader_module_desc = {.nextInChain = + &wgsl_desc.chain}; + WGPUShaderModule shader_module = + procs.deviceCreateShaderModule(device_, &shader_module_desc); + + WGPUColorTargetState color_target = { + .format = format, + .writeMask = WGPUColorWriteMask_Alpha, + }; + WGPUFragmentState fragment = { + .module = shader_module, + .entryPoint = "frag_main", + .targetCount = 1, + .targets = &color_target, + }; + WGPURenderPipelineDescriptor pipeline_desc = { + .vertex = + { + .module = shader_module, + .entryPoint = "vert_main", + }, + .primitive = {.topology = WGPUPrimitiveTopology_TriangleList}, + .multisample = {.count = 1, .mask = 0xFFFFFFFF}, + .fragment = &fragment, + }; + alpha_to_one_pipeline_ = + procs.deviceCreateRenderPipeline(device_, &pipeline_desc); + procs.shaderModuleRelease(shader_module); +} + +WebGPUTextureAlphaClearer::~WebGPUTextureAlphaClearer() { + const auto& procs = dawn_control_client_->GetProcs(); + procs.renderPipelineRelease(alpha_to_one_pipeline_); + procs.deviceRelease(device_); +} + +bool WebGPUTextureAlphaClearer::IsCompatible(WGPUDevice device, + WGPUTextureFormat format) const { + return device_ == device && format_ == format; +} + +void WebGPUTextureAlphaClearer::ClearAlpha(WGPUTexture texture) { + const auto& procs = dawn_control_client_->GetProcs(); + + WGPUTextureView attachment_view = procs.textureCreateView(texture, nullptr); + + WGPUDawnEncoderInternalUsageDescriptor internal_usage_desc = { + .chain = {.sType = WGPUSType_DawnEncoderInternalUsageDescriptor}, + .useInternalUsages = true, + }; + WGPUCommandEncoderDescriptor command_encoder_desc = { + .nextInChain = &internal_usage_desc.chain, + }; + WGPUCommandEncoder command_encoder = + procs.deviceCreateCommandEncoder(device_, &command_encoder_desc); + + WGPURenderPassColorAttachment color_attachment = { + .view = attachment_view, + .loadOp = WGPULoadOp_Load, + .storeOp = WGPUStoreOp_Store, + }; + WGPURenderPassDescriptor render_pass_desc = { + .colorAttachmentCount = 1, + .colorAttachments = &color_attachment, + }; + WGPURenderPassEncoder pass = + procs.commandEncoderBeginRenderPass(command_encoder, &render_pass_desc); + DCHECK(alpha_to_one_pipeline_); + procs.renderPassEncoderSetPipeline(pass, alpha_to_one_pipeline_); + procs.renderPassEncoderDraw(pass, 3, 1, 0, 0); + procs.renderPassEncoderEnd(pass); + + WGPUCommandBuffer command_buffer = + procs.commandEncoderFinish(command_encoder, nullptr); + + WGPUQueue queue = procs.deviceGetQueue(device_); + procs.queueSubmit(queue, 1, &command_buffer); + + procs.renderPassEncoderRelease(pass); + procs.commandEncoderRelease(command_encoder); + procs.commandBufferRelease(command_buffer); + procs.textureViewRelease(attachment_view); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.h b/third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.h new file mode 100644 index 0000000..6d2dcd8b --- /dev/null +++ b/third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.h
@@ -0,0 +1,39 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_GPU_WEBGPU_TEXTURE_ALPHA_CLEARER_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_GPU_WEBGPU_TEXTURE_ALPHA_CLEARER_H_ + +#include <dawn/webgpu.h> + +#include "third_party/blink/renderer/platform/graphics/gpu/dawn_control_client_holder.h" +#include "third_party/blink/renderer/platform/platform_export.h" +#include "third_party/blink/renderer/platform/wtf/ref_counted.h" + +namespace blink { + +class PLATFORM_EXPORT WebGPUTextureAlphaClearer final + : public WTF::RefCounted<WebGPUTextureAlphaClearer> { + public: + WebGPUTextureAlphaClearer( + scoped_refptr<DawnControlClientHolder> dawn_control_client, + WGPUDevice device, + WGPUTextureFormat format); + + bool IsCompatible(WGPUDevice device, WGPUTextureFormat format) const; + void ClearAlpha(WGPUTexture texture); + + private: + friend class WTF::RefCounted<WebGPUTextureAlphaClearer>; + ~WebGPUTextureAlphaClearer(); + + const scoped_refptr<DawnControlClientHolder> dawn_control_client_; + const WGPUDevice device_; + const WGPUTextureFormat format_; + WGPURenderPipeline alpha_to_one_pipeline_ = nullptr; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_GPU_WEBGPU_TEXTURE_ALPHA_CLEARER_H_
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 49e2693..7b966eb 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -707,7 +707,7 @@ }, { name: "CSSLastBaseline", - status: "experimental", + status: "stable", }, { name: "CSSLayoutAPI", @@ -1146,23 +1146,24 @@ }, { name: "FedCm", - origin_trial_feature_name: "FedCM", - origin_trial_allows_third_party: true, public: true, - status: "test", + status: "stable", }, { name: "FedCmIdpSigninStatus", + depends_on: ["FedCm"], public: true, status: "test", }, { name: "FedCmIdpSignout", + depends_on: ["FedCm"], public: true, status: "test", }, { name: "FedCmIframeSupport", + depends_on: ["FedCm"], public: true, status: "test", }, @@ -2485,6 +2486,7 @@ { name: "StorageBuckets", status: "experimental", + base_feature: "StorageBuckets", }, { name: "StorageFoundationAPI",
diff --git a/third_party/blink/renderer/platform/wtf/cross_thread_copier_base.h b/third_party/blink/renderer/platform/wtf/cross_thread_copier_base.h index 944cceb..5aa005b 100644 --- a/third_party/blink/renderer/platform/wtf/cross_thread_copier_base.h +++ b/third_party/blink/renderer/platform/wtf/cross_thread_copier_base.h
@@ -32,6 +32,7 @@ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_CROSS_THREAD_COPIER_BASE_H_ #include "base/files/file.h" +#include "base/files/file_error_or.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "third_party/blink/renderer/platform/wtf/cross_thread_copier.h" @@ -39,8 +40,6 @@ namespace base { template <typename, typename> class RefCountedThreadSafe; -template <typename> -class FileErrorOr; class TimeDelta; class TimeTicks; class Time;
diff --git a/third_party/blink/tools/blinkpy/common/net/web.py b/third_party/blink/tools/blinkpy/common/net/web.py index 049f8af..d717d5fa 100644 --- a/third_party/blink/tools/blinkpy/common/net/web.py +++ b/third_party/blink/tools/blinkpy/common/net/web.py
@@ -49,11 +49,13 @@ return_none_on_404=return_none_on_404).run(make_request) def request(self, method, url, data=None, headers=None): - return self.session.request(method.lower(), - url, - data=data, - headers=headers, - stream=True) + response = self.session.request(method.lower(), + url, + data=data, + headers=headers, + stream=True) + response.raise_for_status() + return response def request_and_read(self, *args, **kwargs): response = self.request(*args, **kwargs)
diff --git a/third_party/blink/tools/blinkpy/common/net/web_mock.py b/third_party/blink/tools/blinkpy/common/net/web_mock.py index 3159eab8..9e2ef8b 100644 --- a/third_party/blink/tools/blinkpy/common/net/web_mock.py +++ b/third_party/blink/tools/blinkpy/common/net/web_mock.py
@@ -29,6 +29,7 @@ import json from requests.exceptions import HTTPError from requests import Response +from requests.structures import CaseInsensitiveDict from blinkpy.common.net.rpc import RESPONSE_PREFIX @@ -75,11 +76,7 @@ self.body = values.get('body', '') # The name of the headers (keys) are case-insensitive, and values are stripped. headers_raw = values.get('headers', {}) - self.headers = { - key.lower(): value.strip() - for key, value in headers_raw.items() - } - self._info = MockInfo(self.headers) + self.headers = CaseInsensitiveDict(headers_raw) if int(self.status_code) >= 400: response = Response() @@ -92,19 +89,5 @@ def getcode(self): return self.status_code - def getheader(self, header): - return self.headers.get(header.lower(), None) - def json(self): return json.loads(self.body) - - def info(self): - return self._info - - -class MockInfo(object): - def __init__(self, headers): - self._headers = headers - - def getheader(self, header): - return self._headers.get(header.lower(), None)
diff --git a/third_party/blink/tools/blinkpy/w3c/wpt_github.py b/third_party/blink/tools/blinkpy/w3c/wpt_github.py index e4324dd..b4a0f69 100644 --- a/third_party/blink/tools/blinkpy/w3c/wpt_github.py +++ b/third_party/blink/tools/blinkpy/w3c/wpt_github.py
@@ -488,11 +488,8 @@ def getheader(self, header): """Gets the value of the header with the given name. - Delegates to HTTPMessage.getheader(), which is case-insensitive.""" - if six.PY3: - return self._raw_response.getheader(header) - else: - return self._raw_response.info().getheader(header) + Delegates to request.Response.headers, which is case-insensitive.""" + return self._raw_response.headers.get(header) class GitHubError(Exception):
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 0788300..4cd0890 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -307,6 +307,7 @@ crbug.com/1351556 virtual/document-transition/document-transition/capture-callback-exception.html [ Failure ] crbug.com/1351556 virtual/document-transition-wide-gamut/document-transition/capture-callback-exception.html [ Failure ] crbug.com/1366886 [ Mac12-arm64 ] virtual/document-transition-wide-gamut/wpt_internal/document-transition/iframe-transition.sub.html [ Failure Timeout ] +crbug.com/1366886 [ Mac11-arm64 ] virtual/document-transition-wide-gamut/wpt_internal/document-transition/iframe-transition.sub.html [ Failure Timeout ] ########## Ref tests can't be rebaselined ########## crbug.com/619103 paint/invalidation/background/background-resize-width.html [ Failure Pass ] @@ -7267,4 +7268,4 @@ crbug.com/1349331 http/tests/devtools/oopif/oopif-storage.js [ Skip ] # Sheriff 2022-10-12 -crbug.com/1367495 [ Debug Linux ] virtual/threaded-no-composited-antialiasing/animations/direction-and-fill/animation-direction-reverse-timing-functions.html [ Failure Pass ] \ No newline at end of file +crbug.com/1367495 [ Debug Linux ] virtual/threaded-no-composited-antialiasing/animations/direction-and-fill/animation-direction-reverse-timing-functions.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/css3/filters/effect-reference-hidpi-hw.html b/third_party/blink/web_tests/css3/filters/effect-reference-hidpi-hw.html index 5e324de..2d1a981 100644 --- a/third_party/blink/web_tests/css3/filters/effect-reference-hidpi-hw.html +++ b/third_party/blink/web_tests/css3/filters/effect-reference-hidpi-hw.html
@@ -1,12 +1,10 @@ <script> - function startTest() { - if (window.testRunner) { - testRunner.waitUntilDone(); - testRunner.setBackingScaleFactor(2, function() { testRunner.notifyDone(); }); - } + if (window.testRunner) { + testRunner.waitUntilDone(); + testRunner.setBackingScaleFactor(2, function() { testRunner.notifyDone(); }); } </script> -<body onload="startTest();"></body> +<body></body> <svg xmlns="http://www.w3.org/2000/svg" width="0" height="0" version="1.1"> <defs> <filter id="displacement" color-interpolation-filters="sRGB">
diff --git a/third_party/blink/web_tests/dark-mode/colors/selection.html b/third_party/blink/web_tests/dark-mode/colors/selection.html index a961f3739..9eede25 100644 --- a/third_party/blink/web_tests/dark-mode/colors/selection.html +++ b/third_party/blink/web_tests/dark-mode/colors/selection.html
@@ -1,15 +1,17 @@ <!DOCTYPE html> <style> -body { - background-color: #808080; -} .block { font-size: 20px; - height: 50px; + height: 40px; margin: 10px; padding: 10px; border: 1px solid #000; } + +.background { + background-color: #808080; +} + .selectionbw::selection { color: black; background-color: white; @@ -30,13 +32,26 @@ <div id="selectionstart" class="block selectionbw"> selection style of black on white </div> -<div id="selectionend" class="block selectionwb"> +<div class="block selectionbw background"> + selection style of black on white +</div> +<div class="block selectionwb"> selection style of white on black </div> +<div id="selectionend" class="block selectionwb background"> + selection style of white on black +</div> + <div id="highlightstart" class="block highlightbw"> highlight style of white on black </div> -<div id="highlightend" class="block highlightwb"> +<div class="block highlightbw background"> + highlight style of white on black +</div> +<div class="block highlightwb"> + highlight style of black on white +</div> +<div id="highlightend" class="block highlightwb background"> highlight style of black on white </div> <script> @@ -44,9 +59,8 @@ selectionRange.setStartBefore(document.getElementById('selectionstart')); selectionRange.setEndAfter(document.getElementById('selectionend')); window.getSelection().addRange(selectionRange); - let highlightRange = new Range(); highlightRange.setStartBefore(document.getElementById('highlightstart')); highlightRange.setEndAfter(document.getElementById('highlightend')); CSS.highlights.set('highlight', new Highlight(highlightRange)); -</script> +</script> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-046.html.ini b/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-046.html.ini new file mode 100644 index 0000000..4f07d8f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-046.html.ini
@@ -0,0 +1,2 @@ +[at-supports-046.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-namespace-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-namespace-001.html.ini new file mode 100644 index 0000000..72d1a73 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-namespace-001.html.ini
@@ -0,0 +1,2 @@ +[at-supports-namespace-001.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-namespace-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-namespace-002.html.ini new file mode 100644 index 0000000..dd9aed65 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-namespace-002.html.ini
@@ -0,0 +1,2 @@ +[at-supports-namespace-002.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-040.xht.ini b/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-040.xht.ini new file mode 100644 index 0000000..0d8be8d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-040.xht.ini
@@ -0,0 +1,2 @@ +[css-supports-040.xht] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-041.xht.ini b/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-041.xht.ini new file mode 100644 index 0000000..0abe17cb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-041.xht.ini
@@ -0,0 +1,2 @@ +[css-supports-041.xht] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-042.xht.ini b/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-042.xht.ini new file mode 100644 index 0000000..eb12d74 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-042.xht.ini
@@ -0,0 +1,2 @@ +[css-supports-042.xht] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/js/CSS-supports-CSSStyleDeclaration.html.ini b/third_party/blink/web_tests/external/wpt/css/css-conditional/js/CSS-supports-CSSStyleDeclaration.html.ini new file mode 100644 index 0000000..c90e8e2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/js/CSS-supports-CSSStyleDeclaration.html.ini
@@ -0,0 +1,60 @@ +[CSS-supports-CSSStyleDeclaration.html] + [-epub-caption-side: _camel_cased_attribute v. CSS.supports] + expected: FAIL + + [-epub-text-combine: _camel_cased_attribute v. CSS.supports] + expected: FAIL + + [-epub-text-emphasis: _camel_cased_attribute v. CSS.supports] + expected: FAIL + + [-epub-text-emphasis-color: _camel_cased_attribute v. CSS.supports] + expected: FAIL + + [-epub-text-emphasis-style: _camel_cased_attribute v. CSS.supports] + expected: FAIL + + [-epub-text-orientation: _camel_cased_attribute v. CSS.supports] + expected: FAIL + + [-epub-text-transform: _camel_cased_attribute v. CSS.supports] + expected: FAIL + + [-epub-word-break: _camel_cased_attribute v. CSS.supports] + expected: FAIL + + [-epub-writing-mode: _camel_cased_attribute v. CSS.supports] + expected: FAIL + + [font-display: _camel_cased_attribute v. CSS.supports] + expected: FAIL + + [font-display: _dashed_attribute v. CSS.supports] + expected: FAIL + + [inherits: _camel_cased_attribute v. CSS.supports] + expected: FAIL + + [initial-value: _camel_cased_attribute v. CSS.supports] + expected: FAIL + + [initial-value: _dashed_attribute v. CSS.supports] + expected: FAIL + + [speak-as: _camel_cased_attribute v. CSS.supports] + expected: FAIL + + [speak-as: _dashed_attribute v. CSS.supports] + expected: FAIL + + [src: _camel_cased_attribute v. CSS.supports] + expected: FAIL + + [syntax: _camel_cased_attribute v. CSS.supports] + expected: FAIL + + [unicode-range: _camel_cased_attribute v. CSS.supports] + expected: FAIL + + [unicode-range: _dashed_attribute v. CSS.supports] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/js/supports-conditionText.html.ini b/third_party/blink/web_tests/external/wpt/css/css-conditional/js/supports-conditionText.html.ini new file mode 100644 index 0000000..f7cf2cf8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/js/supports-conditionText.html.ini
@@ -0,0 +1,12 @@ +[supports-conditionText.html] + [conditionText getter for @supports ()] + expected: FAIL + + [conditionText getter for @supports func()] + expected: FAIL + + [conditionText getter for @supports (())] + expected: FAIL + + [conditionText getter for @supports (func())] + expected: FAIL
diff --git a/third_party/blink/web_tests/fast/scrolling/overflow-scrollability.html b/third_party/blink/web_tests/fast/scrolling/overflow-scrollability.html index c15a887f..7ba20bcf 100644 --- a/third_party/blink/web_tests/fast/scrolling/overflow-scrollability.html +++ b/third_party/blink/web_tests/fast/scrolling/overflow-scrollability.html
@@ -65,7 +65,13 @@ <script> const mouse = GestureSourceType.MOUSE_INPUT; - const pixelsToScroll = 10; + const pixelsToScroll = pixelsPerTick(); + + async function waitForScroll(scrollPosFunc, target, errorMesage) { + await waitFor(() => { + return Math.abs(scrollPosFunc() - target) < 0.01; + }, errorMesage); + } async function testScrollable(div_id, can_scroll) { let div = document.getElementById(div_id); @@ -80,9 +86,13 @@ await smoothScroll(pixelsToScroll, x, y, mouse, 'down', SPEED_INSTANT, false /* precise_scrolling_deltas */); let assertDescription = `${div_id} vertical scroll failed`; - if (can_scroll) - assert_approx_equals(div.scrollTop, expectedScroll.y, 0.01, assertDescription); - else { + if (can_scroll) { + waitForScroll(() => div.scrollTop, expectedScroll.y, + assertDescription); + } else { + // Wait a few frames before checking to ensure the div doesn't scroll. + await raf(); + await raf(); assert_equals(div.scrollTop, 0, assertDescription); } @@ -90,8 +100,12 @@ SPEED_INSTANT, false /* precise_scrolling_deltas */); assertDescription = `${div_id} horizontal scroll failed`; if (can_scroll) { + waitForScroll(() => div.scrollLeft, expectedScroll.x, + assertDescription); assert_approx_equals(div.scrollLeft, expectedScroll.x, 0.01, assertDescription); } else { + await raf(); + await raf(); assert_equals(div.scrollLeft, 0, assertDescription); } } @@ -113,4 +127,4 @@ }, 'This tests that scrollable areas with the appropriate overflow mode set' + ' are in fact scrollable by the user.'); }; -</script> \ No newline at end of file +</script>
diff --git a/third_party/blink/web_tests/platform/linux/dark-mode/colors/selection-expected.png b/third_party/blink/web_tests/platform/linux/dark-mode/colors/selection-expected.png index 231145c4..4b68490 100644 --- a/third_party/blink/web_tests/platform/linux/dark-mode/colors/selection-expected.png +++ b/third_party/blink/web_tests/platform/linux/dark-mode/colors/selection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/selection-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/selection-expected.png index 04af6ba..c575934 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/selection-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/selection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/dark-mode/colors/selection-expected.png b/third_party/blink/web_tests/platform/mac/dark-mode/colors/selection-expected.png index b10f58a..a193e576 100644 --- a/third_party/blink/web_tests/platform/mac/dark-mode/colors/selection-expected.png +++ b/third_party/blink/web_tests/platform/mac/dark-mode/colors/selection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/selection-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/selection-expected.png index 8a02f2c..d839e025 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/selection-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/selection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/dark-mode/colors/selection-expected.png b/third_party/blink/web_tests/platform/win/dark-mode/colors/selection-expected.png index 18648fc..fdc9db2 100644 --- a/third_party/blink/web_tests/platform/win/dark-mode/colors/selection-expected.png +++ b/third_party/blink/web_tests/platform/win/dark-mode/colors/selection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/selection-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/selection-expected.png index ea1d3a8..85e932d 100644 --- a/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/selection-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/selection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt index a09c54f..09c9dc6d 100644 --- a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -4250,6 +4250,10 @@ attribute @@toStringTag method constructor method getFrequencyResponse +interface IdentityCredential : Credential + attribute @@toStringTag + getter token + method constructor interface IdleDeadline attribute @@toStringTag getter didTimeout
diff --git a/third_party/leveldatabase/env_chromium.cc b/third_party/leveldatabase/env_chromium.cc index 05408ee9..a885e871 100644 --- a/third_party/leveldatabase/env_chromium.cc +++ b/third_party/leveldatabase/env_chromium.cc
@@ -223,7 +223,7 @@ if (!handle) { int flags = base::File::FLAG_READ | base::File::FLAG_OPEN; FileErrorOr<base::File> result = filesystem_->OpenFile(filepath_, flags); - if (result.is_error()) { + if (!result.has_value()) { return MakeIOError(filepath_.AsUTF8Unsafe(), "Could not perform read", kRandomAccessFileRead); } @@ -323,7 +323,7 @@ FilePath path = FilePath::FromUTF8Unsafe(parent_dir_); FileErrorOr<base::File> result = filesystem_->OpenFile( path, base::File::FLAG_OPEN | base::File::FLAG_READ); - if (result.is_error()) { + if (!result.has_value()) { return MakeIOError(parent_dir_, "Unable to open directory", kSyncParent, result.error()); } @@ -784,7 +784,7 @@ FileErrorOr<std::vector<base::FilePath>> result = filesystem_->GetDirectoryEntries( dir, storage::FilesystemProxy::DirectoryEntryType::kFilesOnly); - if (result.is_error()) + if (!result.has_value()) return; for (const auto& path : result.value()) { @@ -808,7 +808,7 @@ filesystem_->GetDirectoryEntries( dir_path, storage::FilesystemProxy::DirectoryEntryType::kFilesAndDirectories); - if (entries_result.is_error()) { + if (!entries_result.has_value()) { return MakeIOError(dir, "Could not open/read directory", kGetChildren, entries_result.error()); } @@ -892,11 +892,11 @@ const base::FilePath path = base::FilePath::FromUTF8Unsafe(fname); Retrier retrier; FileErrorOr<std::unique_ptr<storage::FilesystemProxy::FileLock>> lock_result = - base::File::Error::FILE_ERROR_FAILED; + base::unexpected(base::File::Error::FILE_ERROR_FAILED); do { lock_result = filesystem_->LockFile(path); - } while (lock_result.is_error() && retrier.ShouldKeepTrying()); - if (lock_result.is_error()) { + } while (!lock_result.has_value() && retrier.ShouldKeepTrying()); + if (!lock_result.has_value()) { return MakeIOError(fname, FileErrorString(lock_result.error()), kLockFile, lock_result.error()); } @@ -938,7 +938,7 @@ FilePath path = FilePath::FromUTF8Unsafe(fname); FileErrorOr<base::File> open_result = filesystem_->OpenFile( path, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); - if (open_result.is_error()) { + if (!open_result.has_value()) { *result = nullptr; return MakeIOError(fname, "Unable to create log file", kNewLogger, open_result.error()); @@ -953,7 +953,7 @@ FilePath path = FilePath::FromUTF8Unsafe(fname); FileErrorOr<base::File> open_result = filesystem_->OpenFile( path, base::File::FLAG_OPEN | base::File::FLAG_READ); - if (open_result.is_error()) { + if (!open_result.has_value()) { *result = nullptr; return MakeIOError(fname, "Unable to create sequential file", kNewSequentialFile, open_result.error()); @@ -968,7 +968,7 @@ base::FilePath file_path = FilePath::FromUTF8Unsafe(fname); FileErrorOr<base::File> open_result = filesystem_->OpenFile( file_path, base::File::FLAG_READ | base::File::FLAG_OPEN); - if (!open_result.is_error()) { + if (open_result.has_value()) { base::File file = std::move(open_result.value()); if (file_cache_) { *result = new ChromiumEvictableRandomAccessFile( @@ -990,7 +990,7 @@ FilePath path = FilePath::FromUTF8Unsafe(fname); FileErrorOr<base::File> open_result = filesystem_->OpenFile( path, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); - if (open_result.is_error()) { + if (!open_result.has_value()) { *result = nullptr; return MakeIOError(fname, "Unable to create writable file", kNewWritableFile, open_result.error()); @@ -1005,7 +1005,7 @@ FilePath path = FilePath::FromUTF8Unsafe(fname); FileErrorOr<base::File> open_result = filesystem_->OpenFile( path, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_APPEND); - if (open_result.is_error()) { + if (!open_result.has_value()) { *result = nullptr; return MakeIOError(fname, "Unable to create appendable file", kNewAppendableFile, open_result.error());
diff --git a/third_party/libavif/BUILD.gn b/third_party/libavif/BUILD.gn index 0b52ea48..6d0ffdc 100644 --- a/third_party/libavif/BUILD.gn +++ b/third_party/libavif/BUILD.gn
@@ -12,7 +12,6 @@ "src/src/avif.c", "src/src/colr.c", "src/src/diag.c", - "src/src/exif.c", "src/src/io.c", "src/src/mem.c", "src/src/obu.c",
diff --git a/third_party/minizip/DIR_METADATA b/third_party/minizip/DIR_METADATA index 5345fc2..e9400b87 100644 --- a/third_party/minizip/DIR_METADATA +++ b/third_party/minizip/DIR_METADATA
@@ -1,3 +1 @@ -monorail: { - component: "Platform>Apps>FileManager" -} +mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 66431d8c..4167be0 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -241,6 +241,10 @@ <int value="52" label="FLAG_REQUEST_MULTI_FINGER_GESTURES"/> <int value="53" label="FLAG_REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK"/> <int value="54" label="FLAG_SERVICE_HANDLES_DOUBLE_TAP"/> + <int value="55" label="SERVICE_TYPE_ASSISTIVE_TECH_WITH_PASSWORD_MANAGER"/> + <int value="56" label="SERVICE_TYPE_ASSISTIVE_TECH_WITH_UNKNOWN"/> + <int value="57" label="SERVICE_TYPE_PASSWORD_MANAGER_WITH_UNKNOWN"/> + <int value="58" label="SERVICE_TYPE_ALL_VARIANTS"/> </enum> <enum name="AccessibilityATKAPIEnum"> @@ -9221,6 +9225,21 @@ <int value="762" label="CREDIT_CARD_STANDALONE_VERIFICATION_CODE - Predictions different - Value agrees with both predictions"/> + <int value="769" label="NUMERIC_QUANTITY - Predictions equal - Value agrees"/> + <int value="770" + label="NUMERIC_QUANTITY - Predictions equal - Value disagrees"/> + <int value="771" + label="NUMERIC_QUANTITY - Predictions different - Value agrees with old + prediction"/> + <int value="772" + label="NUMERIC_QUANTITY - Predictions different - Value agrees with new + prediction"/> + <int value="773" + label="NUMERIC_QUANTITY - Predictions different - Value agrees with + neither prediction"/> + <int value="774" + label="NUMERIC_QUANTITY - Predictions different - Value agrees with + both predictions"/> </enum> <enum name="AutofillPredictionSource"> @@ -9501,6 +9520,7 @@ <int value="125" label="IBAN_VALUE"/> <int value="126" label="CREDIT_CARD_STANDALONE_VERIFICATION_CODE"/> <int value="127" label="RESERVED"/> + <int value="128" label="NUMERIC_QUANTITY"/> </enum> <enum name="AutofillServerPredictionAvailability"> @@ -29078,6 +29098,7 @@ <int value="7" label="Failed to Serialize the Response"/> <int value="8" label="Serialized Response is Empty"/> <int value="9" label="Success"/> + <int value="10" label="Failed to Serialize the Signals"/> </enum> <enum name="DTEnrollmentStatus"> @@ -46713,13 +46734,6 @@ <int value="3" label="Three months"/> </enum> -<enum name="GeopositionErrorCode"> - <int value="0" label="There was no error"/> - <int value="1" label="User denied use of geolocation"/> - <int value="2" label="Geoposition could not be determined"/> - <int value="3" label="Timeout"/> -</enum> - <enum name="GestureEventFilterResults"> <int value="0" label="GestureScrollBegin allowed by main thread touch action"/> @@ -62883,6 +62897,7 @@ <int value="1605611615" label="enable-webrtc-srtp-aes-gcm"/> <int value="1607541874" label="SettingsLandingPageRedesign:enabled"/> <int value="1609059016" label="CupsIppPrintingBackend:enabled"/> + <int value="1609219232" label="AutofillImprovedLabelForInference:disabled"/> <int value="1611265771" label="Win10TabSearchCaptionButton:enabled"/> <int value="1611522475" label="AutofillPrimaryInfoStyleExperiment:disabled"/> <int value="1612206633" label="CCTModuleCustomHeader:enabled"/> @@ -63327,6 +63342,7 @@ <int value="1875156497" label="CaptureMode:enabled"/> <int value="1877769074" label="PhoneHubFeatureSetupErrorHandling:enabled"/> <int value="1878331098" label="GuestViewCrossProcessFrames:enabled"/> + <int value="1879542762" label="AutofillImprovedLabelForInference:enabled"/> <int value="1880955305" label="enable-preconnect-to-search"/> <int value="1881036528" label="disable-multilingual-spellchecker"/> <int value="1881174782" label="disable-brotli"/>
diff --git a/tools/metrics/histograms/metadata/accessibility/histograms.xml b/tools/metrics/histograms/metadata/accessibility/histograms.xml index f6b9719..a9cce571 100644 --- a/tools/metrics/histograms/metadata/accessibility/histograms.xml +++ b/tools/metrics/histograms/metadata/accessibility/histograms.xml
@@ -301,11 +301,12 @@ </histogram> <histogram name="Accessibility.AndroidServiceInfo" - enum="AccessibilityAndroidServiceInfoEnum" expires_after="2022-11-18"> + enum="AccessibilityAndroidServiceInfoEnum" expires_after="M109"> <owner>aleventhal@chromium.org</owner> <owner>mschillaci@chromium.org</owner> <owner>chrome-a11y-core@google.com</owner> <summary> + Deprecated as of 10/2022, M109. Now using the per-variant enum (below). Tracks flags and capabilities of enabled accessibility services. Recorded every time an Android web content view first creates a virtual view hierarchy, indicating that some accessibility service is running. The number @@ -316,6 +317,32 @@ </summary> </histogram> +<histogram name="Accessibility.AndroidServiceInfo.{RunningApps}" + enum="AccessibilityAndroidServiceInfoEnum" expires_after="2023-07-01"> + <owner>mschillaci@google.com</owner> + <owner>aldietz@google.com</owner> + <owner>dtseng@chromium.org</owner> + <owner>chrome-a11y-core@google.com</owner> + <summary> + Tracks events, flags, feedback and capabilities of enabled accessibility + services separated into variants based on the types of running accessibility + services. This information would be a subset of the (now deprecated) + Accessibility.AndroidServiceInfo histogram. It will allow us to look at the + same histograms but only for a subset of users (e.g. what are the requested + flags etc of enabled accessibility services for clients running only a + password manager). + </summary> + <token key="RunningApps"> + <variant name="ALL_VARIANTS"/> + <variant name="ASSISTIVE_TECH"/> + <variant name="ASSISTIVE_TECH_WITH_PASSWORD_MANAGER"/> + <variant name="ASSISTIVE_TECH_WITH_UNKNOWN"/> + <variant name="PASSWORD_MANAGER"/> + <variant name="PASSWORD_MANAGER_WITH_UNKNOWN"/> + <variant name="UNKNOWN"/> + </token> +</histogram> + <histogram name="Accessibility.ATK-APIs" enum="AccessibilityATKAPIEnum" expires_after="2022-11-18"> <owner>jdiggs@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml index 492e1aef..87ed6b2d 100644 --- a/tools/metrics/histograms/metadata/ash/histograms.xml +++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -1358,6 +1358,21 @@ </summary> </histogram> +<histogram name="Ash.DeskApi.{Method}.Result" units="BooleanSuccess" + expires_after="2023-10-07"> + <owner>aprilzhou@chromium.org</owner> + <owner>janetmac@chromium.org</owner> + <summary> + Recorded when a desk API {Method} method succeeded or failed. + </summary> + <token key="Method"> + <variant name="AllDesk" summary="set to all desks"/> + <variant name="LaunchDesk" summary="launch desk"/> + <variant name="RemoveDesk" summary="remove desk"/> + <variant name="SwitchDesk" summary="switch desk"/> + </token> +</histogram> + <histogram name="Ash.Desks.AnimationLatency.DeskActivation" units="ms" expires_after="2023-04-23"> <owner>amusbach@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml index 8a93992..3f314a1 100644 --- a/tools/metrics/histograms/metadata/autofill/histograms.xml +++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -280,6 +280,18 @@ <token key="Group" variants="Autofill.Ablation.Group"/> </histogram> +<histogram + name="Autofill.AcceptedFilledFieldWithNumericQuantityHeuristicPrediction" + enum="Boolean" expires_after="M112"> + <owner>koerber@google.com</owner> + <owner>chrome-autofill-alerts@google.com</owner> + <summary> + Logs if the filling of a field was accepted even though it had a + NUMERIC_QUANTITY prediction. This metric is only emitted if the feature to + grant the heuristic precedence is disabled. Emitted on submission time. + </summary> +</histogram> + <histogram name="Autofill.Address.IsEnabled.PageLoad" enum="BooleanEnabled" expires_after="2023-02-12"> <owner>jsaul@google.com</owner> @@ -2280,6 +2292,16 @@ </summary> </histogram> +<histogram name="Autofill.NumericQuantityCollidesWithServerPrediction" + enum="Boolean" expires_after="M112"> + <owner>koerber@google.com</owner> + <owner>chrome-autofill-alerts@google.com</owner> + <summary> + Logs that a field with a heuristic prediction for an NUMERIC_QUANTITY + collides with a server prediction. The metric is emitted on form submission. + </summary> +</histogram> + <histogram name="Autofill.Offer.SelectedCardHasOffer" enum="AutofillCreditCardOfferSelection" expires_after="2023-08-01"> <owner>siyua@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/geolocation/histograms.xml b/tools/metrics/histograms/metadata/geolocation/histograms.xml index 8c9f1e2..62b53f0f 100644 --- a/tools/metrics/histograms/metadata/geolocation/histograms.xml +++ b/tools/metrics/histograms/metadata/geolocation/histograms.xml
@@ -88,13 +88,6 @@ </summary> </histogram> -<histogram name="Geolocation.LocationUpdate.ErrorCode" - enum="GeopositionErrorCode" expires_after="2022-11-20"> - <owner>mattreynolds@chromium.org</owner> - <owner>device-dev@chromium.org</owner> - <summary>Error code for the geoposition sent to the renderers.</summary> -</histogram> - <histogram name="Geolocation.NetworkLocationRequest.AccessPoints" units="units" expires_after="M85"> <owner>mattreynolds@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/v8/histograms.xml b/tools/metrics/histograms/metadata/v8/histograms.xml index 5783c05..2c90d1dc 100644 --- a/tools/metrics/histograms/metadata/v8/histograms.xml +++ b/tools/metrics/histograms/metadata/v8/histograms.xml
@@ -1171,19 +1171,6 @@ </summary> </histogram> -<histogram name="V8.GCMainThreadMarkingThroughput" units="MB/s" - expires_after="2022-11-20"> - <owner>mlippautz@chromium.org</owner> - <owner>v8-memory-sheriffs@google.com</owner> - <summary> - Marking throughput considering all durations of all marking phases on the - main thread and marked bytes within one V8 garbage collection cycle. - Reported once per garbage collection cycle. Only reported for platforms - supporting high resolution clocks and when more than 1MB of live objects - have been found. - </summary> -</histogram> - <histogram name="V8.GCMarkCompactReason" enum="GarbageCollectionReason" expires_after="2023-03-26"> <owner>mlippautz@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index b82771b03..c8a6861 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,16 +5,16 @@ "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "win": { - "hash": "18dab85b6d7a0996c800e65ab496db03ec1297f1", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/c356fc671b3cbf3b3f4f1ba332ed6005c9d3f78b/trace_processor_shell.exe" + "hash": "27e80ba16d9c6e2283f3f1cab33fa391db47f298", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/4fcf7d61f3559fdb37fefda36e272f05e40f0fef/trace_processor_shell.exe" }, "linux_arm": { "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893", "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "mac": { - "hash": "ccf649ab59c48f142e3c32f983440973c32e861f", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/c356fc671b3cbf3b3f4f1ba332ed6005c9d3f78b/trace_processor_shell" + "hash": "5066d38c3b61c3e7b96bcec31e3c04a334e222bb", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/4fcf7d61f3559fdb37fefda36e272f05e40f0fef/trace_processor_shell" }, "mac_arm64": { "hash": "e1ad4861384b06d911a65f035317914b8cc975c6",
diff --git a/tools/polymer/polymer.gni b/tools/polymer/polymer.gni index 6cfe416..87df6f1 100644 --- a/tools/polymer/polymer.gni +++ b/tools/polymer/polymer.gni
@@ -12,9 +12,9 @@ "third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-ripple-behavior.html|PaperRippleBehavior", "ui/webui/resources/cr_elements/cr_scrollable_behavior.html|CrScrollableBehavior", "ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_behavior.html|CrRadioButtonBehavior", - "ui/webui/resources/cr_elements/i18n_behavior.html|I18nBehavior", - "ui/webui/resources/cr_elements/policy/cr_policy_pref_behavior.html|CrPolicyPrefBehavior", - "ui/webui/resources/cr_elements/web_ui_listener_behavior.html|WebUIListenerBehavior", + "ash/webui/common/resources/i18n_behavior.html|I18nBehavior", + "ash/webui/common/resources/cr_policy_pref_behavior.html|CrPolicyPrefBehavior", + "ash/webui/common/resources/web_ui_listener_behavior.html|WebUIListenerBehavior", "ui/webui/resources/html/cr/ui/focus_outline_manager.html|FocusOutlineManager", "ui/webui/resources/html/cr/ui/focus_row_behavior.html|FocusRowBehavior", "ui/webui/resources/html/cr/ui/focus_without_ink_js.html|focusWithoutInk",
diff --git a/tools/typescript/definitions/chrome_test.d.ts b/tools/typescript/definitions/chrome_test.d.ts index 5ff2c4a7..ca77066 100644 --- a/tools/typescript/definitions/chrome_test.d.ts +++ b/tools/typescript/definitions/chrome_test.d.ts
@@ -12,6 +12,7 @@ export function assertTrue(value: boolean, message?: string): asserts value; export function fail(message?: string): never; export function runTests(tests: Array<() => void>): void; + export function runWithUserGesture(callback: () => void): void; export function succeed(message?: string): void; } }
diff --git a/ui/android/java/src/org/chromium/ui/modaldialog/ModalDialogManager.java b/ui/android/java/src/org/chromium/ui/modaldialog/ModalDialogManager.java index 560dcb1..816efa5e 100644 --- a/ui/android/java/src/org/chromium/ui/modaldialog/ModalDialogManager.java +++ b/ui/android/java/src/org/chromium/ui/modaldialog/ModalDialogManager.java
@@ -146,10 +146,14 @@ public @interface ModalDialogPriority { int LOW = 1; int HIGH = 2; + // This is intended to be used only by those dialogs which are meant to block any access to - // a subset of Chrome features when they are being shown. For example, incognito re-auth - // feature uses this to gate the user's access to Incognito feature unless they - // re-authenticate successfully. For most of the clients, using just HIGH should suffice. + // a subset of Chrome features when they are being shown. This also decouples the dialog + // from any suspend calls! For example, incognito re-auth feature uses this to gate the + // user's access to Incognito feature unless they re-authenticate successfully and it + // ensures that the dialog doesn't get removed because of any other Chrome clients. + // STOP: Other Chrome clients should just rely on HIGH instead! Check with the existing + // clients if you still intend on using this. int VERY_HIGH = 3; int RANGE_MIN = LOW; @@ -325,12 +329,25 @@ return; } - // Put the new dialog in pending list if the dialog type is suspended or the current dialog - // is of higher priority. - if (mSuspendedTypes.contains(dialogType) - || (isShowing() && mCurrentPriority >= dialogPriority)) { - mPendingDialogContainer.put(dialogType, dialogPriority, model, showAsNext); - return; + // The requested dialog is of very high priority. This needs special treatment when + // considering to put in pending list or not. + if (dialogPriority == ModalDialogPriority.VERY_HIGH) { + // We only put the requested dialog in pending list if the currently shown dialog + // also has a VERY_HIGH priority. + if (isShowing() && mCurrentPriority >= dialogPriority) { + assert mCurrentPriority + == ModalDialogPriority.VERY_HIGH : "Higher priority is not supported."; + mPendingDialogContainer.put(dialogType, dialogPriority, model, showAsNext); + return; + } + } else { + // Put the new dialog in pending list if the dialog type is suspended or the current + // dialog is of higher priority. + if ((mSuspendedTypes.contains(dialogType)) + || (isShowing() && mCurrentPriority >= dialogPriority)) { + mPendingDialogContainer.put(dialogType, dialogPriority, model, showAsNext); + return; + } } if (isShowing()) suspendCurrentDialog(); @@ -375,6 +392,7 @@ mCurrentPresenter.setDialogModel(null, null); for (ModalDialogManagerObserver o : mObserverList) o.onDialogDismissed(model); mCurrentPresenter = null; + mCurrentPriority = ModalDialogPriority.LOW; mDismissingCurrentDialog = false; dispatchOnLastDialogDismissedIfEmpty(); showNextDialog(); @@ -439,16 +457,21 @@ } /** - * Suspend all dialogs of the specified type, including the one currently shown. These dialogs - * will be prevented from showing unless {@link #resumeType(int, int)} is called after the - * suspension. If the current dialog is suspended, it will be moved back to the first dialog - * in the pending list. Any dialogs of the specified type in the pending list will be skipped. + * Suspend all dialogs of the specified type, including the one currently shown. The currently + * shown dialog would be suspended if its priority is not VERY_HIGH. + * + * These dialogs will be prevented from showing unless {@link #resumeType(int, int)} is called + * after the suspension. If the current dialog is suspended, it will be moved back to the first + * dialog in the pending list. Any dialogs of the specified type in the pending list will be + * skipped. + * * @param dialogType The specified type of dialogs to be suspended. * @return A token to use when resuming the suspended type. */ public int suspendType(@ModalDialogType int dialogType) { mSuspendedTypes.add(dialogType); - if (isShowing() && dialogType == mCurrentType) { + if (isShowing() && dialogType == mCurrentType + && mCurrentPriority != ModalDialogPriority.VERY_HIGH) { suspendCurrentDialog(); showNextDialog(); }
diff --git a/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java b/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java index e728dbbc..07acb1d 100644 --- a/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java +++ b/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java
@@ -411,6 +411,86 @@ assertEquals(mDialogModels.get(0), mModalDialogManager.getCurrentDialogForTest()); assertEquals(2, mModalDialogManager.getPendingDialogsForTest(ModalDialogType.TAB).size()); } + @Test + @Feature({"ModalDialog"}) + public void testVeryHighPriorityDialog_SuspendType_APP_DoesNotDismissCurrentDialog() { + // Show a very high priority dialog of type APP. + mModalDialogManager.showDialog(mDialogModels.get(0), ModalDialogType.APP, + ModalDialogManager.ModalDialogPriority.VERY_HIGH, false); + // Suspend the APP type and check we are still showing the very_high priority dialog. + int token = mModalDialogManager.suspendType(ModalDialogType.APP); + assertTrue(mModalDialogManager.isShowing()); + } + + @Test + @Feature({"ModalDialog"}) + public void testVeryHighPriorityDialog_SuspendType_TAB_DoesNotDismissCurrentDialog() { + // Show a very high priority dialog of type TAB. + mModalDialogManager.showDialog(mDialogModels.get(0), ModalDialogType.TAB, + ModalDialogManager.ModalDialogPriority.VERY_HIGH, false); + // Suspend the APP type and check we are still showing the very_high priority dialog. + int token = mModalDialogManager.suspendType(ModalDialogType.TAB); + assertTrue(mModalDialogManager.isShowing()); + } + + @Test + @Feature({"ModalDialog"}) + public void testSuspendType_StillAllowsShowing_NewVeryHighPriorityDialog_OfSameType() { + // Show a high priority dialog. + mModalDialogManager.showDialog(mDialogModels.get(0), ModalDialogType.APP, + ModalDialogManager.ModalDialogPriority.HIGH, false); + + // Suspend the APP type. + int token = mModalDialogManager.suspendType(ModalDialogType.APP); + assertFalse(mModalDialogManager.isShowing()); + + // Create a new dialog of the same type(!) but with a very_high priority and check it's + // shown. + mModalDialogManager.showDialog(mDialogModels.get(1), ModalDialogType.APP, + ModalDialogManager.ModalDialogPriority.VERY_HIGH, false); + assertTrue(mModalDialogManager.isShowing()); + assertEquals(mDialogModels.get(1), + mModalDialogManager.getCurrentPresenterForTest().getDialogModel()); + } + + @Test + @Feature({"ModalDialog"}) + public void testVeryHighPriorityDialog_IsShown_IfCurrentDialog_IsLowerPriority() { + // Show a high priority dialog. + mModalDialogManager.showDialog(mDialogModels.get(0), ModalDialogType.APP, + ModalDialogManager.ModalDialogPriority.HIGH, false); + // Create a new dialog of the same type but with a very_high priority and check it's + // shown. + mModalDialogManager.showDialog(mDialogModels.get(1), ModalDialogType.APP, + ModalDialogManager.ModalDialogPriority.VERY_HIGH, false); + assertTrue(mModalDialogManager.isShowing()); + assertEquals(mDialogModels.get(1), + mModalDialogManager.getCurrentPresenterForTest().getDialogModel()); + // Check that the previously shown dialog was removed and we are now showing the new dialog + // which has a very high priority. + verify(mAppModalPresenter, times(1)).removeDialogView(mDialogModels.get(0)); + verify(mAppModalPresenter, times(1)).addDialogView(mDialogModels.get(1)); + } + + @Test + @Feature({"ModalDialog"}) + public void testVeryHighPriorityDialog_IsNotShown_IfCurrentDialog_IsAlsoVeryHighPriority() { + // Show a very high priority dialog. + mModalDialogManager.showDialog(mDialogModels.get(0), ModalDialogType.APP, + ModalDialogManager.ModalDialogPriority.VERY_HIGH, false); + assertTrue(mModalDialogManager.isShowing()); + verify(mAppModalPresenter, times(1)).addDialogView(mDialogModels.get(0)); + + // Create a new dialog of the same type and with very_high priority as well. + mModalDialogManager.showDialog(mDialogModels.get(1), ModalDialogType.APP, + ModalDialogManager.ModalDialogPriority.VERY_HIGH, false); + + // Check that the new dialog is not shown and the previously shown dialog is never removed. + verify(mAppModalPresenter, times(0)).removeDialogView(mDialogModels.get(0)); + verify(mAppModalPresenter, times(0)).addDialogView(mDialogModels.get(1)); + assertEquals(mDialogModels.get(0), + mModalDialogManager.getCurrentPresenterForTest().getDialogModel()); + } private static void assertOnDismissCalled(PropertyModel model, int numberOfInvocations) { verify(model.get(ModalDialogProperties.CONTROLLER), times(numberOfInvocations))
diff --git a/ui/base/l10n/l10n_util.cc b/ui/base/l10n/l10n_util.cc index 19f7fd9..1c041510 100644 --- a/ui/base/l10n/l10n_util.cc +++ b/ui/base/l10n/l10n_util.cc
@@ -93,6 +93,7 @@ "en-CA", // English (Canada) "en-GB", // English (UK) "en-GB-oxendict", // English (UK, OED spelling) + "en-IE", // English (Ireland) "en-IN", // English (India) "en-NZ", // English (New Zealand) "en-US", // English (US)
diff --git a/ui/file_manager/COMMON_METADATA b/ui/file_manager/COMMON_METADATA index 5345fc2..8040003 100644 --- a/ui/file_manager/COMMON_METADATA +++ b/ui/file_manager/COMMON_METADATA
@@ -1,3 +1,6 @@ -monorail: { - component: "Platform>Apps>FileManager" +buganizer { + component_id: 167289 +} +buganizer_public { + component_id: 1258625 }
diff --git a/ui/file_manager/file_manager/foreground/elements/BUILD.gn b/ui/file_manager/file_manager/foreground/elements/BUILD.gn index 1d170a5a..a424f3a 100644 --- a/ui/file_manager/file_manager/foreground/elements/BUILD.gn +++ b/ui/file_manager/file_manager/foreground/elements/BUILD.gn
@@ -75,6 +75,7 @@ js_library("files_format_dialog") { deps = [ + "//ash/webui/common/resources:i18n_behavior", "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", "//ui/file_manager/file_manager/common/js:files_app_entry_types", @@ -82,7 +83,6 @@ "//ui/file_manager/file_manager/common/js:volume_manager_types", "//ui/file_manager/file_manager/externs:volume_info", "//ui/file_manager/file_manager/foreground/js:file_rename", - "//ui/webui/resources/cr_elements:i18n_behavior", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
diff --git a/ui/file_manager/file_manager/foreground/elements/files_format_dialog.js b/ui/file_manager/file_manager/foreground/elements/files_format_dialog.js index 95d000e..860fe06 100644 --- a/ui/file_manager/file_manager/foreground/elements/files_format_dialog.js +++ b/ui/file_manager/file_manager/foreground/elements/files_format_dialog.js
@@ -11,7 +11,7 @@ import 'chrome://resources/cr_elements/cr_shared_vars.css.js'; import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; -import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {EntryList, VolumeEntry} from '../../common/js/files_app_entry_types.js';
diff --git a/ui/views/controls/menu/menu_scroll_view_container.cc b/ui/views/controls/menu/menu_scroll_view_container.cc index 40097dd..fd2cf17 100644 --- a/ui/views/controls/menu/menu_scroll_view_container.cc +++ b/ui/views/controls/menu/menu_scroll_view_container.cc
@@ -98,7 +98,7 @@ host_->GetMenuItem()->GetMenuController()->OnDragExitedScrollButton(host_); } - void OnMouseExited(const ui::MouseEvent& event) override { + void OnMouseEntered(const ui::MouseEvent& event) override { host_->GetMenuItem()->GetMenuController()->SetEnabledScrollButtons(true); }
diff --git a/ui/webui/resources/BUILD.gn b/ui/webui/resources/BUILD.gn index 203fe49a..727253b 100644 --- a/ui/webui/resources/BUILD.gn +++ b/ui/webui/resources/BUILD.gn
@@ -52,13 +52,11 @@ "cr_components/customize_themes:build_grdp", "cr_components/help_bubble:build_grdp", "cr_components/most_visited:build_grdp", - "cr_elements:build_grdp", "js/browser_command:build_grdp", "//third_party/polymer/v3_0:build_grdp", ] grdp_files += [ "$root_gen_dir/third_party/polymer/v3_0/polymer_3_0_resources.grdp", - "$root_gen_dir/ui/webui/resources/cr_elements/cr_elements_resources.grdp", "$target_gen_dir/cr_components/app_management/resources.grdp", "$target_gen_dir/cr_components/customize_themes/resources.grdp", "$target_gen_dir/cr_components/help_bubble/resources.grdp", @@ -137,10 +135,6 @@ "js:closure_compile", "js:closure_compile_modules", ] - - if (include_polymer && is_chromeos_ash) { - deps += [ "cr_elements:closure_compile" ] - } } # TypeScript targets @@ -148,19 +142,11 @@ preprocessed_folder = "$target_gen_dir/preprocessed" checked_in_dts_files = [ - "cr_elements/cr_scrollable_behavior.d.ts", - "cr_elements/i18n_behavior.d.ts", - "cr_elements/policy/cr_policy_indicator_behavior.d.ts", - "cr_elements/web_ui_listener_behavior.d.ts", "js/parse_html_subset.d.ts", "js/promise_resolver.d.ts", "js/static_types.d.ts", ] -if (is_chromeos_ash) { - checked_in_dts_files += [ "cr_elements/cr_container_shadow_behavior.d.ts" ] -} - # Copies checked-in .d.ts files to the preprocess folder so that they are # discovered by TSC the same way generated .d.ts files are. copy("copy_checked_in_dts_files") {
diff --git a/ui/webui/resources/cr_elements/BUILD.gn b/ui/webui/resources/cr_elements/BUILD.gn index d5d481e..88c492c 100644 --- a/ui/webui/resources/cr_elements/BUILD.gn +++ b/ui/webui/resources/cr_elements/BUILD.gn
@@ -3,29 +3,15 @@ # found in the LICENSE file. import("//build/config/chromeos/ui_mode.gni") -import("//third_party/closure_compiler/compile_js.gni") import("//tools/grit/preprocess_if_expr.gni") import("//tools/polymer/css_to_wrapper.gni") import("//tools/polymer/html_to_wrapper.gni") import("//ui/webui/resources/include_polymer.gni") -import("//ui/webui/resources/tools/generate_grd.gni") import("//ui/webui/webui_features.gni") import("./cr_elements.gni") preprocess_folder = "$root_gen_dir/ui/webui/resources/preprocessed/cr_elements" -if (include_polymer) { - preprocess_src_manifest = "preprocessed_src_manifest.json" - - generate_grd("build_grdp") { - grd_prefix = "cr_elements" - out_grd = "$target_gen_dir/${grd_prefix}_resources.grdp" - public_deps = [ ":preprocess" ] - manifest_files = [ "$target_gen_dir/$preprocess_src_manifest" ] - resource_path_prefix = "cr_elements" - } -} - group("preprocess") { public_deps = [ ":html_wrapper_files_native", @@ -36,7 +22,6 @@ public_deps += [ ":css_wrapper_files", ":html_wrapper_files", - ":preprocess_src", ] } } @@ -54,72 +39,6 @@ } } -if (include_polymer) { - preprocess_if_expr("preprocess_src") { - in_folder = "." - out_folder = preprocess_folder - out_manifest = "$target_gen_dir/$preprocess_src_manifest" - - in_files = [ - "i18n_behavior.js", - "web_ui_listener_behavior.js", - ] - - if (is_chromeos_ash) { - in_files += [ - "cr_container_shadow_behavior.js", - "cr_scrollable_behavior.js", - "policy/cr_policy_indicator_behavior.js", - ] - } - } -} - -group("closure_compile") { - deps = [ ":cr_elements_module_resources" ] - if (is_chromeos_ash) { - deps += [ "policy:closure_compile_module" ] - } -} - -js_type_check("cr_elements_module_resources") { - is_polymer3 = true - deps = [ - ":i18n_behavior", - ":web_ui_listener_behavior", - ] - if (is_chromeos_ash) { - deps += [ - ":cr_container_shadow_behavior", - ":cr_scrollable_behavior", - ] - } -} - -js_library("i18n_behavior") { - deps = [ - "//ui/webui/resources/js:load_time_data.m", - "//ui/webui/resources/js:parse_html_subset", - ] -} - -js_library("web_ui_listener_behavior") { - deps = [ "//ui/webui/resources/js:cr.m" ] -} - -if (is_chromeos_ash) { - js_library("cr_container_shadow_behavior") { - deps = [ "//ui/webui/resources/js:assert" ] - } - - js_library("cr_scrollable_behavior") { - deps = [ - "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list", - "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - ] - } -} - html_to_wrapper("html_wrapper_files_native") { deps = [ ":preprocess_ts" ] in_folder = preprocess_folder
diff --git a/ui/webui/resources/cr_elements/policy/BUILD.gn b/ui/webui/resources/cr_elements/policy/BUILD.gn deleted file mode 100644 index dc7de28..0000000 --- a/ui/webui/resources/cr_elements/policy/BUILD.gn +++ /dev/null
@@ -1,16 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//third_party/closure_compiler/compile_js.gni") - -assert(is_chromeos_ash) - -js_type_check("closure_compile_module") { - is_polymer3 = true - deps = [ ":cr_policy_indicator_behavior" ] -} - -js_library("cr_policy_indicator_behavior") { - deps = [ "//ui/webui/resources/js:assert" ] -}