diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2024-02-22 13:19:49 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2024-03-12 13:45:06 +0000 |
commit | 9c1f44f67466fea2fb20bb6f31fea388d8c65961 (patch) | |
tree | 03e7709aa7ed9a7cf2ec26ca410acd0b4c536666 /chromium/chrome/browser/ui/webui/settings | |
parent | ada9ddbf8c604585ac344b72f7bb63ac27c84726 (diff) |
BASELINE: Update Chromium to 122.0.6261.72
Change-Id: I655fa6da670f5e82a4c0df33630e388663de2a8e
Reviewed-on: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/542310
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/chrome/browser/ui/webui/settings')
62 files changed, 4515 insertions, 3598 deletions
diff --git a/chromium/chrome/browser/ui/webui/settings/OWNERS b/chromium/chrome/browser/ui/webui/settings/OWNERS index 551452d4055..c494850f01f 100644 --- a/chromium/chrome/browser/ui/webui/settings/OWNERS +++ b/chromium/chrome/browser/ui/webui/settings/OWNERS @@ -1,5 +1,7 @@ file://chrome/browser/resources/settings/OWNERS +per-file accessibility_main_handler*=file://ui/accessibility/OWNERS + per-file people_handler*=msalama@chromium.org per-file people_handler*=treib@chromium.org @@ -16,3 +18,5 @@ per-file safety_check_handler*=andzaytsev@google.com,rainhard@chromium.org,sidey per-file settings_clear_browsing_data_handler*=sauski@google.com per-file settings_localized_strings_provider*=sauski@google.com per-file settings_security_key_handler*=file://device/fido/OWNERS + +per-file performance_*=file://chrome/browser/ui/performance_controls/OWNERS
\ No newline at end of file diff --git a/chromium/chrome/browser/ui/webui/settings/about_handler.cc b/chromium/chrome/browser/ui/webui/settings/about_handler.cc index aea43c7f32e..4a40ec0eb0c 100644 --- a/chromium/chrome/browser/ui/webui/settings/about_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/about_handler.cc @@ -53,6 +53,8 @@ #include "v8/include/v8-version-string.h" #if BUILDFLAG(IS_CHROMEOS_ASH) +#include <optional> + #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/new_window_delegate.h" @@ -77,7 +79,6 @@ #include "chromeos/dbus/power/power_manager_client.h" #include "chromeos/version/version_loader.h" #include "components/user_manager/user_manager.h" -#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/icu/source/i18n/unicode/timezone.h" #include "ui/chromeos/devicetype_utils.h" #endif @@ -171,7 +172,7 @@ base::FilePath GetRegulatoryLabelDirForRegion(base::StringPiece region) { base::FilePath FindRegulatoryLabelDir() { base::FilePath region_path; // Use the VPD region code to find the label dir. - const absl::optional<base::StringPiece> region = + const std::optional<base::StringPiece> region = ash::system::StatisticsProvider::GetInstance()->GetMachineStatistic( ash::system::kRegionKey); if (region && !region->empty()) { @@ -202,7 +203,7 @@ std::string ReadRegulatoryLabelText(const base::FilePath& label_dir_path) { base::Value::Dict GetVersionInfo() { base::Value::Dict version_info; - absl::optional<std::string> version = chromeos::version_loader::GetVersion( + std::optional<std::string> version = chromeos::version_loader::GetVersion( chromeos::version_loader::VERSION_FULL); version_info.Set("osVersion", version.value_or("0.0.0.0")); version_info.Set("arcVersion", chromeos::version_loader::GetArcVersion()); @@ -744,7 +745,7 @@ void AboutHandler::HandleIsConsumerAutoUpdateEnabled( void AboutHandler::OnIsConsumerAutoUpdateEnabled(std::string callback_id, std::string feature, - absl::optional<bool> enabled) { + std::optional<bool> enabled) { if (!enabled.has_value()) { LOG(ERROR) << "Failed to get feature value for " << feature << " defaulting to enabled"; diff --git a/chromium/chrome/browser/ui/webui/settings/about_handler.h b/chromium/chrome/browser/ui/webui/settings/about_handler.h index 3e9863ca20a..c8384152295 100644 --- a/chromium/chrome/browser/ui/webui/settings/about_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/about_handler.h @@ -197,7 +197,7 @@ class AboutHandler : public settings::SettingsPageUIHandler, // Callbacks for version_updater_->IsConsumerAutoUpdateEnabled calls. void OnIsConsumerAutoUpdateEnabled(std::string callback_id, std::string feature, - absl::optional<bool> enabled); + std::optional<bool> enabled); void HandleSetConsumerAutoUpdate(const base::Value::List& args); void HandleOpenProductLicenseOther(const base::Value::List& args); diff --git a/chromium/chrome/browser/ui/webui/settings/about_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/about_handler_unittest.cc index 7f74d757183..9cb2f5a9d4f 100644 --- a/chromium/chrome/browser/ui/webui/settings/about_handler_unittest.cc +++ b/chromium/chrome/browser/ui/webui/settings/about_handler_unittest.cc @@ -100,7 +100,7 @@ class AboutHandlerTest : public testing::Test { TestingProfile profile_; content::TestWebUI web_ui_; std::unique_ptr<TestAboutHandler> handler_; - raw_ptr<ash::FakeUpdateEngineClient, DanglingUntriaged | ExperimentalAsh> + raw_ptr<ash::FakeUpdateEngineClient, DanglingUntriaged> fake_update_engine_client_; std::unique_ptr<base::SimpleTestClock> clock_; }; diff --git a/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.cc b/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.cc index 816c10bb03d..3271b9201f8 100644 --- a/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.cc @@ -19,6 +19,10 @@ #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) +#include "ui/accessibility/accessibility_features.h" +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) + namespace settings { AccessibilityMainHandler::AccessibilityMainHandler() = default; @@ -27,14 +31,21 @@ AccessibilityMainHandler::~AccessibilityMainHandler() = default; void AccessibilityMainHandler::RegisterMessages() { web_ui()->RegisterMessageCallback( - "a11yPageReady", - base::BindRepeating(&AccessibilityMainHandler::HandleA11yPageReady, + "getScreenReaderState", + base::BindRepeating(&AccessibilityMainHandler::HandleGetScreenReaderState, base::Unretained(this))); web_ui()->RegisterMessageCallback( "confirmA11yImageLabels", base::BindRepeating( &AccessibilityMainHandler::HandleCheckAccessibilityImageLabels, base::Unretained(this))); +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) + web_ui()->RegisterMessageCallback( + "getScreenAiInstallState", + base::BindRepeating( + &AccessibilityMainHandler::HandleGetScreenAIInstallState, + base::Unretained(this))); +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) } void AccessibilityMainHandler::OnJavascriptAllowed() { @@ -44,18 +55,65 @@ void AccessibilityMainHandler::OnJavascriptAllowed() { &AccessibilityMainHandler::OnAccessibilityStatusChanged, base::Unretained(this))); #endif // BUILDFLAG(IS_CHROMEOS_ASH) + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) + if (features::IsPdfOcrEnabled()) { + CHECK(!component_ready_observer_.IsObserving()); + component_ready_observer_.Observe( + screen_ai::ScreenAIInstallState::GetInstance()); + } +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) } void AccessibilityMainHandler::OnJavascriptDisallowed() { #if BUILDFLAG(IS_CHROMEOS_ASH) accessibility_subscription_ = {}; #endif // BUILDFLAG(IS_CHROMEOS_ASH) + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) + if (features::IsPdfOcrEnabled()) { + component_ready_observer_.Reset(); + } +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) +} + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) +void AccessibilityMainHandler::DownloadProgressChanged(double progress) { + CHECK_GE(progress, 0.0); + CHECK_LE(progress, 1.0); + const int progress_num = progress * 100; + FireWebUIListener("pdf-ocr-downloading-progress-changed", + base::Value(progress_num)); +} + +void AccessibilityMainHandler::StateChanged( + screen_ai::ScreenAIInstallState::State state) { + base::Value state_value = base::Value(static_cast<int>(state)); + FireWebUIListener("pdf-ocr-state-changed", state_value); +} + +void AccessibilityMainHandler::HandleGetScreenAIInstallState( + const base::Value::List& args) { + CHECK_EQ(1U, args.size()); + const base::Value& callback_id = args[0]; + AllowJavascript(); + // Get the current install state and send it back to a UI callback. + screen_ai::ScreenAIInstallState::State current_install_state = + screen_ai::ScreenAIInstallState::GetInstance()->get_state(); + ResolveJavascriptCallback( + callback_id, base::Value(static_cast<int>(current_install_state))); } +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) -void AccessibilityMainHandler::HandleA11yPageReady( +void AccessibilityMainHandler::HandleGetScreenReaderState( const base::Value::List& args) { + CHECK_EQ(1U, args.size()); + const base::Value& callback_id = args[0]; AllowJavascript(); - SendScreenReaderStateChanged(); + // Get the current install state and send it back to a UI callback. + base::Value is_screen_reader_enabled( + accessibility_state_utils::IsScreenReaderEnabled()); + ResolveJavascriptCallback(callback_id, is_screen_reader_enabled); } void AccessibilityMainHandler::HandleCheckAccessibilityImageLabels( diff --git a/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.h b/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.h index 913d3e70344..e8f6cf20bf3 100644 --- a/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler.h @@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_ACCESSIBILITY_MAIN_HANDLER_H_ #define CHROME_BROWSER_UI_WEBUI_SETTINGS_ACCESSIBILITY_MAIN_HANDLER_H_ +#include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" @@ -12,11 +13,22 @@ #include "chrome/browser/ash/accessibility/accessibility_manager.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) +#include "base/scoped_observation.h" +#include "chrome/browser/screen_ai/screen_ai_install_state.h" +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) + namespace settings { // Settings handler for the main accessibility settings page, // chrome://settings/accessibility. -class AccessibilityMainHandler : public ::settings::SettingsPageUIHandler { +class AccessibilityMainHandler + : public ::settings::SettingsPageUIHandler +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) + , + public screen_ai::ScreenAIInstallState::Observer +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) +{ public: AccessibilityMainHandler(); ~AccessibilityMainHandler() override; @@ -28,10 +40,20 @@ class AccessibilityMainHandler : public ::settings::SettingsPageUIHandler { void OnJavascriptAllowed() override; void OnJavascriptDisallowed() override; - void HandleA11yPageReady(const base::Value::List& args); - void HandleCheckAccessibilityImageLabels(const base::Value::List& args); +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) + // screen_ai::ScreenAIInstallState::Observer: + void DownloadProgressChanged(double progress) override; + void StateChanged(screen_ai::ScreenAIInstallState::State state) override; +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) private: + void HandleGetScreenReaderState(const base::Value::List& args); + void HandleCheckAccessibilityImageLabels(const base::Value::List& args); + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) + void HandleGetScreenAIInstallState(const base::Value::List& args); +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) + void SendScreenReaderStateChanged(); #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -40,6 +62,12 @@ class AccessibilityMainHandler : public ::settings::SettingsPageUIHandler { base::CallbackListSubscription accessibility_subscription_; #endif // BUILDFLAG(IS_CHROMEOS_ASH) + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) + base::ScopedObservation<screen_ai::ScreenAIInstallState, + screen_ai::ScreenAIInstallState::Observer> + component_ready_observer_{this}; +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) }; } // namespace settings diff --git a/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler_unittest.cc new file mode 100644 index 00000000000..b13f44c5228 --- /dev/null +++ b/chromium/chrome/browser/ui/webui/settings/accessibility_main_handler_unittest.cc @@ -0,0 +1,228 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/settings/accessibility_main_handler.h" + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) +#include <memory> + +#include "base/memory/raw_ptr.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/browser/screen_ai/screen_ai_install_state.h" +#include "chrome/test/base/testing_profile.h" +#include "content/public/browser/web_contents.h" +#include "content/public/test/browser_task_environment.h" +#include "content/public/test/test_web_ui.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/accessibility/accessibility_features.h" +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) + +namespace settings { + +namespace { + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) +const char kWebUIListenerCall[] = "cr.webUIListenerCallback"; +const char kPdfOcrDownloadingProgressChangedEventName[] = + "pdf-ocr-downloading-progress-changed"; +const char kPdfOcrStateChangedEventName[] = "pdf-ocr-state-changed"; + +class TestScreenAIInstallState : public screen_ai::ScreenAIInstallState { + public: + TestScreenAIInstallState() = default; + + TestScreenAIInstallState(const TestScreenAIInstallState&) = delete; + TestScreenAIInstallState& operator=(const TestScreenAIInstallState&) = delete; + + ~TestScreenAIInstallState() override = default; + + // screen_ai::ScreenAIInstallState: + void SetLastUsageTime() override {} + void DownloadComponentInternal() override {} +}; + +class TestAccessibilityMainHandler : public AccessibilityMainHandler { + public: + explicit TestAccessibilityMainHandler( + TestScreenAIInstallState* screen_ai_install_state) + : test_screen_ai_install_state_(screen_ai_install_state) {} + + ~TestAccessibilityMainHandler() override = default; + + // Make public for testing. + using AccessibilityMainHandler::AllowJavascript; + using AccessibilityMainHandler::set_web_ui; + + private: + raw_ptr<TestScreenAIInstallState> test_screen_ai_install_state_ = nullptr; + base::ScopedObservation<screen_ai::ScreenAIInstallState, + screen_ai::ScreenAIInstallState::Observer> + component_ready_observer_{this}; +}; +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) + +} // namespace + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) +class AccessibilityMainHandlerPdfOcrTest : public testing::Test { + public: + AccessibilityMainHandlerPdfOcrTest() : features_({features::kPdfOcr}) {} + + AccessibilityMainHandlerPdfOcrTest( + const AccessibilityMainHandlerPdfOcrTest&) = delete; + AccessibilityMainHandlerPdfOcrTest& operator=( + const AccessibilityMainHandlerPdfOcrTest&) = delete; + + ~AccessibilityMainHandlerPdfOcrTest() override = default; + + // testing::Test: + void SetUp() override { + TestingProfile::Builder builder; + profile_ = builder.Build(); + web_contents_ = content::WebContents::Create( + content::WebContents::CreateParams(profile_.get())); + + test_web_ui_ = std::make_unique<content::TestWebUI>(); + test_web_ui_->set_web_contents(web_contents_.get()); + + test_screen_ai_install_state_ = + std::make_unique<TestScreenAIInstallState>(); + + handler_ = std::make_unique<TestAccessibilityMainHandler>( + test_screen_ai_install_state_.get()); + handler_->set_web_ui(test_web_ui_.get()); + handler_->RegisterMessages(); + handler_->AllowJavascript(); + ASSERT_TRUE(handler_->IsJavascriptAllowed()); + + // Run until idle so the handler picks up initial screen ai install state, + // which is screen_ai::ScreenAIInstallState::State::kNotDownloaded. + browser_task_environment_.RunUntilIdle(); + } + + void TearDown() override { handler_.reset(); } + + void ExpectCallToWebUI(const std::string& type, + const std::string& func_name, + const int expected_arg, + size_t call_count) { + EXPECT_EQ(test_web_ui()->call_data().size(), call_count); + // Get the last call data based on the given call_count value. + const content::TestWebUI::CallData& call_data = + *test_web_ui()->call_data()[call_count - 1]; + EXPECT_EQ(call_data.function_name(), type); + EXPECT_EQ(call_data.arg1()->GetString(), func_name); + EXPECT_EQ(call_data.arg2()->GetInt(), expected_arg); + } + + void SimulateSetDownloadProgress(double progress) { + test_screen_ai_install_state_->SetDownloadProgress(progress); + } + + void SimulateSetState(screen_ai::ScreenAIInstallState::State state) { + test_screen_ai_install_state_->SetStateForTesting(state); + } + + content::TestWebUI* test_web_ui() const { return test_web_ui_.get(); } + TestAccessibilityMainHandler* handler() const { return handler_.get(); } + + protected: + base::test::ScopedFeatureList features_; + content::BrowserTaskEnvironment browser_task_environment_; + + std::unique_ptr<TestAccessibilityMainHandler> handler_; + std::unique_ptr<TestingProfile> profile_; + std::unique_ptr<TestScreenAIInstallState> test_screen_ai_install_state_; + std::unique_ptr<content::TestWebUI> test_web_ui_; + std::unique_ptr<content::WebContents> web_contents_; +}; + +TEST_F(AccessibilityMainHandlerPdfOcrTest, MessageForScreenAIDownloadingState) { + size_t call_data_count_before_call = test_web_ui()->call_data().size(); + + screen_ai::ScreenAIInstallState::State state = + screen_ai::ScreenAIInstallState::State::kDownloading; + SimulateSetState(state); + ExpectCallToWebUI(kWebUIListenerCall, kPdfOcrStateChangedEventName, + /*expected_arg=*/static_cast<int>(state), + /*call_count=*/call_data_count_before_call + 1u); +} + +TEST_F(AccessibilityMainHandlerPdfOcrTest, + MessageForScreenAIDownloadingProgress) { + // State needs to be `kDownloading` before updating the download progress. + size_t call_data_count_before_call = test_web_ui()->call_data().size(); + + screen_ai::ScreenAIInstallState::State state = + screen_ai::ScreenAIInstallState::State::kDownloading; + SimulateSetState(state); + ExpectCallToWebUI(kWebUIListenerCall, kPdfOcrStateChangedEventName, + /*expected_arg=*/static_cast<int>(state), + /*call_count=*/++call_data_count_before_call); + + const double progress = 0.3; + SimulateSetDownloadProgress(progress); + // `progress` is expected to be converted into percentage in a message. + const int expected_progress_in_percentage = progress * 100; + ExpectCallToWebUI(kWebUIListenerCall, + kPdfOcrDownloadingProgressChangedEventName, + /*expected_arg=*/expected_progress_in_percentage, + /*call_count=*/call_data_count_before_call + 1u); +} + +TEST_F(AccessibilityMainHandlerPdfOcrTest, MessageForScreenAIDownloadedState) { + size_t call_data_count_before_call = test_web_ui()->call_data().size(); + + screen_ai::ScreenAIInstallState::State state = + screen_ai::ScreenAIInstallState::State::kDownloaded; + SimulateSetState(state); + ExpectCallToWebUI(kWebUIListenerCall, kPdfOcrStateChangedEventName, + /*expected_arg=*/static_cast<int>(state), + /*call_count=*/call_data_count_before_call + 1u); +} + +TEST_F(AccessibilityMainHandlerPdfOcrTest, + MessageForScreenAIDownloadFailedState) { + size_t call_data_count_before_call = test_web_ui()->call_data().size(); + + screen_ai::ScreenAIInstallState::State state = + screen_ai::ScreenAIInstallState::State::kFailed; + SimulateSetState(state); + ExpectCallToWebUI(kWebUIListenerCall, kPdfOcrStateChangedEventName, + /*expected_arg=*/static_cast<int>(state), + /*call_count=*/call_data_count_before_call + 1u); +} + +TEST_F(AccessibilityMainHandlerPdfOcrTest, MessageForScreenAIReadyState) { + size_t call_data_count_before_call = test_web_ui()->call_data().size(); + + screen_ai::ScreenAIInstallState::State state = + screen_ai::ScreenAIInstallState::State::kReady; + SimulateSetState(state); + ExpectCallToWebUI(kWebUIListenerCall, kPdfOcrStateChangedEventName, + /*expected_arg=*/static_cast<int>(state), + /*call_count=*/call_data_count_before_call + 1u); +} + +TEST_F(AccessibilityMainHandlerPdfOcrTest, + MessageForScreenAINotDownloadedState) { + size_t call_data_count_before_call = test_web_ui()->call_data().size(); + + // Either `kReady` or `kFailed` needs to be set for testing `kNotDownloaded`. + screen_ai::ScreenAIInstallState::State state = + screen_ai::ScreenAIInstallState::State::kReady; + SimulateSetState(state); + ExpectCallToWebUI(kWebUIListenerCall, kPdfOcrStateChangedEventName, + /*expected_arg=*/static_cast<int>(state), + /*call_count=*/++call_data_count_before_call); + + state = screen_ai::ScreenAIInstallState::State::kNotDownloaded; + SimulateSetState(state); + ExpectCallToWebUI(kWebUIListenerCall, kPdfOcrStateChangedEventName, + /*expected_arg=*/static_cast<int>(state), + /*call_count=*/call_data_count_before_call + 1u); +} +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) + +} // namespace settings diff --git a/chromium/chrome/browser/ui/webui/settings/captions_handler.cc b/chromium/chrome/browser/ui/webui/settings/captions_handler.cc index 0ac89f33672..4bd32f5100d 100644 --- a/chromium/chrome/browser/ui/webui/settings/captions_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/captions_handler.cc @@ -6,7 +6,6 @@ #include "base/containers/contains.h" #include "base/functional/bind.h" -#include "base/strings/string_split.h" #include "base/values.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" @@ -36,14 +35,6 @@ constexpr char kCodeKey[] = "code"; constexpr char kDisplayNameKey[] = "displayName"; constexpr char kNativeDisplayNameKey[] = "nativeDisplayName"; -// Gets a list of locales enabled by the Finch flag. -std::vector<std::string> GetEnabledLanguages() { - return base::SplitString( - base::GetFieldTrialParamValueByFeature(media::kLiveCaptionMultiLanguage, - "available_languages"), - ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); -} - base::Value::List SortByDisplayName( std::vector<base::Value::Dict> language_packs) { std::sort(language_packs.begin(), language_packs.end(), @@ -165,7 +156,7 @@ void CaptionsHandler::HandleInstallLanguagePacks( } base::Value::List CaptionsHandler::GetAvailableLanguagePacks() { - auto enabled_languages = GetEnabledLanguages(); + auto enabled_languages = speech::GetEnabledLanguages(); std::vector<base::Value::Dict> available_language_packs; for (const auto& config : speech::kLanguageComponentConfigs) { if (config.language_code != speech::LanguageCode::kNone && @@ -192,7 +183,7 @@ base::Value::List CaptionsHandler::GetInstalledLanguagePacks() { for (const auto& language : g_browser_process->local_state()->GetList( prefs::kSodaRegisteredLanguagePacks)) { base::Value::Dict installed_language_pack; - const absl::optional<speech::SodaLanguagePackComponentConfig> config = + const std::optional<speech::SodaLanguagePackComponentConfig> config = speech::GetLanguageComponentConfig(language.GetString()); if (config && config->language_code != speech::LanguageCode::kNone) { installed_language_pack.Set(kCodeKey, language.GetString()); diff --git a/chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.cc b/chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.cc index 6c3e46fa87a..b03fba90323 100644 --- a/chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.cc +++ b/chromium/chrome/browser/ui/webui/settings/custom_home_pages_table_model.cc @@ -161,7 +161,7 @@ void CustomHomePagesTableModel::SetToCurrentlyOpenPages( // Add tabs from appropriate browser windows. size_t add_index = 0; - for (auto* browser : *BrowserList::GetInstance()) { + for (Browser* browser : *BrowserList::GetInstance()) { if (!ShouldIncludeBrowser(browser)) continue; diff --git a/chromium/chrome/browser/ui/webui/settings/downloads_handler.cc b/chromium/chrome/browser/ui/webui/settings/downloads_handler.cc index 437c8cd337e..e95a52a8148 100644 --- a/chromium/chrome/browser/ui/webui/settings/downloads_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/downloads_handler.cc @@ -19,6 +19,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/shell_dialogs/selected_file_info.h" #if BUILDFLAG(IS_CHROMEOS_ASH) #include "chrome/browser/ash/file_manager/path_util.h" @@ -110,15 +111,15 @@ void DownloadsHandler::HandleSelectDownloadLocation( web_ui()->GetWebContents()->GetTopLevelNativeWindow(), nullptr); } -void DownloadsHandler::FileSelected(const base::FilePath& path, +void DownloadsHandler::FileSelected(const ui::SelectedFileInfo& file, int index, void* params) { select_folder_dialog_ = nullptr; base::RecordAction(UserMetricsAction("Options_SetDownloadDirectory")); PrefService* pref_service = profile_->GetPrefs(); - pref_service->SetFilePath(prefs::kDownloadDefaultDirectory, path); - pref_service->SetFilePath(prefs::kSaveFileDefaultDirectory, path); + pref_service->SetFilePath(prefs::kDownloadDefaultDirectory, file.path()); + pref_service->SetFilePath(prefs::kSaveFileDefaultDirectory, file.path()); } void DownloadsHandler::FileSelectionCanceled(void* params) { diff --git a/chromium/chrome/browser/ui/webui/settings/downloads_handler.h b/chromium/chrome/browser/ui/webui/settings/downloads_handler.h index 795319577c9..fd19956b174 100644 --- a/chromium/chrome/browser/ui/webui/settings/downloads_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/downloads_handler.h @@ -50,7 +50,7 @@ class DownloadsHandler : public SettingsPageUIHandler, void HandleSelectDownloadLocation(const base::Value::List& args); // SelectFileDialog::Listener implementation. - void FileSelected(const base::FilePath& path, + void FileSelected(const ui::SelectedFileInfo& file, int index, void* params) override; void FileSelectionCanceled(void* params) override; diff --git a/chromium/chrome/browser/ui/webui/settings/hats_handler.cc b/chromium/chrome/browser/ui/webui/settings/hats_handler.cc index 05ad16ca957..f18b7c37b1b 100644 --- a/chromium/chrome/browser/ui/webui/settings/hats_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/hats_handler.cc @@ -5,6 +5,7 @@ #include "chrome/browser/ui/webui/settings/hats_handler.h" #include "base/functional/bind.h" +#include "base/metrics/histogram_functions.h" #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/hats/hats_service.h" @@ -32,12 +33,8 @@ SurveyBitsData GetPrivacySettingsProductSpecificBitsData(Profile* profile) { static_cast<content_settings::CookieControlsMode>( profile->GetPrefs()->GetInteger(prefs::kCookieControlsMode)) == content_settings::CookieControlsMode::kBlockThirdParty; - const bool privacy_sandbox_enabled = - PrivacySandboxSettingsFactory::GetForProfile(profile) - ->IsPrivacySandboxEnabled(); - return {{"3P cookies blocked", third_party_cookies_blocked}, - {"Privacy Sandbox enabled", privacy_sandbox_enabled}}; + return {{"3P cookies blocked", third_party_cookies_blocked}}; } // Generate the Product Specific bits data which accompanies M1 Ad Privacy @@ -73,8 +70,8 @@ void HatsHandler::RegisterMessages() { base::BindRepeating(&HatsHandler::HandleTrustSafetyInteractionOccurred, base::Unretained(this))); web_ui()->RegisterMessageCallback( - "securityPageInteractionOccurred", - base::BindRepeating(&HatsHandler::HandleSecurityPageInteractionOccurred, + "securityPageHatsRequest", + base::BindRepeating(&HatsHandler::HandleSecurityPageHatsRequest, base::Unretained(this))); } @@ -82,14 +79,15 @@ void HatsHandler::RegisterMessages() { * First arg in the list indicates the SecurityPageInteraction. * Second arg in the list indicates the SafeBrowsingSetting. */ -void HatsHandler::HandleSecurityPageInteractionOccurred( - const base::Value::List& args) { +void HatsHandler::HandleSecurityPageHatsRequest(const base::Value::List& args) { AllowJavascript(); - // There are 2 argument in the input list. + // There are 3 argument in the input list. // The first one is the SecurityPageInteraction that triggered the survey. // The second one is the safe browsing setting the user was on. - CHECK_EQ(2U, args.size()); + // The third one is the total amount of time a user spent on the security page + // in focus. + CHECK_EQ(3U, args.size()); Profile* profile = Profile::FromWebUI(web_ui()); @@ -109,23 +107,42 @@ void HatsHandler::HandleSecurityPageInteractionOccurred( return; } + // Do not send the survey if the user didn't stay on the page long enough. + if (args[2].GetDouble() < + features::kHappinessTrackingSurveysForSecurityPageTime.Get() + .InMilliseconds()) { + return; + } + + auto interaction = static_cast<SecurityPageInteraction>(args[0].GetInt()); + if (features::kHappinessTrackingSurveysForSecurityPageRequireInteraction + .Get() && + interaction == SecurityPageInteraction::NO_INTERACTION) { + return; + } + // Generate the Product Specific bits data from |profile| and |args|. SurveyStringData product_specific_string_data = GetSecurityPageProductSpecificStringData(profile, args); - hats_service->LaunchDelayedSurveyForWebContents( - kHatsSurveyTriggerSettingsSecurity, web_ui()->GetWebContents(), - features::kHappinessTrackingSurveysForSecurityPageTime.Get() - .InMilliseconds(), + hats_service->LaunchSurvey( + kHatsSurveyTriggerSettingsSecurity, + /*success_callback*/ base::DoNothing(), + /*failure_callback*/ base::DoNothing(), /*product_specific_bits_data=*/{}, - /*product_specific_string_data=*/product_specific_string_data, - /*require_same_origin=*/true); + /*product_specific_string_data=*/product_specific_string_data); + + // Log histogram that indicates that a survey is requested from the security + // page. + base::UmaHistogramBoolean("Feedback.SecurityPage.SurveyRequested", true); } /** * Generate the Product Specific string data from |profile| and |args|. * - First arg in the list indicates the SecurityPageInteraction. * - Second arg in the list indicates the SafeBrowsingSetting. + * - Third arg in the list indicates the amount of time user spent on the + * security page in focus. */ SurveyStringData HatsHandler::GetSecurityPageProductSpecificStringData( Profile* profile, @@ -155,12 +172,16 @@ SurveyStringData HatsHandler::GetSecurityPageProductSpecificStringData( } case SecurityPageInteraction::EXPAND_BUTTON_ENHANCED_CLICK: { security_page_interaction_type = - "enhanced_protection_expand_button_clicked."; + "enhanced_protection_expand_button_clicked"; break; } case SecurityPageInteraction::EXPAND_BUTTON_STANDARD_CLICK: { security_page_interaction_type = - "standard_protection_expand_button_clicked."; + "standard_protection_expand_button_clicked"; + break; + } + case SecurityPageInteraction::NO_INTERACTION: { + security_page_interaction_type = "no_interaction"; break; } } @@ -200,7 +221,7 @@ SurveyStringData HatsHandler::GetSecurityPageProductSpecificStringData( {"Safe Browsing Setting Before Trigger", safe_browsing_setting_before}, {"Safe Browsing Setting After Trigger", safe_browsing_setting_current}, {"Client Channel", client_channel}, - }; + {"Time On Page", std::to_string(args[2].GetDouble())}}; } void HatsHandler::HandleTrustSafetyInteractionOccurred( @@ -232,19 +253,9 @@ void HatsHandler::RequestHatsSurvey(TrustSafetyInteraction interaction) { std::string trigger = ""; int timeout_ms = 0; SurveyBitsData product_specific_bits_data = {}; - bool require_same_origin = false; + auto navigation_behaviour = HatsService::NavigationBehaviour::ALLOW_ANY; switch (interaction) { - case TrustSafetyInteraction::OPENED_PRIVACY_SANDBOX: { - trigger = kHatsSurveyTriggerPrivacySandbox; - timeout_ms = - features::kHappinessTrackingSurveysForDesktopPrivacySandboxTime.Get() - .InMilliseconds(); - product_specific_bits_data = - GetPrivacySettingsProductSpecificBitsData(profile); - require_same_origin = true; - break; - } case TrustSafetyInteraction::RAN_SAFETY_CHECK: [[fallthrough]]; case TrustSafetyInteraction::USED_PRIVACY_CARD: { @@ -257,22 +268,14 @@ void HatsHandler::RequestHatsSurvey(TrustSafetyInteraction interaction) { prefs::kPrivacyGuideViewed)) { return; } - // If the privacy settings survey is explicitly targeting users who have - // not viewed the Privacy Sandbox page, and this user has viewed the page, - // do not attempt to show the privacy settings survey. - if (features::kHappinessTrackingSurveysForDesktopSettingsPrivacyNoSandbox - .Get() && - Profile::FromWebUI(web_ui())->GetPrefs()->GetBoolean( - prefs::kPrivacySandboxPageViewed)) { - return; - } trigger = kHatsSurveyTriggerSettingsPrivacy; timeout_ms = features::kHappinessTrackingSurveysForDesktopSettingsPrivacyTime.Get() .InMilliseconds(); product_specific_bits_data = GetPrivacySettingsProductSpecificBitsData(profile); - require_same_origin = true; + navigation_behaviour = + HatsService::NavigationBehaviour::REQUIRE_SAME_ORIGIN; break; } case TrustSafetyInteraction::COMPLETED_PRIVACY_GUIDE: { @@ -280,7 +283,8 @@ void HatsHandler::RequestHatsSurvey(TrustSafetyInteraction interaction) { timeout_ms = features::kHappinessTrackingSurveysForDesktopPrivacyGuideTime.Get() .InMilliseconds(); - require_same_origin = true; + navigation_behaviour = + HatsService::NavigationBehaviour::REQUIRE_SAME_ORIGIN; break; } case TrustSafetyInteraction::OPENED_AD_PRIVACY: { @@ -288,7 +292,8 @@ void HatsHandler::RequestHatsSurvey(TrustSafetyInteraction interaction) { timeout_ms = features::kHappinessTrackingSurveysForDesktopM1AdPrivacyPageTime.Get() .InMilliseconds(); - require_same_origin = true; + navigation_behaviour = + HatsService::NavigationBehaviour::REQUIRE_SAME_ORIGIN; product_specific_bits_data = GetAdPrivacyProductSpecificBitsData(profile); break; } @@ -297,7 +302,8 @@ void HatsHandler::RequestHatsSurvey(TrustSafetyInteraction interaction) { timeout_ms = features::kHappinessTrackingSurveysForDesktopM1TopicsSubpageTime.Get() .InMilliseconds(); - require_same_origin = true; + navigation_behaviour = + HatsService::NavigationBehaviour::REQUIRE_SAME_ORIGIN; product_specific_bits_data = GetAdPrivacyProductSpecificBitsData(profile); break; } @@ -306,7 +312,8 @@ void HatsHandler::RequestHatsSurvey(TrustSafetyInteraction interaction) { timeout_ms = features::kHappinessTrackingSurveysForDesktopM1FledgeSubpageTime.Get() .InMilliseconds(); - require_same_origin = true; + navigation_behaviour = + HatsService::NavigationBehaviour::REQUIRE_SAME_ORIGIN; product_specific_bits_data = GetAdPrivacyProductSpecificBitsData(profile); break; } @@ -317,10 +324,21 @@ void HatsHandler::RequestHatsSurvey(TrustSafetyInteraction interaction) { kHappinessTrackingSurveysForDesktopM1AdMeasurementSubpageTime .Get() .InMilliseconds(); - require_same_origin = true; + navigation_behaviour = + HatsService::NavigationBehaviour::REQUIRE_SAME_ORIGIN; product_specific_bits_data = GetAdPrivacyProductSpecificBitsData(profile); break; } +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) + case TrustSafetyInteraction::OPENED_GET_MOST_CHROME: { + trigger = kHatsSurveyTriggerGetMostChrome; + timeout_ms = features::kHappinessTrackingSurveysGetMostChromeTime.Get() + .InMilliseconds(); + navigation_behaviour = + HatsService::NavigationBehaviour::REQUIRE_SAME_DOCUMENT; + break; + } +#endif case TrustSafetyInteraction::OPENED_PASSWORD_MANAGER: [[fallthrough]]; case TrustSafetyInteraction::RAN_PASSWORD_CHECK: { @@ -334,7 +352,7 @@ void HatsHandler::RequestHatsSurvey(TrustSafetyInteraction interaction) { hats_service->LaunchDelayedSurveyForWebContents( trigger, web_ui()->GetWebContents(), timeout_ms, product_specific_bits_data, - /*product_specific_string_data=*/{}, require_same_origin); + /*product_specific_string_data=*/{}, navigation_behaviour); } void HatsHandler::InformSentimentService(TrustSafetyInteraction interaction) { diff --git a/chromium/chrome/browser/ui/webui/settings/hats_handler.h b/chromium/chrome/browser/ui/webui/settings/hats_handler.h index 20b7f0f05f3..019cb79adcd 100644 --- a/chromium/chrome/browser/ui/webui/settings/hats_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/hats_handler.h @@ -6,6 +6,7 @@ #define CHROME_BROWSER_UI_WEBUI_SETTINGS_HATS_HANDLER_H_ #include "base/gtest_prod_util.h" +#include "build/branding_buildflags.h" #include "chrome/browser/ui/hats/hats_service.h" #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" @@ -27,7 +28,7 @@ class HatsHandler : public SettingsPageUIHandler { void HandleTrustSafetyInteractionOccurred(const base::Value::List& args); - void HandleSecurityPageInteractionOccurred(const base::Value::List& args); + void HandleSecurityPageHatsRequest(const base::Value::List& args); private: friend class HatsHandlerTest; @@ -35,12 +36,23 @@ class HatsHandler : public SettingsPageUIHandler { FRIEND_TEST_ALL_PREFIXES(HatsHandlerTest, PrivacySettingsHats); FRIEND_TEST_ALL_PREFIXES(HatsHandlerTest, PrivacyGuideHats); FRIEND_TEST_ALL_PREFIXES(HatsHandlerTest, PrivacySandboxHats); - FRIEND_TEST_ALL_PREFIXES(HatsHandlerTest, SecurityPageInteractions); + FRIEND_TEST_ALL_PREFIXES( + HatsHandlerTest, + HandleSecurityPageHatsRequestPassesArgumentsToHatsService); + FRIEND_TEST_ALL_PREFIXES( + HatsHandlerTest, + HandleSecurityPageHatsRequestPassesArgumentsToHatsServiceNotLaunchSurveyNotEnoughTime); + FRIEND_TEST_ALL_PREFIXES( + HatsHandlerTest, + HandleSecurityPageHatsRequestPassesArgumentsToHatsServiceNotLaunchSurveyNoInteraction); FRIEND_TEST_ALL_PREFIXES(HatsHandlerTest, TrustSafetySentimentInteractions); FRIEND_TEST_ALL_PREFIXES(HatsHandlerNoSandboxTest, PrivacySettings); FRIEND_TEST_ALL_PREFIXES(HatsHandlerNoSandboxTest, TrustSafetySentimentInteractions); FRIEND_TEST_ALL_PREFIXES(HatsHandlerParamTest, AdPrivacyHats); +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) + FRIEND_TEST_ALL_PREFIXES(HatsHandlerTest, GetMostChromeHats); +#endif // All Trust & Safety based interactions which may result in a HaTS survey. // Must be kept in sync with the enum of the same name in @@ -48,7 +60,7 @@ class HatsHandler : public SettingsPageUIHandler { enum class TrustSafetyInteraction { RAN_SAFETY_CHECK = 0, USED_PRIVACY_CARD = 1, - OPENED_PRIVACY_SANDBOX = 2, + // OPENED_PRIVACY_SANDBOX = 2, // DEPRECATED OPENED_PASSWORD_MANAGER = 3, COMPLETED_PRIVACY_GUIDE = 4, RAN_PASSWORD_CHECK = 5, @@ -56,6 +68,9 @@ class HatsHandler : public SettingsPageUIHandler { OPENED_TOPICS_SUBPAGE = 7, OPENED_FLEDGE_SUBPAGE = 8, OPENED_AD_MEASUREMENT_SUBPAGE = 9, +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) + OPENED_GET_MOST_CHROME = 10, +#endif }; /** @@ -68,7 +83,8 @@ class HatsHandler : public SettingsPageUIHandler { RADIO_BUTTON_STANDARD_CLICK = 1, RADIO_BUTTON_DISABLE_CLICK = 2, EXPAND_BUTTON_ENHANCED_CLICK = 3, - EXPAND_BUTTON_STANDARD_CLICK = 4 + EXPAND_BUTTON_STANDARD_CLICK = 4, + NO_INTERACTION = 5, }; /** diff --git a/chromium/chrome/browser/ui/webui/settings/hats_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/hats_handler_unittest.cc index 345c70f0482..ff3c6262e4c 100644 --- a/chromium/chrome/browser/ui/webui/settings/hats_handler_unittest.cc +++ b/chromium/chrome/browser/ui/webui/settings/hats_handler_unittest.cc @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "build/build_config.h" #include "chrome/browser/ui/webui/settings/hats_handler.h" #include <memory> @@ -9,6 +10,7 @@ #include "base/memory/raw_ptr.h" #include "base/values.h" +#include "build/branding_buildflags.h" #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h" #include "chrome/browser/ui/hats/hats_service.h" #include "chrome/browser/ui/hats/hats_service_factory.h" @@ -37,14 +39,14 @@ class HatsHandlerTest : public ChromeRenderViewHostTestHarness { base::test::FeatureRefAndParams settings_privacy{ features::kHappinessTrackingSurveysForDesktopSettingsPrivacy, {{"settings-time", "15s"}}}; - base::test::FeatureRefAndParams privacy_sandbox{ - features::kHappinessTrackingSurveysForDesktopPrivacySandbox, - {{"settings-time", "10s"}}}; base::test::FeatureRefAndParams privacy_guide{ features::kHappinessTrackingSurveysForDesktopPrivacyGuide, {{"settings-time", "15s"}}}; + base::test::FeatureRefAndParams security_page{ + features::kHappinessTrackingSurveysForSecurityPage, + {{"security-page-time", "15s"}}}; scoped_feature_list_.InitWithFeaturesAndParameters( - {settings_privacy, privacy_sandbox, privacy_guide}, {}); + {settings_privacy, privacy_guide, security_page}, {}); } void SetUp() override { @@ -95,20 +97,20 @@ class HatsHandlerTest : public ChromeRenderViewHostTestHarness { }; TEST_F(HatsHandlerTest, PrivacySettingsHats) { - PrivacySandboxSettingsFactory::GetForProfile(profile()) - ->SetPrivacySandboxEnabled(false); profile()->GetPrefs()->SetInteger( prefs::kCookieControlsMode, static_cast<int>(content_settings::CookieControlsMode::kBlockThirdParty)); SurveyBitsData expected_product_specific_data = { - {"3P cookies blocked", true}, {"Privacy Sandbox enabled", false}}; + {"3P cookies blocked", true}}; // Check that both interacting with the privacy card, and running Safety Check // result in a survey request with the appropriate product specific data. - EXPECT_CALL(*mock_hats_service_, - LaunchDelayedSurveyForWebContents( - kHatsSurveyTriggerSettingsPrivacy, web_contents(), 15000, - expected_product_specific_data, _, true)) + EXPECT_CALL( + *mock_hats_service_, + LaunchDelayedSurveyForWebContents( + kHatsSurveyTriggerSettingsPrivacy, web_contents(), 15000, + expected_product_specific_data, _, + HatsService::NavigationBehaviour::REQUIRE_SAME_ORIGIN, _, _, _, _)) .Times(2); base::Value::List args; args.Append( @@ -124,9 +126,11 @@ TEST_F(HatsHandlerTest, PrivacySettingsHats) { TEST_F(HatsHandlerTest, PrivacyGuideHats) { // Check that completing a privacy guide triggers a privacy guide hats. - EXPECT_CALL(*mock_hats_service_, LaunchDelayedSurveyForWebContents( - kHatsSurveyTriggerPrivacyGuide, - web_contents(), 15000, _, _, true)) + EXPECT_CALL( + *mock_hats_service_, + LaunchDelayedSurveyForWebContents( + kHatsSurveyTriggerPrivacyGuide, web_contents(), 15000, _, _, + HatsService::NavigationBehaviour::REQUIRE_SAME_ORIGIN, _, _, _, _)) .Times(1); base::Value::List args; args.Append(static_cast<int>( @@ -135,86 +139,157 @@ TEST_F(HatsHandlerTest, PrivacyGuideHats) { task_environment()->RunUntilIdle(); } -TEST_F(HatsHandlerTest, SecurityPageInteractions) { +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +TEST_F(HatsHandlerTest, GetMostChromeHats) { + // Check that visiting the "Get the most out of Chrome" page triggers the + // corresponding hats. + EXPECT_CALL( + *mock_hats_service_, + LaunchDelayedSurveyForWebContents( + kHatsSurveyTriggerGetMostChrome, web_contents(), _, _, _, + HatsService::NavigationBehaviour::REQUIRE_SAME_DOCUMENT, _, _, _, _)) + .Times(1); + base::Value::List args; + args.Append(static_cast<int>( + HatsHandler::TrustSafetyInteraction::OPENED_GET_MOST_CHROME)); + handler()->HandleTrustSafetyInteractionOccurred(args); + task_environment()->RunUntilIdle(); +} +#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) + +#if BUILDFLAG(IS_CHROMEOS) +#define MAYBE_HandleSecurityPageHatsRequestPassesArgumentsToHatsService \ + DISABLED_HandleSecurityPageHatsRequestPassesArgumentsToHatsService +#else +#define MAYBE_HandleSecurityPageHatsRequestPassesArgumentsToHatsService \ + HandleSecurityPageHatsRequestPassesArgumentsToHatsService +#endif +TEST_F(HatsHandlerTest, + MAYBE_HandleSecurityPageHatsRequestPassesArgumentsToHatsService) { SurveyStringData expected_product_specific_data = { {"Security Page User Action", "enhanced_protection_radio_button_clicked"}, {"Safe Browsing Setting Before Trigger", "standard_protection"}, {"Safe Browsing Setting After Trigger", "standard_protection"}, +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) + {"Client Channel", "stable"}, +#else {"Client Channel", "unknown"}, +#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) + {"Time On Page", "20000.000000"}, }; // Check that triggering the security page handler function will trigger HaTS // correctly. EXPECT_CALL(*mock_hats_service_, - LaunchDelayedSurveyForWebContents( - kHatsSurveyTriggerSettingsSecurity, web_contents(), 15000, _, - expected_product_specific_data, true)) + LaunchSurvey(kHatsSurveyTriggerSettingsSecurity, _, _, _, + expected_product_specific_data)) .Times(1); base::Value::List args; args.Append(static_cast<int>( HatsHandler::SecurityPageInteraction::RADIO_BUTTON_ENHANCED_CLICK)); args.Append(static_cast<int>(HatsHandler::SafeBrowsingSetting::STANDARD)); + // Set the time spent on the page to 20,000 milliseconds, which is longer than + // the configured value from Finch, 15,000 milliseconds. + args.Append(20000); profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled, true); profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingSurveysEnabled, true); - handler()->HandleSecurityPageInteractionOccurred(args); + handler()->HandleSecurityPageHatsRequest(args); task_environment()->RunUntilIdle(); } -class HatsHandlerNoSandboxTest : public HatsHandlerTest { - public: - HatsHandlerNoSandboxTest() { - scoped_feature_list_.Reset(); - base::test::FeatureRefAndParams settings_privacy{ - features::kHappinessTrackingSurveysForDesktopSettingsPrivacy, - {{"no-sandbox", "true"}}}; - scoped_feature_list_.InitWithFeaturesAndParameters({settings_privacy}, {}); - } -}; +#if BUILDFLAG(IS_CHROMEOS) +#define MAYBE_HandleSecurityPageHatsRequestPassesArgumentsToHatsServiceNotLaunchSurveyNotEnoughTime \ + DISABLED_HandleSecurityPageHatsRequestPassesArgumentsToHatsServiceNotLaunchSurveyNotEnoughTime +#else +#define MAYBE_HandleSecurityPageHatsRequestPassesArgumentsToHatsServiceNotLaunchSurveyNotEnoughTime \ + HandleSecurityPageHatsRequestPassesArgumentsToHatsServiceNotLaunchSurveyNotEnoughTime +#endif +TEST_F( + HatsHandlerTest, + MAYBE_HandleSecurityPageHatsRequestPassesArgumentsToHatsServiceNotLaunchSurveyNotEnoughTime) { + SurveyStringData expected_product_specific_data = { + {"Security Page User Action", "enhanced_protection_radio_button_clicked"}, + {"Safe Browsing Setting Before Trigger", "standard_protection"}, + {"Safe Browsing Setting After Trigger", "standard_protection"}, +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) + {"Client Channel", "stable"}, +#else + {"Client Channel", "unknown"}, +#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) + {"Time On Page", "10000"}, + }; -TEST_F(HatsHandlerNoSandboxTest, PrivacySettings) { - PrivacySandboxSettingsFactory::GetForProfile(profile()) - ->SetPrivacySandboxEnabled(false); - profile()->GetPrefs()->SetInteger( - prefs::kCookieControlsMode, - static_cast<int>(content_settings::CookieControlsMode::kBlockThirdParty)); - SurveyBitsData expected_product_specific_data = { - {"3P cookies blocked", true}, {"Privacy Sandbox enabled", false}}; - // Enable targeting for users who have not seen the Privacy Sandbox page and - // ensure the handler does not attempt to launch the survey. + // Check that staying on the security page less than 15,000 ms will not + // trigger the survey. EXPECT_CALL(*mock_hats_service_, - LaunchDelayedSurveyForWebContents(_, _, _, _, _, _)) + LaunchSurvey(kHatsSurveyTriggerSettingsSecurity, _, _, _, + expected_product_specific_data)) .Times(0); - profile()->GetPrefs()->SetBoolean(prefs::kPrivacySandboxPageViewed, true); - base::Value::List args; - args.Append( - static_cast<int>(HatsHandler::TrustSafetyInteraction::USED_PRIVACY_CARD)); - handler()->HandleTrustSafetyInteractionOccurred(args); + args.Append(static_cast<int>( + HatsHandler::SecurityPageInteraction::RADIO_BUTTON_ENHANCED_CLICK)); + args.Append(static_cast<int>(HatsHandler::SafeBrowsingSetting::STANDARD)); + args.Append(10000); + + profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled, true); + profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingSurveysEnabled, true); + + handler()->HandleSecurityPageHatsRequest(args); task_environment()->RunUntilIdle(); } -TEST_F(HatsHandlerTest, PrivacySandboxHats) { - // Check that the handler correctly forwards the survey request to the - // HaTS service and also includes the appropriate product specific data. - PrivacySandboxSettingsFactory::GetForProfile(profile()) - ->SetPrivacySandboxEnabled(false); - profile()->GetPrefs()->SetInteger( - prefs::kCookieControlsMode, - static_cast<int>(content_settings::CookieControlsMode::kBlockThirdParty)); - SurveyBitsData expected_product_specific_data = { - {"3P cookies blocked", true}, {"Privacy Sandbox enabled", false}}; +#if BUILDFLAG(IS_CHROMEOS) +#define MAYBE_HandleSecurityPageHatsRequestPassesArgumentsToHatsServiceNotLaunchSurveyNoInteraction \ + DISABLED_HandleSecurityPageHatsRequestPassesArgumentsToHatsServiceNotLaunchSurveyNoInteraction +#else +#define MAYBE_HandleSecurityPageHatsRequestPassesArgumentsToHatsServiceNotLaunchSurveyNoInteraction \ + HandleSecurityPageHatsRequestPassesArgumentsToHatsServiceNotLaunchSurveyNoInteraction +#endif +TEST_F( + HatsHandlerTest, + MAYBE_HandleSecurityPageHatsRequestPassesArgumentsToHatsServiceNotLaunchSurveyNoInteraction) { + SurveyStringData expected_product_specific_data = { + {"Security Page User Action", "no_interaction"}, + {"Safe Browsing Setting Before Trigger", "standard_protection"}, + {"Safe Browsing Setting After Trigger", "standard_protection"}, +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) + {"Client Channel", "stable"}, +#else + {"Client Channel", "unknown"}, +#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) + {"Time On Page", "20000.000000"}, + }; + + // Reconfigure the feature parameter to require interaction to launch the + // survey. + base::test::FeatureRefAndParams security_page{ + features::kHappinessTrackingSurveysForSecurityPage, + {{"security-page-time", "15s"}, + {"security-page-require-interaction", "true"}}}; + scoped_feature_list_.Reset(); + scoped_feature_list_.InitWithFeaturesAndParameters({security_page}, {}); + + // Verify that if there are no interactions on the security page but user + // interactions are required through finch, the survey will not be shown. EXPECT_CALL(*mock_hats_service_, - LaunchDelayedSurveyForWebContents( - kHatsSurveyTriggerPrivacySandbox, web_contents(), 10000, - expected_product_specific_data, _, true)); + LaunchSurvey(kHatsSurveyTriggerSettingsSecurity, _, _, _, + expected_product_specific_data)) + .Times(0); + base::Value::List args; - args.Append(static_cast<int>( - HatsHandler::TrustSafetyInteraction::OPENED_PRIVACY_SANDBOX)); - handler()->HandleTrustSafetyInteractionOccurred(args); + args.Append( + static_cast<int>(HatsHandler::SecurityPageInteraction::NO_INTERACTION)); + args.Append(static_cast<int>(HatsHandler::SafeBrowsingSetting::STANDARD)); + args.Append(20000); + + profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled, true); + profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingSurveysEnabled, true); + + handler()->HandleSecurityPageHatsRequest(args); task_environment()->RunUntilIdle(); } @@ -235,25 +310,6 @@ TEST_F(HatsHandlerTest, TrustSafetySentimentInteractions) { handler()->HandleTrustSafetyInteractionOccurred(args); } -TEST_F(HatsHandlerNoSandboxTest, TrustSafetySentimentInteractions) { - // A profile & feature state that would exclude the user from receiving the - // Privacy Settings HaTS survey should not stop the sentiment service being - // informed that the interaction occurred. - // Check that interactions relevant to the T&S sentiment service are - // correctly reported. - EXPECT_CALL(*mock_sentiment_service_, RanSafetyCheck()).Times(1); - base::Value::List args; - args.Append( - static_cast<int>(HatsHandler::TrustSafetyInteraction::RAN_SAFETY_CHECK)); - profile()->GetPrefs()->SetBoolean(prefs::kPrivacySandboxPageViewed, true); - handler()->HandleTrustSafetyInteractionOccurred(args); - - EXPECT_CALL(*mock_sentiment_service_, OpenedPasswordManager(web_contents())); - args[0] = base::Value(static_cast<int>( - HatsHandler::TrustSafetyInteraction::OPENED_PASSWORD_MANAGER)); - handler()->HandleTrustSafetyInteractionOccurred(args); -} - class HatsHandlerParamTest : public HatsHandlerTest, public testing::WithParamInterface<bool> {}; @@ -288,10 +344,11 @@ TEST_P(HatsHandlerParamTest, AdPrivacyHats) { }; for (const auto& [interaction, survey] : interaction_to_survey) { - EXPECT_CALL(*mock_hats_service_, - LaunchDelayedSurveyForWebContents( - survey, web_contents(), 20000, - expected_product_specific_data, _, true)); + EXPECT_CALL( + *mock_hats_service_, + LaunchDelayedSurveyForWebContents( + survey, web_contents(), 20000, expected_product_specific_data, _, + HatsService::NavigationBehaviour::REQUIRE_SAME_ORIGIN, _, _, _, _)); base::Value::List args; args.Append(static_cast<int>(interaction)); handler()->HandleTrustSafetyInteractionOccurred(args); diff --git a/chromium/chrome/browser/ui/webui/settings/import_data_handler.cc b/chromium/chrome/browser/ui/webui/settings/import_data_handler.cc index 93d4228dedf..18f9ac15b9f 100644 --- a/chromium/chrome/browser/ui/webui/settings/import_data_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/import_data_handler.cc @@ -27,6 +27,7 @@ #include "chrome/common/pref_names.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/web_ui.h" +#include "ui/shell_dialogs/selected_file_info.h" using content::BrowserThread; @@ -252,7 +253,7 @@ void ImportDataHandler::ImportEnded() { : kImportStatusFailed)); } -void ImportDataHandler::FileSelected(const base::FilePath& path, +void ImportDataHandler::FileSelected(const ui::SelectedFileInfo& file, int /*index*/, void* /*params*/) { DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -261,7 +262,7 @@ void ImportDataHandler::FileSelected(const base::FilePath& path, importer::SourceProfile source_profile; source_profile.importer_type = importer::TYPE_BOOKMARKS_FILE; - source_profile.source_path = path; + source_profile.source_path = file.path(); StartImport(source_profile, importer::FAVORITES); } diff --git a/chromium/chrome/browser/ui/webui/settings/import_data_handler.h b/chromium/chrome/browser/ui/webui/settings/import_data_handler.h index 26544ebffe1..3283dc96949 100644 --- a/chromium/chrome/browser/ui/webui/settings/import_data_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/import_data_handler.h @@ -62,7 +62,7 @@ class ImportDataHandler : public SettingsPageUIHandler, void ImportEnded() override; // ui::SelectFileDialog::Listener: - void FileSelected(const base::FilePath& path, + void FileSelected(const ui::SelectedFileInfo& file, int index, void* params) override; void FileSelectionCanceled(void* params) override; diff --git a/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc b/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc index 668bcc23291..c84d9cb5270 100644 --- a/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc +++ b/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc @@ -10,7 +10,6 @@ #include "base/check_op.h" #include "base/functional/bind.h" -#include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" @@ -106,9 +105,6 @@ void IncompatibleApplicationsHandler::HandleRequestIncompatibleApplicationsList( application_list.Append(std::move(dict)); } - UMA_HISTOGRAM_COUNTS_100("IncompatibleApplicationsPage.NumApplications", - incompatible_applications.size()); - const base::Value& callback_id = args.front(); ResolveJavascriptCallback(callback_id, application_list); } diff --git a/chromium/chrome/browser/ui/webui/settings/languages_handler.h b/chromium/chrome/browser/ui/webui/settings/languages_handler.h index 57909cd7523..367c7e125c7 100644 --- a/chromium/chrome/browser/ui/webui/settings/languages_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/languages_handler.h @@ -45,7 +45,7 @@ class LanguagesHandler : public SettingsPageUIHandler { void HandleSetProspectiveUILanguage(const base::Value::List& args); #if BUILDFLAG(IS_CHROMEOS_ASH) - raw_ptr<Profile, ExperimentalAsh> profile_; // Weak pointer. + raw_ptr<Profile> profile_; // Weak pointer. #endif }; diff --git a/chromium/chrome/browser/ui/webui/settings/people_handler.cc b/chromium/chrome/browser/ui/webui/settings/people_handler.cc index 6888f70788a..59aef1cbf40 100644 --- a/chromium/chrome/browser/ui/webui/settings/people_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/people_handler.cc @@ -4,6 +4,8 @@ #include "chrome/browser/ui/webui/settings/people_handler.h" +#include <memory> +#include <optional> #include <string> #include "base/check_op.h" @@ -41,11 +43,13 @@ #include "chrome/common/url_constants.h" #include "chrome/common/webui_url_constants.h" #include "chrome/grit/generated_resources.h" +#include "components/prefs/pref_change_registrar.h" #include "components/prefs/pref_service.h" #include "components/signin/core/browser/signin_error_controller.h" #include "components/signin/public/base/consent_level.h" #include "components/signin/public/base/signin_metrics.h" #include "components/signin/public/base/signin_pref_names.h" +#include "components/signin/public/base/signin_switches.h" #include "components/signin/public/identity_manager/account_info.h" #include "components/signin/public/identity_manager/accounts_mutator.h" #include "components/signin/public/identity_manager/identity_manager.h" @@ -60,7 +64,6 @@ #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_delegate.h" #include "google_apis/gaia/gaia_auth_util.h" -#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/webui/web_ui_util.h" @@ -114,14 +117,14 @@ SyncConfigInfo::SyncConfigInfo() : sync_everything(false) {} SyncConfigInfo::~SyncConfigInfo() {} bool GetConfiguration(const std::string& json, SyncConfigInfo* config) { - absl::optional<base::Value> parsed_value = base::JSONReader::Read(json); + std::optional<base::Value> parsed_value = base::JSONReader::Read(json); if (!parsed_value.has_value() || !parsed_value->is_dict()) { DLOG(ERROR) << "GetConfiguration() not passed a Dictionary"; return false; } const base::Value::Dict& root = parsed_value->GetDict(); - absl::optional<bool> sync_everything = root.FindBool("syncAllDataTypes"); + std::optional<bool> sync_everything = root.FindBool("syncAllDataTypes"); if (!sync_everything.has_value()) { DLOG(ERROR) << "GetConfiguration() not passed a syncAllDataTypes value"; return false; @@ -131,7 +134,7 @@ bool GetConfiguration(const std::string& json, SyncConfigInfo* config) { for (syncer::UserSelectableType type : syncer::UserSelectableTypeSet::All()) { std::string key_name = syncer::GetUserSelectableTypeName(type) + std::string("Synced"); - absl::optional<bool> type_synced = root.FindBool(key_name); + std::optional<bool> type_synced = root.FindBool(key_name); if (!type_synced.has_value()) { DLOG(ERROR) << "GetConfiguration() not passed a value for " << key_name; return false; @@ -177,12 +180,19 @@ std::string GetSyncErrorAction(SyncStatusActionType action_type) { // Returns the base::Value associated with the account, to use in the stored // accounts list. -base::Value::Dict GetAccountValue(const AccountInfo& account) { +base::Value::Dict GetAccountValue(signin::IdentityManager* identity_manager, + const AccountInfo& account) { DCHECK(!account.IsEmpty()); - auto dict = base::Value::Dict() - .Set("email", account.email) - .Set("fullName", account.full_name) - .Set("givenName", account.given_name); + auto dict = + base::Value::Dict() + .Set("email", account.email) + .Set("fullName", account.full_name) + .Set("givenName", account.given_name) + .Set("isPrimaryAccount", + account.account_id == + identity_manager + ->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin) + .account_id); if (!account.account_image.IsEmpty()) { dict.Set("avatarImage", webui::GetBitmapDataUrl(account.account_image.AsBitmap())); @@ -315,8 +325,9 @@ void PeopleHandler::RegisterMessages() { void PeopleHandler::OnJavascriptAllowed() { PrefService* prefs = profile_->GetPrefs(); - profile_pref_registrar_.Init(prefs); - profile_pref_registrar_.Add( + profile_pref_registrar_ = std::make_unique<PrefChangeRegistrar>(); + profile_pref_registrar_->Init(prefs); + profile_pref_registrar_->Add( prefs::kSigninAllowed, base::BindRepeating(&PeopleHandler::UpdateSyncStatus, base::Unretained(this))); @@ -335,7 +346,7 @@ void PeopleHandler::OnJavascriptAllowed() { } void PeopleHandler::OnJavascriptDisallowed() { - profile_pref_registrar_.RemoveAll(); + profile_pref_registrar_.reset(); identity_manager_observation_.Reset(); sync_service_observation_.Reset(); } @@ -458,7 +469,7 @@ base::Value::List PeopleHandler::GetStoredAccountsList() { for (const auto& account : signin_ui_util::GetOrderedAccountsForDisplay( identity_manager, /*restrict_to_accounts_eligible_for_sync=*/true)) { - accounts.Append(GetAccountValue(account)); + accounts.Append(GetAccountValue(identity_manager, account)); } return accounts; } @@ -473,7 +484,7 @@ base::Value::List PeopleHandler::GetStoredAccountsList() { AccountInfo primary_account_info = identity_manager->FindExtendedAccountInfo( identity_manager->GetPrimaryAccountInfo(ConsentLevel::kSignin)); if (!primary_account_info.IsEmpty()) - accounts.Append(GetAccountValue(primary_account_info)); + accounts.Append(GetAccountValue(identity_manager, primary_account_info)); return accounts; } @@ -658,7 +669,8 @@ void PeopleHandler::HandleSignout(const base::Value::List& args) { bool is_clear_primary_account_allowed = signin_client->IsClearPrimaryAccountAllowed(is_syncing); - if (!is_syncing && !is_clear_primary_account_allowed) { + if (!is_syncing && !is_clear_primary_account_allowed && + !base::FeatureList::IsEnabled(switches::kUnoDesktop)) { // 'Signout' should not be offered in the UI if clear primary account is not // allowed. NOTREACHED() @@ -771,6 +783,12 @@ void PeopleHandler::CloseSyncSetup() { LoginUIService* service = GetLoginUIService(); if (service) { auto self_weak_ptr = weak_factory_.GetWeakPtr(); + + // ChromeOS Ash doesn't support signing out and hence the code below + // cannot build (RevokeSyncConsent() doesn't exist). However, the code is + // unreachable on Ash because IsInitialSyncFeatureSetupComplete() in the + // condition below always returns true. +#if !BUILDFLAG(IS_CHROMEOS_ASH) syncer::SyncService* sync_service = GetSyncService(); // Don't log a cancel event if the sync setup dialog is being @@ -779,18 +797,7 @@ void PeopleHandler::CloseSyncSetup() { configuring_sync_ && !sync_service->GetUserSettings()->IsInitialSyncFeatureSetupComplete() && sync_service->GetAuthError().state() == GoogleServiceAuthError::NONE) { -#if BUILDFLAG(IS_CHROMEOS_ASH) - // ChromeOS Ash doesn't support signing out and hence the code below - // cannot build (RevokeSyncConsent() doesn't exist). However, this code is - // unreachable on Ash because IsInitialSyncFeatureSetupComplete() always - // returns true. - NOTREACHED_NORETURN(); -#else // BUILDFLAG(IS_CHROMEOS_ASH) - // If the user clicked "Cancel" while setting up sync, disable sync - // because we don't want the sync engine to remain in the - // first-setup-incomplete state. DVLOG(1) << "Sync setup aborted by user action"; - sync_service->StopAndClear(); // Revoke sync consent on desktop Chrome if they click cancel during // initial setup or close sync setup without confirming sync. @@ -798,8 +805,8 @@ void PeopleHandler::CloseSyncSetup() { ->GetPrimaryAccountMutator() ->RevokeSyncConsent(signin_metrics::ProfileSignout::kAbortSignin, signin_metrics::SignoutDelete::kIgnoreMetric); -#endif // BUILDFLAG(IS_CHROMEOS_ASH) } +#endif // !BUILDFLAG(IS_CHROMEOS_ASH) service->LoginUIClosed(this); @@ -1012,7 +1019,12 @@ void PeopleHandler::PushSyncPrefs() { // We call IsPassphraseRequired() here, instead of calling // IsPassphraseRequiredForPreferredDataTypes(), because we want to show the // passphrase UI even if no encrypted data types are enabled. - args.Set("passphraseRequired", sync_user_settings->IsPassphraseRequired()); + // IsInitialSyncFeatureSetupComplete()==false is special-cased to avoid that + // the user enters the custom passphrase before confirming they want to + // complete the sync setup flow. + args.Set("passphraseRequired", + sync_user_settings->IsPassphraseRequired() && + sync_user_settings->IsInitialSyncFeatureSetupComplete()); // Same as above, we call IsTrustedVaultKeyRequired() here instead of. // IsTrustedVaultKeyRequiredForPreferredDataTypes(). diff --git a/chromium/chrome/browser/ui/webui/settings/people_handler.h b/chromium/chrome/browser/ui/webui/settings/people_handler.h index 5c6ec3870af..a598ab20ab6 100644 --- a/chromium/chrome/browser/ui/webui/settings/people_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/people_handler.h @@ -79,6 +79,8 @@ class PeopleHandler : public SettingsPageUIHandler, FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, ShowSetupCustomPassphraseRequired); FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, + OngoingSetupCustomPassphraseRequired); + FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, ShowSetupTrustedVaultKeysRequired); FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, ShowSetupEncryptAll); FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, ShowSetupEncryptAllDisallowed); @@ -248,7 +250,7 @@ class PeopleHandler : public SettingsPageUIHandler, std::unique_ptr<base::OneShotTimer> engine_start_timer_; // Used to listen for pref changes to allow or disallow signin. - PrefChangeRegistrar profile_pref_registrar_; + std::unique_ptr<PrefChangeRegistrar> profile_pref_registrar_; // Manages observer lifetimes. base::ScopedObservation<signin::IdentityManager, diff --git a/chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc index 3a49373a5a2..f9d912bc7f2 100644 --- a/chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc +++ b/chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc @@ -224,12 +224,27 @@ class PeopleHandlerTest : public ChromeRenderViewHostTestHarness { SyncServiceFactory::GetInstance()->SetTestingFactoryAndUse( profile(), base::BindRepeating(&BuildMockSyncService))); - ON_CALL(*mock_sync_service_, HasSyncConsent()).WillByDefault(Return(true)); - + // TODO(crbug.com/1505763): Consider adopting TestSyncService instead of + // adding fake-like behavior to MockSyncService. + ON_CALL(*mock_sync_service_, GetTransportState()) + .WillByDefault(Return(syncer::SyncService::TransportState::DISABLED)); ON_CALL(*GetMockUserSettings(), GetPassphraseType()) .WillByDefault(Return(syncer::PassphraseType::kImplicitPassphrase)); ON_CALL(*GetMockUserSettings(), GetExplicitPassphraseTime()) .WillByDefault(Return(base::Time())); + ON_CALL(*mock_sync_service_, GetDisableReasons()) + .WillByDefault(Return(syncer::SyncService::DisableReasonSet( + {syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN}))); + ON_CALL(*GetMockUserSettings(), GetRegisteredSelectableTypes()) + .WillByDefault(Return(GetAllTypes())); + ON_CALL(*GetMockUserSettings(), IsSyncEverythingEnabled()) + .WillByDefault(Return(true)); + ON_CALL(*GetMockUserSettings(), GetSelectedTypes()) + .WillByDefault(Return(GetAllTypes())); + ON_CALL(*GetMockUserSettings(), IsCustomPassphraseAllowed()) + .WillByDefault(Return(true)); + ON_CALL(*GetMockUserSettings(), IsEncryptEverythingEnabled()) + .WillByDefault(Return(false)); ON_CALL(*mock_sync_service_, GetSetupInProgressHandle()) .WillByDefault( Return(ByMove(std::make_unique<syncer::SyncSetupInProgressHandle>( @@ -249,6 +264,14 @@ class PeopleHandlerTest : public ChromeRenderViewHostTestHarness { } void SigninUser() { + // TODO(crbug.com/1505763): Consider adopting TestSyncService instead of + // adding fake-like behavior to MockSyncService. + ON_CALL(*mock_sync_service_, HasSyncConsent()).WillByDefault(Return(true)); + ON_CALL(*mock_sync_service_, GetTransportState()) + .WillByDefault(Return(syncer::SyncService::TransportState::ACTIVE)); + ON_CALL(*mock_sync_service_, GetDisableReasons()) + .WillByDefault(Return(syncer::SyncService::DisableReasonSet())); + identity_test_env()->SetPrimaryAccount(kTestUser, signin::ConsentLevel::kSync); } @@ -259,29 +282,6 @@ class PeopleHandlerTest : public ChromeRenderViewHostTestHarness { web_ui_.set_web_contents(web_contents()); } - // Setup the expectations for calls made when displaying the config page. - void SetDefaultExpectationsForConfigPage() { - ON_CALL(*mock_sync_service_, GetDisableReasons()) - .WillByDefault(Return(syncer::SyncService::DisableReasonSet())); - ON_CALL(*GetMockUserSettings(), GetRegisteredSelectableTypes()) - .WillByDefault(Return(GetAllTypes())); - ON_CALL(*GetMockUserSettings(), IsSyncEverythingEnabled()) - .WillByDefault(Return(true)); - ON_CALL(*GetMockUserSettings(), GetSelectedTypes()) - .WillByDefault(Return(GetAllTypes())); - ON_CALL(*GetMockUserSettings(), IsCustomPassphraseAllowed()) - .WillByDefault(Return(true)); - ON_CALL(*GetMockUserSettings(), IsEncryptEverythingEnabled()) - .WillByDefault(Return(false)); - } - - void SetupInitializedSyncService() { - // An initialized SyncService will have already completed sync setup and - // will have an initialized sync engine. - ON_CALL(*mock_sync_service_, GetTransportState()) - .WillByDefault(Return(syncer::SyncService::TransportState::ACTIVE)); - } - void ExpectPageStatusResponse(const std::string& expected_status) { auto& data = *web_ui_.call_data().back(); EXPECT_EQ("cr.webUIResponse", data.function_name()); @@ -375,18 +375,11 @@ class PeopleHandlerTest : public ChromeRenderViewHostTestHarness { #if !BUILDFLAG(IS_CHROMEOS_ASH) TEST_F(PeopleHandlerTest, DisplayBasicLogin) { ASSERT_FALSE(identity_test_env()->identity_manager()->HasPrimaryAccount( - ConsentLevel::kSync)); + ConsentLevel::kSignin)); CreatePeopleHandler(); // Test that the HandleStartSignin call enables JavaScript. handler_->DisallowJavascript(); - ON_CALL(*mock_sync_service_, GetDisableReasons()) - .WillByDefault(Return(syncer::SyncService::DisableReasonSet( - {syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN}))); - ON_CALL(*GetMockUserSettings(), IsInitialSyncFeatureSetupComplete()) - .WillByDefault(Return(false)); - // Ensure that the user is not signed in before calling |HandleStartSignin()|. - identity_test_env()->ClearPrimaryAccount(); handler_->HandleStartSignin(base::Value::List()); // Sync setup hands off control to the gaia login tab. @@ -407,8 +400,6 @@ TEST_F(PeopleHandlerTest, DisplayBasicLogin) { TEST_F(PeopleHandlerTest, DisplayConfigureWithEngineDisabledAndCancel) { SigninUser(); CreatePeopleHandler(); - ON_CALL(*mock_sync_service_, GetDisableReasons()) - .WillByDefault(Return(syncer::SyncService::DisableReasonSet())); ON_CALL(*GetMockUserSettings(), IsInitialSyncFeatureSetupComplete()) .WillByDefault(Return(false)); ON_CALL(*mock_sync_service_, GetTransportState()) @@ -442,14 +433,11 @@ TEST_F(PeopleHandlerTest, CreatePeopleHandler(); ON_CALL(*GetMockUserSettings(), IsInitialSyncFeatureSetupComplete()) .WillByDefault(Return(false)); - ON_CALL(*mock_sync_service_, GetDisableReasons()) - .WillByDefault(Return(syncer::SyncService::DisableReasonSet())); // Sync engine is stopped initially, and will start up. ON_CALL(*mock_sync_service_, GetTransportState()) .WillByDefault( Return(syncer::SyncService::TransportState::START_DEFERRED)); EXPECT_CALL(*mock_sync_service_, SetSyncFeatureRequested()); - SetDefaultExpectationsForConfigPage(); handler_->HandleShowSyncSetupUI(base::Value::List()); @@ -458,7 +446,6 @@ TEST_F(PeopleHandlerTest, Mock::VerifyAndClearExpectations(mock_sync_service_); // Now, act as if the SyncService has started up. - SetDefaultExpectationsForConfigPage(); ON_CALL(*mock_sync_service_, GetTransportState()) .WillByDefault(Return(syncer::SyncService::TransportState::ACTIVE)); NotifySyncStateChanged(); @@ -482,24 +469,17 @@ TEST_F(PeopleHandlerTest, DisplayConfigureWithEngineDisabledAndCancelAfterSigninSuccess) { SigninUser(); CreatePeopleHandler(); - ON_CALL(*mock_sync_service_, GetDisableReasons()) - .WillByDefault(Return(syncer::SyncService::DisableReasonSet())); ON_CALL(*GetMockUserSettings(), IsInitialSyncFeatureSetupComplete()) .WillByDefault(Return(false)); EXPECT_CALL(*mock_sync_service_, GetTransportState()) .WillOnce(Return(syncer::SyncService::TransportState::INITIALIZING)) .WillRepeatedly(Return(syncer::SyncService::TransportState::ACTIVE)); EXPECT_CALL(*mock_sync_service_, SetSyncFeatureRequested()); - SetDefaultExpectationsForConfigPage(); handler_->HandleShowSyncSetupUI(base::Value::List()); // Sync engine becomes active, so |handler_| is notified. NotifySyncStateChanged(); - // It's important to tell sync the user cancelled the setup flow before we - // tell it we're through with the setup progress. - testing::InSequence seq; - EXPECT_CALL(*mock_sync_service_, StopAndClear()); EXPECT_CALL(mock_on_setup_in_progress_handle_destroyed_, Run()); handler_->CloseSyncSetup(); @@ -524,8 +504,6 @@ TEST_F(PeopleHandlerTest, RestartSyncAfterDashboardClear) { .WillOnce([&]() { // SetSyncFeatureRequested() clears IsSyncFeatureDisabledViaDashboard() // and immediately starts initializing the engine. - ON_CALL(*mock_sync_service_, GetDisableReasons()) - .WillByDefault(Return(syncer::SyncService::DisableReasonSet())); #if BUILDFLAG(IS_CHROMEOS_ASH) ON_CALL(*GetMockUserSettings(), IsSyncFeatureDisabledViaDashboard()) .WillByDefault(Return(false)); @@ -616,6 +594,9 @@ TEST_F(PeopleHandlerTest, UnrecoverableErrorInitializingSync) { {syncer::SyncService::DISABLE_REASON_UNRECOVERABLE_ERROR}))); ON_CALL(*GetMockUserSettings(), IsInitialSyncFeatureSetupComplete()) .WillByDefault(Return(false)); + ON_CALL(*mock_sync_service_, GetTransportState()) + .WillByDefault(Return(syncer::SyncService::TransportState::DISABLED)); + // Open the web UI. handler_->HandleShowSyncSetupUI(base::Value::List()); @@ -630,6 +611,9 @@ TEST_F(PeopleHandlerTest, GaiaErrorInitializingSync) { {syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN}))); ON_CALL(*GetMockUserSettings(), IsInitialSyncFeatureSetupComplete()) .WillByDefault(Return(false)); + ON_CALL(*mock_sync_service_, GetTransportState()) + .WillByDefault(Return(syncer::SyncService::TransportState::DISABLED)); + // Open the web UI. handler_->HandleShowSyncSetupUI(base::Value::List()); @@ -643,11 +627,6 @@ TEST_F(PeopleHandlerTest, TestSyncEverything) { base::Value::List list_args; list_args.Append(kTestCallbackId); list_args.Append(args); - ON_CALL(*GetMockUserSettings(), IsPassphraseRequiredForPreferredDataTypes()) - .WillByDefault(Return(false)); - ON_CALL(*GetMockUserSettings(), IsPassphraseRequired()) - .WillByDefault(Return(false)); - SetupInitializedSyncService(); EXPECT_CALL(*mock_sync_service_->GetMockUserSettings(), SetSelectedTypes(true, _)); handler_->HandleSetDatatypes(list_args); @@ -658,16 +637,11 @@ TEST_F(PeopleHandlerTest, TestSyncEverything) { TEST_F(PeopleHandlerTest, EnterCorrectExistingPassphrase) { SigninUser(); CreatePeopleHandler(); - SetupInitializedSyncService(); ON_CALL(*GetMockUserSettings(), IsPassphraseRequired()) .WillByDefault(Return(true)); - ON_CALL(*GetMockUserSettings(), IsTrustedVaultKeyRequired()) - .WillByDefault(Return(false)); ON_CALL(*GetMockUserSettings(), IsUsingExplicitPassphrase()) .WillByDefault(Return(true)); - ON_CALL(*GetMockUserSettings(), IsCustomPassphraseAllowed()) - .WillByDefault(Return(true)); EXPECT_CALL(*mock_sync_service_->GetMockUserSettings(), SetDecryptionPassphrase("correct_passphrase")) @@ -684,16 +658,11 @@ TEST_F(PeopleHandlerTest, EnterCorrectExistingPassphrase) { TEST_F(PeopleHandlerTest, SuccessfullyCreateCustomPassphrase) { SigninUser(); CreatePeopleHandler(); - SetupInitializedSyncService(); ON_CALL(*GetMockUserSettings(), IsPassphraseRequired()) .WillByDefault(Return(false)); - ON_CALL(*GetMockUserSettings(), IsTrustedVaultKeyRequired()) - .WillByDefault(Return(false)); ON_CALL(*GetMockUserSettings(), IsUsingExplicitPassphrase()) .WillByDefault(Return(false)); - ON_CALL(*GetMockUserSettings(), IsCustomPassphraseAllowed()) - .WillByDefault(Return(true)); EXPECT_CALL(*mock_sync_service_->GetMockUserSettings(), SetEncryptionPassphrase("custom_passphrase")); @@ -709,16 +678,11 @@ TEST_F(PeopleHandlerTest, SuccessfullyCreateCustomPassphrase) { TEST_F(PeopleHandlerTest, EnterWrongExistingPassphrase) { SigninUser(); CreatePeopleHandler(); - SetupInitializedSyncService(); ON_CALL(*GetMockUserSettings(), IsPassphraseRequired()) .WillByDefault(Return(true)); - ON_CALL(*GetMockUserSettings(), IsTrustedVaultKeyRequired()) - .WillByDefault(Return(false)); ON_CALL(*GetMockUserSettings(), IsUsingExplicitPassphrase()) .WillByDefault(Return(true)); - ON_CALL(*GetMockUserSettings(), IsCustomPassphraseAllowed()) - .WillByDefault(Return(true)); EXPECT_CALL(*mock_sync_service_->GetMockUserSettings(), SetDecryptionPassphrase("invalid_passphrase")) @@ -735,16 +699,6 @@ TEST_F(PeopleHandlerTest, EnterWrongExistingPassphrase) { TEST_F(PeopleHandlerTest, CannotCreateBlankPassphrase) { SigninUser(); CreatePeopleHandler(); - SetupInitializedSyncService(); - - ON_CALL(*GetMockUserSettings(), IsPassphraseRequired()) - .WillByDefault(Return(false)); - ON_CALL(*GetMockUserSettings(), IsTrustedVaultKeyRequired()) - .WillByDefault(Return(false)); - ON_CALL(*GetMockUserSettings(), IsUsingExplicitPassphrase()) - .WillByDefault(Return(false)); - ON_CALL(*GetMockUserSettings(), IsCustomPassphraseAllowed()) - .WillByDefault(Return(true)); EXPECT_CALL(*mock_sync_service_->GetMockUserSettings(), SetEncryptionPassphrase) @@ -763,7 +717,6 @@ TEST_F(PeopleHandlerTest, CannotCreateBlankPassphrase) { TEST_F(PeopleHandlerTest, TestSyncIndividualTypes) { SigninUser(); CreatePeopleHandler(); - SetDefaultExpectationsForConfigPage(); for (syncer::UserSelectableType type : GetAllTypes()) { syncer::UserSelectableTypeSet type_to_set; type_to_set.Put(type); @@ -771,11 +724,6 @@ TEST_F(PeopleHandlerTest, TestSyncIndividualTypes) { base::Value::List list_args; list_args.Append(kTestCallbackId); list_args.Append(args); - ON_CALL(*GetMockUserSettings(), IsPassphraseRequiredForPreferredDataTypes()) - .WillByDefault(Return(false)); - ON_CALL(*GetMockUserSettings(), IsPassphraseRequired()) - .WillByDefault(Return(false)); - SetupInitializedSyncService(); EXPECT_CALL(*mock_sync_service_->GetMockUserSettings(), SetSelectedTypes(false, type_to_set)); @@ -788,16 +736,10 @@ TEST_F(PeopleHandlerTest, TestSyncIndividualTypes) { TEST_F(PeopleHandlerTest, TestSyncAllManually) { SigninUser(); CreatePeopleHandler(); - SetDefaultExpectationsForConfigPage(); std::string args = GetConfiguration(CHOOSE_WHAT_TO_SYNC, GetAllTypes()); base::Value::List list_args; list_args.Append(kTestCallbackId); list_args.Append(args); - ON_CALL(*GetMockUserSettings(), IsPassphraseRequiredForPreferredDataTypes()) - .WillByDefault(Return(false)); - ON_CALL(*GetMockUserSettings(), IsPassphraseRequired()) - .WillByDefault(Return(false)); - SetupInitializedSyncService(); EXPECT_CALL(*mock_sync_service_->GetMockUserSettings(), SetSelectedTypes(false, GetAllTypes())); handler_->HandleSetDatatypes(list_args); @@ -808,14 +750,12 @@ TEST_F(PeopleHandlerTest, TestSyncAllManually) { TEST_F(PeopleHandlerTest, NonRegisteredType) { SigninUser(); CreatePeopleHandler(); - SetDefaultExpectationsForConfigPage(); // Simulate apps not being registered. syncer::UserSelectableTypeSet registered_types = GetAllTypes(); registered_types.Remove(syncer::UserSelectableType::kApps); ON_CALL(*GetMockUserSettings(), GetRegisteredSelectableTypes()) .WillByDefault(Return(registered_types)); - SetupInitializedSyncService(); // Simulate "Sync everything" being turned off, but all individual // toggles left on. @@ -833,13 +773,7 @@ TEST_F(PeopleHandlerTest, NonRegisteredType) { TEST_F(PeopleHandlerTest, ShowSyncSetup) { SigninUser(); CreatePeopleHandler(); - ON_CALL(*GetMockUserSettings(), IsPassphraseRequired()) - .WillByDefault(Return(false)); - ON_CALL(*GetMockUserSettings(), IsUsingExplicitPassphrase()) - .WillByDefault(Return(false)); - SetupInitializedSyncService(); // This should display the sync setup dialog (not login). - SetDefaultExpectationsForConfigPage(); handler_->HandleShowSyncSetupUI(base::Value::List()); ExpectSyncPrefsChanged(); @@ -852,8 +786,6 @@ TEST_F(PeopleHandlerTest, ShowSetupSyncEverything) { .WillByDefault(Return(false)); ON_CALL(*GetMockUserSettings(), IsUsingExplicitPassphrase()) .WillByDefault(Return(false)); - SetupInitializedSyncService(); - SetDefaultExpectationsForConfigPage(); // This should display the sync setup dialog (not login). handler_->HandleShowSyncSetupUI(base::Value::List()); @@ -878,12 +810,6 @@ TEST_F(PeopleHandlerTest, ShowSetupSyncEverything) { TEST_F(PeopleHandlerTest, ShowSetupManuallySyncAll) { SigninUser(); CreatePeopleHandler(); - ON_CALL(*GetMockUserSettings(), IsPassphraseRequired()) - .WillByDefault(Return(false)); - ON_CALL(*GetMockUserSettings(), IsUsingExplicitPassphrase()) - .WillByDefault(Return(false)); - SetupInitializedSyncService(); - SetDefaultExpectationsForConfigPage(); ON_CALL(*GetMockUserSettings(), IsSyncEverythingEnabled()) .WillByDefault(Return(false)); // This should display the sync setup dialog (not login). @@ -896,15 +822,10 @@ TEST_F(PeopleHandlerTest, ShowSetupManuallySyncAll) { TEST_F(PeopleHandlerTest, ShowSetupSyncForAllTypesIndividually) { SigninUser(); CreatePeopleHandler(); + ON_CALL(*GetMockUserSettings(), IsSyncEverythingEnabled()) + .WillByDefault(Return(false)); + for (syncer::UserSelectableType type : GetAllTypes()) { - ON_CALL(*GetMockUserSettings(), IsPassphraseRequired()) - .WillByDefault(Return(false)); - ON_CALL(*GetMockUserSettings(), IsUsingExplicitPassphrase()) - .WillByDefault(Return(false)); - SetupInitializedSyncService(); - SetDefaultExpectationsForConfigPage(); - ON_CALL(*GetMockUserSettings(), IsSyncEverythingEnabled()) - .WillByDefault(Return(false)); const syncer::UserSelectableTypeSet types = {type}; ON_CALL(*GetMockUserSettings(), GetSelectedTypes()) .WillByDefault(Return(types)); @@ -927,14 +848,14 @@ TEST_F(PeopleHandlerTest, ShowSetupSyncForAllTypesIndividually) { TEST_F(PeopleHandlerTest, ShowSetupOldGaiaPassphraseRequired) { SigninUser(); CreatePeopleHandler(); - SetupInitializedSyncService(); - SetDefaultExpectationsForConfigPage(); const auto passphrase_time = base::Time::Now(); ON_CALL(*GetMockUserSettings(), GetExplicitPassphraseTime()) .WillByDefault(Return(passphrase_time)); ON_CALL(*GetMockUserSettings(), IsPassphraseRequired()) .WillByDefault(Return(true)); + ON_CALL(*GetMockUserSettings(), IsInitialSyncFeatureSetupComplete()) + .WillByDefault(Return(true)); ON_CALL(*GetMockUserSettings(), GetPassphraseType()) .WillByDefault(Return(syncer::PassphraseType::kFrozenImplicitPassphrase)); @@ -951,14 +872,14 @@ TEST_F(PeopleHandlerTest, ShowSetupOldGaiaPassphraseRequired) { TEST_F(PeopleHandlerTest, ShowSetupCustomPassphraseRequired) { SigninUser(); CreatePeopleHandler(); - SetupInitializedSyncService(); - SetDefaultExpectationsForConfigPage(); const auto passphrase_time = base::Time::Now(); ON_CALL(*GetMockUserSettings(), GetExplicitPassphraseTime()) .WillByDefault(Return(passphrase_time)); ON_CALL(*GetMockUserSettings(), IsPassphraseRequired()) .WillByDefault(Return(true)); + ON_CALL(*GetMockUserSettings(), IsInitialSyncFeatureSetupComplete()) + .WillByDefault(Return(true)); ON_CALL(*GetMockUserSettings(), GetPassphraseType()) .WillByDefault(Return(syncer::PassphraseType::kCustomPassphrase)); @@ -972,6 +893,31 @@ TEST_F(PeopleHandlerTest, ShowSetupCustomPassphraseRequired) { *dictionary.FindString("explicitPassphraseTime")); } +// Verifies that the user is not prompted to enter the custom passphrase while +// sync setup is ongoing. This isn't reachable on Ash because +// IsInitialSyncFeatureSetupComplete() always returns true. +#if !BUILDFLAG(IS_CHROMEOS_ASH) +TEST_F(PeopleHandlerTest, OngoingSetupCustomPassphraseRequired) { + SigninUser(); + CreatePeopleHandler(); + + const auto passphrase_time = base::Time::Now(); + ON_CALL(*GetMockUserSettings(), GetExplicitPassphraseTime()) + .WillByDefault(Return(passphrase_time)); + ON_CALL(*GetMockUserSettings(), IsPassphraseRequired()) + .WillByDefault(Return(true)); + ON_CALL(*GetMockUserSettings(), IsInitialSyncFeatureSetupComplete()) + .WillByDefault(Return(false)); + ON_CALL(*GetMockUserSettings(), GetPassphraseType()) + .WillByDefault(Return(syncer::PassphraseType::kCustomPassphrase)); + + handler_->HandleShowSyncSetupUI(base::Value::List()); + + base::Value::Dict dictionary = ExpectSyncPrefsChanged(); + ExpectHasBoolKey(dictionary, "passphraseRequired", false); +} +#endif // !BUILDFLAG(IS_CHROMEOS_ASH) + TEST_F(PeopleHandlerTest, ShowSetupTrustedVaultKeysRequired) { SigninUser(); CreatePeopleHandler(); @@ -979,8 +925,6 @@ TEST_F(PeopleHandlerTest, ShowSetupTrustedVaultKeysRequired) { .WillByDefault(Return(true)); ON_CALL(*GetMockUserSettings(), GetPassphraseType()) .WillByDefault(Return(syncer::PassphraseType::kTrustedVaultPassphrase)); - SetupInitializedSyncService(); - SetDefaultExpectationsForConfigPage(); // This should display the sync setup dialog (not login). handler_->HandleShowSyncSetupUI(base::Value::List()); @@ -994,12 +938,6 @@ TEST_F(PeopleHandlerTest, ShowSetupTrustedVaultKeysRequired) { TEST_F(PeopleHandlerTest, ShowSetupEncryptAll) { SigninUser(); CreatePeopleHandler(); - ON_CALL(*GetMockUserSettings(), IsPassphraseRequired()) - .WillByDefault(Return(false)); - ON_CALL(*GetMockUserSettings(), IsUsingExplicitPassphrase()) - .WillByDefault(Return(false)); - SetupInitializedSyncService(); - SetDefaultExpectationsForConfigPage(); ON_CALL(*GetMockUserSettings(), IsEncryptEverythingEnabled()) .WillByDefault(Return(true)); @@ -1013,12 +951,6 @@ TEST_F(PeopleHandlerTest, ShowSetupEncryptAll) { TEST_F(PeopleHandlerTest, ShowSetupEncryptAllDisallowed) { SigninUser(); CreatePeopleHandler(); - ON_CALL(*GetMockUserSettings(), IsPassphraseRequired()) - .WillByDefault(Return(false)); - ON_CALL(*GetMockUserSettings(), IsUsingExplicitPassphrase()) - .WillByDefault(Return(false)); - SetupInitializedSyncService(); - SetDefaultExpectationsForConfigPage(); ON_CALL(*GetMockUserSettings(), IsCustomPassphraseAllowed()) .WillByDefault(Return(false)); @@ -1033,14 +965,7 @@ TEST_F(PeopleHandlerTest, ShowSetupEncryptAllDisallowed) { TEST_F(PeopleHandlerTest, CannotCreatePassphraseIfCustomPassphraseDisallowed) { SigninUser(); CreatePeopleHandler(); - SetupInitializedSyncService(); - ON_CALL(*GetMockUserSettings(), IsPassphraseRequired()) - .WillByDefault(Return(false)); - ON_CALL(*GetMockUserSettings(), IsTrustedVaultKeyRequired()) - .WillByDefault(Return(false)); - ON_CALL(*GetMockUserSettings(), IsUsingExplicitPassphrase()) - .WillByDefault(Return(false)); ON_CALL(*GetMockUserSettings(), IsCustomPassphraseAllowed()) .WillByDefault(Return(false)); @@ -1059,12 +984,7 @@ TEST_F(PeopleHandlerTest, CannotCreatePassphraseIfCustomPassphraseDisallowed) { TEST_F(PeopleHandlerTest, CannotOverwritePassphraseWithNewOne) { SigninUser(); CreatePeopleHandler(); - SetupInitializedSyncService(); - ON_CALL(*GetMockUserSettings(), IsPassphraseRequired()) - .WillByDefault(Return(false)); - ON_CALL(*GetMockUserSettings(), IsTrustedVaultKeyRequired()) - .WillByDefault(Return(false)); ON_CALL(*GetMockUserSettings(), IsUsingExplicitPassphrase()) .WillByDefault(Return(true)); ON_CALL(*GetMockUserSettings(), IsCustomPassphraseAllowed()) @@ -1085,8 +1005,6 @@ TEST_F(PeopleHandlerTest, CannotOverwritePassphraseWithNewOne) { TEST_F(PeopleHandlerTest, DashboardClearWhileSettingsOpen_ConfirmSoon) { SigninUser(); CreatePeopleHandler(); - // Sync starts out fully enabled. - SetDefaultExpectationsForConfigPage(); handler_->HandleShowSyncSetupUI(base::Value::List()); @@ -1128,8 +1046,6 @@ TEST_F(PeopleHandlerTest, DashboardClearWhileSettingsOpen_ConfirmSoon) { TEST_F(PeopleHandlerTest, DashboardClearWhileSettingsOpen_ConfirmLater) { SigninUser(); CreatePeopleHandler(); - // Sync starts out fully enabled. - SetDefaultExpectationsForConfigPage(); handler_->HandleShowSyncSetupUI(base::Value::List()); diff --git a/chromium/chrome/browser/ui/webui/settings/performance_handler.cc b/chromium/chrome/browser/ui/webui/settings/performance_handler.cc index 41c4e685d66..8d6885604e7 100644 --- a/chromium/chrome/browser/ui/webui/settings/performance_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/performance_handler.cc @@ -35,9 +35,9 @@ void PerformanceHandler::RegisterMessages() { &PerformanceHandler::HandleOpenBatterySaverFeedbackDialog, base::Unretained(this))); web_ui()->RegisterMessageCallback( - "openHighEfficiencyFeedbackDialog", + "openMemorySaverFeedbackDialog", base::BindRepeating( - &PerformanceHandler::HandleOpenHighEfficiencyFeedbackDialog, + &PerformanceHandler::HandleOpenMemorySaverFeedbackDialog, base::Unretained(this))); web_ui()->RegisterMessageCallback( "openSpeedFeedbackDialog", @@ -73,7 +73,7 @@ base::Value PerformanceHandler::GetCurrentOpenSites() { std::set<std::pair<base::TimeTicks, std::string>, std::greater<>> last_active_time_host_pairs; const Profile* profile = Profile::FromWebUI(web_ui()); - for (auto* browser : *BrowserList::GetInstance()) { + for (Browser* browser : *BrowserList::GetInstance()) { // Exclude browsers not signed into the current profile if (browser->profile() != profile) { continue; @@ -127,7 +127,7 @@ void PerformanceHandler::HandleOpenBatterySaverFeedbackDialog( HandleOpenFeedbackDialog("performance_battery"); } -void PerformanceHandler::HandleOpenHighEfficiencyFeedbackDialog( +void PerformanceHandler::HandleOpenMemorySaverFeedbackDialog( const base::Value::List& args) { HandleOpenFeedbackDialog("performance_tabs"); } diff --git a/chromium/chrome/browser/ui/webui/settings/performance_handler.h b/chromium/chrome/browser/ui/webui/settings/performance_handler.h index 1446a5713cc..d64af3ee4a6 100644 --- a/chromium/chrome/browser/ui/webui/settings/performance_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/performance_handler.h @@ -51,7 +51,7 @@ class PerformanceHandler : public SettingsPageUIHandler, */ void HandleGetDeviceHasBattery(const base::Value::List& args); void HandleOpenBatterySaverFeedbackDialog(const base::Value::List& args); - void HandleOpenHighEfficiencyFeedbackDialog(const base::Value::List& args); + void HandleOpenMemorySaverFeedbackDialog(const base::Value::List& args); void HandleOpenSpeedFeedbackDialog(const base::Value::List& args); void HandleOpenFeedbackDialog(const std::string category_tag); void HandleValidateTabDiscardExceptionRule(const base::Value::List& args); diff --git a/chromium/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc b/chromium/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc index be94f0e7cc9..82213349935 100644 --- a/chromium/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc +++ b/chromium/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc @@ -11,7 +11,14 @@ #include "build/branding_buildflags.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/performance_manager/public/user_tuning/battery_saver_mode_manager.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser_element_identifiers.h" #include "chrome/browser/ui/browser_finder.h" +#include "chrome/browser/ui/performance_controls/test_support/battery_saver_browser_test_mixin.h" +#include "chrome/browser/ui/performance_controls/test_support/memory_saver_interactive_test_mixin.h" +#include "chrome/browser/ui/performance_controls/test_support/webui_interactive_test_mixin.h" +#include "chrome/browser/ui/tabs/tab_enums.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/webui/feedback/feedback_dialog.h" #include "chrome/common/url_constants.h" #include "chrome/test/base/ui_test_utils.h" @@ -19,7 +26,9 @@ #include "chrome/test/interaction/webcontents_interaction_test_util.h" #include "components/performance_manager/public/features.h" #include "components/performance_manager/public/user_tuning/prefs.h" +#include "components/prefs/pref_service.h" #include "content/public/test/browser_test.h" +#include "net/dns/mock_host_resolver.h" #include "url/gurl.h" #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -28,19 +37,15 @@ #endif // BUILDFLAG(IS_CHROMEOS_ASH) using performance_manager::user_tuning::prefs::BatterySaverModeState; -using performance_manager::user_tuning::prefs::HighEfficiencyModeState; +using performance_manager::user_tuning::prefs::MemorySaverModeState; namespace { DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kPerformanceSettingsPage); -DEFINE_LOCAL_CUSTOM_ELEMENT_EVENT_TYPE(kButtonWasClicked); -DEFINE_LOCAL_CUSTOM_ELEMENT_EVENT_TYPE(kElementRenders); -DEFINE_LOCAL_CUSTOM_ELEMENT_EVENT_TYPE(kIronCollapseContentShows); +DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kSecondTabContent); +DEFINE_LOCAL_CUSTOM_ELEMENT_EVENT_TYPE(kElementHides); +DEFINE_LOCAL_CUSTOM_ELEMENT_EVENT_TYPE(kExceptionDialogShows); -constexpr char kCheckJsElementIsChecked[] = "(el) => { return el.checked; }"; -constexpr char kCheckJsElementIsNotChecked[] = - "(el) => { return !el.checked; }"; - -const WebContentsInteractionTestUtil::DeepQuery kHighEfficiencyToggleQuery = { +const WebContentsInteractionTestUtil::DeepQuery kMemorySaverToggleQuery = { "settings-ui", "settings-main", "settings-basic-page", @@ -57,199 +62,184 @@ const WebContentsInteractionTestUtil::DeepQuery kDiscardOnTimerQuery = { "settings-performance-page", "controlled-radio-button#enabledOnTimerButton"}; -} // namespace - -class PerformanceSettingsInteractiveTest : public InteractiveBrowserTest { - public: - void SetUp() override { - InteractiveBrowserTest::SetUp(); - } +const WebContentsInteractionTestUtil::DeepQuery kExceptionDialogEntry = { + "settings-ui", + "settings-main", + "settings-basic-page", + "settings-performance-page", + "tab-discard-exception-list", + "tab-discard-exception-tabbed-add-dialog", + "tab-discard-exception-current-sites-list#list", + "settings-checkbox-list-entry"}; - void SetUpOnMainThread() override { - InteractiveBrowserTest::SetUpOnMainThread(); - performance_manager::user_tuning::UserPerformanceTuningManager:: - GetInstance() - ->SetHighEfficiencyModeEnabled(true); - ASSERT_TRUE(embedded_test_server()->InitializeAndListen()); - embedded_test_server()->StartAcceptingConnections(); - } +const WebContentsInteractionTestUtil::DeepQuery kExceptionDialogAddButton = { + "settings-ui", + "settings-main", + "settings-basic-page", + "settings-performance-page", + "tab-discard-exception-list", + "tab-discard-exception-tabbed-add-dialog", + "cr-button#actionButton"}; - void TearDownOnMainThread() override { - EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); - InteractiveBrowserTest::TearDownOnMainThread(); - } +const WebContentsInteractionTestUtil::DeepQuery kMemorySaverFeedbackButton = { + "settings-ui", "settings-main", "settings-basic-page", + "settings-section#performanceSettingsSection", "cr-icon-button#feedback"}; - auto ClickElement(const ui::ElementIdentifier& contents_id, - const DeepQuery& element) { - return Steps(MoveMouseTo(contents_id, element), ClickMouse()); - } +const WebContentsInteractionTestUtil::DeepQuery kBatterySaverFeedbackButton = { + "settings-ui", "settings-main", "settings-basic-page", + "settings-section#batterySettingsSection", "cr-icon-button#feedback"}; - auto CheckTabCount(int expected_tab_count) { - auto get_tab_count = base::BindLambdaForTesting( - [this]() { return browser()->tab_strip_model()->GetTabCount(); }); +} // namespace - return CheckResult(get_tab_count, expected_tab_count); +class MemorySettingsInteractiveTest + : public MemorySaverInteractiveTestMixin< + WebUiInteractiveTestMixin<InteractiveBrowserTest>> { + public: + void SetUpOnMainThread() override { + MemorySaverInteractiveTestMixin::SetUpOnMainThread(); + SetMemorySaverModeEnabled(true); } - auto CheckHighEfficiencyModePrefState(HighEfficiencyModeState state) { - return CheckResult(base::BindLambdaForTesting([]() { - return performance_manager::user_tuning::prefs:: - GetCurrentHighEfficiencyModeState( - g_browser_process->local_state()); - }), - state); + auto CheckMemorySaverModePrefState(MemorySaverModeState state) { + return CheckResult( + base::BindLambdaForTesting([]() { + return performance_manager::user_tuning::prefs:: + GetCurrentMemorySaverModeState(g_browser_process->local_state()); + }), + state); } - auto CheckHighEfficiencyModeLogged( - HighEfficiencyModeState state, + auto CheckMemorySaverModeLogged( + MemorySaverModeState state, int expected_count, const base::HistogramTester& histogram_tester) { return Do(base::BindLambdaForTesting([=, &histogram_tester]() { histogram_tester.ExpectBucketCount( - "PerformanceControls.HighEfficiency.SettingsChangeMode2", + "PerformanceControls.MemorySaver.SettingsChangeMode", static_cast<int>(state), expected_count); })); } - auto WaitForButtonStateChange(const ui::ElementIdentifier& contents_id, - DeepQuery element, - bool is_checked) { - StateChange toggle_selection_change; - toggle_selection_change.event = kButtonWasClicked; - toggle_selection_change.where = element; - toggle_selection_change.type = StateChange::Type::kExistsAndConditionTrue; - toggle_selection_change.test_function = - is_checked ? kCheckJsElementIsChecked : kCheckJsElementIsNotChecked; - - return WaitForStateChange(contents_id, toggle_selection_change); - } - - auto WaitForElementToRender(const ui::ElementIdentifier& contents_id, - const DeepQuery& element) { - StateChange element_renders; - element_renders.event = kElementRenders; - element_renders.where = element; - element_renders.type = StateChange::Type::kExistsAndConditionTrue; - element_renders.test_function = - "(el) => { return el.clientWidth > 0 && el.clientHeight > 0; }"; - - return WaitForStateChange(contents_id, element_renders); - } - - auto WaitForIronListCollapseStateChange(ui::ElementIdentifier webcontents_id, - DeepQuery query) { - StateChange iron_collapse_finish_animating; - iron_collapse_finish_animating.event = kIronCollapseContentShows; - iron_collapse_finish_animating.where = query; - iron_collapse_finish_animating.type = - StateChange::Type::kExistsAndConditionTrue; - iron_collapse_finish_animating.test_function = - "(el) => { return !el.transitioning; }"; - - return WaitForStateChange(webcontents_id, iron_collapse_finish_animating); - } - private: base::test::ScopedFeatureList scoped_feature_list_; }; -IN_PROC_BROWSER_TEST_F(PerformanceSettingsInteractiveTest, - HighEfficiencyPrefChanged) { +IN_PROC_BROWSER_TEST_F(MemorySettingsInteractiveTest, MemorySaverPrefChanged) { RunTestSequence( InstrumentTab(kPerformanceSettingsPage), NavigateWebContents(kPerformanceSettingsPage, GURL(chrome::kChromeUIPerformanceSettingsURL)), - WaitForElementToRender(kPerformanceSettingsPage, - kHighEfficiencyToggleQuery), - CheckJsResultAt(kPerformanceSettingsPage, kHighEfficiencyToggleQuery, - kCheckJsElementIsChecked), + WaitForElementToRender(kPerformanceSettingsPage, kMemorySaverToggleQuery), + WaitForButtonStateChange(kPerformanceSettingsPage, + kMemorySaverToggleQuery, true), - // Turn Off High Efficiency Mode - ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery), + // Turn Off Memory Saver Mode + ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery), WaitForButtonStateChange(kPerformanceSettingsPage, - kHighEfficiencyToggleQuery, false), - CheckHighEfficiencyModePrefState(HighEfficiencyModeState::kDisabled), + kMemorySaverToggleQuery, false), + CheckMemorySaverModePrefState(MemorySaverModeState::kDisabled), - // Turn High Efficiency Mode back on - ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery), + // Turn Memory Saver Mode back on + ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery), WaitForButtonStateChange(kPerformanceSettingsPage, - kHighEfficiencyToggleQuery, true), - CheckHighEfficiencyModePrefState( - HighEfficiencyModeState::kEnabledOnTimer)); + kMemorySaverToggleQuery, true), + CheckMemorySaverModePrefState(MemorySaverModeState::kEnabledOnTimer)); } -IN_PROC_BROWSER_TEST_F(PerformanceSettingsInteractiveTest, - HighEfficiencyLearnMoreLinkNavigates) { +IN_PROC_BROWSER_TEST_F(MemorySettingsInteractiveTest, + MemorySaverLearnMoreLinkNavigates) { DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kLearnMorePage); - const DeepQuery high_efficiency_learn_more = {"settings-ui", - "settings-main", - "settings-basic-page", - "settings-performance-page", - "settings-toggle-button", - "a#learn-more"}; + const DeepQuery memory_saver_learn_more = {"settings-ui", + "settings-main", + "settings-basic-page", + "settings-performance-page", + "settings-toggle-button", + "a#learn-more"}; RunTestSequence( InstrumentTab(kPerformanceSettingsPage), NavigateWebContents(kPerformanceSettingsPage, GURL(chrome::kChromeUIPerformanceSettingsURL)), InstrumentNextTab(kLearnMorePage), - ClickElement(kPerformanceSettingsPage, high_efficiency_learn_more), - WaitForShow(kLearnMorePage), CheckTabCount(2), + ClickElement(kPerformanceSettingsPage, memory_saver_learn_more), + WaitForShow(kLearnMorePage), + CheckResult([&]() { return browser()->tab_strip_model()->count(); }, 2), WaitForWebContentsReady(kLearnMorePage, - GURL(chrome::kHighEfficiencyModeLearnMoreUrl))); + GURL(chrome::kMemorySaverModeLearnMoreUrl))); } -IN_PROC_BROWSER_TEST_F(PerformanceSettingsInteractiveTest, - HighEfficiencyMetricsShouldLogOnToggle) { +IN_PROC_BROWSER_TEST_F(MemorySettingsInteractiveTest, + MemorySaverMetricsShouldLogOnToggle) { base::HistogramTester histogram_tester; RunTestSequence( InstrumentTab(kPerformanceSettingsPage), NavigateWebContents(kPerformanceSettingsPage, GURL(chrome::kChromeUIPerformanceSettingsURL)), - WaitForElementToRender(kPerformanceSettingsPage, - kHighEfficiencyToggleQuery), - CheckJsResultAt(kPerformanceSettingsPage, kHighEfficiencyToggleQuery, - kCheckJsElementIsChecked), + WaitForElementToRender(kPerformanceSettingsPage, kMemorySaverToggleQuery), + WaitForButtonStateChange(kPerformanceSettingsPage, + kMemorySaverToggleQuery, true), - // Turn Off High Efficiency Mode - ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery), + // Turn Off Memory Saver Mode + ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery), WaitForButtonStateChange(kPerformanceSettingsPage, - kHighEfficiencyToggleQuery, false), - CheckHighEfficiencyModeLogged(HighEfficiencyModeState::kDisabled, 1, - histogram_tester), + kMemorySaverToggleQuery, false), + CheckMemorySaverModeLogged(MemorySaverModeState::kDisabled, 1, + histogram_tester), - // Turn High Efficiency Mode back on - ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery), + // Turn Memory Saver Mode back on + ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery), WaitForButtonStateChange(kPerformanceSettingsPage, - kHighEfficiencyToggleQuery, true), - CheckHighEfficiencyModeLogged(HighEfficiencyModeState::kEnabledOnTimer, 1, - histogram_tester)); + kMemorySaverToggleQuery, true), + CheckMemorySaverModeLogged(MemorySaverModeState::kEnabledOnTimer, 1, + histogram_tester)); } #if BUILDFLAG(GOOGLE_CHROME_BRANDING) -// TODO(http://b/281528238): reenable the test. -IN_PROC_BROWSER_TEST_F(PerformanceSettingsInteractiveTest, - DISABLED_HighEfficiencySendFeedbackDialogOpens) { - const DeepQuery high_efficiency_feedback = { - "settings-ui", "settings-main", "settings-basic-page", - "settings-section#performanceSettingsSection", "cr-icon-button#feedback"}; - +#if !BUILDFLAG(IS_CHROMEOS) +IN_PROC_BROWSER_TEST_F(MemorySettingsInteractiveTest, + MemorySaverSendFeedbackDialogOpens) { RunTestSequence( InstrumentTab(kPerformanceSettingsPage), NavigateWebContents(kPerformanceSettingsPage, GURL(chrome::kChromeUIPerformanceSettingsURL)), - ClickElement(kPerformanceSettingsPage, high_efficiency_feedback), + ClickElement(kPerformanceSettingsPage, kMemorySaverFeedbackButton), InAnyContext(WaitForShow(FeedbackDialog::kFeedbackDialogForTesting))); } + +#elif BUILDFLAG(IS_CHROMEOS_ASH) +class MemorySettingsCrosInteractiveTest + : public WebUiInteractiveTestMixin<InteractiveAshTest> {}; + +IN_PROC_BROWSER_TEST_F(MemorySettingsCrosInteractiveTest, + MemorySaverSendFeedbackDialogOpens) { + SetupContextWidget(); + InstallSystemApps(); + + DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kOsFeedbackDialogElementId); + CreateBrowserWindow(GURL(chrome::kChromeUIPerformanceSettingsURL)); + Browser* const browser = chrome::FindLastActive(); + ASSERT_NE(browser, nullptr); + + RunTestSequence( + InContext(browser->window()->GetElementContext(), + InstrumentTab(kPerformanceSettingsPage)), + WaitForElementToRender(kPerformanceSettingsPage, + kMemorySaverFeedbackButton), + InstrumentNextTab(kOsFeedbackDialogElementId, AnyBrowser()), + ClickElement(kPerformanceSettingsPage, kMemorySaverFeedbackButton), + WaitForShow(kOsFeedbackDialogElementId)); +} + +#endif // BUILDFLAG(IS_CHROMEOS_ASH) #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) -class PerformanceSettingsMultiStateModeInteractiveTest - : public PerformanceSettingsInteractiveTest { +class MemorySaverSettingsMultiStateModeInteractiveTest + : public MemorySettingsInteractiveTest { public: void SetUp() override { scoped_feature_list_.InitAndEnableFeature( - performance_manager::features::kHighEfficiencyMultistateMode); + performance_manager::features::kMemorySaverMultistateMode); InteractiveBrowserTest::SetUp(); } @@ -260,7 +250,6 @@ class PerformanceSettingsMultiStateModeInteractiveTest StateChange toggle_selection_change; toggle_selection_change.event = kButtonWasClicked; toggle_selection_change.where = element; - toggle_selection_change.type = StateChange::Type::kExistsAndConditionTrue; toggle_selection_change.test_function = is_disabled ? "(el) => el.disabled === true" : "(el) => el.disabled === false"; @@ -272,39 +261,37 @@ class PerformanceSettingsMultiStateModeInteractiveTest base::test::ScopedFeatureList scoped_feature_list_; }; -IN_PROC_BROWSER_TEST_F(PerformanceSettingsMultiStateModeInteractiveTest, - HighEfficiencyPrefChanged) { +IN_PROC_BROWSER_TEST_F(MemorySaverSettingsMultiStateModeInteractiveTest, + MemorySaverPrefChanged) { RunTestSequence( InstrumentTab(kPerformanceSettingsPage), NavigateWebContents(kPerformanceSettingsPage, GURL(chrome::kChromeUIPerformanceSettingsURL)), - WaitForElementToRender(kPerformanceSettingsPage, - kHighEfficiencyToggleQuery), - CheckJsResultAt(kPerformanceSettingsPage, kHighEfficiencyToggleQuery, - kCheckJsElementIsChecked), + WaitForElementToRender(kPerformanceSettingsPage, kMemorySaverToggleQuery), + WaitForButtonStateChange(kPerformanceSettingsPage, + kMemorySaverToggleQuery, true), - // Enable high efficiency mode to discard tabs based on a timer + // Enable memory saver mode to discard tabs based on a timer ClickElement(kPerformanceSettingsPage, kDiscardOnTimerQuery), WaitForButtonStateChange(kPerformanceSettingsPage, kDiscardOnTimerQuery, true), - CheckHighEfficiencyModePrefState( - HighEfficiencyModeState::kEnabledOnTimer), + CheckMemorySaverModePrefState(MemorySaverModeState::kEnabledOnTimer), - // Turn off high efficiency mode - ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery), + // Turn off memory saver mode + ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery), WaitForButtonStateChange(kPerformanceSettingsPage, - kHighEfficiencyToggleQuery, false), - CheckHighEfficiencyModePrefState(HighEfficiencyModeState::kDisabled), + kMemorySaverToggleQuery, false), + CheckMemorySaverModePrefState(MemorySaverModeState::kDisabled), - // Turn high efficiency mode back on - ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery), + // Turn memory saver mode back on + ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery), WaitForButtonStateChange(kPerformanceSettingsPage, - kHighEfficiencyToggleQuery, true), - CheckHighEfficiencyModePrefState(HighEfficiencyModeState::kEnabled)); + kMemorySaverToggleQuery, true), + CheckMemorySaverModePrefState(MemorySaverModeState::kEnabled)); } -IN_PROC_BROWSER_TEST_F(PerformanceSettingsMultiStateModeInteractiveTest, - HighEfficiencyMetricsShouldLogOnToggle) { +IN_PROC_BROWSER_TEST_F(MemorySaverSettingsMultiStateModeInteractiveTest, + MemorySaverMetricsShouldLogOnToggle) { base::HistogramTester histogram_tester; const DeepQuery iron_collapse = { @@ -315,48 +302,47 @@ IN_PROC_BROWSER_TEST_F(PerformanceSettingsMultiStateModeInteractiveTest, InstrumentTab(kPerformanceSettingsPage), NavigateWebContents(kPerformanceSettingsPage, GURL(chrome::kChromeUIPerformanceSettingsURL)), - WaitForElementToRender(kPerformanceSettingsPage, - kHighEfficiencyToggleQuery), - CheckJsResultAt(kPerformanceSettingsPage, kHighEfficiencyToggleQuery, - kCheckJsElementIsChecked), + WaitForElementToRender(kPerformanceSettingsPage, kMemorySaverToggleQuery), + WaitForButtonStateChange(kPerformanceSettingsPage, + kMemorySaverToggleQuery, true), - // Turn Off High Efficiency Mode - ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery), + // Turn Off Memory Saver Mode + ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery), WaitForButtonStateChange(kPerformanceSettingsPage, - kHighEfficiencyToggleQuery, false), - CheckHighEfficiencyModeLogged(HighEfficiencyModeState::kDisabled, 1, - histogram_tester), + kMemorySaverToggleQuery, false), + CheckMemorySaverModeLogged(MemorySaverModeState::kDisabled, 1, + histogram_tester), - // Turn High Efficiency Mode back on - ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery), + // Turn Memory Saver Mode back on + ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery), WaitForButtonStateChange(kPerformanceSettingsPage, - kHighEfficiencyToggleQuery, true), - CheckHighEfficiencyModeLogged(HighEfficiencyModeState::kEnabled, 1, - histogram_tester), + kMemorySaverToggleQuery, true), + CheckMemorySaverModeLogged(MemorySaverModeState::kEnabled, 1, + histogram_tester), // Wait for the iron-collapse animation to finish so that the performance // radio buttons will show on screen WaitForIronListCollapseStateChange(kPerformanceSettingsPage, iron_collapse), - // Change high efficiency setting to discard tabs based on timer + // Change memory saver setting to discard tabs based on timer ClickElement(kPerformanceSettingsPage, kDiscardOnTimerQuery), WaitForButtonStateChange(kPerformanceSettingsPage, kDiscardOnTimerQuery, true), - CheckHighEfficiencyModeLogged(HighEfficiencyModeState::kEnabledOnTimer, 1, - histogram_tester), + CheckMemorySaverModeLogged(MemorySaverModeState::kEnabledOnTimer, 1, + histogram_tester), - // Change high efficiency setting to discard tabs based on usage + // Change memory saver setting to discard tabs based on usage ClickElement(kPerformanceSettingsPage, kDiscardOnUsageQuery), WaitForButtonStateChange(kPerformanceSettingsPage, kDiscardOnUsageQuery, true), - CheckHighEfficiencyModeLogged(HighEfficiencyModeState::kEnabled, 2, - histogram_tester)); + CheckMemorySaverModeLogged(MemorySaverModeState::kEnabled, 2, + histogram_tester)); } // Checks that the selected discard timer value is preserved as the high // efficiency mode gets toggled -IN_PROC_BROWSER_TEST_F(PerformanceSettingsMultiStateModeInteractiveTest, +IN_PROC_BROWSER_TEST_F(MemorySaverSettingsMultiStateModeInteractiveTest, DiscardTimerStateIsPreserved) { const DeepQuery discard_time_menu = { "settings-ui", "settings-main", "settings-basic-page", @@ -381,10 +367,9 @@ IN_PROC_BROWSER_TEST_F(PerformanceSettingsMultiStateModeInteractiveTest, InstrumentTab(kPerformanceSettingsPage), NavigateWebContents(kPerformanceSettingsPage, GURL(chrome::kChromeUIPerformanceSettingsURL)), - WaitForElementToRender(kPerformanceSettingsPage, - kHighEfficiencyToggleQuery), - CheckJsResultAt(kPerformanceSettingsPage, kHighEfficiencyToggleQuery, - kCheckJsElementIsChecked), + WaitForElementToRender(kPerformanceSettingsPage, kMemorySaverToggleQuery), + WaitForButtonStateChange(kPerformanceSettingsPage, + kMemorySaverToggleQuery, true), // Select discard on timer option ClickElement(kPerformanceSettingsPage, kDiscardOnTimerQuery), @@ -399,12 +384,12 @@ IN_PROC_BROWSER_TEST_F(PerformanceSettingsMultiStateModeInteractiveTest, base::ReplaceStringPlaceholders("(el) => { el.value = $1}", {discard_timer_value}, nullptr)), - // Turn off high efficiency mode - ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery), + // Turn off memory saver mode + ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery), WaitForButtonStateChange(kPerformanceSettingsPage, - kHighEfficiencyToggleQuery, false), - // Turn high efficiency mode back on - ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery), + kMemorySaverToggleQuery, false), + // Turn memory saver mode back on + ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery), WaitForIronListCollapseStateChange(kPerformanceSettingsPage, iron_collapse), CheckJsResultAt(kPerformanceSettingsPage, discard_time_drop_down, @@ -430,51 +415,13 @@ IN_PROC_BROWSER_TEST_F(PerformanceSettingsMultiStateModeInteractiveTest, } #if !BUILDFLAG(IS_CHROMEOS) -class BatterySettingsInteractiveTest : public InteractiveBrowserTest { +class BatterySettingsInteractiveTest + : public BatterySaverBrowserTestMixin< + WebUiInteractiveTestMixin<InteractiveBrowserTest>> { public: - void SetUp() override { - SetUpFakeBatterySampler(); - InteractiveBrowserTest::SetUp(); - } - - void SetUpOnMainThread() override { - InteractiveBrowserTest::SetUpOnMainThread(); - ASSERT_TRUE(embedded_test_server()->InitializeAndListen()); - embedded_test_server()->StartAcceptingConnections(); - } - - void TearDownOnMainThread() override { - EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); - InteractiveBrowserTest::TearDownOnMainThread(); - } - - void SetUpFakeBatterySampler() { - auto test_sampling_event_source = - std::make_unique<base::test::TestSamplingEventSource>(); - auto test_battery_level_provider = - std::make_unique<base::test::TestBatteryLevelProvider>(); - - sampling_source_ = test_sampling_event_source.get(); - battery_level_provider_ = test_battery_level_provider.get(); - test_battery_level_provider->SetBatteryState( - base::test::TestBatteryLevelProvider::CreateBatteryState(1, true, 100)); - - battery_state_sampler_ = - base::BatteryStateSampler::CreateInstanceForTesting( - std::move(test_sampling_event_source), - std::move(test_battery_level_provider)); - } - - auto ClickElement(const ui::ElementIdentifier& contents_id, - const DeepQuery& element) { - return Steps(MoveMouseTo(contents_id, element), ClickMouse()); - } - - auto CheckTabCount(int expected_tab_count) { - auto get_tab_count = base::BindLambdaForTesting( - [this]() { return browser()->tab_strip_model()->GetTabCount(); }); - - return CheckResult(get_tab_count, expected_tab_count); + base::BatteryLevelProvider::BatteryState GetFakeBatteryState() override { + return base::test::TestBatteryLevelProvider::CreateBatteryState(1, true, + 100); } auto CheckBatteryStateLogged(const base::HistogramTester& histogram_tester, @@ -487,50 +434,7 @@ class BatterySettingsInteractiveTest : public InteractiveBrowserTest { })); } - auto WaitForButtonStateChange(const ui::ElementIdentifier& contents_id, - DeepQuery element, - bool is_checked) { - StateChange toggle_selection_change; - toggle_selection_change.event = kButtonWasClicked; - toggle_selection_change.where = element; - toggle_selection_change.type = StateChange::Type::kExistsAndConditionTrue; - toggle_selection_change.test_function = - is_checked ? kCheckJsElementIsChecked : kCheckJsElementIsNotChecked; - - return WaitForStateChange(contents_id, toggle_selection_change); - } - - auto WaitForElementToRender(const ui::ElementIdentifier& contents_id, - const DeepQuery& element) { - StateChange element_renders; - element_renders.event = kElementRenders; - element_renders.where = element; - element_renders.type = StateChange::Type::kExistsAndConditionTrue; - element_renders.test_function = - "(el) => { return el.clientWidth > 0 && el.clientHeight > 0; }"; - - return WaitForStateChange(contents_id, element_renders); - } - - auto WaitForIronListCollapseStateChange(ui::ElementIdentifier webcontents_id, - DeepQuery query) { - StateChange iron_collapse_finish_animating; - iron_collapse_finish_animating.event = kIronCollapseContentShows; - iron_collapse_finish_animating.where = query; - iron_collapse_finish_animating.type = - StateChange::Type::kExistsAndConditionTrue; - iron_collapse_finish_animating.test_function = - "(el) => { return !el.transitioning; }"; - - return WaitForStateChange(webcontents_id, iron_collapse_finish_animating); - } - private: - raw_ptr<base::test::TestSamplingEventSource, DanglingUntriaged> - sampling_source_; - raw_ptr<base::test::TestBatteryLevelProvider, DanglingUntriaged> - battery_level_provider_; - std::unique_ptr<base::BatteryStateSampler> battery_state_sampler_; base::test::ScopedFeatureList scoped_feature_list_; }; @@ -547,7 +451,8 @@ IN_PROC_BROWSER_TEST_F(BatterySettingsInteractiveTest, GURL(chrome::kChromeUIPerformanceSettingsURL)), InstrumentNextTab(kLearnMorePage), ClickElement(kPerformanceSettingsPage, battery_saver_learn_more), - WaitForShow(kLearnMorePage), CheckTabCount(2), + WaitForShow(kLearnMorePage), + CheckResult([&]() { return browser()->tab_strip_model()->count(); }, 2), WaitForWebContentsReady(kLearnMorePage, GURL(chrome::kBatterySaverModeLearnMoreUrl))); } @@ -577,8 +482,8 @@ IN_PROC_BROWSER_TEST_F(BatterySettingsInteractiveTest, NavigateWebContents(kPerformanceSettingsPage, GURL(chrome::kChromeUIPerformanceSettingsURL)), WaitForElementToRender(kPerformanceSettingsPage, battery_saver_toggle), - CheckJsResultAt(kPerformanceSettingsPage, battery_saver_toggle, - kCheckJsElementIsChecked), + WaitForButtonStateChange(kPerformanceSettingsPage, battery_saver_toggle, + true), // Turn off Battery Saver Mode ClickElement(kPerformanceSettingsPage, battery_saver_toggle), @@ -615,24 +520,20 @@ IN_PROC_BROWSER_TEST_F(BatterySettingsInteractiveTest, } #if BUILDFLAG(GOOGLE_CHROME_BRANDING) -// TODO(http://b/281528238): reenable the test. IN_PROC_BROWSER_TEST_F(BatterySettingsInteractiveTest, - DISABLED_BatterySaverSendFeedbackDialogOpens) { - const DeepQuery battery_saver_feedback = { - "settings-ui", "settings-main", "settings-basic-page", - "settings-section#batterySettingsSection", "cr-icon-button#feedback"}; - + BatterySaverSendFeedbackDialogOpens) { RunTestSequence( InstrumentTab(kPerformanceSettingsPage), NavigateWebContents(kPerformanceSettingsPage, GURL(chrome::kChromeUIPerformanceSettingsURL)), - ClickElement(kPerformanceSettingsPage, battery_saver_feedback), + ClickElement(kPerformanceSettingsPage, kBatterySaverFeedbackButton), InAnyContext(WaitForShow(FeedbackDialog::kFeedbackDialogForTesting))); } #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) #elif BUILDFLAG(IS_CHROMEOS_ASH) -class BatterySettingsInteractiveTest : public InteractiveAshTest { +class BatterySettingsInteractiveTest + : public WebUiInteractiveTestMixin<InteractiveAshTest> { public: BatterySettingsInteractiveTest() : scoped_feature_list_(ash::features::kBatterySaver) {} @@ -643,25 +544,6 @@ class BatterySettingsInteractiveTest : public InteractiveAshTest { kForceDeviceHasBatterySwitch); } - auto WaitForElementToRender(const ui::ElementIdentifier& contents_id, - const DeepQuery& element) { - StateChange element_renders; - element_renders.event = kElementRenders; - element_renders.where = element; - element_renders.type = StateChange::Type::kExistsAndConditionTrue; - element_renders.test_function = - "(el) => { return el !== null && el.clientWidth > 0 && el.clientHeight " - "> 0; }"; - - return WaitForStateChange(contents_id, element_renders); - } - - auto ClickElement(const ui::ElementIdentifier& contents_id, - const DeepQuery& element) { - return Steps(WaitForElementToRender(contents_id, element), - MoveMouseTo(contents_id, element), ClickMouse()); - } - private: base::test::ScopedFeatureList scoped_feature_list_; }; @@ -691,4 +573,187 @@ IN_PROC_BROWSER_TEST_F(BatterySettingsInteractiveTest, WaitForWebContentsReady(kOsSettingsElementId, GURL("chrome://os-settings/power"))); } + +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +IN_PROC_BROWSER_TEST_F(BatterySettingsInteractiveTest, + BatterySaverSendFeedbackDialogOpens) { + SetupContextWidget(); + InstallSystemApps(); + + DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kOsFeedbackDialogElementId); + CreateBrowserWindow(GURL(chrome::kChromeUIPerformanceSettingsURL)); + Browser* const browser = chrome::FindLastActive(); + ASSERT_NE(browser, nullptr); + + RunTestSequence( + InContext(browser->window()->GetElementContext(), + InstrumentTab(kPerformanceSettingsPage)), + WaitForElementToRender(kPerformanceSettingsPage, + kBatterySaverFeedbackButton), + InstrumentNextTab(kOsFeedbackDialogElementId, AnyBrowser()), + ClickElement(kPerformanceSettingsPage, kBatterySaverFeedbackButton), + WaitForShow(kOsFeedbackDialogElementId)); +} +#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) #endif // BUILDFLAG(IS_CHROMEOS_ASH) + +class TabDiscardExceptionsSettingsInteractiveTest + : public MemorySaverInteractiveTestMixin< + WebUiInteractiveTestMixin<InteractiveBrowserTest>> { + public: + void SetUp() override { + scoped_feature_list_.InitAndEnableFeature( + performance_manager::features::kDiscardExceptionsImprovements); + + MemorySaverInteractiveTestMixin::SetUp(); + } + + auto WaitForElementToHide(const ui::ElementIdentifier& contents_id, + const DeepQuery& element) { + StateChange element_renders; + element_renders.event = kElementHides; + element_renders.where = element; + element_renders.test_function = + "(el) => { let rect = el.getBoundingClientRect(); return rect.width " + "=== 0 && rect.height === 0; }"; + + return WaitForStateChange(contents_id, element_renders); + } + + auto OpenAddExceptionDialog(const ui::ElementIdentifier& contents_id) { + const WebContentsInteractionTestUtil::DeepQuery add_exceptions_button = { + "settings-ui", + "settings-main", + "settings-basic-page", + "settings-performance-page", + "tab-discard-exception-list", + "cr-button#addButton"}; + + const WebContentsInteractionTestUtil::DeepQuery picker_dialog = { + "settings-ui", + "settings-main", + "settings-basic-page", + "settings-performance-page", + "tab-discard-exception-list", + "tab-discard-exception-tabbed-add-dialog"}; + + const WebContentsInteractionTestUtil::DeepQuery tab_picker_tab = { + "settings-ui", + "settings-main", + "settings-basic-page", + "settings-performance-page", + "tab-discard-exception-list", + "tab-discard-exception-tabbed-add-dialog", + "cr-tabs", + "div.tab"}; + + StateChange exceptions_dialog; + exceptions_dialog.event = kExceptionDialogShows; + exceptions_dialog.where = picker_dialog; + return Steps(ClickElement(contents_id, add_exceptions_button), + WaitForStateChange(contents_id, exceptions_dialog), + ClickElement(contents_id, tab_picker_tab)); + } + + auto WaitForDisabledStateChange(const ui::ElementIdentifier& contents_id, + const DeepQuery element, + bool is_disabled) { + StateChange toggle_selection_change; + toggle_selection_change.event = kButtonWasClicked; + toggle_selection_change.where = element; + toggle_selection_change.type = StateChange::Type::kExistsAndConditionTrue; + toggle_selection_change.test_function = base::StrCat( + {"(el) => el.disabled === ", is_disabled ? "true" : "false"}); + return WaitForStateChange(contents_id, toggle_selection_change); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +IN_PROC_BROWSER_TEST_F(TabDiscardExceptionsSettingsInteractiveTest, + AddSiteToExceptionList) { + const WebContentsInteractionTestUtil::DeepQuery exception_entry = { + "settings-ui", + "settings-main", + "settings-basic-page", + "settings-performance-page", + "tab-discard-exception-list", + "tab-discard-exception-entry"}; + + RunTestSequence( + InstrumentTab(kPerformanceSettingsPage), + NavigateWebContents(kPerformanceSettingsPage, + GURL(chrome::kChromeUIPerformanceSettingsURL)), + WaitForWebContentsReady(kPerformanceSettingsPage, + GURL(chrome::kChromeUIPerformanceSettingsURL)), + AddInstrumentedTab(kSecondTabContent, GetURL("example.com")), + SelectTab(kTabStripElementId, 0), WaitForShow(kPerformanceSettingsPage), + OpenAddExceptionDialog(kPerformanceSettingsPage), + WaitForDisabledStateChange(kPerformanceSettingsPage, + kExceptionDialogAddButton, true), + ClickElement(kPerformanceSettingsPage, kExceptionDialogEntry), + WaitForDisabledStateChange(kPerformanceSettingsPage, + kExceptionDialogAddButton, false), + ClickElement(kPerformanceSettingsPage, kExceptionDialogAddButton), + WaitForElementToRender(kPerformanceSettingsPage, exception_entry)); +} + +// The high efficiency tab picker should live update when the user open or +// closes a tab that can be added to the exceptions list +IN_PROC_BROWSER_TEST_F(TabDiscardExceptionsSettingsInteractiveTest, + UpdatesEntryListLive) { + RunTestSequence( + InstrumentTab(kPerformanceSettingsPage), + NavigateWebContents(kPerformanceSettingsPage, + GURL(chrome::kChromeUIPerformanceSettingsURL)), + // Make sure there is no entry in the tab picker since there are no other + // tabs open + OpenAddExceptionDialog(kPerformanceSettingsPage), + EnsureNotPresent(kPerformanceSettingsPage, kExceptionDialogEntry), + + // Dialog should show new entry when opening a new tab + AddInstrumentedTab(kSecondTabContent, GetURL("example.com")), + SelectTab(kTabStripElementId, 0), WaitForShow(kPerformanceSettingsPage), + WaitForElementToRender(kPerformanceSettingsPage, kExceptionDialogEntry), + + // Dialog entry should hide when its corresponding tab is closed + Do(base::BindLambdaForTesting([=]() { + browser()->tab_strip_model()->CloseWebContentsAt( + 1, TabCloseTypes::CLOSE_NONE); + })), + WaitForElementToHide(kPerformanceSettingsPage, kExceptionDialogEntry)); +} + +// The high efficiency exceptions tab picker should only show sites that are +// non-chrome sites and have not been added to the exceptions list yet +IN_PROC_BROWSER_TEST_F(TabDiscardExceptionsSettingsInteractiveTest, + IgnoreIneligibleTabs) { + base::Value::List exclusion_list; + exclusion_list.Append("example.com"); + browser()->profile()->GetPrefs()->SetList( + performance_manager::user_tuning::prefs::kTabDiscardingExceptions, + std::move(exclusion_list)); + + RunTestSequence( + InstrumentTab(kPerformanceSettingsPage), + NavigateWebContents(kPerformanceSettingsPage, + GURL(chrome::kChromeUIPerformanceSettingsURL)), + // Open a site that is already on the exclusion list + AddInstrumentedTab(kSecondTabContent, GetURL("example.com")), + SelectTab(kTabStripElementId, 0), WaitForShow(kPerformanceSettingsPage), + + // Verify entry not shown since this is an excluded site + OpenAddExceptionDialog(kPerformanceSettingsPage), + EnsureNotPresent(kPerformanceSettingsPage, kExceptionDialogEntry), + + // Verify entry shows when navigated to a non-excluded site + NavigateWebContents(kSecondTabContent, GetURL("a.com")), + WaitForElementToRender(kPerformanceSettingsPage, kExceptionDialogEntry), + + // Verify that the entry hides since the tab has navigated to a chrome + // page + NavigateWebContents(kSecondTabContent, + GURL(chrome::kChromeUINewTabPageURL)), + WaitForElementToHide(kPerformanceSettingsPage, kExceptionDialogEntry)); +} diff --git a/chromium/chrome/browser/ui/webui/settings/recent_site_settings_helper.cc b/chromium/chrome/browser/ui/webui/settings/recent_site_settings_helper.cc index eb1d2bcdd39..a4f67eeaabb 100644 --- a/chromium/chrome/browser/ui/webui/settings/recent_site_settings_helper.cc +++ b/chromium/chrome/browser/ui/webui/settings/recent_site_settings_helper.cc @@ -4,6 +4,7 @@ #include "chrome/browser/ui/webui/settings/recent_site_settings_helper.h" +#include "base/containers/cxx20_erase_vector.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/permissions/permission_decision_auto_blocker_factory.h" #include "chrome/browser/profiles/profile.h" @@ -246,13 +247,10 @@ std::vector<RecentSitePermissions> GetRecentSitePermissions( all_site_permissions.end()); for (auto& site_permissions : all_site_permissions) { - site_permissions.settings.erase( - std::remove_if(site_permissions.settings.begin(), - site_permissions.settings.end(), - [min_timestamp](const TimestampedSetting& x) { - return x.timestamp < min_timestamp; - }), - site_permissions.settings.end()); + base::EraseIf(site_permissions.settings, + [min_timestamp](const TimestampedSetting& x) { + return x.timestamp < min_timestamp; + }); } return all_site_permissions; } diff --git a/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.cc b/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.cc index 66ba22b5875..6fb74d2f857 100644 --- a/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.cc @@ -33,7 +33,6 @@ #include "ui/base/l10n/l10n_util.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "chrome/browser/ash/reset/metrics.h" #include "chrome/common/pref_names.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) @@ -117,12 +116,6 @@ void ResetSettingsHandler::RegisterMessages() { base::BindRepeating( &ResetSettingsHandler::HandleGetTriggeredResetToolName, base::Unretained(this))); -#if BUILDFLAG(IS_CHROMEOS_ASH) - web_ui()->RegisterMessageCallback( - "onPowerwashDialogShow", - base::BindRepeating(&ResetSettingsHandler::OnShowPowerwashDialog, - base::Unretained(this))); -#endif // BUILDFLAG(IS_CHROMEOS_ASH) } void ResetSettingsHandler::HandleResetProfileSettings( @@ -245,9 +238,6 @@ void ResetSettingsHandler::ResetProfile( callback_weak_ptr_factory_.GetWeakPtr(), callback_id, send_settings, request_origin)); base::RecordAction(base::UserMetricsAction("ResetProfile")); - UMA_HISTOGRAM_ENUMERATION( - "ProfileReset.ResetRequestOrigin", request_origin, - reset_report::ChromeResetReport::ResetRequestOrigin_MAX + 1); } ProfileResetter* ResetSettingsHandler::GetResetter() { @@ -288,14 +278,4 @@ void ResetSettingsHandler::HandleGetTriggeredResetToolName( ResolveJavascriptCallback(callback_id, string_value); } -#if BUILDFLAG(IS_CHROMEOS_ASH) -void ResetSettingsHandler::OnShowPowerwashDialog( - const base::Value::List& args) { - UMA_HISTOGRAM_ENUMERATION( - "Reset.ChromeOS.PowerwashDialogShown", - ash::reset::DialogViewType::kFromOptions, - ash::reset::DialogViewType::kCount); -} -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - } // namespace settings diff --git a/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.h b/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.h index 6adb5ab05ff..96a56aa0c5d 100644 --- a/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/reset_settings_handler.h @@ -83,11 +83,6 @@ class ResetSettingsHandler : public SettingsPageUIHandler { bool send_feedback, reset_report::ChromeResetReport::ResetRequestOrigin request_origin); -#if BUILDFLAG(IS_CHROMEOS_ASH) - // Will be called when powerwash dialog is shown. - void OnShowPowerwashDialog(const base::Value::List& args); -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - const raw_ptr<Profile> profile_; std::unique_ptr<ProfileResetter> resetter_; diff --git a/chromium/chrome/browser/ui/webui/settings/safety_check_extensions_handler.cc b/chromium/chrome/browser/ui/webui/settings/safety_check_extensions_handler.cc index 19cc95df50b..6cc27e9b939 100644 --- a/chromium/chrome/browser/ui/webui/settings/safety_check_extensions_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/safety_check_extensions_handler.cc @@ -60,7 +60,7 @@ bool SafetyCheckExtensionsHandler::CheckExtensionForTrigger( if (warning_acked || !is_extension) { return false; } - absl::optional<extensions::CWSInfoService::CWSInfo> extension_info = + std::optional<extensions::CWSInfoService::CWSInfo> extension_info = cws_info_service_->GetCWSInfo(extension); if (extension_info.has_value() && extension_info->is_present) { switch (extension_info->violation_type) { diff --git a/chromium/chrome/browser/ui/webui/settings/safety_check_extensions_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/safety_check_extensions_handler_unittest.cc index 11df7d2c0eb..298f1f95a5a 100644 --- a/chromium/chrome/browser/ui/webui/settings/safety_check_extensions_handler_unittest.cc +++ b/chromium/chrome/browser/ui/webui/settings/safety_check_extensions_handler_unittest.cc @@ -81,11 +81,11 @@ static extensions::CWSInfoService::CWSInfo cws_info_no_data{ class MockCWSInfoService : public extensions::CWSInfoService { public: - MOCK_METHOD(absl::optional<bool>, + MOCK_METHOD(std::optional<bool>, IsLiveInCWS, (const extensions::Extension&), (const, override)); - MOCK_METHOD(absl::optional<CWSInfoServiceInterface::CWSInfo>, + MOCK_METHOD(std::optional<CWSInfoServiceInterface::CWSInfo>, GetCWSInfo, (const extensions::Extension&), (const, override)); diff --git a/chromium/chrome/browser/ui/webui/settings/safety_check_handler.cc b/chromium/chrome/browser/ui/webui/settings/safety_check_handler.cc index 8ba2a58c4a3..7ba5b95d8bd 100644 --- a/chromium/chrome/browser/ui/webui/settings/safety_check_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/safety_check_handler.cc @@ -102,10 +102,10 @@ bool IsUnmutedCompromisedCredential( return false; return base::ranges::any_of( entry.compromised_info->compromise_types, [](auto type) { - return type == - extensions::api::passwords_private::COMPROMISE_TYPE_LEAKED || + return type == extensions::api::passwords_private::CompromiseType:: + kLeaked || type == - extensions::api::passwords_private::COMPROMISE_TYPE_PHISHED; + extensions::api::passwords_private::CompromiseType::kPhished; }); } @@ -114,7 +114,8 @@ bool IsCredentialWeak( DCHECK(entry.compromised_info); return base::ranges::any_of( entry.compromised_info->compromise_types, [](auto type) { - return type == extensions::api::passwords_private::COMPROMISE_TYPE_WEAK; + return type == + extensions::api::passwords_private::CompromiseType::kWeak; }); } @@ -124,7 +125,7 @@ bool IsCredentialReused( return base::ranges::any_of( entry.compromised_info->compromise_types, [](auto type) { return type == - extensions::api::passwords_private::COMPROMISE_TYPE_REUSED; + extensions::api::passwords_private::CompromiseType::kReused; }); } @@ -391,10 +392,6 @@ void SafetyCheckHandler::OnExtensionsCheckResult( GetStringForExtensions(status, Blocklisted(blocklisted), reenabled_user, reenabled_admin)); FireWebUIListener(kExtensionsEvent, event); - if (status != ExtensionsStatus::kChecking) { - base::UmaHistogramEnumeration("Settings.SafetyCheck.ExtensionsResult", - status); - } extensions_status_ = status; CompleteParentIfChildrenCompleted(); } @@ -779,7 +776,7 @@ void SafetyCheckHandler::OnCredentialDone( passwords_delegate_->GetPasswordCheckStatus(); // Send progress updates only if the check is still running. if (status.state == - extensions::api::passwords_private::PASSWORD_CHECK_STATE_RUNNING && + extensions::api::passwords_private::PasswordCheckState::kRunning && status.already_processed && status.remaining_in_queue) { Done done = Done(*(status.already_processed)); Total total = Total(*(status.remaining_in_queue) + done.value()); @@ -793,7 +790,7 @@ void SafetyCheckHandler::OnInsecureCredentialsChanged() { passwords_delegate_->GetPasswordCheckStatus(); // Ignore the event, unless the password check is idle with no errors. if (status.state != - extensions::api::passwords_private::PASSWORD_CHECK_STATE_IDLE) { + extensions::api::passwords_private::PasswordCheckState::kIdle) { return; } UpdatePasswordsResultOnCheckIdle(); diff --git a/chromium/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc index a5974280a64..5a8a5d127f0 100644 --- a/chromium/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc +++ b/chromium/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc @@ -4,6 +4,7 @@ #include "chrome/browser/ui/webui/settings/safety_check_handler.h" +#include <optional> #include <string> #include <unordered_map> @@ -36,7 +37,7 @@ #include "components/password_manager/core/browser/leak_detection/bulk_leak_check.h" #include "components/password_manager/core/browser/leak_detection/bulk_leak_check_service.h" #include "components/password_manager/core/browser/password_form.h" -#include "components/password_manager/core/browser/test_password_store.h" +#include "components/password_manager/core/browser/password_store/test_password_store.h" #include "components/prefs/pref_service.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "components/safety_check/test_update_check_helper.h" @@ -52,7 +53,6 @@ #include "extensions/common/extension_builder.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/abseil-cpp/absl/types/optional.h" #if BUILDFLAG(IS_CHROMEOS_ASH) #include "ui/chromeos/devicetype_utils.h" @@ -201,7 +201,7 @@ class TestPasswordsDelegate : public extensions::TestPasswordsPrivateDelegate { std::vector<extensions::api::passwords_private::PasswordUiEntry> insecure; for (int i = 0; i < leaked_password_count_; ++i) { insecure.push_back(CreateInsecureCredential( - i, extensions::api::passwords_private::COMPROMISE_TYPE_LEAKED)); + i, extensions::api::passwords_private::CompromiseType::kLeaked)); if (i < muted_leaked_password_count_) { insecure[i].compromised_info->is_muted = true; } @@ -209,17 +209,17 @@ class TestPasswordsDelegate : public extensions::TestPasswordsPrivateDelegate { for (int i = 0; i < phished_password_count_; ++i) { insecure.push_back(CreateInsecureCredential( insecure.size(), - extensions::api::passwords_private::COMPROMISE_TYPE_PHISHED)); + extensions::api::passwords_private::CompromiseType::kPhished)); } for (int i = 0; i < weak_password_count_; ++i) { insecure.push_back(CreateInsecureCredential( insecure.size(), - extensions::api::passwords_private::COMPROMISE_TYPE_WEAK)); + extensions::api::passwords_private::CompromiseType::kWeak)); } for (int i = 0; i < reused_password_count_; ++i) { insecure.push_back(CreateInsecureCredential( insecure.size(), - extensions::api::passwords_private::COMPROMISE_TYPE_REUSED)); + extensions::api::passwords_private::CompromiseType::kReused)); } return insecure; } @@ -253,7 +253,7 @@ class TestPasswordsDelegate : public extensions::TestPasswordsPrivateDelegate { int total_ = 0; int test_credential_counter_ = 0; extensions::api::passwords_private::PasswordCheckState state_ = - extensions::api::passwords_private::PASSWORD_CHECK_STATE_IDLE; + extensions::api::passwords_private::PasswordCheckState::kIdle; scoped_refptr<password_manager::TestPasswordStore> store_ = base::MakeRefCounted<password_manager::TestPasswordStore>(); password_manager::FakeAffiliationService affiliation_service_; @@ -398,7 +398,7 @@ SafetyCheckHandlerTest::GetSafetyCheckStatusChangedWithDataIfExists( if (!dictionary) { continue; } - absl::optional<int> cur_new_state = dictionary->FindInt("newState"); + std::optional<int> cur_new_state = dictionary->FindInt("newState"); if (cur_new_state == new_state) return dictionary; } @@ -890,7 +890,7 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_StaleSafeThenCompromised) { test_leak_service_->set_state_and_notify( password_manager::BulkLeakCheckService::State::kRunning); test_passwords_delegate_->SetPasswordCheckState( - extensions::api::passwords_private::PASSWORD_CHECK_STATE_RUNNING); + extensions::api::passwords_private::PasswordCheckState::kRunning); EXPECT_TRUE(GetSafetyCheckStatusChangedWithDataIfExists( kPasswords, static_cast<int>(SafetyCheckHandler::PasswordsStatus::kChecking))); @@ -903,7 +903,7 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_StaleSafeThenCompromised) { test_leak_service_->set_state_and_notify( password_manager::BulkLeakCheckService::State::kIdle); test_passwords_delegate_->SetPasswordCheckState( - extensions::api::passwords_private::PASSWORD_CHECK_STATE_IDLE); + extensions::api::passwords_private::PasswordCheckState::kIdle); const base::Value::Dict* event = GetSafetyCheckStatusChangedWithDataIfExists( kPasswords, static_cast<int>(SafetyCheckHandler::PasswordsStatus::kSafe)); EXPECT_TRUE(event); @@ -926,7 +926,7 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_SafeStateThenMoreEvents) { test_leak_service_->set_state_and_notify( password_manager::BulkLeakCheckService::State::kRunning); test_passwords_delegate_->SetPasswordCheckState( - extensions::api::passwords_private::PASSWORD_CHECK_STATE_RUNNING); + extensions::api::passwords_private::PasswordCheckState::kRunning); EXPECT_TRUE(GetSafetyCheckStatusChangedWithDataIfExists( kPasswords, static_cast<int>(SafetyCheckHandler::PasswordsStatus::kChecking))); @@ -942,7 +942,7 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_SafeStateThenMoreEvents) { // The check is completed with another safe state. test_passwords_delegate_->SetPasswordCheckState( - extensions::api::passwords_private::PASSWORD_CHECK_STATE_IDLE); + extensions::api::passwords_private::PasswordCheckState::kIdle); test_leak_service_->set_state_and_notify( password_manager::BulkLeakCheckService::State::kIdle); // This time the safe state should be reflected. @@ -1358,7 +1358,7 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_Progress) { auto is_leaked = password_manager::IsLeaked(false); safety_check_->PerformSafetyCheck(); test_passwords_delegate_->SetPasswordCheckState( - extensions::api::passwords_private::PASSWORD_CHECK_STATE_RUNNING); + extensions::api::passwords_private::PasswordCheckState::kRunning); test_passwords_delegate_->SetProgress(1, 3); static_cast<password_manager::BulkLeakCheckService::Observer*>( safety_check_.get()) @@ -1382,7 +1382,7 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_Progress) { // Final update comes after status change, so no new progress message should // be present. test_passwords_delegate_->SetPasswordCheckState( - extensions::api::passwords_private::PASSWORD_CHECK_STATE_IDLE); + extensions::api::passwords_private::PasswordCheckState::kIdle); test_passwords_delegate_->SetProgress(3, 3); static_cast<password_manager::BulkLeakCheckService::Observer*>( safety_check_.get()) @@ -1401,9 +1401,6 @@ TEST_F(SafetyCheckHandlerTest, CheckExtensions_NoExtensions) { kExtensions, static_cast<int>( SafetyCheckHandler::ExtensionsStatus::kNoneBlocklisted))); - histogram_tester_.ExpectBucketCount( - "Settings.SafetyCheck.ExtensionsResult", - SafetyCheckHandler::ExtensionsStatus::kNoneBlocklisted, 1); } TEST_F(SafetyCheckHandlerTest, CheckExtensions_NoneBlocklisted) { @@ -1423,9 +1420,6 @@ TEST_F(SafetyCheckHandlerTest, CheckExtensions_NoneBlocklisted) { EXPECT_TRUE(event); VerifyDisplayString(event, "You're protected from potentially harmful extensions"); - histogram_tester_.ExpectBucketCount( - "Settings.SafetyCheck.ExtensionsResult", - SafetyCheckHandler::ExtensionsStatus::kNoneBlocklisted, 1); } TEST_F(SafetyCheckHandlerTest, CheckExtensions_BlocklistedAllDisabled) { @@ -1448,9 +1442,6 @@ TEST_F(SafetyCheckHandlerTest, CheckExtensions_BlocklistedAllDisabled) { EXPECT_TRUE(event); VerifyDisplayString( event, "1 potentially harmful extension is off. You can also remove it."); - histogram_tester_.ExpectBucketCount( - "Settings.SafetyCheck.ExtensionsResult", - SafetyCheckHandler::ExtensionsStatus::kBlocklistedAllDisabled, 1); } TEST_F(SafetyCheckHandlerTest, CheckExtensions_BlocklistedReenabledAllByUser) { @@ -1473,9 +1464,6 @@ TEST_F(SafetyCheckHandlerTest, CheckExtensions_BlocklistedReenabledAllByUser) { EXPECT_TRUE(event); VerifyDisplayString(event, "You turned 1 potentially harmful extension back on"); - histogram_tester_.ExpectBucketCount( - "Settings.SafetyCheck.ExtensionsResult", - SafetyCheckHandler::ExtensionsStatus::kBlocklistedReenabledAllByUser, 1); } TEST_F(SafetyCheckHandlerTest, CheckExtensions_BlocklistedReenabledAllByAdmin) { @@ -1498,9 +1486,6 @@ TEST_F(SafetyCheckHandlerTest, CheckExtensions_BlocklistedReenabledAllByAdmin) { VerifyDisplayString(event, "Your administrator turned 1 potentially harmful " "extension back on"); - histogram_tester_.ExpectBucketCount( - "Settings.SafetyCheck.ExtensionsResult", - SafetyCheckHandler::ExtensionsStatus::kBlocklistedReenabledAllByAdmin, 1); } TEST_F(SafetyCheckHandlerTest, CheckExtensions_BlocklistedReenabledSomeByUser) { @@ -1539,9 +1524,6 @@ TEST_F(SafetyCheckHandlerTest, CheckExtensions_BlocklistedReenabledSomeByUser) { "You turned 1 potentially harmful extension back " "on. Your administrator " "turned 1 potentially harmful extension back on."); - histogram_tester_.ExpectBucketCount( - "Settings.SafetyCheck.ExtensionsResult", - SafetyCheckHandler::ExtensionsStatus::kBlocklistedReenabledSomeByUser, 1); } TEST_F(SafetyCheckHandlerTest, CheckParentRanDisplayString) { diff --git a/chromium/chrome/browser/ui/webui/settings/safety_hub_handler.cc b/chromium/chrome/browser/ui/webui/settings/safety_hub_handler.cc index c3cc7b537e6..28bb2773556 100644 --- a/chromium/chrome/browser/ui/webui/settings/safety_hub_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/safety_hub_handler.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. #include "chrome/browser/ui/webui/settings/safety_hub_handler.h" + #include <memory> #include "base/check.h" @@ -136,7 +137,7 @@ base::Value::Dict CardDataToValue(int header_id, // Returns true if the card dict indicates there is something actionable for the // user. bool CardHasRecommendations(base::Value::Dict card_data) { - absl::optional<int> state = card_data.FindInt(safety_hub::kCardStateKey); + std::optional<int> state = card_data.FindInt(safety_hub::kCardStateKey); CHECK(state.has_value()); SafetyHubCardState card_state = static_cast<SafetyHubCardState>(state.value()); @@ -376,7 +377,15 @@ void SafetyHubHandler::HandleDismissActiveMenuNotification( void SafetyHubHandler::HandleDismissPasswordMenuNotification( const base::Value::List& args) { SafetyHubMenuNotificationServiceFactory::GetForProfile(profile_) - ->DismissPasswordNotification(); + ->DismissActiveNotificationOfModule( + safety_hub::SafetyHubModuleType::PASSWORDS); +} + +void SafetyHubHandler::HandleDismissExtensionsMenuNotification( + const base::Value::List& args) { + SafetyHubMenuNotificationServiceFactory::GetForProfile(profile_) + ->DismissActiveNotificationOfModule( + safety_hub::SafetyHubModuleType::EXTENSIONS); } void SafetyHubHandler::HandleBlockNotificationPermissionForOrigins( @@ -697,6 +706,11 @@ void SafetyHubHandler::RegisterMessages() { &SafetyHubHandler::HandleDismissPasswordMenuNotification, base::Unretained(this))); web_ui()->RegisterMessageCallback( + "dismissSafetyHubExtensionsMenuNotification", + base::BindRepeating( + &SafetyHubHandler::HandleDismissExtensionsMenuNotification, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( "blockNotificationPermissionForOrigins", base::BindRepeating( &SafetyHubHandler::HandleBlockNotificationPermissionForOrigins, @@ -762,7 +776,7 @@ void SafetyHubHandler::SendNotificationPermissionReviewList() { int SafetyHubHandler::GetNumberOfExtensionsThatNeedReview() { extensions::CWSInfoService* cws_info_service = extensions::CWSInfoServiceFactory::GetForProfile(profile_); - absl::optional<std::unique_ptr<SafetyHubService::Result>> sh_result = + std::optional<std::unique_ptr<SafetyHubService::Result>> sh_result = SafetyHubExtensionsResult::GetResult(cws_info_service, profile_, false); if (!sh_result.has_value()) { return 0; diff --git a/chromium/chrome/browser/ui/webui/settings/safety_hub_handler.h b/chromium/chrome/browser/ui/webui/settings/safety_hub_handler.h index c6bc20b3952..3c1555f49f8 100644 --- a/chromium/chrome/browser/ui/webui/settings/safety_hub_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/safety_hub_handler.h @@ -154,6 +154,9 @@ class SafetyHubHandler : public settings::SettingsPageUIHandler { // Handles dismissing the menu notifications for the password module. void HandleDismissPasswordMenuNotification(const base::Value::List& args); + // Handles dismissing the menu notifications for the extensions module. + void HandleDismissExtensionsMenuNotification(const base::Value::List& args); + // Returns the data for Safe Browsing card. void HandleGetSafeBrowsingCardData(const base::Value::List& args); diff --git a/chromium/chrome/browser/ui/webui/settings/safety_hub_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/safety_hub_handler_unittest.cc index 5452e228226..977a3f5585b 100644 --- a/chromium/chrome/browser/ui/webui/settings/safety_hub_handler_unittest.cc +++ b/chromium/chrome/browser/ui/webui/settings/safety_hub_handler_unittest.cc @@ -5,6 +5,7 @@ #include <ctime> #include <memory> +#include "base/containers/fixed_flat_set.h" #include "base/functional/bind.h" #include "base/memory/scoped_refptr.h" #include "base/strings/utf_string_conversions.h" @@ -39,7 +40,7 @@ #include "components/content_settings/core/common/content_settings_pattern.h" #include "components/content_settings/core/common/content_settings_types.h" #include "components/content_settings/core/common/features.h" -#include "components/password_manager/core/browser/test_password_store.h" +#include "components/password_manager/core/browser/password_store/test_password_store.h" #include "components/permissions/constants.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "components/sync_preferences/testing_pref_service_syncable.h" @@ -275,10 +276,9 @@ class SafetyHubHandlerTest : public testing::Test { base::Version({CHROME_VERSION_MAJOR, CHROME_VERSION_MINOR, CHROME_VERSION_BUILD, CHROME_VERSION_PATCH + 1}), - absl::nullopt) + std::nullopt) : g_browser_process->GetBuildState()->SetUpdate( - BuildState::UpdateType::kNone, base::Version(), - absl::nullopt); + BuildState::UpdateType::kNone, base::Version(), std::nullopt); break; case SafetyHubHandler::SafetyHubModule::kSafeBrowsing: isModuleRecommended @@ -291,6 +291,8 @@ class SafetyHubHandlerTest : public testing::Test { : safety_hub_test_util::CleanAllMockExtensions(profile()); break; case SafetyHubHandler::SafetyHubModule::kNotifications: + hcsm()->ClearSettingsForOneType( + ContentSettingsType::NOTIFICATION_PERMISSION_REVIEW); isModuleRecommended ? AddNotificationPermissionsForReview() : handler()->HandleIgnoreOriginsForNotificationPermissionReview( @@ -693,14 +695,18 @@ TEST_F(SafetyHubHandlerTest, HandleGetSafeBrowsingCardData_DisabledByUser) { TEST_F(SafetyHubHandlerTest, RevokeAllContentSettingTypes) { // TODO(crbug.com/1459305): Remove this after adding names for those // types. - std::list<ContentSettingsType> no_name_types = { - ContentSettingsType::DURABLE_STORAGE, - ContentSettingsType::ACCESSIBILITY_EVENTS, - ContentSettingsType::NFC, - ContentSettingsType::FILE_SYSTEM_READ_GUARD, - ContentSettingsType::CAMERA_PAN_TILT_ZOOM, - ContentSettingsType::TOP_LEVEL_STORAGE_ACCESS, - ContentSettingsType::FILE_SYSTEM_ACCESS_EXTENDED_PERMISSION}; + static constexpr auto kNoNameTypes = + base::MakeFixedFlatSet<ContentSettingsType>({ + // clang-format off + ContentSettingsType::DURABLE_STORAGE, + ContentSettingsType::ACCESSIBILITY_EVENTS, + ContentSettingsType::NFC, + ContentSettingsType::FILE_SYSTEM_READ_GUARD, + ContentSettingsType::CAMERA_PAN_TILT_ZOOM, + ContentSettingsType::TOP_LEVEL_STORAGE_ACCESS, + ContentSettingsType::FILE_SYSTEM_ACCESS_EXTENDED_PERMISSION, + // clang-format on + }); // Add all content settings in the content setting registry to revoked // permissions list. @@ -730,13 +736,10 @@ TEST_F(SafetyHubHandlerTest, RevokeAllContentSettingTypes) { ContentSettingsType::REVOKED_UNUSED_SITE_PERMISSIONS, base::Value(dict.Clone())); - // Unless the permission in no_name_types, it should be shown on the UI. + // Unless the permission in kNoNameTypes, it should be shown on the UI. const auto& revoked_permissions = handler()->PopulateUnusedSitePermissionsData(); - bool is_no_name_type = - (std::find(no_name_types.begin(), no_name_types.end(), type) != - no_name_types.end()); - if (is_no_name_type) { + if (base::Contains(kNoNameTypes, type)) { EXPECT_EQ(revoked_permissions.size(), 0U); } else { EXPECT_EQ(revoked_permissions.size(), 1U); @@ -767,7 +770,7 @@ TEST_F(SafetyHubHandlerTest, VersionCardOutOfDate) { BuildState::UpdateType::kNormalUpdate, base::Version({CHROME_VERSION_MAJOR, CHROME_VERSION_MINOR, CHROME_VERSION_BUILD, CHROME_VERSION_PATCH + 1}), - absl::nullopt); + std::nullopt); base::Value::List args; args.Append("getVersionCardData"); @@ -806,6 +809,7 @@ TEST_F(SafetyHubHandlerTest, HandleGetSafetyHubHasRecommendations) { // has a recommendation or not. for (int testCase = pow(2, (int)modules.size()) - 1; testCase >= 0; testCase--) { + SCOPED_TRACE("testCase: " + std::bitset<8>(testCase).to_string()); std::set<SafetyHubHandler::SafetyHubModule> recommendedModules; for (int i = 0; i < (int)modules.size(); i++) { diff --git a/chromium/chrome/browser/ui/webui/settings/search_engines_handler.cc b/chromium/chrome/browser/ui/webui/settings/search_engines_handler.cc index bd80b957888..e949b96e9cc 100644 --- a/chromium/chrome/browser/ui/webui/settings/search_engines_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/search_engines_handler.cc @@ -11,11 +11,13 @@ #include "base/functional/bind.h" #include "base/metrics/field_trial.h" #include "base/metrics/user_metrics.h" +#include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "chrome/browser/extensions/extension_util.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/search_engine_choice/search_engine_choice_service_factory.h" #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/search_engines/ui_thread_search_terms_data.h" #include "chrome/browser/ui/search_engines/template_url_table_model.h" @@ -25,11 +27,11 @@ #include "chrome/common/webui_url_constants.h" #include "chrome/grit/generated_resources.h" #include "components/prefs/pref_service.h" +#include "components/search_engines/search_engine_choice/search_engine_choice_service.h" #include "components/search_engines/search_engine_choice_utils.h" #include "components/search_engines/search_engines_pref_names.h" #include "components/search_engines/template_url.h" #include "components/search_engines/template_url_service.h" -#include "components/signin/public/base/signin_switches.h" #include "content/public/browser/web_ui.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" @@ -123,7 +125,7 @@ base::Value::Dict SearchEnginesHandler::GetSearchEnginesList() { // Find the default engine. const TemplateURL* default_engine = list_controller_.GetDefaultSearchProvider(); - absl::optional<size_t> default_index = + std::optional<size_t> default_index = list_controller_.table_model()->IndexOfTemplateURL(default_engine); // Build the first list (default search engines). @@ -228,14 +230,27 @@ base::Value::Dict SearchEnginesHandler::CreateDictionaryForEngine( dict.Set("iconURL", icon_url.spec()); const bool is_search_engine_choice_settings_ui = - base::FeatureList::IsEnabled(switches::kSearchEngineChoiceSettingsUi) && search_engines::IsChoiceScreenFlagEnabled( search_engines::ChoicePromo::kAny); - if (is_search_engine_choice_settings_ui && + + // The icons that are used for search engines in the EEA region are bundled + // with Chrome. We use the favicon service for countries outside the EEA + // region to guarantee having icons for all search engines. + search_engines::SearchEngineChoiceService* search_engine_choice_service = + search_engines::SearchEngineChoiceServiceFactory::GetForProfile(profile); + const bool is_eea_region = search_engines::IsEeaChoiceCountry( + search_engine_choice_service->GetCountryId()); + if (is_search_engine_choice_settings_ui && is_eea_region && template_url->prepopulate_id() != 0) { - const std::u16string icon_path = GetGeneratedIconPath( - template_url->keyword(), /*parent_directory_path=*/u"images/"); - dict.Set("iconPath", icon_path); + std::string_view icon_path = + GetSearchEngineGeneratedIconPath(template_url->keyword()); + if (!icon_path.empty()) { + // The search engine icon path are 24px, but displayed at 16px, or 32px on + // HiDPI screens. Use the 2x version (48px) for a large enough icon. + // Note that this icon path is used in `site-favicon` which does not + // support `image-set`. + dict.Set("iconPath", base::StrCat({icon_path, "@2x"})); + } } dict.Set("modelIndex", base::checked_cast<int>(index)); @@ -248,6 +263,7 @@ base::Value::Dict SearchEnginesHandler::CreateDictionaryForEngine( dict.Set("canBeDeactivated", list_controller_.CanDeactivate(template_url)); dict.Set("shouldConfirmDeletion", list_controller_.ShouldConfirmDeletion(template_url)); + dict.Set("isManaged", list_controller_.IsManaged(template_url)); TemplateURL::Type type = template_url->type(); dict.Set("isOmniboxExtension", type == TemplateURL::OMNIBOX_API_EXTENSION); if (type == TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION || @@ -286,24 +302,13 @@ void SearchEnginesHandler::HandleSetDefaultSearchEngine( return; } - list_controller_.MakeDefaultTemplateURL(index); - -#if BUILDFLAG(ENABLE_SEARCH_ENGINE_CHOICE) - Profile& profile = CHECK_DEREF(Profile::FromWebUI(web_ui())); - TemplateURLService* template_url_service = - TemplateURLServiceFactory::GetForProfile(&profile); search_engines::ChoiceMadeLocation choice_made_location = static_cast<search_engines::ChoiceMadeLocation>(args[1].GetInt()); - CHECK(choice_made_location == search_engines::ChoiceMadeLocation::kSearchSettings || choice_made_location == search_engines::ChoiceMadeLocation::kSearchEngineSettings); - // `RecordChoiceMade` should always be called after setting the default - // search engine. - search_engines::RecordChoiceMade(profile.GetPrefs(), choice_made_location, - template_url_service); -#endif + list_controller_.MakeDefaultTemplateURL(index, choice_made_location); base::RecordAction(base::UserMetricsAction("Options_SearchEngineSetDefault")); } diff --git a/chromium/chrome/browser/ui/webui/settings/search_engines_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/search_engines_handler_unittest.cc index 2a074636bc2..51b1122a10b 100644 --- a/chromium/chrome/browser/ui/webui/settings/search_engines_handler_unittest.cc +++ b/chromium/chrome/browser/ui/webui/settings/search_engines_handler_unittest.cc @@ -3,8 +3,10 @@ // found in the LICENSE file. #include "chrome/browser/ui/webui/settings/search_engines_handler.h" + #include "base/functional/bind.h" #include "base/memory/raw_ptr.h" +#include "base/strings/utf_string_conversions.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/time/time.h" @@ -17,22 +19,27 @@ #include "components/search_engines/search_engine_choice_utils.h" #include "components/search_engines/search_engine_type.h" #include "components/search_engines/search_engines_pref_names.h" +#include "components/search_engines/search_engines_switches.h" #include "components/search_engines/template_url.h" #include "components/search_engines/template_url_service.h" #include "components/signin/public/base/signin_switches.h" +#include "components/version_info/version_info.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/test_web_contents_factory.h" #include "content/public/test/test_web_ui.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/events/devices/device_data_manager.h" namespace settings { namespace { TemplateURL* AddSearchEngine(TemplateURLService* template_url_service, const std::string& name, + const std::u16string& keyword, int prepopulated_id, - absl::optional<std::string> url) { + std::optional<std::string> url) { TemplateURLData default_search_engine; default_search_engine.SetShortName(base::UTF8ToUTF16(name)); + default_search_engine.SetKeyword(keyword); default_search_engine.prepopulate_id = prepopulated_id; if (url.has_value()) { @@ -51,7 +58,9 @@ TemplateURL* AddSearchEngine(TemplateURLService* template_url_service, class SearchEnginesHandlerTestBase : public testing::Test { public: SearchEnginesHandlerTestBase() - : profile_manager_(TestingBrowserProcess::GetGlobal()) {} + : profile_manager_(TestingBrowserProcess::GetGlobal()) { + ui::DeviceDataManager::CreateInstance(); + } void SetUp() override { testing::Test::SetUp(); @@ -63,10 +72,11 @@ class SearchEnginesHandlerTestBase : public testing::Test { base::BindRepeating(&TemplateURLServiceFactory::BuildInstanceFor)); TemplateURLService* template_url_service = TemplateURLServiceFactory::GetForProfile(profile()); - TemplateURL* default_engine = - AddSearchEngine(template_url_service, "foo.com", /*prepopulated_id=*/0, - /*url=*/absl::nullopt); + TemplateURL* default_engine = AddSearchEngine( + template_url_service, "foo.com", u"foo_com", /*prepopulated_id=*/0, + /*url=*/std::nullopt); AddSearchEngine(template_url_service, "bing", + TemplateURLPrepopulateData::bing.keyword, TemplateURLPrepopulateData::bing.id, TemplateURLPrepopulateData::bing.search_url); @@ -103,7 +113,11 @@ class SearchEnginesHandlerParametrizedTest public: SearchEnginesHandlerParametrizedTest() { if (WithSearchEnginesChoiceEnabled()) { - feature_list()->InitAndEnableFeature(switches::kSearchEngineChoice); + feature_list()->InitAndEnableFeature( + switches::kSearchEngineChoiceTrigger); + } else { + feature_list()->InitAndDisableFeature( + switches::kSearchEngineChoiceTrigger); } } @@ -111,13 +125,13 @@ class SearchEnginesHandlerParametrizedTest SearchEnginesHandlerTestBase::SetUp(); if (WithSearchEnginesChoiceEnabled()) { - PrefService* pref_service = profile()->GetPrefs(); // The search engine choice feature is only enabled for countries in the // EEA region. const int kBelgiumCountryId = country_codes::CountryCharsToCountryID('B', 'E'); - pref_service->SetInteger(country_codes::kCountryIDAtInstall, - kBelgiumCountryId); + base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( + switches::kSearchEngineChoiceCountry, + country_codes::CountryIDToCountryString(kBelgiumCountryId)); } } @@ -137,9 +151,9 @@ TEST_P(SearchEnginesHandlerParametrizedTest, EXPECT_EQ(0U, web_ui()->call_data().size()); TemplateURLService* template_url_service = TemplateURLServiceFactory::GetForProfile(profile()); - TemplateURL* template_url = - AddSearchEngine(template_url_service, "bar.com", /*prepopulated_id=*/0, - /*url=*/absl::nullopt); + TemplateURL* template_url = AddSearchEngine(template_url_service, "bar.com", + u"bar_com", /*prepopulated_id=*/0, + /*url=*/std::nullopt); EXPECT_EQ(1U, web_ui()->call_data().size()); const content::TestWebUI::CallData& call_data = *web_ui()->call_data().back(); @@ -185,19 +199,19 @@ class SearchEnginesHandlerTestWithSearchEngineChoiceEnabled : public SearchEnginesHandlerTestBase { public: SearchEnginesHandlerTestWithSearchEngineChoiceEnabled() { - feature_list()->InitAndEnableFeature(switches::kSearchEngineChoice); + feature_list()->InitAndEnableFeature(switches::kSearchEngineChoiceTrigger); } void SetUp() override { SearchEnginesHandlerTestBase::SetUp(); - PrefService* pref_service = profile()->GetPrefs(); // The search engine choice feature is only enabled for countries in the // EEA region. const int kBelgiumCountryId = country_codes::CountryCharsToCountryID('B', 'E'); - pref_service->SetInteger(country_codes::kCountryIDAtInstall, - kBelgiumCountryId); + base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( + switches::kSearchEngineChoiceCountry, + country_codes::CountryIDToCountryString(kBelgiumCountryId)); } }; @@ -208,11 +222,15 @@ TEST_F(SearchEnginesHandlerTestWithSearchEngineChoiceEnabled, // region. const int kBelgiumCountryId = country_codes::CountryCharsToCountryID('B', 'E'); - pref_service->SetInteger(country_codes::kCountryIDAtInstall, - kBelgiumCountryId); + base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( + switches::kSearchEngineChoiceCountry, + country_codes::CountryIDToCountryString(kBelgiumCountryId)); EXPECT_FALSE(pref_service->HasPrefPath( prefs::kDefaultSearchProviderChoiceScreenCompletionTimestamp)); + EXPECT_FALSE(pref_service->HasPrefPath( + prefs::kDefaultSearchProviderChoiceScreenCompletionVersion)); + base::Value::List args; // Search engine model id. args.Append(1); @@ -224,19 +242,22 @@ TEST_F(SearchEnginesHandlerTestWithSearchEngineChoiceEnabled, prefs::kDefaultSearchProviderChoiceScreenCompletionTimestamp), base::Time::Now().ToDeltaSinceWindowsEpoch().InSeconds(), /*abs_error=*/2); + EXPECT_EQ(pref_service->GetString( + prefs::kDefaultSearchProviderChoiceScreenCompletionVersion), + version_info::GetVersionNumber()); } TEST_F(SearchEnginesHandlerTestWithSearchEngineChoiceEnabled, RecordingSearchEngineShouldBeDoneAfterSettingDefault) { - PrefService* pref_service = profile()->GetPrefs(); TemplateURLService* template_url_service = TemplateURLServiceFactory::GetForProfile(profile()); // The search engine choice feature is only enabled for countries in the EEA // region. const int kBelgiumCountryId = country_codes::CountryCharsToCountryID('B', 'E'); - pref_service->SetInteger(country_codes::kCountryIDAtInstall, - kBelgiumCountryId); + base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( + switches::kSearchEngineChoiceCountry, + country_codes::CountryIDToCountryString(kBelgiumCountryId)); const TemplateURL* default_search_engine = template_url_service->GetDefaultSearchProvider(); diff --git a/chromium/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc b/chromium/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc index 2f1cb813139..313b3d282c8 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc @@ -170,7 +170,7 @@ void ClearBrowsingDataHandler::HandleClearBrowsingData( Profile::FromWebUI(web_ui())); for (const base::Value& type : data_type_list) { const std::string pref_name = type.GetString(); - absl::optional<BrowsingDataType> data_type = + std::optional<BrowsingDataType> data_type = browsing_data::GetDataTypeFromDeletionPreference(pref_name); CHECK(data_type); data_type_vector.push_back(*data_type); @@ -242,22 +242,6 @@ void ClearBrowsingDataHandler::HandleClearBrowsingData( browsing_data::RecordDeleteBrowsingDataAction( browsing_data::DeleteBrowsingDataAction::kClearBrowsingDataDialog); - // Record the circumstances under which passwords are deleted. - if (data_types.find(BrowsingDataType::PASSWORDS) != data_types.end()) { - static const BrowsingDataType other_types[] = { - BrowsingDataType::HISTORY, BrowsingDataType::DOWNLOADS, - BrowsingDataType::CACHE, BrowsingDataType::COOKIES, - BrowsingDataType::FORM_DATA, BrowsingDataType::HOSTED_APPS_DATA, - }; - int checked_other_types = base::ranges::count_if( - other_types, [&data_types](BrowsingDataType type) { - return data_types.find(type) != data_types.end(); - }); - base::UmaHistogramSparse( - "History.ClearBrowsingData.PasswordsDeletion.AdditionalDatatypesCount", - checked_other_types); - } - std::unique_ptr<AccountReconcilor::ScopedSyncedDataDeletion> scoped_data_deletion; diff --git a/chromium/chrome/browser/ui/webui/settings/settings_default_browser_handler.cc b/chromium/chrome/browser/ui/webui/settings/settings_default_browser_handler.cc index 680ebe84f03..5d9744f814e 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_default_browser_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/settings_default_browser_handler.cc @@ -79,7 +79,7 @@ void DefaultBrowserHandler::SetAsDefaultBrowser(const base::Value::List& args) { default_browser_worker_->StartSetAsDefault( base::BindOnce(&DefaultBrowserHandler::OnDefaultBrowserWorkerFinished, - weak_ptr_factory_.GetWeakPtr(), absl::nullopt)); + weak_ptr_factory_.GetWeakPtr(), std::nullopt)); // If the user attempted to make Chrome the default browser, notify // them when this changes. @@ -89,7 +89,7 @@ void DefaultBrowserHandler::SetAsDefaultBrowser(const base::Value::List& args) { void DefaultBrowserHandler::OnDefaultBrowserSettingChange() { default_browser_worker_->StartCheckIsDefault( base::BindOnce(&DefaultBrowserHandler::OnDefaultBrowserWorkerFinished, - weak_ptr_factory_.GetWeakPtr(), absl::nullopt)); + weak_ptr_factory_.GetWeakPtr(), std::nullopt)); } void DefaultBrowserHandler::RecordSetAsDefaultUMA() { @@ -98,7 +98,7 @@ void DefaultBrowserHandler::RecordSetAsDefaultUMA() { } void DefaultBrowserHandler::OnDefaultBrowserWorkerFinished( - const absl::optional<std::string>& js_callback_id, + const std::optional<std::string>& js_callback_id, shell_integration::DefaultWebClientState state) { if (state == shell_integration::IS_DEFAULT) { // Notify the user in the future if Chrome ceases to be the user's chosen diff --git a/chromium/chrome/browser/ui/webui/settings/settings_default_browser_handler.h b/chromium/chrome/browser/ui/webui/settings/settings_default_browser_handler.h index c08a7839538..1bee8cd91d0 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_default_browser_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/settings_default_browser_handler.h @@ -53,7 +53,7 @@ class DefaultBrowserHandler : public SettingsPageUIHandler { // done. // |js_callback_id| is specified when the state was requested from WebUI. void OnDefaultBrowserWorkerFinished( - const absl::optional<std::string>& js_callback_id, + const std::optional<std::string>& js_callback_id, shell_integration::DefaultWebClientState state); // Reference to a background worker that handles default browser settings. diff --git a/chromium/chrome/browser/ui/webui/settings/settings_default_browser_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/settings_default_browser_handler_unittest.cc index c2b5d30d415..bfc824d248b 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_default_browser_handler_unittest.cc +++ b/chromium/chrome/browser/ui/webui/settings/settings_default_browser_handler_unittest.cc @@ -1,11 +1,12 @@ // Copyright 2023 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <memory> - #include "chrome/browser/ui/webui/settings/settings_default_browser_handler.h" +#include <memory> + #include "base/memory/scoped_refptr.h" +#include "base/test/run_until.h" #include "base/test/test_timeouts.h" #include "base/values.h" #include "chrome/browser/shell_integration.h" @@ -129,13 +130,8 @@ class DefaultBrowserHandlerTest : public testing::Test { } void WaitForSingleCallData() { - while (test_web_ui()->call_data().empty()) { - base::RunLoop run_loop; - base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask( - FROM_HERE, run_loop.QuitClosure(), TestTimeouts::tiny_timeout()); - run_loop.Run(); - } - + EXPECT_TRUE(base::test::RunUntil( + [&]() { return !test_web_ui()->call_data().empty(); })); ASSERT_EQ(test_web_ui()->call_data().size(), 1u); } diff --git a/chromium/chrome/browser/ui/webui/settings/settings_interactive_uitest.cc b/chromium/chrome/browser/ui/webui/settings/settings_interactive_uitest.cc index 9058e6fa08b..53902e5b297 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_interactive_uitest.cc +++ b/chromium/chrome/browser/ui/webui/settings/settings_interactive_uitest.cc @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/feature_list.h" #include "base/test/bind.h" #include "chrome/browser/themes/theme_service.h" #include "chrome/browser/themes/theme_service_factory.h" @@ -12,6 +13,7 @@ #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/interaction/tracked_element_webcontents.h" #include "chrome/test/interaction/webcontents_interaction_test_util.h" +#include "components/content_settings/core/common/features.h" #include "components/privacy_sandbox/privacy_sandbox_features.h" #include "content/public/test/browser_test.h" #include "net/dns/mock_host_resolver.h" @@ -99,27 +101,16 @@ class SettingsInteractiveUiTest : public InProcessBrowserTest { } }; -class CookieSettingsInteractiveUiTest - : public SettingsInteractiveUiTest, - public testing::WithParamInterface<bool> { - public: - CookieSettingsInteractiveUiTest() { - feature_list_.InitWithFeatureState( - privacy_sandbox::kPrivacySandboxSettings4, GetParam()); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -IN_PROC_BROWSER_TEST_P(CookieSettingsInteractiveUiTest, +IN_PROC_BROWSER_TEST_F(SettingsInteractiveUiTest, CheckQuestionMarkIsPresentUnderCookiesAndSiteData) { UNCALLED_MOCK_CALLBACK(ui::InteractionSequence::CompletedCallback, completed); UNCALLED_MOCK_CALLBACK(ui::InteractionSequence::AbortedCallback, aborted); + bool is_3pcd = base::FeatureList::IsEnabled( + content_settings::features::kTrackingProtection3pcd); const std::string cookie_row_selector = - GetParam() ? "cr-link-row#thirdPartyCookiesLinkRow" - : "cr-link-row#cookiesLinkRow"; + is_3pcd ? "cr-link-row#trackingProtectionLinkRow" + : "cr-link-row#thirdPartyCookiesLinkRow"; const GURL cookie_setting_url("chrome://settings/privacy"); const WebContentsInteractionTestUtil::DeepQuery cookies_link_row = { "settings-ui", "settings-main", "settings-basic-page", @@ -161,8 +152,14 @@ IN_PROC_BROWSER_TEST_P(CookieSettingsInteractiveUiTest, auto* util = element->AsA<TrackedElementWebContents>()->owner(); auto* const contents = util->web_contents(); - EXPECT_EQ(chrome::kCookiesSettingsHelpCenterURL, - contents->GetURL()); + if (is_3pcd) { + EXPECT_EQ( + contents->GetURL(), + GURL(chrome::kTrackingProtectionHelpCenterURL)); + } else { + EXPECT_EQ(contents->GetURL(), + chrome::kCookiesSettingsHelpCenterURL); + } })) .Build()) .Build(); @@ -170,8 +167,6 @@ IN_PROC_BROWSER_TEST_P(CookieSettingsInteractiveUiTest, EXPECT_CALL_IN_SCOPE(completed, Run, sequence->RunSynchronouslyForTesting()); } -INSTANTIATE_TEST_SUITE_P(All, CookieSettingsInteractiveUiTest, testing::Bool()); - class ThemeSettingsInteractiveUiTest : public SettingsInteractiveUiTest { public: void SetUpCommandLine(base::CommandLine* command_line) override { diff --git a/chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc index bf0b01306fe..5fd8f3e5b73 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chromium/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc @@ -85,6 +85,7 @@ #include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "components/services/screen_ai/buildflags/buildflags.h" #include "components/signin/public/base/signin_buildflags.h" +#include "components/signin/public/base/signin_switches.h" #include "components/strings/grit/components_branded_strings.h" #include "components/strings/grit/components_strings.h" #include "components/subresource_filter/core/browser/subresource_filter_features.h" @@ -183,64 +184,64 @@ std::string BuildOSSettingsUrl(const std::string& sub_page) { void AddCommonStrings(content::WebUIDataSource* html_source, Profile* profile) { static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"add", IDS_ADD}, - {"advancedPageTitle", IDS_SETTINGS_ADVANCED}, - {"back", IDS_ACCNAME_BACK}, - {"basicPageTitle", IDS_SETTINGS_BASIC}, - {"cancel", IDS_CANCEL}, - {"clear", IDS_SETTINGS_CLEAR}, - {"close", IDS_CLOSE}, - {"confirm", IDS_CONFIRM}, - {"continue", IDS_SETTINGS_CONTINUE}, - {"controlledByExtension", IDS_SETTINGS_CONTROLLED_BY_EXTENSION}, - {"custom", IDS_SETTINGS_CUSTOM}, - {"delete", IDS_SETTINGS_DELETE}, - {"disable", IDS_DISABLE}, - {"done", IDS_DONE}, - {"edit", IDS_SETTINGS_EDIT}, - {"extensionsLinkTooltip", IDS_SETTINGS_MENU_EXTENSIONS_LINK_TOOLTIP}, - {"fonts", IDS_SETTINGS_FONTS}, - {"learnMore", IDS_LEARN_MORE}, - {"manage", IDS_SETTINGS_MANAGE}, - {"menu", IDS_MENU}, - {"menuButtonLabel", IDS_SETTINGS_MENU_BUTTON_LABEL}, - {"moreActions", IDS_SETTINGS_MORE_ACTIONS}, - {"noThanks", IDS_NO_THANKS}, - {"ok", IDS_OK}, - {"opensInNewTab", IDS_SETTINGS_OPENS_IN_NEW_TAB}, - {"sendFeedbackButton", IDS_SETTINGS_SEND_FEEDBACK_ROLE_DESCRIPTION}, + {"add", IDS_ADD}, + {"advancedPageTitle", IDS_SETTINGS_ADVANCED}, + {"back", IDS_ACCNAME_BACK}, + {"basicPageTitle", IDS_SETTINGS_BASIC}, + {"cancel", IDS_CANCEL}, + {"clear", IDS_SETTINGS_CLEAR}, + {"close", IDS_CLOSE}, + {"confirm", IDS_CONFIRM}, + {"continue", IDS_SETTINGS_CONTINUE}, + {"controlledByExtension", IDS_SETTINGS_CONTROLLED_BY_EXTENSION}, + {"custom", IDS_SETTINGS_CUSTOM}, + {"delete", IDS_SETTINGS_DELETE}, + {"disable", IDS_DISABLE}, + {"done", IDS_DONE}, + {"edit", IDS_SETTINGS_EDIT}, + {"extensionsLinkTooltip", IDS_SETTINGS_MENU_EXTENSIONS_LINK_TOOLTIP}, + {"fonts", IDS_SETTINGS_FONTS}, + {"learnMore", IDS_LEARN_MORE}, + {"manage", IDS_SETTINGS_MANAGE}, + {"menu", IDS_MENU}, + {"menuButtonLabel", IDS_SETTINGS_MENU_BUTTON_LABEL}, + {"moreActions", IDS_SETTINGS_MORE_ACTIONS}, + {"noThanks", IDS_NO_THANKS}, + {"ok", IDS_OK}, + {"opensInNewTab", IDS_SETTINGS_OPENS_IN_NEW_TAB}, + {"sendFeedbackButton", IDS_SETTINGS_SEND_FEEDBACK_ROLE_DESCRIPTION}, #if !BUILDFLAG(IS_CHROMEOS_ASH) - {"relaunchConfirmationDialogTitle", IDS_RELAUNCH_CONFIRMATION_DIALOG_TITLE}, -#endif - {"remove", IDS_REMOVE}, - {"restart", IDS_SETTINGS_RESTART}, -#if !BUILDFLAG(IS_CHROMEOS_ASH) - {"restartToApplyChanges", IDS_SETTINGS_RESTART_TO_APPLY_CHANGES}, -#endif - {"retry", IDS_SETTINGS_RETRY}, - {"save", IDS_SAVE}, - {"searchResultBubbleText", IDS_SEARCH_RESULT_BUBBLE_TEXT}, - {"searchResultsBubbleText", IDS_SEARCH_RESULTS_BUBBLE_TEXT}, - {"sentenceEnd", IDS_SENTENCE_END}, - {"settings", IDS_SETTINGS_SETTINGS}, - {"settingsAltPageTitle", IDS_SETTINGS_ALT_PAGE_TITLE}, - {"subpageArrowRoleDescription", IDS_SETTINGS_SUBPAGE_BUTTON}, - {"subpageBackButtonAriaLabel", IDS_SETTINGS_SUBPAGE_BACK_BUTTON_ARIA_LABEL}, - {"subpageBackButtonAriaRoleDescription", - IDS_SETTINGS_SUBPAGE_BACK_BUTTON_ARIA_ROLE_DESCRIPTION}, - {"subpageLearnMoreAriaLabel", IDS_SETTINGS_SUBPAGE_LEARN_MORE_ARIA_LABEL}, - {"notValid", IDS_SETTINGS_NOT_VALID}, - {"notValidWebAddress", IDS_SETTINGS_NOT_VALID_WEB_ADDRESS}, - {"notValidWebAddressForContentType", - IDS_SETTINGS_NOT_VALID_WEB_ADDRESS_FOR_CONTENT_TYPE}, - - // Common font related strings shown in a11y and appearance sections. - {"quickBrownFox", IDS_SETTINGS_QUICK_BROWN_FOX}, - {"verySmall", IDS_SETTINGS_VERY_SMALL_FONT}, - {"small", IDS_SETTINGS_SMALL_FONT}, - {"medium", IDS_SETTINGS_MEDIUM_FONT}, - {"large", IDS_SETTINGS_LARGE_FONT}, - {"veryLarge", IDS_SETTINGS_VERY_LARGE_FONT}, + {"relaunchConfirmationDialogTitle", + IDS_RELAUNCH_CONFIRMATION_DIALOG_TITLE}, +#endif + {"remove", IDS_REMOVE}, + {"restart", IDS_SETTINGS_RESTART}, + {"restartToApplyChanges", IDS_SETTINGS_RESTART_TO_APPLY_CHANGES}, + {"retry", IDS_SETTINGS_RETRY}, + {"save", IDS_SAVE}, + {"searchResultBubbleText", IDS_SEARCH_RESULT_BUBBLE_TEXT}, + {"searchResultsBubbleText", IDS_SEARCH_RESULTS_BUBBLE_TEXT}, + {"sentenceEnd", IDS_SENTENCE_END}, + {"settings", IDS_SETTINGS_SETTINGS}, + {"settingsAltPageTitle", IDS_SETTINGS_ALT_PAGE_TITLE}, + {"subpageArrowRoleDescription", IDS_SETTINGS_SUBPAGE_BUTTON}, + {"subpageBackButtonAriaLabel", + IDS_SETTINGS_SUBPAGE_BACK_BUTTON_ARIA_LABEL}, + {"subpageBackButtonAriaRoleDescription", + IDS_SETTINGS_SUBPAGE_BACK_BUTTON_ARIA_ROLE_DESCRIPTION}, + {"subpageLearnMoreAriaLabel", IDS_SETTINGS_SUBPAGE_LEARN_MORE_ARIA_LABEL}, + {"notValid", IDS_SETTINGS_NOT_VALID}, + {"notValidWebAddress", IDS_SETTINGS_NOT_VALID_WEB_ADDRESS}, + {"notValidWebAddressForContentType", + IDS_SETTINGS_NOT_VALID_WEB_ADDRESS_FOR_CONTENT_TYPE}, + + // Common font related strings shown in a11y and appearance sections. + {"quickBrownFox", IDS_SETTINGS_QUICK_BROWN_FOX}, + {"verySmall", IDS_SETTINGS_VERY_SMALL_FONT}, + {"small", IDS_SETTINGS_SMALL_FONT}, + {"medium", IDS_SETTINGS_MEDIUM_FONT}, + {"large", IDS_SETTINGS_LARGE_FONT}, + {"veryLarge", IDS_SETTINGS_VERY_LARGE_FONT}, }; html_source->AddLocalizedStrings(kLocalizedStrings); @@ -254,7 +255,7 @@ void AddCommonStrings(content::WebUIDataSource* html_source, Profile* profile) { crosapi::mojom::SessionType::kPublicSession || profile->IsGuestSession()); #else - profile->IsGuestSession()); + profile->IsGuestSession()); #endif html_source->AddBoolean("isChildAccount", profile->IsChild()); @@ -274,33 +275,38 @@ void AddCommonStrings(content::WebUIDataSource* html_source, Profile* profile) { void AddA11yStrings(content::WebUIDataSource* html_source) { static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"moreFeaturesLink", IDS_SETTINGS_MORE_FEATURES_LINK}, - {"a11yPageTitle", IDS_SETTINGS_ACCESSIBILITY}, - {"a11yWebStore", IDS_SETTINGS_ACCESSIBILITY_WEB_STORE}, - {"moreFeaturesLinkDescription", - IDS_SETTINGS_MORE_FEATURES_LINK_DESCRIPTION}, - {"accessibleImageLabelsTitle", IDS_SETTINGS_ACCESSIBLE_IMAGE_LABELS_TITLE}, - {"accessibleImageLabelsSubtitle", - IDS_SETTINGS_ACCESSIBLE_IMAGE_LABELS_SUBTITLE}, - {"pdfOcrTitle", IDS_SETTINGS_PDF_OCR_TITLE}, - {"pdfOcrSubtitle", IDS_SETTINGS_PDF_OCR_SUBTITLE}, - {"settingsSliderRoleDescription", - IDS_SETTINGS_SLIDER_MIN_MAX_ARIA_ROLE_DESCRIPTION}, - {"caretBrowsingTitle", IDS_SETTINGS_ENABLE_CARET_BROWSING_TITLE}, - {"caretBrowsingSubtitle", IDS_SETTINGS_ENABLE_CARET_BROWSING_SUBTITLE}, + {"moreFeaturesLink", IDS_SETTINGS_MORE_FEATURES_LINK}, + {"a11yPageTitle", IDS_SETTINGS_ACCESSIBILITY}, + {"a11yWebStore", IDS_SETTINGS_ACCESSIBILITY_WEB_STORE}, + {"moreFeaturesLinkDescription", + IDS_SETTINGS_MORE_FEATURES_LINK_DESCRIPTION}, + {"accessibleImageLabelsTitle", + IDS_SETTINGS_ACCESSIBLE_IMAGE_LABELS_TITLE}, + {"accessibleImageLabelsSubtitle", + IDS_SETTINGS_ACCESSIBLE_IMAGE_LABELS_SUBTITLE}, + {"settingsSliderRoleDescription", + IDS_SETTINGS_SLIDER_MIN_MAX_ARIA_ROLE_DESCRIPTION}, + {"caretBrowsingTitle", IDS_SETTINGS_ENABLE_CARET_BROWSING_TITLE}, + {"caretBrowsingSubtitle", IDS_SETTINGS_ENABLE_CARET_BROWSING_SUBTITLE}, #if BUILDFLAG(IS_CHROMEOS) - {"manageAccessibilityFeatures", - IDS_SETTINGS_ACCESSIBILITY_MANAGE_ACCESSIBILITY_FEATURES}, + {"manageAccessibilityFeatures", + IDS_SETTINGS_ACCESSIBILITY_MANAGE_ACCESSIBILITY_FEATURES}, #else // !BUILDFLAG(IS_CHROMEOS) - {"focusHighlightLabel", - IDS_SETTINGS_ACCESSIBILITY_FOCUS_HIGHLIGHT_DESCRIPTION}, + {"focusHighlightLabel", + IDS_SETTINGS_ACCESSIBILITY_FOCUS_HIGHLIGHT_DESCRIPTION}, #endif #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) - {"overscrollHistoryNavigationTitle", - IDS_SETTINGS_OVERSCROLL_HISTORY_NAVIGATION_TITLE}, - {"overscrollHistoryNavigationSubtitle", - IDS_SETTINGS_OVERSCROLL_HISTORY_NAVIGATION_SUBTITLE}, -#endif + {"overscrollHistoryNavigationTitle", + IDS_SETTINGS_OVERSCROLL_HISTORY_NAVIGATION_TITLE}, + {"overscrollHistoryNavigationSubtitle", + IDS_SETTINGS_OVERSCROLL_HISTORY_NAVIGATION_SUBTITLE}, + {"pdfOcrDownloadCompleteLabel", IDS_SETTINGS_PDF_OCR_DOWNLOAD_COMPLETE}, + {"pdfOcrDownloadErrorLabel", IDS_SETTINGS_PDF_OCR_DOWNLOAD_ERROR}, + {"pdfOcrDownloadProgressLabel", IDS_SETTINGS_PDF_OCR_DOWNLOAD_PROGRESS}, + {"pdfOcrDownloadingLabel", IDS_SETTINGS_PDF_OCR_DOWNLOADING}, + {"pdfOcrTitle", IDS_SETTINGS_PDF_OCR_TITLE}, + {"pdfOcrSubtitle", IDS_SETTINGS_PDF_OCR_SUBTITLE}, +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) }; html_source->AddLocalizedStrings(kLocalizedStrings); @@ -327,25 +333,25 @@ void AddA11yStrings(content::WebUIDataSource* html_source) { void AddAboutStrings(content::WebUIDataSource* html_source, Profile* profile) { // Top level About Page strings. static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"aboutProductLogoAlt", IDS_SHORT_PRODUCT_LOGO_ALT_TEXT}, + {"aboutProductLogoAlt", IDS_SHORT_PRODUCT_LOGO_ALT_TEXT}, #if BUILDFLAG(GOOGLE_CHROME_BRANDING) - {"aboutReportAnIssue", IDS_SETTINGS_ABOUT_PAGE_REPORT_AN_ISSUE}, - {"aboutPrivacyPolicy", IDS_SETTINGS_ABOUT_PAGE_PRIVACY_POLICY}, -#endif - {"aboutRelaunch", IDS_SETTINGS_ABOUT_PAGE_RELAUNCH}, - {"aboutUpgradeCheckStarted", IDS_SETTINGS_ABOUT_UPGRADE_CHECK_STARTED}, - {"aboutUpgradeRelaunch", IDS_SETTINGS_UPGRADE_SUCCESSFUL_RELAUNCH}, - {"aboutUpgradeUpdating", IDS_SETTINGS_UPGRADE_UPDATING}, - {"aboutUpgradeUpdatingPercent", IDS_SETTINGS_UPGRADE_UPDATING_PERCENT}, - {"aboutGetHelpUsingChrome", IDS_SETTINGS_GET_HELP_USING_CHROME}, - {"aboutPageTitle", IDS_SETTINGS_ABOUT_PROGRAM}, - {"aboutProductTitle", IDS_PRODUCT_NAME}, - {"aboutLearnMoreUpdatingErrors", - IDS_SETTINGS_ABOUT_PAGE_LEARN_MORE_UPDATE_ERRORS}, - {"aboutLearnMoreSystemRequirements", - IDS_SETTINGS_ABOUT_PAGE_LEARN_MORE_SYSTEM_REQUIREMENTS}, + {"aboutReportAnIssue", IDS_SETTINGS_ABOUT_PAGE_REPORT_AN_ISSUE}, + {"aboutPrivacyPolicy", IDS_SETTINGS_ABOUT_PAGE_PRIVACY_POLICY}, +#endif + {"aboutRelaunch", IDS_SETTINGS_ABOUT_PAGE_RELAUNCH}, + {"aboutUpgradeCheckStarted", IDS_SETTINGS_ABOUT_UPGRADE_CHECK_STARTED}, + {"aboutUpgradeRelaunch", IDS_SETTINGS_UPGRADE_SUCCESSFUL_RELAUNCH}, + {"aboutUpgradeUpdating", IDS_SETTINGS_UPGRADE_UPDATING}, + {"aboutUpgradeUpdatingPercent", IDS_SETTINGS_UPGRADE_UPDATING_PERCENT}, + {"aboutGetHelpUsingChrome", IDS_SETTINGS_GET_HELP_USING_CHROME}, + {"aboutPageTitle", IDS_SETTINGS_ABOUT_PROGRAM}, + {"aboutProductTitle", IDS_PRODUCT_NAME}, + {"aboutLearnMoreUpdatingErrors", + IDS_SETTINGS_ABOUT_PAGE_LEARN_MORE_UPDATE_ERRORS}, + {"aboutLearnMoreSystemRequirements", + IDS_SETTINGS_ABOUT_PAGE_LEARN_MORE_SYSTEM_REQUIREMENTS}, #if BUILDFLAG(IS_MAC) - {"aboutLearnMoreUpdating", IDS_SETTINGS_ABOUT_PAGE_LEARN_MORE_UPDATING}, + {"aboutLearnMoreUpdating", IDS_SETTINGS_ABOUT_PAGE_LEARN_MORE_UPDATING}, #endif }; html_source->AddLocalizedStrings(kLocalizedStrings); @@ -403,58 +409,58 @@ void AddAboutStrings(content::WebUIDataSource* html_source, Profile* profile) { void AddAppearanceStrings(content::WebUIDataSource* html_source, Profile* profile) { static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"appearancePageTitle", IDS_SETTINGS_APPEARANCE}, - {"customWebAddress", IDS_SETTINGS_CUSTOM_WEB_ADDRESS}, - {"enterCustomWebAddress", IDS_SETTINGS_ENTER_CUSTOM_WEB_ADDRESS}, - {"homeButtonDisabled", IDS_SETTINGS_HOME_BUTTON_DISABLED}, - {"themes", IDS_SETTINGS_THEMES}, - {"chromeColors", IDS_SETTINGS_CHROME_COLORS}, - {"colorSchemeMode", IDS_SETTINGS_COLOR_SCHEME_MODE}, - {"lightMode", IDS_NTP_CUSTOMIZE_CHROME_COLOR_SCHEME_MODE_LIGHT_LABEL}, - {"darkMode", IDS_NTP_CUSTOMIZE_CHROME_COLOR_SCHEME_MODE_DARK_LABEL}, - {"systemMode", IDS_NTP_CUSTOMIZE_CHROME_COLOR_SCHEME_MODE_SYSTEM_LABEL}, - {"showHomeButton", IDS_SETTINGS_SHOW_HOME_BUTTON}, - {"showBookmarksBar", IDS_SETTINGS_SHOW_BOOKMARKS_BAR}, - {"showHoverCardImages", IDS_SETTINGS_SHOW_HOVER_CARD_IMAGES}, - {"sidePanel", IDS_SETTINGS_SIDE_PANEL}, - {"homePageNtp", IDS_SETTINGS_HOME_PAGE_NTP}, - {"changeHomePage", IDS_SETTINGS_CHANGE_HOME_PAGE}, - {"themesGalleryUrl", IDS_THEMES_GALLERY_URL}, - {"chooseFromWebStore", IDS_SETTINGS_WEB_STORE}, - {"pageZoom", IDS_SETTINGS_PAGE_ZOOM_LABEL}, - {"fontSize", IDS_SETTINGS_FONT_SIZE_LABEL}, - {"customizeFonts", IDS_SETTINGS_CUSTOMIZE_FONTS}, - {"standardFont", IDS_SETTINGS_STANDARD_FONT_LABEL}, - {"serifFont", IDS_SETTINGS_SERIF_FONT_LABEL}, - {"sansSerifFont", IDS_SETTINGS_SANS_SERIF_FONT_LABEL}, - {"fixedWidthFont", IDS_SETTINGS_FIXED_WIDTH_FONT_LABEL}, - {"mathFont", IDS_SETTINGS_MATH_FONT_LABEL}, - {"minimumFont", IDS_SETTINGS_MINIMUM_FONT_SIZE_LABEL}, - {"tiny", IDS_SETTINGS_TINY_FONT_SIZE}, - {"huge", IDS_SETTINGS_HUGE_FONT_SIZE}, - {"sidePanelAlignLeft", IDS_SETTINGS_SIDE_PANEL_ALIGN_LEFT}, - {"sidePanelAlignRight", IDS_SETTINGS_SIDE_PANEL_ALIGN_RIGHT}, + {"appearancePageTitle", IDS_SETTINGS_APPEARANCE}, + {"customWebAddress", IDS_SETTINGS_CUSTOM_WEB_ADDRESS}, + {"enterCustomWebAddress", IDS_SETTINGS_ENTER_CUSTOM_WEB_ADDRESS}, + {"homeButtonDisabled", IDS_SETTINGS_HOME_BUTTON_DISABLED}, + {"themes", IDS_SETTINGS_THEMES}, + {"chromeColors", IDS_SETTINGS_CHROME_COLORS}, + {"colorSchemeMode", IDS_SETTINGS_COLOR_SCHEME_MODE}, + {"lightMode", IDS_NTP_CUSTOMIZE_CHROME_COLOR_SCHEME_MODE_LIGHT_LABEL}, + {"darkMode", IDS_NTP_CUSTOMIZE_CHROME_COLOR_SCHEME_MODE_DARK_LABEL}, + {"systemMode", IDS_NTP_CUSTOMIZE_CHROME_COLOR_SCHEME_MODE_SYSTEM_LABEL}, + {"showHomeButton", IDS_SETTINGS_SHOW_HOME_BUTTON}, + {"showBookmarksBar", IDS_SETTINGS_SHOW_BOOKMARKS_BAR}, + {"showHoverCardImages", IDS_SETTINGS_SHOW_HOVER_CARD_IMAGES}, + {"sidePanel", IDS_SETTINGS_SIDE_PANEL}, + {"homePageNtp", IDS_SETTINGS_HOME_PAGE_NTP}, + {"changeHomePage", IDS_SETTINGS_CHANGE_HOME_PAGE}, + {"themesGalleryUrl", IDS_THEMES_GALLERY_URL}, + {"chooseFromWebStore", IDS_SETTINGS_WEB_STORE}, + {"pageZoom", IDS_SETTINGS_PAGE_ZOOM_LABEL}, + {"fontSize", IDS_SETTINGS_FONT_SIZE_LABEL}, + {"customizeFonts", IDS_SETTINGS_CUSTOMIZE_FONTS}, + {"standardFont", IDS_SETTINGS_STANDARD_FONT_LABEL}, + {"serifFont", IDS_SETTINGS_SERIF_FONT_LABEL}, + {"sansSerifFont", IDS_SETTINGS_SANS_SERIF_FONT_LABEL}, + {"fixedWidthFont", IDS_SETTINGS_FIXED_WIDTH_FONT_LABEL}, + {"mathFont", IDS_SETTINGS_MATH_FONT_LABEL}, + {"minimumFont", IDS_SETTINGS_MINIMUM_FONT_SIZE_LABEL}, + {"tiny", IDS_SETTINGS_TINY_FONT_SIZE}, + {"huge", IDS_SETTINGS_HUGE_FONT_SIZE}, + {"sidePanelAlignLeft", IDS_SETTINGS_SIDE_PANEL_ALIGN_LEFT}, + {"sidePanelAlignRight", IDS_SETTINGS_SIDE_PANEL_ALIGN_RIGHT}, #if BUILDFLAG(IS_LINUX) - {"gtkTheme", IDS_SETTINGS_GTK_THEME}, - {"useGtkTheme", IDS_SETTINGS_USE_GTK_THEME}, - {"qtTheme", IDS_SETTINGS_QT_THEME}, - {"useQtTheme", IDS_SETTINGS_USE_QT_THEME}, - {"classicTheme", IDS_SETTINGS_CLASSIC_THEME}, - {"useClassicTheme", IDS_SETTINGS_USE_CLASSIC_THEME}, + {"gtkTheme", IDS_SETTINGS_GTK_THEME}, + {"useGtkTheme", IDS_SETTINGS_USE_GTK_THEME}, + {"qtTheme", IDS_SETTINGS_QT_THEME}, + {"useQtTheme", IDS_SETTINGS_USE_QT_THEME}, + {"classicTheme", IDS_SETTINGS_CLASSIC_THEME}, + {"useClassicTheme", IDS_SETTINGS_USE_CLASSIC_THEME}, #else - {"resetToDefaultTheme", IDS_SETTINGS_RESET_TO_DEFAULT_THEME}, + {"resetToDefaultTheme", IDS_SETTINGS_RESET_TO_DEFAULT_THEME}, #endif #if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS) - {"showWindowDecorations", IDS_SHOW_WINDOW_DECORATIONS}, + {"showWindowDecorations", IDS_SHOW_WINDOW_DECORATIONS}, #endif #if BUILDFLAG(IS_MAC) - {"tabsToLinks", IDS_SETTINGS_TABS_TO_LINKS_PREF}, - {"warnBeforeQuitting", IDS_SETTINGS_WARN_BEFORE_QUITTING_PREF}, + {"tabsToLinks", IDS_SETTINGS_TABS_TO_LINKS_PREF}, + {"warnBeforeQuitting", IDS_SETTINGS_WARN_BEFORE_QUITTING_PREF}, #endif - {"readerMode", IDS_SETTINGS_READER_MODE}, - {"readerModeDescription", IDS_SETTINGS_READER_MODE_DESCRIPTION}, - {"themeManagedDialogTitle", IDS_NTP_THEME_MANAGED_DIALOG_TITLE}, - {"themeManagedDialogBody", IDS_NTP_THEME_MANAGED_DIALOG_BODY}, + {"readerMode", IDS_SETTINGS_READER_MODE}, + {"readerModeDescription", IDS_SETTINGS_READER_MODE_DESCRIPTION}, + {"themeManagedDialogTitle", IDS_NTP_THEME_MANAGED_DIALOG_TITLE}, + {"themeManagedDialogBody", IDS_NTP_THEME_MANAGED_DIALOG_BODY}, }; html_source->AddLocalizedStrings(kLocalizedStrings); @@ -480,49 +486,54 @@ void AddAppearanceStrings(content::WebUIDataSource* html_source, void AddClearBrowsingDataStrings(content::WebUIDataSource* html_source, Profile* profile) { static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"clearTimeRange", IDS_SETTINGS_CLEAR_PERIOD_TITLE}, - {"clearBrowsingDataWithSync", IDS_SETTINGS_CLEAR_BROWSING_DATA_WITH_SYNC}, - {"clearBrowsingDataWithSyncError", - IDS_SETTINGS_CLEAR_BROWSING_DATA_WITH_SYNC_ERROR}, - {"clearBrowsingDataWithSyncPassphraseError", - IDS_SETTINGS_CLEAR_BROWSING_DATA_WITH_SYNC_PASSPHRASE_ERROR}, - {"clearBrowsingDataWithSyncPaused", - IDS_SETTINGS_CLEAR_BROWSING_DATA_WITH_SYNC_PAUSED}, - {"clearBrowsingHistory", IDS_SETTINGS_CLEAR_BROWSING_HISTORY}, - {"clearBrowsingHistorySummary", - IDS_SETTINGS_CLEAR_BROWSING_HISTORY_SUMMARY}, - {"clearBrowsingHistorySummarySignedInNoLink", - IDS_SETTINGS_CLEAR_BROWSING_HISTORY_SUMMARY_SIGNED_IN_NO_LINK}, - {"clearDownloadHistory", IDS_SETTINGS_CLEAR_DOWNLOAD_HISTORY}, - {"clearCache", IDS_SETTINGS_CLEAR_CACHE}, - {"clearCookies", IDS_SETTINGS_CLEAR_COOKIES}, - {"clearCookiesSummary", - IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC}, - {"clearCookiesSummarySignedIn", - IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC_WITH_EXCEPTION}, + {"clearTimeRange", IDS_SETTINGS_CLEAR_PERIOD_TITLE}, + {"clearBrowsingDataSignedIn", IDS_SETTINGS_CLEAR_BROWSING_DATA_SIGNED_IN}, + {"clearBrowsingDataWithSync", IDS_SETTINGS_CLEAR_BROWSING_DATA_WITH_SYNC}, + {"clearBrowsingDataWithSyncError", + IDS_SETTINGS_CLEAR_BROWSING_DATA_WITH_SYNC_ERROR}, + {"clearBrowsingDataWithSyncPassphraseError", + IDS_SETTINGS_CLEAR_BROWSING_DATA_WITH_SYNC_PASSPHRASE_ERROR}, + {"clearBrowsingDataWithSyncPaused", + IDS_SETTINGS_CLEAR_BROWSING_DATA_WITH_SYNC_PAUSED}, + {"clearBrowsingHistory", IDS_SETTINGS_CLEAR_BROWSING_HISTORY}, + {"clearBrowsingHistorySummary", + IDS_SETTINGS_CLEAR_BROWSING_HISTORY_SUMMARY}, + {"clearBrowsingHistorySummarySignedInNoLink", + IDS_SETTINGS_CLEAR_BROWSING_HISTORY_SUMMARY_SIGNED_IN_NO_LINK}, + {"clearDownloadHistory", IDS_SETTINGS_CLEAR_DOWNLOAD_HISTORY}, + {"clearCache", IDS_SETTINGS_CLEAR_CACHE}, + {"clearCookies", IDS_SETTINGS_CLEAR_COOKIES}, + {"clearCookiesSummary", + IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC}, + {"clearCookiesSummarySignedIn", + IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC_SIGNED_IN_PROFILE}, + {"clearCookiesSummarySyncing", + IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC_WITH_EXCEPTION}, #if BUILDFLAG(IS_CHROMEOS_LACROS) - {"clearCookiesSummarySignedInMainProfile", - IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC_MAIN_PROFILE}, -#endif - {"clearCookiesSummarySignedInSupervisedProfile", - IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC_SUPERVISED_PROFILE}, - {"clearCookiesCounter", IDS_DEL_COOKIES_COUNTER}, - {"clearPasswords", IDS_SETTINGS_CLEAR_PASSWORDS}, - {"clearFormData", IDS_SETTINGS_CLEAR_FORM_DATA}, - {"clearHostedAppData", IDS_SETTINGS_CLEAR_HOSTED_APP_DATA}, - {"clearPeriodHour", IDS_SETTINGS_CLEAR_PERIOD_HOUR}, - {"clearPeriod24Hours", IDS_SETTINGS_CLEAR_PERIOD_24_HOURS}, - {"clearPeriod7Days", IDS_SETTINGS_CLEAR_PERIOD_7_DAYS}, - {"clearPeriod4Weeks", IDS_SETTINGS_CLEAR_PERIOD_FOUR_WEEKS}, - {"clearPeriodEverything", IDS_SETTINGS_CLEAR_PERIOD_EVERYTHING}, - {"clearPeriod15Minutes", IDS_SETTINGS_CLEAR_PERIOD_15_MINUTES}, - {"historyDeletionDialogTitle", - IDS_CLEAR_BROWSING_DATA_HISTORY_NOTICE_TITLE}, - {"historyDeletionDialogOK", IDS_CLEAR_BROWSING_DATA_HISTORY_NOTICE_OK}, - {"passwordsDeletionDialogTitle", - IDS_CLEAR_BROWSING_DATA_PASSWORDS_NOTICE_TITLE}, - {"passwordsDeletionDialogOK", IDS_CLEAR_BROWSING_DATA_PASSWORDS_NOTICE_OK}, - {"notificationWarning", IDS_SETTINGS_NOTIFICATION_WARNING}, + {"clearCookiesSummarySignedInMainProfile", + IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC_MAIN_PROFILE}, +#endif + {"clearCookiesSummarySignedInSupervisedProfile", + IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC_SUPERVISED_PROFILE}, + {"clearCookiesCounter", IDS_DEL_COOKIES_COUNTER}, + {"clearPasswords", IDS_SETTINGS_CLEAR_PASSWORDS}, + {"clearFormData", IDS_SETTINGS_CLEAR_FORM_DATA}, + {"clearHostedAppData", IDS_SETTINGS_CLEAR_HOSTED_APP_DATA}, + {"clearPeriodHour", IDS_SETTINGS_CLEAR_PERIOD_HOUR}, + {"clearPeriod24Hours", IDS_SETTINGS_CLEAR_PERIOD_24_HOURS}, + {"clearPeriod7Days", IDS_SETTINGS_CLEAR_PERIOD_7_DAYS}, + {"clearPeriod4Weeks", IDS_SETTINGS_CLEAR_PERIOD_FOUR_WEEKS}, + {"clearPeriodEverything", IDS_SETTINGS_CLEAR_PERIOD_EVERYTHING}, + {"clearPeriod15Minutes", IDS_SETTINGS_CLEAR_PERIOD_15_MINUTES}, + {"clearPeriodNotSelected", IDS_SETTINGS_CLEAR_PERIOD_NOT_SELECTED}, + {"historyDeletionDialogTitle", + IDS_CLEAR_BROWSING_DATA_HISTORY_NOTICE_TITLE}, + {"historyDeletionDialogOK", IDS_CLEAR_BROWSING_DATA_HISTORY_NOTICE_OK}, + {"passwordsDeletionDialogTitle", + IDS_CLEAR_BROWSING_DATA_PASSWORDS_NOTICE_TITLE}, + {"passwordsDeletionDialogOK", + IDS_CLEAR_BROWSING_DATA_PASSWORDS_NOTICE_OK}, + {"notificationWarning", IDS_SETTINGS_NOTIFICATION_WARNING}, }; html_source->AddString( @@ -548,6 +559,9 @@ void AddClearBrowsingDataStrings(content::WebUIDataSource* html_source, IDS_CLEAR_BROWSING_DATA_PASSWORDS_NOTICE, l10n_util::GetStringUTF16(IDS_PASSWORDS_WEB_LINK))); + html_source->AddBoolean("unoDesktopEnabled", + base::FeatureList::IsEnabled(switches::kUnoDesktop)); + html_source->AddLocalizedStrings(kLocalizedStrings); } @@ -701,20 +715,20 @@ void AddPerformanceStrings(content::WebUIDataSource* html_source) { {"performancePageTitle", IDS_SETTINGS_PERFORMANCE_PAGE_TITLE}, {"memoryPageTitle", IDS_SETTINGS_MEMORY_PAGE_TITLE}, {"speedPageTitle", IDS_SETTINGS_SPEED_PAGE_TITLE}, - {"highEfficiencyModeLabel", - IDS_SETTINGS_PERFORMANCE_HIGH_EFFICIENCY_MODE_SETTING}, - {"highEfficiencyModeDescription", - IDS_SETTINGS_PERFORMANCE_HIGH_EFFICIENCY_MODE_SETTING_DESCRIPTION}, - {"highEfficiencyModeHeuristicsLabel", - IDS_SETTINGS_PERFORMANCE_HIGH_EFFICIENCY_MODE_HEURISTICS_LABEL}, - {"highEfficiencyModeRecommendedBadge", - IDS_SETTINGS_PERFORMANCE_HIGH_EFFICIENCY_MODE_RECOMMENDED_BADGE}, - {"highEfficiencyModeOnTimerLabel", - IDS_SETTINGS_PERFORMANCE_HIGH_EFFICIENCY_MODE_ON_TIMER_LABEL}, - {"highEfficiencyModeRadioGroupAriaLabel", - IDS_SETTINGS_PERFORMANCE_HIGH_EFFICIENCY_MODE_RADIO_GROUP_ARIA_LABEL}, - {"highEfficiencyChooseDiscardTimeAriaLabel", - IDS_SETTINGS_PERFORMANCE_HIGH_EFFICIENCY_MODE_CHOOSE_DISCARD_TIME_ARIA_LABEL}, + {"memorySaverModeLabel", + IDS_SETTINGS_PERFORMANCE_MEMORY_SAVER_MODE_SETTING}, + {"memorySaverModeDescription", + IDS_SETTINGS_PERFORMANCE_MEMORY_SAVER_MODE_SETTING_DESCRIPTION}, + {"memorySaverModeHeuristicsLabel", + IDS_SETTINGS_PERFORMANCE_MEMORY_SAVER_MODE_HEURISTICS_LABEL}, + {"memorySaverModeRecommendedBadge", + IDS_SETTINGS_PERFORMANCE_MEMORY_SAVER_MODE_RECOMMENDED_BADGE}, + {"memorySaverModeOnTimerLabel", + IDS_SETTINGS_PERFORMANCE_MEMORY_SAVER_MODE_ON_TIMER_LABEL}, + {"memorySaverModeRadioGroupAriaLabel", + IDS_SETTINGS_PERFORMANCE_MEMORY_SAVER_MODE_RADIO_GROUP_ARIA_LABEL}, + {"memorySaverChooseDiscardTimeAriaLabel", + IDS_SETTINGS_PERFORMANCE_MEMORY_SAVER_MODE_CHOOSE_DISCARD_TIME_ARIA_LABEL}, {"batteryPageTitle", IDS_SETTINGS_BATTERY_PAGE_TITLE}, {"batterySaverModeLabel", IDS_SETTINGS_PERFORMANCE_BATTERY_SAVER_MODE_SETTING}, @@ -750,8 +764,8 @@ void AddPerformanceStrings(content::WebUIDataSource* html_source) { html_source->AddLocalizedStrings(kLocalizedStrings); html_source->AddBoolean( - "highEfficiencyShowRecommendedBadge", - performance_manager::features::kHighEfficiencyShowRecommendedBadge.Get()); + "memorySaverShowRecommendedBadge", + performance_manager::features::kMemorySaverShowRecommendedBadge.Get()); html_source->AddString( "tabDiscardTimerFiveMinutes", @@ -801,10 +815,10 @@ void AddPerformanceStrings(content::WebUIDataSource* html_source) { "tabDiscardingExceptionsAddDialogHelp", l10n_util::GetStringFUTF16( IDS_SETTINGS_PERFORMANCE_TAB_DISCARDING_EXCEPTIONS_ADD_DIALOG_HELP, - chrome::kHighEfficiencyModeTabDiscardingHelpUrl)); + chrome::kMemorySaverModeTabDiscardingHelpUrl)); - html_source->AddString("highEfficiencyLearnMoreUrl", - chrome::kHighEfficiencyModeLearnMoreUrl); + html_source->AddString("memorySaverLearnMoreUrl", + chrome::kMemorySaverModeLearnMoreUrl); html_source->AddString("batterySaverLearnMoreUrl", chrome::kBatterySaverModeLearnMoreUrl); html_source->AddString("preloadingLearnMoreUrl", @@ -820,90 +834,97 @@ void AddPerformanceStrings(content::WebUIDataSource* html_source) { void AddLanguagesStrings(content::WebUIDataSource* html_source, Profile* profile) { static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"languagesPageTitle", IDS_SETTINGS_LANGUAGES_PAGE_TITLE}, + {"languagesPageTitle", IDS_SETTINGS_LANGUAGES_PAGE_TITLE}, #if !BUILDFLAG(IS_CHROMEOS_ASH) - {"languagesCardTitle", IDS_SETTINGS_LANGUAGES_CARD_TITLE}, - {"searchLanguages", IDS_SETTINGS_LANGUAGE_SEARCH}, - {"languagesExpandA11yLabel", - IDS_SETTINGS_LANGUAGES_EXPAND_ACCESSIBILITY_LABEL}, - {"preferredLanguagesDesc", IDS_SETTINGS_LANGUAGES_PREFERRED_LANGUAGES_DESC}, - {"moveToTop", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_TO_TOP}, - {"moveUp", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_UP}, - {"moveDown", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_DOWN}, - {"removeLanguage", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_REMOVE}, - {"addLanguages", IDS_SETTINGS_LANGUAGES_LANGUAGES_ADD}, - {"addLanguagesDialogTitle", IDS_SETTINGS_LANGUAGES_MANAGE_LANGUAGES_TITLE}, + {"languagesCardTitle", IDS_SETTINGS_LANGUAGES_CARD_TITLE}, + {"searchLanguages", IDS_SETTINGS_LANGUAGE_SEARCH}, + {"languagesExpandA11yLabel", + IDS_SETTINGS_LANGUAGES_EXPAND_ACCESSIBILITY_LABEL}, + {"preferredLanguagesDesc", + IDS_SETTINGS_LANGUAGES_PREFERRED_LANGUAGES_DESC}, + {"moveToTop", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_TO_TOP}, + {"moveUp", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_UP}, + {"moveDown", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_DOWN}, + {"removeLanguage", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_REMOVE}, + {"addLanguages", IDS_SETTINGS_LANGUAGES_LANGUAGES_ADD}, + {"addLanguagesDialogTitle", + IDS_SETTINGS_LANGUAGES_MANAGE_LANGUAGES_TITLE}, #if BUILDFLAG(IS_WIN) - {"isDisplayedInThisLanguage", - IDS_SETTINGS_LANGUAGES_IS_DISPLAYED_IN_THIS_LANGUAGE}, - {"displayInThisLanguage", IDS_SETTINGS_LANGUAGES_DISPLAY_IN_THIS_LANGUAGE}, -#endif - {"offerToEnableTranslate", - IDS_SETTINGS_LANGUAGES_OFFER_TO_ENABLE_TRANSLATE}, - {"offerToEnableTranslateSublabel", - IDS_SETTINGS_LANGUAGES_OFFER_TO_ENABLE_TRANSLATE_SUBLABEL}, - {"noLanguagesAdded", IDS_SETTINGS_LANGUAGES_NO_LANGUAGES_ADDED}, - {"addLanguageAriaLabel", IDS_SETTINGS_LANGUAGES_ADD_ARIA_LABEL}, - {"removeAutomaticLanguageAriaLabel", - IDS_SETTINGS_LANGUAGES_REMOVE_AUTOMATIC_ARIA_LABEL}, - {"removeNeverLanguageAriaLabel", - IDS_SETTINGS_LANGUAGES_REMOVE_NEVER_ARIA_LABEL}, - {"translatePageTitle", IDS_SETTINGS_TRANSLATE_PAGE_TITLE}, - {"targetLanguageLabel", IDS_SETTINGS_TARGET_TRANSLATE_LABEL}, - {"automaticallyTranslateLanguages", - IDS_SETTINGS_LANGUAGES_AUTOMATIC_TRANSLATE}, - {"addAutomaticallyTranslateLanguagesAriaLabel", - IDS_SETTINGS_LANGUAGES_AUTOMATIC_TRANSLATE_ADD_ARIA_LABEL}, - {"neverTranslateLanguages", IDS_SETTINGS_LANGUAGES_NEVER_LANGUAGES}, - {"addNeverTranslateLanguagesAriaLabel", - IDS_SETTINGS_LANGUAGES_NEVER_TRANSLATE_ADD_ARIA_LABEL}, - {"translateTargetLabel", IDS_SETTINGS_LANGUAGES_TRANSLATE_TARGET}, - {"spellCheckTitle", IDS_SETTINGS_LANGUAGES_SPELL_CHECK_TITLE}, - {"spellCheckBasicLabel", IDS_SETTINGS_LANGUAGES_SPELL_CHECK_BASIC_LABEL}, - {"spellCheckEnhancedLabel", - IDS_SETTINGS_LANGUAGES_SPELL_CHECK_ENHANCED_LABEL}, - {"spellCheckEnhancedDescription", - IDS_SETTINGS_LANGUAGES_SPELL_CHECK_ENHANCED_DESCRIPTION}, - {"offerToEnableSpellCheck", - IDS_SETTINGS_LANGUAGES_OFFER_TO_ENABLE_SPELL_CHECK}, - // Managed dialog strings: - {"languageManagedDialogTitle", IDS_SETTINGS_LANGUAGES_MANAGED_DIALOG_TITLE}, - {"languageManagedDialogBody", IDS_SETTINGS_LANGUAGES_MANAGED_DIALOG_BODY}, + {"isDisplayedInThisLanguage", + IDS_SETTINGS_LANGUAGES_IS_DISPLAYED_IN_THIS_LANGUAGE}, + {"displayInThisLanguage", + IDS_SETTINGS_LANGUAGES_DISPLAY_IN_THIS_LANGUAGE}, +#endif + {"offerToEnableTranslate", + IDS_SETTINGS_LANGUAGES_OFFER_TO_ENABLE_TRANSLATE}, + {"offerToEnableTranslateSublabel", + IDS_SETTINGS_LANGUAGES_OFFER_TO_ENABLE_TRANSLATE_SUBLABEL}, + {"noLanguagesAdded", IDS_SETTINGS_LANGUAGES_NO_LANGUAGES_ADDED}, + {"addLanguageAriaLabel", IDS_SETTINGS_LANGUAGES_ADD_ARIA_LABEL}, + {"removeAutomaticLanguageAriaLabel", + IDS_SETTINGS_LANGUAGES_REMOVE_AUTOMATIC_ARIA_LABEL}, + {"removeNeverLanguageAriaLabel", + IDS_SETTINGS_LANGUAGES_REMOVE_NEVER_ARIA_LABEL}, + {"translatePageTitle", IDS_SETTINGS_TRANSLATE_PAGE_TITLE}, + {"targetLanguageLabel", IDS_SETTINGS_TARGET_TRANSLATE_LABEL}, + {"automaticallyTranslateLanguages", + IDS_SETTINGS_LANGUAGES_AUTOMATIC_TRANSLATE}, + {"addAutomaticallyTranslateLanguagesAriaLabel", + IDS_SETTINGS_LANGUAGES_AUTOMATIC_TRANSLATE_ADD_ARIA_LABEL}, + {"neverTranslateLanguages", IDS_SETTINGS_LANGUAGES_NEVER_LANGUAGES}, + {"addNeverTranslateLanguagesAriaLabel", + IDS_SETTINGS_LANGUAGES_NEVER_TRANSLATE_ADD_ARIA_LABEL}, + {"translateTargetLabel", IDS_SETTINGS_LANGUAGES_TRANSLATE_TARGET}, + {"spellCheckTitle", IDS_SETTINGS_LANGUAGES_SPELL_CHECK_TITLE}, + {"spellCheckBasicLabel", IDS_SETTINGS_LANGUAGES_SPELL_CHECK_BASIC_LABEL}, + {"spellCheckEnhancedLabel", + IDS_SETTINGS_LANGUAGES_SPELL_CHECK_ENHANCED_LABEL}, + {"spellCheckEnhancedDescription", + IDS_SETTINGS_LANGUAGES_SPELL_CHECK_ENHANCED_DESCRIPTION}, + {"offerToEnableSpellCheck", + IDS_SETTINGS_LANGUAGES_OFFER_TO_ENABLE_SPELL_CHECK}, + // Managed dialog strings: + {"languageManagedDialogTitle", + IDS_SETTINGS_LANGUAGES_MANAGED_DIALOG_TITLE}, + {"languageManagedDialogBody", IDS_SETTINGS_LANGUAGES_MANAGED_DIALOG_BODY}, #if !BUILDFLAG(IS_MAC) - {"spellCheckDisabledReason", - IDS_SETTING_LANGUAGES_SPELL_CHECK_DISABLED_REASON}, - {"spellCheckLanguagesListTitle", - IDS_SETTINGS_LANGUAGES_SPELL_CHECK_LANGUAGES_LIST_TITLE}, - {"manageSpellCheck", IDS_SETTINGS_LANGUAGES_SPELL_CHECK_MANAGE}, - {"editDictionaryPageTitle", IDS_SETTINGS_LANGUAGES_EDIT_DICTIONARY_TITLE}, - {"addDictionaryWordLabel", IDS_SETTINGS_LANGUAGES_ADD_DICTIONARY_WORD}, - {"addDictionaryWordButton", - IDS_SETTINGS_LANGUAGES_ADD_DICTIONARY_WORD_BUTTON}, - {"addDictionaryWordDuplicateError", - IDS_SETTINGS_LANGUAGES_ADD_DICTIONARY_WORD_DUPLICATE_ERROR}, - {"addDictionaryWordLengthError", - IDS_SETTINGS_LANGUAGES_ADD_DICTIONARY_WORD_LENGTH_ERROR}, - {"deleteDictionaryWordButton", - IDS_SETTINGS_LANGUAGES_DELETE_DICTIONARY_WORD_BUTTON}, - {"customDictionaryWords", IDS_SETTINGS_LANGUAGES_DICTIONARY_WORDS}, - {"noCustomDictionaryWordsFound", - IDS_SETTINGS_LANGUAGES_DICTIONARY_WORDS_NONE}, - {"languagesDictionaryDownloadError", - IDS_SETTINGS_LANGUAGES_DICTIONARY_DOWNLOAD_FAILED}, - {"languagesDictionaryDownloadErrorHelp", - IDS_SETTINGS_LANGUAGES_DICTIONARY_DOWNLOAD_FAILED_HELP}, + {"spellCheckDisabledReason", + IDS_SETTING_LANGUAGES_SPELL_CHECK_DISABLED_REASON}, + {"spellCheckLanguagesListTitle", + IDS_SETTINGS_LANGUAGES_SPELL_CHECK_LANGUAGES_LIST_TITLE}, + {"manageSpellCheck", IDS_SETTINGS_LANGUAGES_SPELL_CHECK_MANAGE}, + {"editDictionaryPageTitle", IDS_SETTINGS_LANGUAGES_EDIT_DICTIONARY_TITLE}, + {"addDictionaryWordLabel", IDS_SETTINGS_LANGUAGES_ADD_DICTIONARY_WORD}, + {"addDictionaryWordButton", + IDS_SETTINGS_LANGUAGES_ADD_DICTIONARY_WORD_BUTTON}, + {"addDictionaryWordDuplicateError", + IDS_SETTINGS_LANGUAGES_ADD_DICTIONARY_WORD_DUPLICATE_ERROR}, + {"addDictionaryWordLengthError", + IDS_SETTINGS_LANGUAGES_ADD_DICTIONARY_WORD_LENGTH_ERROR}, + {"deleteDictionaryWordButton", + IDS_SETTINGS_LANGUAGES_DELETE_DICTIONARY_WORD_BUTTON}, + {"customDictionaryWords", IDS_SETTINGS_LANGUAGES_DICTIONARY_WORDS}, + {"noCustomDictionaryWordsFound", + IDS_SETTINGS_LANGUAGES_DICTIONARY_WORDS_NONE}, + {"languagesDictionaryDownloadError", + IDS_SETTINGS_LANGUAGES_DICTIONARY_DOWNLOAD_FAILED}, + {"languagesDictionaryDownloadErrorHelp", + IDS_SETTINGS_LANGUAGES_DICTIONARY_DOWNLOAD_FAILED_HELP}, #endif #endif // !BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(IS_CHROMEOS_ASH) - {"openChromeOSLanguagesSettingsLabel", - IDS_SETTINGS_LANGUAGES_OPEN_CHROME_OS_SETTINGS_LABEL}, + {"openChromeOSLanguagesSettingsLabel", + IDS_SETTINGS_LANGUAGES_OPEN_CHROME_OS_SETTINGS_LABEL}, #endif }; html_source->AddLocalizedStrings(kLocalizedStrings); #if BUILDFLAG(IS_CHROMEOS_ASH) html_source->AddString( - "chromeOSLanguagesSettingsPath", - chromeos::settings::mojom::kLanguagesAndInputSectionPath); + "osSettingsLanguagesPageUrl", + ash::features::IsOsSettingsRevampWayfindingEnabled() + ? BuildOSSettingsUrl(chromeos::settings::mojom::kLanguagesSubpagePath) + : BuildOSSettingsUrl( + chromeos::settings::mojom::kLanguagesAndInputSectionPath)); #endif // BUILDFLAG(IS_CHROMEOS_ASH) } @@ -936,13 +957,15 @@ bool IsFidoAuthenticationAvailable(autofill::PersonalDataManager* personal_data, // If |autofill_manager| is not available, then don't show toggle switch. autofill::ContentAutofillDriverFactory* autofill_driver_factory = autofill::ContentAutofillDriverFactory::FromWebContents(web_contents); - if (!autofill_driver_factory) + if (!autofill_driver_factory) { return false; + } autofill::ContentAutofillDriver* autofill_driver = autofill_driver_factory->DriverForFrame( web_contents->GetPrimaryMainFrame()); - if (!autofill_driver) + if (!autofill_driver) { return false; + } // Show the toggle switch only if FIDO authentication is available. Once // returned, this decision may be overridden (from true to false) by the @@ -971,171 +994,190 @@ void AddAutofillStrings(content::WebUIDataSource* html_source, Profile* profile, content::WebContents* web_contents) { static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"autofillPageTitle", IDS_SETTINGS_AUTOFILL_AND_PASSWORDS}, - {"passwordsDescription", IDS_SETTINGS_PASSWORD_MANAGER_DESCRIPTION}, - {"genericCreditCard", IDS_AUTOFILL_CC_GENERIC}, - {"creditCards", IDS_AUTOFILL_PAYMENT_METHODS}, - {"paymentsMethodsTableAriaLabel", - IDS_AUTOFILL_PAYMENT_METHODS_TABLE_ARIA_LABEL}, - {"noPaymentMethodsFound", IDS_SETTINGS_PAYMENT_METHODS_NONE}, - {"googlePayments", IDS_SETTINGS_GOOGLE_PAYMENTS}, - {"googlePaymentsCached", IDS_SETTINGS_GOOGLE_PAYMENTS_CACHED}, - {"enableProfilesLabel", IDS_AUTOFILL_ENABLE_PROFILES_TOGGLE_LABEL}, - {"enableProfilesSublabel", IDS_AUTOFILL_ENABLE_PROFILES_TOGGLE_SUBLABEL}, - {"enableCreditCardsLabel", IDS_AUTOFILL_ENABLE_CREDIT_CARDS_TOGGLE_LABEL}, - {"enableCreditCardsSublabel", - IDS_AUTOFILL_ENABLE_CREDIT_CARDS_TOGGLE_SUBLABEL}, - {"enableCreditCardFIDOAuthLabel", IDS_ENABLE_CREDIT_CARD_FIDO_AUTH_LABEL}, - {"enableCreditCardFIDOAuthSublabel", - IDS_ENABLE_CREDIT_CARD_FIDO_AUTH_SUBLABEL}, - {"enableCvcStorageLabel", - IDS_AUTOFILL_SETTINGS_PAGE_ENABLE_CVC_STORAGE_LABEL}, - {"enableCvcStorageSublabel", - IDS_AUTOFILL_SETTINGS_PAGE_ENABLE_CVC_STORAGE_SUBLABEL}, - {"enableCvcStorageDeleteDataSublabel", - IDS_AUTOFILL_SETTINGS_PAGE_ENABLE_CVC_STORAGE_WITH_DELETE_LINK_SUBLABEL}, - {"enableMandatoryAuthToggleLabel", - IDS_AUTOFILL_SETTINGS_PAGE_ENABLE_PAYMENT_METHOD_MANDATORY_REAUTH_LABEL}, - {"enableMandatoryAuthToggleSublabel", - IDS_AUTOFILL_SETTINGS_PAGE_ENABLE_PAYMENT_METHOD_MANDATORY_REAUTH_SUBLABEL}, - {"bulkRemoveCvcConfirmationTitle", - IDS_AUTOFILL_SETTINGS_PAGE_BULK_REMOVE_CVC_TITLE}, - {"bulkRemoveCvcConfirmationDescription", - IDS_AUTOFILL_SETTINGS_PAGE_BULK_REMOVE_CVC_DESCRIPTION}, - {"addresses", IDS_AUTOFILL_ADDRESSES}, - {"addressesTableAriaLabel", IDS_AUTOFILL_ADDRESSES_TABLE_ARIA_LABEL}, - {"addressesTitle", IDS_AUTOFILL_ADDRESSES_SETTINGS_TITLE}, - {"addAddressTitle", IDS_SETTINGS_AUTOFILL_ADDRESSES_ADD_TITLE}, - {"editAddressTitle", IDS_SETTINGS_AUTOFILL_ADDRESSES_EDIT_TITLE}, - {"localAddressIconA11yLabel", IDS_AUTOFILL_LOCAL_ADDRESS_ICON_A11Y_LABEL}, - {"newAccountAddressSourceNotice", - IDS_AUTOFILL_ADDRESS_WILL_BE_SAVED_IN_ACCOUNT_SOURCE_NOTICE}, - {"editAccountAddressSourceNotice", - IDS_AUTOFILL_ADDRESS_ALREADY_SAVED_IN_ACCOUNT_SOURCE_NOTICE}, - {"deleteAccountAddressSourceNotice", - IDS_AUTOFILL_DELETE_ACCOUNT_ADDRESS_SOURCE_NOTICE}, - {"addressCountry", IDS_SETTINGS_AUTOFILL_ADDRESSES_COUNTRY}, - {"addressPhone", IDS_SETTINGS_AUTOFILL_ADDRESSES_PHONE}, - {"addressEmail", IDS_SETTINGS_AUTOFILL_ADDRESSES_EMAIL}, - {"honorificLabel", IDS_SETTINGS_AUTOFILL_ADDRESS_HONORIFIC_LABEL}, - {"creditCardDescription", IDS_SETTINGS_AUTOFILL_CARD_DESCRIPTION}, - {"creditCardA11yLabeled", IDS_SETTINGS_AUTOFILL_CARD_A11Y_LABELED}, - {"creditCardExpDateA11yLabeled", - IDS_SETTINGS_AUTOFILL_CARD_EXP_DATE_A11Y_LABELED}, - {"moreActionsForAddress", IDS_SETTINGS_AUTOFILL_MORE_ACTIONS_FOR_ADDRESS}, - {"moreActionsForCreditCard", - IDS_SETTINGS_AUTOFILL_MORE_ACTIONS_FOR_CREDIT_CARD}, - {"removeAddress", IDS_SETTINGS_ADDRESS_REMOVE}, - {"removeAddressConfirmationTitle", - IDS_SETTINGS_ADDRESS_REMOVE_CONFIRMATION_TITLE}, - {"removeSyncAddressConfirmationDescription", - IDS_AUTOFILL_DELETE_SYNC_ADDRESS_SOURCE_NOTICE}, - {"removeLocalAddressConfirmationDescription", - IDS_AUTOFILL_DELETE_LOCAL_ADDRESS_SOURCE_NOTICE}, - {"removeLocalCreditCardConfirmationTitle", - IDS_SETTINGS_LOCAL_CARD_REMOVE_CONFIRMATION_TITLE}, - {"removeLocalPaymentMethodConfirmationDescription", - IDS_SETTINGS_LOCAL_PAYMENT_METHOD_REMOVE_CONFIRMATION_DESCRIPTION}, - {"addressRemovedMessage", IDS_SETTINGS_ADDRESS_REMOVED_MESSAGE}, - {"editAddressRequiredFieldError", - IDS_AUTOFILL_EDIT_ADDRESS_REQUIRED_FIELD_FORM_ERROR}, - {"editAddressRequiredFieldsError", - IDS_AUTOFILL_EDIT_ADDRESS_REQUIRED_FIELDS_FORM_ERROR}, - {"clearCreditCard", IDS_SETTINGS_CREDIT_CARD_REMOVE}, - {"creditCardExpiration", IDS_SETTINGS_CREDIT_CARD_EXPIRATION_DATE}, - {"creditCardName", IDS_SETTINGS_NAME_ON_CREDIT_CARD}, - {"creditCardNickname", IDS_SETTINGS_CREDIT_CARD_NICKNAME}, - {"creditCardNicknameInvalid", IDS_SETTINGS_CREDIT_CARD_NICKNAME_INVALID}, - {"creditCardNumber", IDS_SETTINGS_CREDIT_CARD_NUMBER}, - {"creditCardExpirationMonth", IDS_SETTINGS_CREDIT_CARD_EXPIRATION_MONTH}, - {"creditCardExpirationYear", IDS_SETTINGS_CREDIT_CARD_EXPIRATION_YEAR}, - {"creditCardExpired", IDS_SETTINGS_CREDIT_CARD_EXPIRED}, - {"editCreditCardTitle", IDS_SETTINGS_EDIT_CREDIT_CARD_TITLE}, - {"addCreditCardTitle", IDS_SETTINGS_ADD_CREDIT_CARD_TITLE}, - {"addPaymentMethods", IDS_SETTINGS_ADD_PAYMENT_METHODS}, - {"addPaymentMethodCreditOrDebitCard", - IDS_SETTINGS_ADD_PAYMENT_METHOD_CREDIT_OR_DEBIT_CARD}, - {"addPaymentMethodIban", IDS_SETTINGS_ADD_PAYMENT_METHOD_IBAN}, - {"ibanSavedToThisDeviceOnly", IDS_SETTINGS_IBAN_SAVED_TO_THIS_DEVICE_ONLY}, - {"addIbanTitle", IDS_SETTINGS_ADD_IBAN_TITLE}, - {"editIbanTitle", IDS_SETTINGS_EDIT_IBAN_TITLE}, - {"ibanNickname", IDS_IBAN_NICKNAME}, - {"moreActionsForIban", IDS_SETTINGS_AUTOFILL_MORE_ACTIONS_FOR_IBAN}, - {"moreActionsForIbanDescription", - IDS_SETTINGS_AUTOFILL_MORE_ACTIONS_FOR_IBAN_DESCRIPTION}, - {"editIban", IDS_SETTINGS_IBAN_EDIT}, - {"removeLocalIbanConfirmationTitle", - IDS_SETTINGS_LOCAL_IBAN_REMOVE_CONFIRMATION_TITLE}, - {"migrateCreditCardsLabel", IDS_SETTINGS_MIGRATABLE_CARDS_LABEL}, - {"migratableCardsInfoSingle", IDS_SETTINGS_SINGLE_MIGRATABLE_CARD_INFO}, - {"migratableCardsInfoMultiple", - IDS_SETTINGS_MULTIPLE_MIGRATABLE_CARDS_INFO}, - {"remotePaymentMethodsLinkLabel", - IDS_SETTINGS_REMOTE_PAYMENT_METHODS_LINK_LABEL}, - {"canMakePaymentToggleLabel", IDS_SETTINGS_CAN_MAKE_PAYMENT_TOGGLE_LABEL}, - {"autofillDetail", IDS_SETTINGS_AUTOFILL_DETAIL}, - {"passwords", IDS_SETTINGS_PASSWORD_MANAGER}, - {"passwordsLeakDetectionLabel", - IDS_SETTINGS_PASSWORDS_LEAK_DETECTION_LABEL}, - {"passwordsLeakDetectionLabelUpdated", - IDS_SETTINGS_PASSWORDS_LEAK_DETECTION_LABEL_UPDATED}, - {"passwordsLeakDetectionGeneralDescription", - IDS_PASSWORD_MANAGER_LEAK_HELP_MESSAGE}, - {"passwordsLeakDetectionGeneralDescriptionUpdated", - IDS_PASSWORD_MANAGER_LEAK_HELP_MESSAGE_UPDATED}, - {"passwordsLeakDetectionSignedOutEnabledDescription", - IDS_SETTINGS_PASSWORDS_LEAK_DETECTION_SIGNED_OUT_ENABLED_DESC}, - {"editPasskeySiteLabel", IDS_SETTINGS_PASSKEYS_SITE_LABEL}, - {"editPasskeyUsernameLabel", - IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_USERNAME_LABEL}, + {"autofillPageTitle", IDS_SETTINGS_AUTOFILL_AND_PASSWORDS}, + {"passwordsDescription", IDS_SETTINGS_PASSWORD_MANAGER_DESCRIPTION}, + {"genericCreditCard", IDS_AUTOFILL_CC_GENERIC}, + {"creditCards", IDS_AUTOFILL_PAYMENT_METHODS}, + {"paymentsMethodsTableAriaLabel", + IDS_AUTOFILL_PAYMENT_METHODS_TABLE_ARIA_LABEL}, + {"noPaymentMethodsFound", IDS_SETTINGS_PAYMENT_METHODS_NONE}, + {"googlePayments", IDS_SETTINGS_GOOGLE_PAYMENTS}, + {"googlePaymentsCached", IDS_SETTINGS_GOOGLE_PAYMENTS_CACHED}, + {"enableProfilesLabel", IDS_AUTOFILL_ENABLE_PROFILES_TOGGLE_LABEL}, + {"enableProfilesSublabel", IDS_AUTOFILL_ENABLE_PROFILES_TOGGLE_SUBLABEL}, + {"enableCreditCardsLabel", IDS_AUTOFILL_ENABLE_CREDIT_CARDS_TOGGLE_LABEL}, + {"enableCreditCardsSublabel", + IDS_AUTOFILL_ENABLE_CREDIT_CARDS_TOGGLE_SUBLABEL}, + {"enableCreditCardFIDOAuthLabel", IDS_ENABLE_CREDIT_CARD_FIDO_AUTH_LABEL}, + {"enableCreditCardFIDOAuthSublabel", + IDS_ENABLE_CREDIT_CARD_FIDO_AUTH_SUBLABEL}, + {"enableCvcStorageLabel", + IDS_AUTOFILL_SETTINGS_PAGE_ENABLE_CVC_STORAGE_LABEL}, + {"enableCvcStorageSublabel", + IDS_AUTOFILL_SETTINGS_PAGE_ENABLE_CVC_STORAGE_SUBLABEL}, + {"enableCvcStorageDeleteDataSublabel", + IDS_AUTOFILL_SETTINGS_PAGE_ENABLE_CVC_STORAGE_WITH_DELETE_LINK_SUBLABEL}, + {"enableMandatoryAuthToggleLabel", + IDS_AUTOFILL_SETTINGS_PAGE_ENABLE_PAYMENT_METHOD_MANDATORY_REAUTH_LABEL}, + {"enableMandatoryAuthToggleSublabel", + IDS_AUTOFILL_SETTINGS_PAGE_ENABLE_PAYMENT_METHOD_MANDATORY_REAUTH_SUBLABEL}, + {"bulkRemoveCvcConfirmationTitle", + IDS_AUTOFILL_SETTINGS_PAGE_BULK_REMOVE_CVC_TITLE}, + {"bulkRemoveCvcConfirmationDescription", + IDS_AUTOFILL_SETTINGS_PAGE_BULK_REMOVE_CVC_DESCRIPTION}, + {"addresses", IDS_AUTOFILL_ADDRESSES}, + {"addressesTableAriaLabel", IDS_AUTOFILL_ADDRESSES_TABLE_ARIA_LABEL}, + {"addressesTitle", IDS_AUTOFILL_ADDRESSES_SETTINGS_TITLE}, + {"addAddressTitle", IDS_SETTINGS_AUTOFILL_ADDRESSES_ADD_TITLE}, + {"editAddressTitle", IDS_SETTINGS_AUTOFILL_ADDRESSES_EDIT_TITLE}, + {"localAddressIconA11yLabel", IDS_AUTOFILL_LOCAL_ADDRESS_ICON_A11Y_LABEL}, + {"newAccountAddressSourceNotice", + IDS_AUTOFILL_ADDRESS_WILL_BE_SAVED_IN_ACCOUNT_SOURCE_NOTICE}, + {"editAccountAddressSourceNotice", + IDS_AUTOFILL_ADDRESS_ALREADY_SAVED_IN_ACCOUNT_SOURCE_NOTICE}, + {"deleteAccountAddressSourceNotice", + IDS_AUTOFILL_DELETE_ACCOUNT_ADDRESS_SOURCE_NOTICE}, + {"addressCountry", IDS_SETTINGS_AUTOFILL_ADDRESSES_COUNTRY}, + {"addressPhone", IDS_SETTINGS_AUTOFILL_ADDRESSES_PHONE}, + {"addressEmail", IDS_SETTINGS_AUTOFILL_ADDRESSES_EMAIL}, + {"creditCardDescription", IDS_SETTINGS_AUTOFILL_CARD_DESCRIPTION}, + {"creditCardA11yLabeled", IDS_SETTINGS_AUTOFILL_CARD_A11Y_LABELED}, + {"creditCardExpDateA11yLabeled", + IDS_SETTINGS_AUTOFILL_CARD_EXP_DATE_A11Y_LABELED}, + {"moreActionsForAddress", IDS_SETTINGS_AUTOFILL_MORE_ACTIONS_FOR_ADDRESS}, + {"moreActionsForCreditCard", + IDS_SETTINGS_AUTOFILL_MORE_ACTIONS_FOR_CREDIT_CARD}, + {"removeAddress", IDS_SETTINGS_ADDRESS_REMOVE}, + {"removeAddressConfirmationTitle", + IDS_SETTINGS_ADDRESS_REMOVE_CONFIRMATION_TITLE}, + {"removeSyncAddressConfirmationDescription", + IDS_AUTOFILL_DELETE_SYNC_ADDRESS_SOURCE_NOTICE}, + {"removeLocalAddressConfirmationDescription", + IDS_AUTOFILL_DELETE_LOCAL_ADDRESS_SOURCE_NOTICE}, + {"removeLocalCreditCardConfirmationTitle", + IDS_SETTINGS_LOCAL_CARD_REMOVE_CONFIRMATION_TITLE}, + {"removeLocalPaymentMethodConfirmationDescription", + IDS_SETTINGS_LOCAL_PAYMENT_METHOD_REMOVE_CONFIRMATION_DESCRIPTION}, + {"addressRemovedMessage", IDS_SETTINGS_ADDRESS_REMOVED_MESSAGE}, + {"editAddressRequiredFieldError", + IDS_AUTOFILL_EDIT_ADDRESS_REQUIRED_FIELD_FORM_ERROR}, + {"editAddressRequiredFieldsError", + IDS_AUTOFILL_EDIT_ADDRESS_REQUIRED_FIELDS_FORM_ERROR}, + {"clearCreditCard", IDS_SETTINGS_CREDIT_CARD_REMOVE}, + {"creditCardExpiration", IDS_SETTINGS_CREDIT_CARD_EXPIRATION_DATE}, + {"creditCardName", IDS_SETTINGS_NAME_ON_CREDIT_CARD}, + {"creditCardNickname", IDS_SETTINGS_CREDIT_CARD_NICKNAME}, + {"creditCardNicknameInvalid", IDS_SETTINGS_CREDIT_CARD_NICKNAME_INVALID}, + {"creditCardCvcInputTitle", IDS_SETTINGS_CREDIT_CARD_CVC_TITLE}, + {"creditCardCvcImageTitle", IDS_SETTINGS_CREDIT_CARD_CVC_IMAGE_TITLE}, + {"creditCardCvcAmexImageTitle", + IDS_SETTINGS_CREDIT_CARD_CVC_IMAGE_TITLE_AMEX}, + {"creditCardCvcInputPlaceholder", + IDS_SETTINGS_CREDIT_CARD_CVC_PLACEHOLDER}, + {"creditCardNumber", IDS_SETTINGS_CREDIT_CARD_NUMBER}, + {"creditCardExpirationMonth", IDS_SETTINGS_CREDIT_CARD_EXPIRATION_MONTH}, + {"creditCardExpirationYear", IDS_SETTINGS_CREDIT_CARD_EXPIRATION_YEAR}, + {"creditCardExpired", IDS_SETTINGS_CREDIT_CARD_EXPIRED}, + {"editCreditCardTitle", IDS_SETTINGS_EDIT_CREDIT_CARD_TITLE}, + {"addCreditCardTitle", IDS_SETTINGS_ADD_CREDIT_CARD_TITLE}, + {"addPaymentMethods", IDS_SETTINGS_ADD_PAYMENT_METHODS}, + {"addPaymentMethodCreditOrDebitCard", + IDS_SETTINGS_ADD_PAYMENT_METHOD_CREDIT_OR_DEBIT_CARD}, + {"addPaymentMethodIban", IDS_SETTINGS_ADD_PAYMENT_METHOD_IBAN}, + {"ibanSavedToThisDeviceOnly", + IDS_SETTINGS_IBAN_SAVED_TO_THIS_DEVICE_ONLY}, + {"addIbanTitle", IDS_SETTINGS_ADD_IBAN_TITLE}, + {"editIbanTitle", IDS_SETTINGS_EDIT_IBAN_TITLE}, + {"ibanNickname", IDS_IBAN_NICKNAME}, + {"moreActionsForIban", IDS_SETTINGS_AUTOFILL_MORE_ACTIONS_FOR_IBAN}, + {"a11yIbanDescription", IDS_SETTINGS_AUTOFILL_A11Y_IBAN_DESCRIPTION}, + {"editIban", IDS_SETTINGS_IBAN_EDIT}, + {"removeLocalIbanConfirmationTitle", + IDS_SETTINGS_LOCAL_IBAN_REMOVE_CONFIRMATION_TITLE}, + {"migrateCreditCardsLabel", IDS_SETTINGS_MIGRATABLE_CARDS_LABEL}, + {"migratableCardsInfoSingle", IDS_SETTINGS_SINGLE_MIGRATABLE_CARD_INFO}, + {"migratableCardsInfoMultiple", + IDS_SETTINGS_MULTIPLE_MIGRATABLE_CARDS_INFO}, + {"remotePaymentMethodsLinkLabel", + IDS_SETTINGS_REMOTE_PAYMENT_METHODS_LINK_LABEL}, + {"canMakePaymentToggleLabel", IDS_SETTINGS_CAN_MAKE_PAYMENT_TOGGLE_LABEL}, + {"autofillDetail", IDS_SETTINGS_AUTOFILL_DETAIL}, + {"passwords", IDS_SETTINGS_PASSWORD_MANAGER}, + {"passwordsLeakDetectionLabel", + IDS_SETTINGS_PASSWORDS_LEAK_DETECTION_LABEL}, + {"passwordsLeakDetectionLabelUpdated", + IDS_SETTINGS_PASSWORDS_LEAK_DETECTION_LABEL_UPDATED}, + {"passwordsLeakDetectionGeneralDescription", + IDS_PASSWORD_MANAGER_LEAK_HELP_MESSAGE}, + {"passwordsLeakDetectionGeneralDescriptionUpdated", + IDS_PASSWORD_MANAGER_LEAK_HELP_MESSAGE_UPDATED}, + {"passwordsLeakDetectionSignedOutEnabledDescription", + IDS_SETTINGS_PASSWORDS_LEAK_DETECTION_SIGNED_OUT_ENABLED_DESC}, + {"editPasskeySiteLabel", IDS_SETTINGS_PASSKEYS_SITE_LABEL}, + {"editPasskeyUsernameLabel", + IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_USERNAME_LABEL}, #if BUILDFLAG(IS_MAC) - {"passkeyLengthError", IDS_SETTINGS_PASSKEYS_LENGTH_ERROR}, - {"editPasskeyDialogTitle", IDS_SETTINGS_PASSKEYS_DIALOG_TITLE}, - {"passkeyEditDialogFootnote", IDS_SETTINGS_PASSKEYS_EDIT_DIALOG_FOOTNOTE}, -#endif - {"noAddressesFound", IDS_SETTINGS_ADDRESS_NONE}, - {"noSearchResults", IDS_SEARCH_NO_RESULTS}, - {"searchResultsPlural", IDS_SEARCH_RESULTS_PLURAL}, - {"searchResultsSingular", IDS_SEARCH_RESULTS_SINGULAR}, - {"addVirtualCard", IDS_AUTOFILL_ADD_VIRTUAL_CARD}, - {"savedToThisDeviceOnly", IDS_SETTINGS_PAYMENTS_SAVED_TO_THIS_DEVICE_ONLY}, - {"localPasswordManager", - IDS_PASSWORD_BUBBLES_PASSWORD_MANAGER_LINK_TEXT_SAVING_ON_DEVICE}, - {"removeVirtualCard", IDS_AUTOFILL_REMOVE_VIRTUAL_CARD}, - {"editServerCard", IDS_AUTOFILL_EDIT_SERVER_CREDIT_CARD}, - {"virtualCardTurnedOn", IDS_AUTOFILL_VIRTUAL_CARD_TURNED_ON_LABEL}, - {"unenrollVirtualCardDialogTitle", - IDS_AUTOFILL_VIRTUAL_CARD_UNENROLL_DIALOG_TITLE}, - {"unenrollVirtualCardDialogConfirm", - IDS_AUTOFILL_VIRTUAL_CARD_UNENROLL_DIALOG_CONFIRM_BUTTON_LABEL}, + {"passkeyLengthError", IDS_SETTINGS_PASSKEYS_LENGTH_ERROR}, + {"editPasskeyDialogTitle", IDS_SETTINGS_PASSKEYS_DIALOG_TITLE}, + {"passkeyEditDialogFootnote", IDS_SETTINGS_PASSKEYS_EDIT_DIALOG_FOOTNOTE}, +#endif + {"noAddressesFound", IDS_SETTINGS_ADDRESS_NONE}, + {"noSearchResults", IDS_SEARCH_NO_RESULTS}, + {"searchResultsPlural", IDS_SEARCH_RESULTS_PLURAL}, + {"searchResultsSingular", IDS_SEARCH_RESULTS_SINGULAR}, + {"addVirtualCard", IDS_AUTOFILL_ADD_VIRTUAL_CARD}, + {"savedToThisDeviceOnly", + IDS_SETTINGS_PAYMENTS_SAVED_TO_THIS_DEVICE_ONLY}, + {"localPasswordManager", + IDS_PASSWORD_BUBBLES_PASSWORD_MANAGER_LINK_TEXT_SAVING_ON_DEVICE}, + {"removeVirtualCard", IDS_AUTOFILL_REMOVE_VIRTUAL_CARD}, + {"editServerCard", IDS_AUTOFILL_EDIT_SERVER_CREDIT_CARD}, + {"virtualCardTurnedOn", IDS_AUTOFILL_VIRTUAL_CARD_TURNED_ON_LABEL}, + {"unenrollVirtualCardDialogTitle", + IDS_AUTOFILL_VIRTUAL_CARD_UNENROLL_DIALOG_TITLE}, + {"unenrollVirtualCardDialogConfirm", + IDS_AUTOFILL_VIRTUAL_CARD_UNENROLL_DIALOG_CONFIRM_BUTTON_LABEL}, #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) - {"managePasskeysLabel", IDS_AUTOFILL_MANAGE_PASSKEYS_LABEL}, - {"managePasskeysTitle", IDS_AUTOFILL_MANAGE_PASSKEYS_TITLE}, - {"managePasskeysSearch", IDS_AUTOFILL_MANAGE_PASSKEYS_SEARCH}, - {"managePasskeysNoSupport", IDS_AUTOFILL_MANAGE_PASSKEYS_NO_SUPPORT}, - {"managePasskeysCannotDeleteTitle", - IDS_AUTOFILL_MANAGE_PASSKEYS_CANNOT_DELETE_TITLE}, - {"managePasskeysCannotDeleteBody", - IDS_AUTOFILL_MANAGE_PASSKEYS_CANNOT_DELETE_BODY}, - {"managePasskeysDeleteConfirmationTitle", - IDS_AUTOFILL_MANAGE_PASSKEYS_DELETE_CONFIRMATION_TITLE}, - {"managePasskeysDeleteConfirmationDescription", - IDS_AUTOFILL_MANAGE_PASSKEYS_DELETE_CONFIRMATION_DESCRIPTION}, - {"managePasskeysMoreActionsLabel", - IDS_AUTOFILL_MANAGE_PASSKEYS_MORE_ACTIONS_LABEL}, + {"managePasskeysLabel", IDS_AUTOFILL_MANAGE_PASSKEYS_LABEL}, + {"managePasskeysTitle", IDS_AUTOFILL_MANAGE_PASSKEYS_TITLE}, + {"managePasskeysSearch", IDS_AUTOFILL_MANAGE_PASSKEYS_SEARCH}, + {"managePasskeysNoSupport", IDS_AUTOFILL_MANAGE_PASSKEYS_NO_SUPPORT}, + {"managePasskeysCannotDeleteTitle", + IDS_AUTOFILL_MANAGE_PASSKEYS_CANNOT_DELETE_TITLE}, + {"managePasskeysCannotDeleteBody", + IDS_AUTOFILL_MANAGE_PASSKEYS_CANNOT_DELETE_BODY}, + {"managePasskeysDeleteConfirmationTitle", + IDS_AUTOFILL_MANAGE_PASSKEYS_DELETE_CONFIRMATION_TITLE}, + {"managePasskeysDeleteConfirmationDescription", + IDS_AUTOFILL_MANAGE_PASSKEYS_DELETE_CONFIRMATION_DESCRIPTION}, + {"managePasskeysMoreActionsLabel", + IDS_AUTOFILL_MANAGE_PASSKEYS_MORE_ACTIONS_LABEL}, #endif #if BUILDFLAG(IS_MAC) - {"biometricAuthenticaionForFillingLabel", - IDS_SETTINGS_PASSWORDS_BIOMETRIC_AUTHENTICATION_FOR_FILLING_TOGGLE_LABEL_MAC}, - {"managePasskeysSubTitle", IDS_AUTOFILL_MANAGE_PASSKEYS_SUB_TITLE_MAC}, + {"biometricAuthenticaionForFillingLabel", + IDS_SETTINGS_PASSWORDS_BIOMETRIC_AUTHENTICATION_FOR_FILLING_TOGGLE_LABEL_MAC}, + {"managePasskeysSubTitle", IDS_AUTOFILL_MANAGE_PASSKEYS_SUB_TITLE_MAC}, #elif BUILDFLAG(IS_WIN) - {"biometricAuthenticaionForFillingLabel", - IDS_SETTINGS_PASSWORDS_BIOMETRIC_AUTHENTICATION_FOR_FILLING_TOGGLE_LABEL_WIN}, - {"managePasskeysSubTitle", IDS_AUTOFILL_MANAGE_PASSKEYS_SUB_TITLE_WIN}, -#endif - {"plusAddressSettings", IDS_PLUS_ADDRESS_SETTINGS_LABEL}, - {"cvcTagForCreditCardListEntry", - IDS_AUTOFILL_SETTINGS_PAGE_CVC_TAG_FOR_CREDIT_CARD_LIST_ENTRY}, + {"biometricAuthenticaionForFillingLabel", + IDS_SETTINGS_PASSWORDS_BIOMETRIC_AUTHENTICATION_FOR_FILLING_TOGGLE_LABEL_WIN}, + {"managePasskeysSubTitle", IDS_AUTOFILL_MANAGE_PASSKEYS_SUB_TITLE_WIN}, +#endif + {"plusAddressSettings", IDS_PLUS_ADDRESS_SETTINGS_LABEL}, + {"cvcTagForCreditCardListEntry", + IDS_AUTOFILL_SETTINGS_PAGE_CVC_TAG_FOR_CREDIT_CARD_LIST_ENTRY}, + {"aiPageTitle", IDS_SETTINGS_AI_PAGE_TITLE}, + {"aiPageMainLabel", IDS_SETTINGS_AI_PAGE_MAIN_LABEL}, + {"aiPageMainSublabel", IDS_SETTINGS_AI_PAGE_MAIN_SUBLABEL}, + {"aiComposeLabel", IDS_SETTINGS_AI_COMPOSE_LABEL}, + {"aiComposeSublabel", IDS_SETTINGS_AI_COMPOSE_SUBLABEL}, + {"experimentalAdvancedFeature2Label", + IDS_SETTINGS_EXPERIMENTAL_ADVANCED_FEATURE2_LABEL}, + {"experimentalAdvancedFeature2Sublabel", + IDS_SETTINGS_EXPERIMENTAL_ADVANCED_FEATURE2_SUBLABEL}, + {"experimentalAdvancedFeature3Label", + IDS_SETTINGS_EXPERIMENTAL_ADVANCED_FEATURE3_LABEL}, + {"experimentalAdvancedFeature3Sublabel", + IDS_SETTINGS_EXPERIMENTAL_ADVANCED_FEATURE3_SUBLABEL}, }; GURL google_password_manager_url = GetGooglePasswordManagerURL( @@ -1147,10 +1189,8 @@ void AddAutofillStrings(content::WebUIDataSource* html_source, "manageCreditCardsLabel", l10n_util::GetStringFUTF16( IDS_SETTINGS_PAYMENTS_MANAGE_CREDIT_CARDS, - base::FeatureList::IsEnabled( - autofill::features::kAutofillUpdateChromeSettingsLinkToGPayWeb) - ? chrome::kPaymentMethodsURLForGPayWeb - : chrome::kPaymentMethodsURL)); + base::UTF8ToUTF16( + autofill::payments::GetManageInstrumentsUrl().spec()))); html_source->AddString("managePaymentMethodsUrl", autofill::payments::GetManageInstrumentsUrl().spec()); html_source->AddString("addressesAndPaymentMethodsLearnMoreURL", @@ -1206,12 +1246,6 @@ void AddAutofillStrings(content::WebUIDataSource* html_source, "undoDescription", l10n_util::GetStringFUTF16(IDS_UNDO_DESCRIPTION, undo_accelerator.GetShortcutText())); - - html_source->AddBoolean( - "showHonorific", - base::FeatureList::IsEnabled( - autofill::features::kAutofillEnableSupportForHonorificPrefixes)); - html_source->AddString( "unenrollVirtualCardDialogLabel", l10n_util::GetStringFUTF16( @@ -1223,11 +1257,6 @@ void AddAutofillStrings(content::WebUIDataSource* html_source, html_source->AddLocalizedStrings(kLocalizedStrings); html_source->AddBoolean( - "autofillAccountProfileStorage", - base::FeatureList::IsEnabled( - autofill::features::kAutofillAccountProfileStorage)); - - html_source->AddBoolean( "syncEnableContactInfoDataTypeInTransportMode", base::FeatureList::IsEnabled( syncer::kSyncEnableContactInfoDataTypeInTransportMode)); @@ -1309,19 +1338,21 @@ void AddSignOutDialogStrings(content::WebUIDataSource* html_source, void AddSyncAccountControlStrings(content::WebUIDataSource* html_source) { static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"syncingTo", IDS_SETTINGS_PEOPLE_SYNCING_TO_ACCOUNT}, - {"peopleSignIn", IDS_PROFILES_DICE_SIGNIN_BUTTON}, - {"syncPaused", IDS_SETTINGS_PEOPLE_SYNC_PAUSED}, - {"turnOffSync", IDS_SETTINGS_PEOPLE_SYNC_TURN_OFF}, - {"settingsCheckboxLabel", IDS_SETTINGS_SETTINGS_CHECKBOX_LABEL}, - {"syncNotWorking", IDS_SETTINGS_PEOPLE_SYNC_NOT_WORKING}, - {"syncDisabled", IDS_PROFILES_DICE_SYNC_DISABLED_TITLE}, - {"syncPasswordsNotWorking", IDS_SETTINGS_PEOPLE_SYNC_PASSWORDS_NOT_WORKING}, - {"peopleSignOut", IDS_SETTINGS_PEOPLE_SIGN_OUT}, - {"useAnotherAccount", IDS_SETTINGS_PEOPLE_SYNC_ANOTHER_ACCOUNT}, + {"signedInTo", IDS_SETTINGS_PEOPLE_SIGNED_IN_TO_ACCOUNT}, + {"syncingTo", IDS_SETTINGS_PEOPLE_SYNCING_TO_ACCOUNT}, + {"peopleSignIn", IDS_PROFILES_DICE_SIGNIN_BUTTON}, + {"syncPaused", IDS_SETTINGS_PEOPLE_SYNC_PAUSED}, + {"turnOffSync", IDS_SETTINGS_PEOPLE_SYNC_TURN_OFF}, + {"settingsCheckboxLabel", IDS_SETTINGS_SETTINGS_CHECKBOX_LABEL}, + {"syncNotWorking", IDS_SETTINGS_PEOPLE_SYNC_NOT_WORKING}, + {"syncDisabled", IDS_PROFILES_DICE_SYNC_DISABLED_TITLE}, + {"syncPasswordsNotWorking", + IDS_SETTINGS_PEOPLE_SYNC_PASSWORDS_NOT_WORKING}, + {"peopleSignOut", IDS_SETTINGS_PEOPLE_SIGN_OUT}, + {"useAnotherAccount", IDS_SETTINGS_PEOPLE_SYNC_ANOTHER_ACCOUNT}, #if !BUILDFLAG(IS_CHROMEOS_LACROS) - {"syncAdvancedPageTitle", IDS_SETTINGS_NEW_SYNC_ADVANCED_PAGE_TITLE}, + {"syncAdvancedPageTitle", IDS_SETTINGS_NEW_SYNC_ADVANCED_PAGE_TITLE}, #endif }; @@ -1339,62 +1370,64 @@ void AddSyncAccountControlStrings(content::WebUIDataSource* html_source) { void AddPersonalizationOptionsStrings(content::WebUIDataSource* html_source) { static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"urlKeyedAnonymizedDataCollection", - IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION}, - {"urlKeyedAnonymizedDataCollectionDesc", - IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION_DESC}, - {"spellingPref", IDS_SETTINGS_SPELLING_PREF}, + {"urlKeyedAnonymizedDataCollection", + IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION}, + {"urlKeyedAnonymizedDataCollectionDesc", + IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION_DESC}, + {"spellingPref", IDS_SETTINGS_SPELLING_PREF}, #if !BUILDFLAG(IS_CHROMEOS) - {"signinAllowedTitle", IDS_SETTINGS_SIGNIN_ALLOWED}, - {"signinAllowedDescription", IDS_SETTINGS_SIGNIN_ALLOWED_DESC}, -#endif - {"enablePersonalizationLogging", IDS_SETTINGS_ENABLE_LOGGING_PREF}, - {"enablePersonalizationLoggingDesc", IDS_SETTINGS_ENABLE_LOGGING_PREF_DESC}, - {"spellingDescription", IDS_SETTINGS_SPELLING_PREF_DESC}, - {"searchSuggestPrefDesc", IDS_SETTINGS_SUGGEST_PREF_DESC}, - {"linkDoctorPref", IDS_SETTINGS_LINKDOCTOR_PREF}, - {"linkDoctorPrefDesc", IDS_SETTINGS_LINKDOCTOR_PREF_DESC}, - {"searchSuggestPref", IDS_SETTINGS_SUGGEST_PREF}, - {"driveSuggestPref", IDS_SETTINGS_DRIVE_SUGGEST_PREF}, - {"driveSuggestPrefDesc", IDS_SETTINGS_DRIVE_SUGGEST_PREF_DESC}, - {"priceEmailNotificationsPref", IDS_PRICE_TRACKING_SETTINGS_TITLE}, - {"priceEmailNotificationsPrefDesc", - IDS_PRICE_TRACKING_SETTINGS_EMAIL_DESCRIPTION}, - {"pageContentLinkRowSublabelOn", - IDS_SETTINGS_PAGE_CONTENT_LINK_ROW_SUBLABEL_ON}, - {"pageContentLinkRowSublabelOff", - IDS_SETTINGS_PAGE_CONTENT_LINK_ROW_SUBLABEL_OFF}, - {"pageContentPageTitle", IDS_SETTINGS_PAGE_CONTENT_PAGE_TITLE}, - {"pageContentToggleLabel", IDS_SETTINGS_PAGE_CONTENT_TOGGLE_LABEL}, - {"pageContentToggleSublabel", IDS_SETTINGS_PAGE_CONTENT_TOGGLE_SUBLABEL}, - {"pageContentWhenOnBulletOne", - IDS_SETTINGS_PAGE_CONTENT_WHEN_ON_BULLET_ONE}, - {"pageContentThingsToConsiderBulletOne", - IDS_SETTINGS_PAGE_CONTENT_THINGS_TO_CONSIDER_BULLET_ONE}, - {"pageContentThingsToConsiderBulletTwo", - IDS_SETTINGS_PAGE_CONTENT_THINGS_TO_CONSIDER_BULLET_TWO}, - {"pageContentThingsToConsiderBulletThree", - IDS_SETTINGS_PAGE_CONTENT_THINGS_TO_CONSIDER_BULLET_THREE}, + {"signinAllowedTitle", IDS_SETTINGS_SIGNIN_ALLOWED}, + {"signinAllowedDescription", IDS_SETTINGS_SIGNIN_ALLOWED_DESC}, +#endif + {"enablePersonalizationLogging", IDS_SETTINGS_ENABLE_LOGGING_PREF}, + {"enablePersonalizationLoggingDesc", + IDS_SETTINGS_ENABLE_LOGGING_PREF_DESC}, + {"spellingDescription", IDS_SETTINGS_SPELLING_PREF_DESC}, + {"searchSuggestPrefDesc", IDS_SETTINGS_SUGGEST_PREF_DESC}, + {"linkDoctorPref", IDS_SETTINGS_LINKDOCTOR_PREF}, + {"linkDoctorPrefDesc", IDS_SETTINGS_LINKDOCTOR_PREF_DESC}, + {"searchSuggestPref", IDS_SETTINGS_SUGGEST_PREF}, + {"driveSuggestPref", IDS_SETTINGS_DRIVE_SUGGEST_PREF}, + {"driveSuggestPrefDesc", IDS_SETTINGS_DRIVE_SUGGEST_PREF_DESC}, + {"priceEmailNotificationsPref", IDS_PRICE_TRACKING_SETTINGS_TITLE}, + {"priceEmailNotificationsPrefDesc", + IDS_PRICE_TRACKING_SETTINGS_EMAIL_DESCRIPTION}, + {"pageContentLinkRowSublabelOn", + IDS_SETTINGS_PAGE_CONTENT_LINK_ROW_SUBLABEL_ON}, + {"pageContentLinkRowSublabelOff", + IDS_SETTINGS_PAGE_CONTENT_LINK_ROW_SUBLABEL_OFF}, + {"pageContentPageTitle", IDS_SETTINGS_PAGE_CONTENT_PAGE_TITLE}, + {"pageContentToggleLabel", IDS_SETTINGS_PAGE_CONTENT_TOGGLE_LABEL}, + {"pageContentToggleSublabel", IDS_SETTINGS_PAGE_CONTENT_TOGGLE_SUBLABEL}, + {"pageContentWhenOnBulletOne", + IDS_SETTINGS_PAGE_CONTENT_WHEN_ON_BULLET_ONE}, + {"pageContentThingsToConsiderBulletOne", + IDS_SETTINGS_PAGE_CONTENT_THINGS_TO_CONSIDER_BULLET_ONE}, + {"pageContentThingsToConsiderBulletTwo", + IDS_SETTINGS_PAGE_CONTENT_THINGS_TO_CONSIDER_BULLET_TWO}, + {"pageContentThingsToConsiderBulletThree", + IDS_SETTINGS_PAGE_CONTENT_THINGS_TO_CONSIDER_BULLET_THREE}, }; html_source->AddLocalizedStrings(kLocalizedStrings); } void AddBrowserSyncPageStrings(content::WebUIDataSource* html_source) { static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"peopleSignInSyncPagePromptSecondaryWithAccount", - IDS_SETTINGS_PEOPLE_SIGN_IN_PROMPT_SECONDARY_WITH_ACCOUNT}, - {"peopleSignInSyncPagePromptSecondaryWithNoAccount", - IDS_SETTINGS_PEOPLE_SIGN_IN_PROMPT_SECONDARY_WITH_ACCOUNT}, - {"bookmarksCheckboxLabel", IDS_SETTINGS_BOOKMARKS_CHECKBOX_LABEL}, - {"readingListCheckboxLabel", IDS_SETTINGS_READING_LIST_CHECKBOX_LABEL}, - {"cancelSync", IDS_SETTINGS_SYNC_SETTINGS_CANCEL_SYNC}, - {"syncSetupCancelDialogTitle", IDS_SETTINGS_SYNC_SETUP_CANCEL_DIALOG_TITLE}, - {"syncSetupCancelDialogBody", IDS_SETTINGS_SYNC_SETUP_CANCEL_DIALOG_BODY}, - {"personalizeGoogleServicesTitle", - IDS_SETTINGS_PERSONALIZE_GOOGLE_SERVICES_TITLE}, - {"themeCheckboxLabel", IDS_SETTINGS_THEME_CHECKBOX_LABEL}, + {"peopleSignInSyncPagePromptSecondaryWithAccount", + IDS_SETTINGS_PEOPLE_SIGN_IN_PROMPT_SECONDARY_WITH_ACCOUNT}, + {"peopleSignInSyncPagePromptSecondaryWithNoAccount", + IDS_SETTINGS_PEOPLE_SIGN_IN_PROMPT_SECONDARY_WITH_ACCOUNT}, + {"bookmarksCheckboxLabel", IDS_SETTINGS_BOOKMARKS_CHECKBOX_LABEL}, + {"readingListCheckboxLabel", IDS_SETTINGS_READING_LIST_CHECKBOX_LABEL}, + {"cancelSync", IDS_SETTINGS_SYNC_SETTINGS_CANCEL_SYNC}, + {"syncSetupCancelDialogTitle", + IDS_SETTINGS_SYNC_SETUP_CANCEL_DIALOG_TITLE}, + {"syncSetupCancelDialogBody", IDS_SETTINGS_SYNC_SETUP_CANCEL_DIALOG_BODY}, + {"personalizeGoogleServicesTitle", + IDS_SETTINGS_PERSONALIZE_GOOGLE_SERVICES_TITLE}, + {"themeCheckboxLabel", IDS_SETTINGS_THEME_CHECKBOX_LABEL}, #if BUILDFLAG(IS_CHROMEOS) - {"browserSyncFeatureLabel", IDS_BROWSER_SETTINGS_SYNC_FEATURE_LABEL}, + {"browserSyncFeatureLabel", IDS_BROWSER_SETTINGS_SYNC_FEATURE_LABEL}, #endif }; html_source->AddLocalizedStrings(kLocalizedStrings); @@ -1437,85 +1470,86 @@ void AddBrowserSyncPageStrings(content::WebUIDataSource* html_source) { void AddSyncControlsStrings(content::WebUIDataSource* html_source) { static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"autofillCheckboxLabel", IDS_SETTINGS_AUTOFILL_CHECKBOX_LABEL}, - {"historyCheckboxLabel", IDS_SETTINGS_HISTORY_CHECKBOX_LABEL}, - {"extensionsCheckboxLabel", IDS_SETTINGS_EXTENSIONS_CHECKBOX_LABEL}, - {"openTabsCheckboxLabel", IDS_SETTINGS_OPEN_TABS_CHECKBOX_LABEL}, - {"savedTabGroupsCheckboxLabel", - IDS_SETTINGS_SAVED_TAB_GROUPS_CHECKBOX_LABEL}, - {"wifiConfigurationsCheckboxLabel", - IDS_SETTINGS_WIFI_CONFIGURATIONS_CHECKBOX_LABEL}, - {"syncEverythingCheckboxLabel", - IDS_SETTINGS_SYNC_EVERYTHING_CHECKBOX_LABEL}, - {"appCheckboxLabel", IDS_SETTINGS_APPS_CHECKBOX_LABEL}, + {"autofillCheckboxLabel", IDS_SETTINGS_AUTOFILL_CHECKBOX_LABEL}, + {"historyCheckboxLabel", IDS_SETTINGS_HISTORY_CHECKBOX_LABEL}, + {"extensionsCheckboxLabel", IDS_SETTINGS_EXTENSIONS_CHECKBOX_LABEL}, + {"openTabsCheckboxLabel", IDS_SETTINGS_OPEN_TABS_CHECKBOX_LABEL}, + {"savedTabGroupsCheckboxLabel", + IDS_SETTINGS_SAVED_TAB_GROUPS_CHECKBOX_LABEL}, + {"wifiConfigurationsCheckboxLabel", + IDS_SETTINGS_WIFI_CONFIGURATIONS_CHECKBOX_LABEL}, + {"syncEverythingCheckboxLabel", + IDS_SETTINGS_SYNC_EVERYTHING_CHECKBOX_LABEL}, + {"appCheckboxLabel", IDS_SETTINGS_APPS_CHECKBOX_LABEL}, #if BUILDFLAG(IS_CHROMEOS_LACROS) - {"appCheckboxSublabel", IDS_SETTINGS_APPS_CHECKBOX_SUBLABEL}, + {"appCheckboxSublabel", IDS_SETTINGS_APPS_CHECKBOX_SUBLABEL}, #endif - {"paymentsCheckboxLabel", IDS_SYNC_DATATYPE_PAYMENTS}, - {"nonPersonalizedServicesSectionLabel", - IDS_SETTINGS_NON_PERSONALIZED_SERVICES_SECTION_LABEL}, - {"customizeSyncLabel", IDS_SETTINGS_CUSTOMIZE_SYNC}, - {"syncData", IDS_SETTINGS_SYNC_DATA}, + {"paymentsCheckboxLabel", IDS_SYNC_DATATYPE_PAYMENTS}, + {"nonPersonalizedServicesSectionLabel", + IDS_SETTINGS_NON_PERSONALIZED_SERVICES_SECTION_LABEL}, + {"customizeSyncLabel", IDS_SETTINGS_CUSTOMIZE_SYNC}, + {"syncData", IDS_SETTINGS_SYNC_DATA}, }; html_source->AddLocalizedStrings(kLocalizedStrings); } void AddPeopleStrings(content::WebUIDataSource* html_source, Profile* profile) { static constexpr webui::LocalizedString kLocalizedStrings[] = { - // Top level people strings: - {"peopleSignInPromptSecondaryWithAccount", - IDS_SETTINGS_PEOPLE_SIGN_IN_PROMPT_SECONDARY_WITH_ACCOUNT}, - {"peopleSignInPromptSecondaryWithNoAccount", - IDS_SETTINGS_PEOPLE_SIGN_IN_PROMPT_SECONDARY_WITH_ACCOUNT}, - {"peoplePageTitle", IDS_SETTINGS_PEOPLE}, - {"syncSettingsSavedToast", IDS_SETTINGS_SYNC_SETTINGS_SAVED_TOAST_LABEL}, - {"peopleSignInPrompt", IDS_SETTINGS_PEOPLE_SIGN_IN_PROMPT}, - {"manageGoogleAccount", IDS_SETTINGS_MANAGE_GOOGLE_ACCOUNT}, - {"syncAndNonPersonalizedServices", - IDS_SETTINGS_SYNC_SYNC_AND_NON_PERSONALIZED_SERVICES}, + // Top level people strings: + {"peopleSignInPromptSecondaryWithAccount", + IDS_SETTINGS_PEOPLE_SIGN_IN_PROMPT_SECONDARY_WITH_ACCOUNT}, + {"peopleSignInPromptSecondaryWithNoAccount", + IDS_SETTINGS_PEOPLE_SIGN_IN_PROMPT_SECONDARY_WITH_ACCOUNT}, + {"peoplePageTitle", IDS_SETTINGS_PEOPLE}, + {"syncSettingsSavedToast", IDS_SETTINGS_SYNC_SETTINGS_SAVED_TOAST_LABEL}, + {"peopleSignInPrompt", IDS_SETTINGS_PEOPLE_SIGN_IN_PROMPT}, + {"manageGoogleAccount", IDS_SETTINGS_MANAGE_GOOGLE_ACCOUNT}, + {"syncAndNonPersonalizedServices", + IDS_SETTINGS_SYNC_SYNC_AND_NON_PERSONALIZED_SERVICES}, #if BUILDFLAG(IS_CHROMEOS_ASH) - {"accountManagerSubMenuLabel", IDS_SETTINGS_ACCOUNT_MANAGER_SUBMENU_LABEL}, + {"accountManagerSubMenuLabel", + IDS_SETTINGS_ACCOUNT_MANAGER_SUBMENU_LABEL}, #else - {"editPerson", IDS_SETTINGS_CUSTOMIZE_PROFILE}, - {"profileNameAndPicture", IDS_SETTINGS_CUSTOMIZE_YOUR_CHROME_PROFILE}, + {"editPerson", IDS_SETTINGS_CUSTOMIZE_PROFILE}, + {"profileNameAndPicture", IDS_SETTINGS_CUSTOMIZE_YOUR_CHROME_PROFILE}, #endif // Manage profile strings: #if !BUILDFLAG(IS_CHROMEOS_ASH) - {"showShortcutLabel", IDS_SETTINGS_PROFILE_SHORTCUT_TOGGLE_LABEL}, - {"nameInputLabel", IDS_SETTINGS_PROFILE_NAME_INPUT_LABEL}, - {"nameYourProfile", IDS_SETTING_NAME_YOUR_PROFILE}, - {"pickThemeColor", IDS_SETTINGS_PICK_A_THEME_COLOR}, - {"pickAvatar", IDS_SETTINGS_PICK_AN_AVATAR}, - {"createShortcutTitle", IDS_SETTINGS_CREATE_SHORTCUT}, - {"createShortcutSubtitle", IDS_SETTINGS_CREATE_SHORTCUT_SUBTITLE}, - - // Color picker strings: - {"colorsContainerLabel", IDS_NTP_THEMES_CONTAINER_LABEL}, - {"colorPickerLabel", IDS_NTP_CUSTOMIZE_COLOR_PICKER_LABEL}, - {"defaultColorName", IDS_NTP_CUSTOMIZE_DEFAULT_LABEL}, - {"defaultThemeLabel", IDS_NTP_CUSTOMIZE_DEFAULT_LABEL}, - {"greyDefaultColorName", IDS_NTP_CUSTOMIZE_GREY_DEFAULT_LABEL}, - {"hueSliderTitle", IDS_NTP_CUSTOMIZE_COLOR_HUE_SLIDER_TITLE}, - {"mainColorName", IDS_NTP_CUSTOMIZE_MAIN_COLOR_LABEL}, - {"managedColorsBody", IDS_NTP_THEME_MANAGED_DIALOG_BODY}, - {"managedColorsTitle", IDS_NTP_THEME_MANAGED_DIALOG_TITLE}, - {"themesContainerLabel", IDS_SETTINGS_PICK_A_THEME_COLOR}, - {"thirdPartyThemeDescription", IDS_NTP_CUSTOMIZE_3PT_THEME_DESC}, - {"uninstallThirdPartyThemeButton", IDS_NTP_CUSTOMIZE_3PT_THEME_UNINSTALL}, - - // Managed theme dialog strings: - {"themeManagedDialogTitle", IDS_NTP_THEME_MANAGED_DIALOG_TITLE}, - {"themeManagedDialogBody", IDS_NTP_THEME_MANAGED_DIALOG_BODY}, -#endif - {"deleteProfileWarningExpandA11yLabel", - IDS_SETTINGS_SYNC_DISCONNECT_EXPAND_ACCESSIBILITY_LABEL}, - {"deleteProfileWarningWithCountsSingular", - IDS_SETTINGS_SYNC_DISCONNECT_DELETE_PROFILE_WARNING_WITH_COUNTS_SINGULAR}, - {"deleteProfileWarningWithCountsPlural", - IDS_SETTINGS_SYNC_DISCONNECT_DELETE_PROFILE_WARNING_WITH_COUNTS_PLURAL}, - {"deleteProfileWarningWithoutCounts", - IDS_SETTINGS_SYNC_DISCONNECT_DELETE_PROFILE_WARNING_WITHOUT_COUNTS}, + {"showShortcutLabel", IDS_SETTINGS_PROFILE_SHORTCUT_TOGGLE_LABEL}, + {"nameInputLabel", IDS_SETTINGS_PROFILE_NAME_INPUT_LABEL}, + {"nameYourProfile", IDS_SETTING_NAME_YOUR_PROFILE}, + {"pickThemeColor", IDS_SETTINGS_PICK_A_THEME_COLOR}, + {"pickAvatar", IDS_SETTINGS_PICK_AN_AVATAR}, + {"createShortcutTitle", IDS_SETTINGS_CREATE_SHORTCUT}, + {"createShortcutSubtitle", IDS_SETTINGS_CREATE_SHORTCUT_SUBTITLE}, + + // Color picker strings: + {"colorsContainerLabel", IDS_NTP_THEMES_CONTAINER_LABEL}, + {"colorPickerLabel", IDS_NTP_CUSTOMIZE_COLOR_PICKER_LABEL}, + {"defaultColorName", IDS_NTP_CUSTOMIZE_DEFAULT_LABEL}, + {"defaultThemeLabel", IDS_NTP_CUSTOMIZE_DEFAULT_LABEL}, + {"greyDefaultColorName", IDS_NTP_CUSTOMIZE_GREY_DEFAULT_LABEL}, + {"hueSliderTitle", IDS_NTP_CUSTOMIZE_COLOR_HUE_SLIDER_TITLE}, + {"mainColorName", IDS_NTP_CUSTOMIZE_MAIN_COLOR_LABEL}, + {"managedColorsBody", IDS_NTP_THEME_MANAGED_DIALOG_BODY}, + {"managedColorsTitle", IDS_NTP_THEME_MANAGED_DIALOG_TITLE}, + {"themesContainerLabel", IDS_SETTINGS_PICK_A_THEME_COLOR}, + {"thirdPartyThemeDescription", IDS_NTP_CUSTOMIZE_3PT_THEME_DESC}, + {"uninstallThirdPartyThemeButton", IDS_NTP_CUSTOMIZE_3PT_THEME_UNINSTALL}, + + // Managed theme dialog strings: + {"themeManagedDialogTitle", IDS_NTP_THEME_MANAGED_DIALOG_TITLE}, + {"themeManagedDialogBody", IDS_NTP_THEME_MANAGED_DIALOG_BODY}, +#endif + {"deleteProfileWarningExpandA11yLabel", + IDS_SETTINGS_SYNC_DISCONNECT_EXPAND_ACCESSIBILITY_LABEL}, + {"deleteProfileWarningWithCountsSingular", + IDS_SETTINGS_SYNC_DISCONNECT_DELETE_PROFILE_WARNING_WITH_COUNTS_SINGULAR}, + {"deleteProfileWarningWithCountsPlural", + IDS_SETTINGS_SYNC_DISCONNECT_DELETE_PROFILE_WARNING_WITH_COUNTS_PLURAL}, + {"deleteProfileWarningWithoutCounts", + IDS_SETTINGS_SYNC_DISCONNECT_DELETE_PROFILE_WARNING_WITHOUT_COUNTS}, }; html_source->AddLocalizedStrings(kLocalizedStrings); @@ -1545,6 +1579,12 @@ void AddPeopleStrings(content::WebUIDataSource* html_source, Profile* profile) { // Toggles the Chrome OS Account Manager submenu in the People section. html_source->AddBoolean("isAccountManagerEnabled", ash::IsAccountManagerAvailable(profile)); + html_source->AddString( + "osSettingsAccountsPageUrl", + ash::features::IsOsSettingsRevampWayfindingEnabled() + ? BuildOSSettingsUrl(chromeos::settings::mojom::kPeopleSectionPath) + : BuildOSSettingsUrl( + chromeos::settings::mojom::kMyAccountsSubpagePath)); #elif BUILDFLAG(IS_CHROMEOS_LACROS) html_source->AddBoolean( "isAccountManagerEnabled", @@ -1576,174 +1616,191 @@ bool IsSecureDnsAvailable() { void AddPrivacyStrings(content::WebUIDataSource* html_source, Profile* profile) { static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"privacyPageTitle", IDS_SETTINGS_PRIVACY}, - {"privacyPageMore", IDS_SETTINGS_PRIVACY_MORE}, - {"doNotTrack", IDS_SETTINGS_ENABLE_DO_NOT_TRACK}, - {"doNotTrackDialogTitle", IDS_SETTINGS_ENABLE_DO_NOT_TRACK_DIALOG_TITLE}, - // TODO(crbug.com/1062607): This string is no longer used. Remove. - {"permissionsPageTitle", IDS_SETTINGS_PERMISSIONS}, - {"permissionsPageDescription", IDS_SETTINGS_PERMISSIONS_DESCRIPTION}, - {"securityPageTitle", IDS_SETTINGS_SECURITY}, - {"securityPageDescription", IDS_SETTINGS_SECURITY_DESCRIPTION}, - {"advancedProtectionProgramTitle", - IDS_SETTINGS_ADVANCED_PROTECTION_PROGRAM}, - {"advancedProtectionProgramDesc", - IDS_SETTINGS_ADVANCED_PROTECTION_PROGRAM_DESC}, - {"httpsOnlyModeTitle", IDS_SETTINGS_HTTPS_ONLY_MODE}, - {"httpsOnlyModeDescription", IDS_SETTINGS_HTTPS_ONLY_MODE_DESCRIPTION}, - {"httpsOnlyModeDescriptionAdvancedProtection", - IDS_SETTINGS_HTTPS_ONLY_MODE_DESCRIPTION_ADVANCED_PROTECTION}, - {"manageCertificates", IDS_SETTINGS_MANAGE_CERTIFICATES}, - {"manageCertificatesDescription", - IDS_SETTINGS_MANAGE_CERTIFICATES_DESCRIPTION}, - {"contentSettings", IDS_SETTINGS_CONTENT_SETTINGS}, - {"siteSettings", IDS_SETTINGS_SITE_SETTINGS}, - {"siteSettingsDescription", IDS_SETTINGS_SITE_SETTINGS_DESCRIPTION}, - {"clearData", IDS_SETTINGS_CLEAR_DATA}, - {"clearingData", IDS_SETTINGS_CLEARING_DATA}, - {"clearedData", IDS_SETTINGS_CLEARED_DATA}, - {"clearBrowsingData", IDS_SETTINGS_CLEAR_BROWSING_DATA}, - {"clearBrowsingDataDescription", IDS_SETTINGS_CLEAR_DATA_DESCRIPTION}, - {"titleAndCount", IDS_SETTINGS_TITLE_AND_COUNT}, - {"safeBrowsingEnableExtendedReportingDesc", - IDS_SETTINGS_SAFEBROWSING_ENABLE_REPORTING_DESC}, - {"safeBrowsingEnhanced", IDS_SETTINGS_SAFEBROWSING_ENHANCED}, - {"safeBrowsingEnhancedDesc", IDS_SETTINGS_SAFEBROWSING_ENHANCED_DESC}, - {"safeBrowsingEnhancedDescUpdated", - IDS_SETTINGS_SAFEBROWSING_ENHANCED_DESC_UPDATED}, - {"safeBrowsingEnhancedExpandA11yLabel", - IDS_SETTINGS_SAFEBROWSING_ENHANCED_EXPAND_ACCESSIBILITY_LABEL}, - {"safeBrowsingEnhancedBulOne", - IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_ONE}, - {"safeBrowsingEnhancedBulTwo", - IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_TWO}, - {"safeBrowsingEnhancedBulThree", - IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_THREE}, - {"safeBrowsingEnhancedBulFour", - IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_FOUR}, - {"safeBrowsingEnhancedBulFive", - IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_FIVE}, - {"safeBrowsingEnhancedWhenOnLabel", - IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_LABEL}, - {"safeBrowsingEnhancedWhenOnBulOne", - IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_ONE}, - {"safeBrowsingEnhancedWhenOnBulTwo", - IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_TWO}, - {"safeBrowsingEnhancedWhenOnBulThree", - IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_THREE}, - {"safeBrowsingEnhancedWhenOnBulFour", - IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_FOUR}, - {"safeBrowsingEnhancedWhenOnBulFive", - IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_FIVE}, - {"safeBrowsingEnhancedThingsToConsiderLabel", - IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_LABEL}, - {"safeBrowsingEnhancedThingsToConsiderBulOne", - IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_ONE}, - {"safeBrowsingEnhancedThingsToConsiderBulTwo", - IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_TWO}, - {"safeBrowsingEnhancedThingsToConsiderBulThree", - IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_THREE}, - {"safeBrowsingStandard", IDS_SETTINGS_SAFEBROWSING_STANDARD}, - {"safeBrowsingStandardDesc", IDS_SETTINGS_SAFEBROWSING_STANDARD_DESC}, - {"safeBrowsingStandardDescUpdated", - IDS_SETTINGS_SAFEBROWSING_STANDARD_DESC_UPDATED}, + {"privacyPageTitle", IDS_SETTINGS_PRIVACY}, + {"privacyPageMore", IDS_SETTINGS_PRIVACY_MORE}, + {"doNotTrack", IDS_SETTINGS_ENABLE_DO_NOT_TRACK}, + {"doNotTrackDialogTitle", IDS_SETTINGS_ENABLE_DO_NOT_TRACK_DIALOG_TITLE}, + {"doNotTrackDialogMessage", IDS_SETTINGS_ENABLE_DO_NOT_TRACK_DIALOG_TEXT}, + {"doNotTrackDialogLearnMoreA11yLabel", + IDS_SETTINGS_ENABLE_DO_NOT_TRACK_DIALOG_LEARN_MORE_ACCESSIBILITY_LABEL}, + // TODO(crbug.com/1062607): This string is no longer used. Remove. + {"permissionsPageTitle", IDS_SETTINGS_PERMISSIONS}, + {"permissionsPageDescription", IDS_SETTINGS_PERMISSIONS_DESCRIPTION}, + {"securityPageTitle", IDS_SETTINGS_SECURITY}, + {"securityPageDescription", IDS_SETTINGS_SECURITY_DESCRIPTION}, + {"advancedProtectionProgramTitle", + IDS_SETTINGS_ADVANCED_PROTECTION_PROGRAM}, + {"advancedProtectionProgramDesc", + IDS_SETTINGS_ADVANCED_PROTECTION_PROGRAM_DESC}, + {"httpsOnlyModeTitle", IDS_SETTINGS_HTTPS_ONLY_MODE}, + {"httpsOnlyModeDescription", IDS_SETTINGS_HTTPS_ONLY_MODE_DESCRIPTION}, + {"httpsOnlyModeDescriptionAdvancedProtection", + IDS_SETTINGS_HTTPS_ONLY_MODE_DESCRIPTION_ADVANCED_PROTECTION}, + {"httpsFirstModeSectionLabel", IDS_SETTINGS_HTTPS_FIRST_MODE_TITLE}, + {"httpsFirstModeSectionSubLabel", IDS_SETTINGS_HTTPS_FIRST_MODE_SUBTITLE}, + {"httpsFirstModeEnabledFullLabel", + IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_FULL_LABEL}, + {"httpsFirstModeEnabledFullSubLabel", + IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_FULL_SUBLABEL}, + {"httpsFirstModeEnabledIncognitoLabel", + IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_INCOGNITO_LABEL}, + {"httpsFirstModeEnabledIncognitoSubLabel", + IDS_SETTINGS_HTTPS_FIRST_MODE_ENABLED_INCOGNITO_SUBLABEL}, + {"httpsFirstModeDisabledLabel", + IDS_SETTINGS_HTTPS_FIRST_MODE_DISABLED_LABEL}, + {"httpsFirstModeDisabledSubLabel", + IDS_SETTINGS_HTTPS_FIRST_MODE_DISABLED_SUBLABEL}, + {"manageCertificates", IDS_SETTINGS_MANAGE_CERTIFICATES}, + {"manageCertificatesDescription", + IDS_SETTINGS_MANAGE_CERTIFICATES_DESCRIPTION}, + {"contentSettings", IDS_SETTINGS_CONTENT_SETTINGS}, + {"siteSettings", IDS_SETTINGS_SITE_SETTINGS}, + {"siteSettingsDescription", IDS_SETTINGS_SITE_SETTINGS_DESCRIPTION}, + {"clearData", IDS_SETTINGS_CLEAR_DATA}, + {"clearingData", IDS_SETTINGS_CLEARING_DATA}, + {"clearedData", IDS_SETTINGS_CLEARED_DATA}, + {"clearBrowsingData", IDS_SETTINGS_CLEAR_BROWSING_DATA}, + {"clearBrowsingDataDescription", IDS_SETTINGS_CLEAR_DATA_DESCRIPTION}, + {"titleAndCount", IDS_SETTINGS_TITLE_AND_COUNT}, + {"safeBrowsingEnableExtendedReportingDesc", + IDS_SETTINGS_SAFEBROWSING_ENABLE_REPORTING_DESC}, + {"safeBrowsingEnhanced", IDS_SETTINGS_SAFEBROWSING_ENHANCED}, + {"safeBrowsingEnhancedDesc", IDS_SETTINGS_SAFEBROWSING_ENHANCED_DESC}, + {"safeBrowsingEnhancedDescUpdated", + IDS_SETTINGS_SAFEBROWSING_ENHANCED_DESC_UPDATED}, + {"safeBrowsingEnhancedExpandA11yLabel", + IDS_SETTINGS_SAFEBROWSING_ENHANCED_EXPAND_ACCESSIBILITY_LABEL}, + {"safeBrowsingEnhancedBulOne", + IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_ONE}, + {"safeBrowsingEnhancedBulTwo", + IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_TWO}, + {"safeBrowsingEnhancedBulThree", + IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_THREE}, + {"safeBrowsingEnhancedBulFour", + IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_FOUR}, + {"safeBrowsingEnhancedBulFive", + IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_FIVE}, + {"safeBrowsingEnhancedWhenOnLabel", + IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_LABEL}, + {"safeBrowsingEnhancedWhenOnBulOne", + IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_ONE}, + {"safeBrowsingEnhancedWhenOnBulTwo", + IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_TWO}, + {"safeBrowsingEnhancedWhenOnBulThree", + IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_THREE}, + {"safeBrowsingEnhancedWhenOnBulFour", + IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_FOUR}, + {"safeBrowsingEnhancedWhenOnBulFive", + IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_FIVE}, + {"safeBrowsingEnhancedThingsToConsiderLabel", + IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_LABEL}, + {"safeBrowsingEnhancedThingsToConsiderBulOne", + IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_ONE}, + {"safeBrowsingEnhancedThingsToConsiderBulTwo", + IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_TWO}, + {"safeBrowsingEnhancedThingsToConsiderBulThree", + IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_THREE}, + {"safeBrowsingStandard", IDS_SETTINGS_SAFEBROWSING_STANDARD}, + {"safeBrowsingStandardDesc", IDS_SETTINGS_SAFEBROWSING_STANDARD_DESC}, + {"safeBrowsingStandardDescUpdated", + IDS_SETTINGS_SAFEBROWSING_STANDARD_DESC_UPDATED}, #if BUILDFLAG(GOOGLE_CHROME_BRANDING) - {"safeBrowsingStandardDescUpdatedProxy", - IDS_SETTINGS_SAFEBROWSING_STANDARD_DESC_UPDATED_PROXY}, -#endif - {"safeBrowsingStandardExpandA11yLabel", - IDS_SETTINGS_SAFEBROWSING_STANDARD_EXPAND_ACCESSIBILITY_LABEL}, - {"safeBrowsingStandardBulOne", - IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_ONE}, - {"safeBrowsingStandardBulTwo", - IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_TWO}, + {"safeBrowsingStandardDescUpdatedProxy", + IDS_SETTINGS_SAFEBROWSING_STANDARD_DESC_UPDATED_PROXY}, +#endif + {"safeBrowsingStandardExpandA11yLabel", + IDS_SETTINGS_SAFEBROWSING_STANDARD_EXPAND_ACCESSIBILITY_LABEL}, + {"safeBrowsingStandardBulOne", + IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_ONE}, + {"safeBrowsingStandardBulTwo", + IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_TWO}, #if BUILDFLAG(GOOGLE_CHROME_BRANDING) - {"safeBrowsingStandardBulTwoProxy", - IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_TWO_PROXY}, -#endif - {"safeBrowsingStandardReportingLabel", - IDS_SETTINGS_SAFEBROWSING_STANDARD_HELP_IMPROVE}, - {"safeBrowsingNone", IDS_SETTINGS_SAFEBROWSING_NONE}, - {"safeBrowsingNoneDesc", IDS_SETTINGS_SAFEBROWSING_NONE_DESC}, - {"safeBrowsingNoneDescUpdated", - IDS_SETTINGS_SAFEBROWSING_NONE_DESC_UPDATED}, - {"safeBrowsingDisableDialog", - IDS_SETTINGS_SAFEBROWSING_DISABLE_DIALOG_TITLE}, - {"safeBrowsingDisableDialogDesc", - IDS_SETTINGS_SAFEBROWSING_DISABLE_DIALOG_DESC}, - {"safeBrowsingDisableDialogConfirm", - IDS_SETTINGS_SAFEBROWSING_DISABLE_DIALOG_CONFIRM}, - {"safeBrowsingEnableProtection", - IDS_SETTINGS_SAFEBROWSING_ENABLEPROTECTION}, - {"safeBrowsingEnableProtectionDesc", - IDS_SETTINGS_SAFEBROWSING_ENABLEPROTECTION_DESC}, - {"safeBrowsingSectionLabel", IDS_SETTINGS_SAFEBROWSING_SECTION_LABEL}, - {"syncAndGoogleServicesPrivacyDescription", - IDS_SETTINGS_SYNC_AND_GOOGLE_SERVICES_PRIVACY_DESC_UNIFIED_CONSENT}, - {"urlKeyedAnonymizedDataCollection", - IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION}, - {"urlKeyedAnonymizedDataCollectionDesc", - IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION_DESC}, - {"noRecentPermissions", IDS_SETTINGS_RECENT_PERMISSIONS_NO_CHANGES}, - {"recentPermissionAllowedOneItem", - IDS_SETTINGS_RECENT_PERMISSIONS_ALLOWED_ONE_ITEM}, - {"recentPermissionAllowedTwoItems", - IDS_SETTINGS_RECENT_PERMISSIONS_ALLOWED_TWO_ITEMS}, - {"recentPermissionAllowedMoreThanTwoItems", - IDS_SETTINGS_RECENT_PERMISSIONS_ALLOWED_MORE_THAN_TWO_ITEMS}, - {"recentPermissionAutoBlockedOneItem", - IDS_SETTINGS_RECENT_PERMISSIONS_AUTOMATICALLY_BLOCKED_ONE_ITEM}, - {"recentPermissionAutoBlockedTwoItems", - IDS_SETTINGS_RECENT_PERMISSIONS_AUTOMATICALLY_BLOCKED_TWO_ITEMS}, - {"recentPermissionAutoBlockedMoreThanTwoItems", - IDS_SETTINGS_RECENT_PERMISSIONS_AUTOMATICALLY_BLOCKED_MORE_THAN_TWO_ITEMS}, - {"recentPermissionBlockedOneItem", - IDS_SETTINGS_RECENT_PERMISSIONS_BLOCKED_ONE_ITEM}, - {"recentPermissionBlockedTwoItems", - IDS_SETTINGS_RECENT_PERMISSIONS_BLOCKED_TWO_ITEMS}, - {"recentPermissionBlockedMoreThanTwoItems", - IDS_SETTINGS_RECENT_PERMISSIONS_BLOCKED_MORE_THAN_TWO_ITEMS}, - {"networkPredictionEnabledDesc", - IDS_SETTINGS_NETWORK_PREDICTION_ENABLED_DESC}, - {"networkPredictionEnabledDescCookiesPage", - IDS_SETTINGS_NETWORK_PREDICTION_ENABLED_DESC_COOKIES_PAGE}, - {"preloadingPageTitle", IDS_SETTINGS_PRELOAD_PAGES_TITLE}, - {"preloadingPageSummary", IDS_SETTINGS_PRELOAD_PAGES_SUMMARY}, - {"preloadingPageNoPreloadingTitle", - IDS_SETTINGS_PRELOAD_PAGES_NO_PRELOADING_TITLE}, - {"preloadingPageNoPreloadingSummary", - IDS_SETTINGS_PRELOAD_PAGES_NO_PRELOADING_SUMMARY}, - {"preloadingPageStandardPreloadingTitle", - IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_TITLE}, - {"preloadingPageStandardPreloadingSummary", - IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_SUMMARY}, - {"preloadingPageStandardPreloadingWhenOnBulletOne", - IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_WHEN_ON_BULLET_ONE}, - {"preloadingPageStandardPreloadingWhenOnBulletTwo", - IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_WHEN_ON_BULLET_TWO}, - {"preloadingPageExtendedPreloadingTitle", - IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_TITLE}, - {"preloadingPageExtendedPreloadingSummary", - IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_SUMMARY}, - {"preloadingPageExtendedPreloadingWhenOnBulletOne", - IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_WHEN_ON_BULLET_ONE}, - {"preloadingPageExtendedPreloadingWhenOnBulletTwo", - IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_WHEN_ON_BULLET_TWO}, - {"preloadingPageExtendedPreloadingThingsToConsiderBulletTwo", - IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_THINGS_TO_CONSIDER_BULLET_TWO}, - {"preloadingPageThingsToConsiderBulletOne", - IDS_SETTINGS_PRELOAD_PAGES_THINGS_TO_CONSIDER_BULLET_ONE}, + {"safeBrowsingStandardBulTwoProxy", + IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_TWO_PROXY}, +#endif + {"safeBrowsingStandardReportingLabel", + IDS_SETTINGS_SAFEBROWSING_STANDARD_HELP_IMPROVE}, + {"safeBrowsingNone", IDS_SETTINGS_SAFEBROWSING_NONE}, + {"safeBrowsingNoneDesc", IDS_SETTINGS_SAFEBROWSING_NONE_DESC}, + {"safeBrowsingNoneDescUpdated", + IDS_SETTINGS_SAFEBROWSING_NONE_DESC_UPDATED}, + {"safeBrowsingDisableDialog", + IDS_SETTINGS_SAFEBROWSING_DISABLE_DIALOG_TITLE}, + {"safeBrowsingDisableDialogDesc", + IDS_SETTINGS_SAFEBROWSING_DISABLE_DIALOG_DESC}, + {"safeBrowsingDisableDialogConfirm", + IDS_SETTINGS_SAFEBROWSING_DISABLE_DIALOG_CONFIRM}, + {"safeBrowsingEnableProtection", + IDS_SETTINGS_SAFEBROWSING_ENABLEPROTECTION}, + {"safeBrowsingEnableProtectionDesc", + IDS_SETTINGS_SAFEBROWSING_ENABLEPROTECTION_DESC}, + {"safeBrowsingSectionLabel", IDS_SETTINGS_SAFEBROWSING_SECTION_LABEL}, + {"syncAndGoogleServicesPrivacyDescription", + IDS_SETTINGS_SYNC_AND_GOOGLE_SERVICES_PRIVACY_DESC_UNIFIED_CONSENT}, + {"urlKeyedAnonymizedDataCollection", + IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION}, + {"urlKeyedAnonymizedDataCollectionDesc", + IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION_DESC}, + {"noRecentPermissions", IDS_SETTINGS_RECENT_PERMISSIONS_NO_CHANGES}, + {"recentPermissionAllowedOneItem", + IDS_SETTINGS_RECENT_PERMISSIONS_ALLOWED_ONE_ITEM}, + {"recentPermissionAllowedTwoItems", + IDS_SETTINGS_RECENT_PERMISSIONS_ALLOWED_TWO_ITEMS}, + {"recentPermissionAllowedMoreThanTwoItems", + IDS_SETTINGS_RECENT_PERMISSIONS_ALLOWED_MORE_THAN_TWO_ITEMS}, + {"recentPermissionAutoBlockedOneItem", + IDS_SETTINGS_RECENT_PERMISSIONS_AUTOMATICALLY_BLOCKED_ONE_ITEM}, + {"recentPermissionAutoBlockedTwoItems", + IDS_SETTINGS_RECENT_PERMISSIONS_AUTOMATICALLY_BLOCKED_TWO_ITEMS}, + {"recentPermissionAutoBlockedMoreThanTwoItems", + IDS_SETTINGS_RECENT_PERMISSIONS_AUTOMATICALLY_BLOCKED_MORE_THAN_TWO_ITEMS}, + {"recentPermissionBlockedOneItem", + IDS_SETTINGS_RECENT_PERMISSIONS_BLOCKED_ONE_ITEM}, + {"recentPermissionBlockedTwoItems", + IDS_SETTINGS_RECENT_PERMISSIONS_BLOCKED_TWO_ITEMS}, + {"recentPermissionBlockedMoreThanTwoItems", + IDS_SETTINGS_RECENT_PERMISSIONS_BLOCKED_MORE_THAN_TWO_ITEMS}, + {"networkPredictionEnabledDesc", + IDS_SETTINGS_NETWORK_PREDICTION_ENABLED_DESC}, + {"preloadingPageTitle", IDS_SETTINGS_PRELOAD_PAGES_TITLE}, + {"preloadingPageSummary", IDS_SETTINGS_PRELOAD_PAGES_SUMMARY}, + {"preloadingPageNoPreloadingTitle", + IDS_SETTINGS_PRELOAD_PAGES_NO_PRELOADING_TITLE}, + {"preloadingPageNoPreloadingSummary", + IDS_SETTINGS_PRELOAD_PAGES_NO_PRELOADING_SUMMARY}, + {"preloadingPageStandardPreloadingTitle", + IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_TITLE}, + {"preloadingPageStandardPreloadingSummary", + IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_SUMMARY}, + {"preloadingPageStandardPreloadingWhenOnBulletOne", + IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_WHEN_ON_BULLET_ONE}, + {"preloadingPageStandardPreloadingWhenOnBulletTwo", + IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_WHEN_ON_BULLET_TWO}, + {"preloadingPageExtendedPreloadingTitle", + IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_TITLE}, + {"preloadingPageExtendedPreloadingSummary", + IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_SUMMARY}, + {"preloadingPageExtendedPreloadingWhenOnBulletOne", + IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_WHEN_ON_BULLET_ONE}, + {"preloadingPageExtendedPreloadingWhenOnBulletTwo", + IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_WHEN_ON_BULLET_TWO}, + {"preloadingPageExtendedPreloadingThingsToConsiderBulletTwo", + IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_THINGS_TO_CONSIDER_BULLET_TWO}, + {"preloadingPageThingsToConsiderBulletOne", + IDS_SETTINGS_PRELOAD_PAGES_THINGS_TO_CONSIDER_BULLET_ONE}, + {"securityV8LinkTitle", IDS_SETTINGS_SECURITY_V8_LINK_TITLE}, + {"securityV8LinkDescription", IDS_SETTINGS_SECURITY_V8_LINK_DESCRIPTION}, #if BUILDFLAG(IS_CHROMEOS) - {"openChromeOSSecureDnsSettingsLabel", - IDS_SETTINGS_SECURE_DNS_OPEN_CHROME_OS_SETTINGS_LABEL}, + {"openChromeOSSecureDnsSettingsLabel", + IDS_SETTINGS_SECURE_DNS_OPEN_CHROME_OS_SETTINGS_LABEL}, #endif #if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED) - {"manageDeviceCertificates", IDS_SETTINGS_MANAGE_DEVICE_CERTIFICATES}, - {"manageDeviceCertificatesDescription", - IDS_SETTINGS_MANAGE_DEVICE_CERTIFICATES_DESCRIPTION}, - {"chromeCertificates", IDS_SETTINGS_CHROME_CERTIFICATES}, - {"chromeCertificatesDescription", - IDS_SETTINGS_CHROME_CERTIFICATES_DESCRIPTION}, + {"manageDeviceCertificates", IDS_SETTINGS_MANAGE_DEVICE_CERTIFICATES}, + {"manageDeviceCertificatesDescription", + IDS_SETTINGS_MANAGE_DEVICE_CERTIFICATES_DESCRIPTION}, + {"chromeCertificates", IDS_SETTINGS_CHROME_CERTIFICATES}, + {"chromeCertificatesDescription", + IDS_SETTINGS_CHROME_CERTIFICATES_DESCRIPTION}, #endif }; html_source->AddLocalizedStrings(kLocalizedStrings); @@ -1779,10 +1836,8 @@ void AddPrivacyStrings(content::WebUIDataSource* html_source, html_source->AddString("syncAndGoogleServicesLearnMoreURL", chrome::kSyncAndGoogleServicesLearnMoreURL); - html_source->AddString( - "doNotTrackDialogMessage", - l10n_util::GetStringFUTF16(IDS_SETTINGS_ENABLE_DO_NOT_TRACK_DIALOG_TEXT, - chrome::kDoNotTrackLearnMoreURL)); + html_source->AddString("doNotTrackLearnMoreURL", + chrome::kDoNotTrackLearnMoreURL); html_source->AddString("exceptionsLearnMoreURL", chrome::kContentSettingsExceptionsLearnMoreURL); html_source->AddBoolean( @@ -1843,47 +1898,10 @@ void AddPrivacySandboxStrings(content::WebUIDataSource* html_source, // replace those before the corresponding flag value is checked, which is why // they are included independently of the flag value. static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"privacySandboxTitle", IDS_SETTINGS_PRIVACY_SANDBOX_TITLE}, - {"privacySandboxTrialsEnabled", - IDS_SETTINGS_PRIVACY_SANDBOX_TRIALS_ENABLED}, - {"privacySandboxTrialsDisabled", - IDS_SETTINGS_PRIVACY_SANDBOX_TRIALS_DISABLED}, {"privacySandboxCookiesDialog", IDS_SETTINGS_PRIVACY_SANDBOX_COOKIES_DIALOG}, {"privacySandboxCookiesDialogMore", IDS_SETTINGS_PRIVACY_SANDBOX_COOKIES_DIALOG_MORE}, - {"privacySandboxPageHeading", IDS_SETTINGS_PRIVACY_SANDBOX_PAGE_HEADING}, - {"privacySandboxPageDetails", IDS_SETTINGS_PRIVACY_SANDBOX_PAGE_DETAILS}, - // The following strings are used for PrivacySandboxSettings3. - {"privacySandboxTrialsTitle", IDS_SETTINGS_PRIVACY_SANDBOX_TRIALS_TITLE}, - {"privacySandboxTrialsSummary", - IDS_SETTINGS_PRIVACY_SANDBOX_TRIALS_SUMMARY}, - {"privacySandboxTrialsSummaryLearnMore", - IDS_SETTINGS_PRIVACY_SANDBOX_TRIALS_SUMMARY_LEARN_MORE}, - {"privacySandboxAdPersonalizationTitle", - IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_TITLE}, - {"privacySandboxAdPersonalizationSummary", - IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_SUMMARY}, - {"privacySandboxAdMeasurementTitle", - IDS_SETTINGS_PRIVACY_SANDBOX_AD_MEASUREMENT_TITLE}, - {"privacySandboxAdMeasurementSummary", - IDS_SETTINGS_PRIVACY_SANDBOX_AD_MEASUREMENT_SUMMARY}, - {"privacySandboxSpamAndFraudTitle", - IDS_SETTINGS_PRIVACY_SANDBOX_SPAM_AND_FRAUD_TITLE}, - {"privacySandboxSpamAndFraudSummary", - IDS_SETTINGS_PRIVACY_SANDBOX_SPAM_AND_FRAUD_SUMMARY}, - {"privacySandboxLearnMoreDialogTitle", - IDS_SETTINGS_PRIVACY_SANDBOX_LEARN_MORE_DIALOG_TITLE}, - {"privacySandboxLearnMoreDialogTopicsTitle", - IDS_SETTINGS_PRIVACY_SANDBOX_LEARN_MORE_DIALOG_TOPICS_TITLE}, - {"privacySandboxLearnMoreDialogFledgeTitle", - IDS_SETTINGS_PRIVACY_SANDBOX_LEARN_MORE_DIALOG_FLEDGE_TITLE}, - {"privacySandboxLearnMoreDialogDataTypes", - IDS_SETTINGS_PRIVACY_SANDBOX_LEARN_MORE_DIALOG_DATA_TYPES}, - {"privacySandboxLearnMoreDialogDataUsage", - IDS_SETTINGS_PRIVACY_SANDBOX_LEARN_MORE_DIALOG_DATA_USAGE}, - {"privacySandboxLearnMoreDialogDataManagement", - IDS_SETTINGS_PRIVACY_SANDBOX_LEARN_MORE_DIALOG_DATA_MANAGEMENT}, {"privacySandboxLearnMoreDialogTopicsDataTypes", IDS_SETTINGS_PRIVACY_SANDBOX_LEARN_MORE_DIALOG_TOPICS_DATA_TYPES}, {"privacySandboxLearnMoreDialogTopicsDataUsage", @@ -1894,64 +1912,26 @@ void AddPrivacySandboxStrings(content::WebUIDataSource* html_source, IDS_SETTINGS_PRIVACY_SANDBOX_LEARN_MORE_DIALOG_FLEDGE_DATA_TYPES}, {"privacySandboxLearnMoreDialogFledgeDataUsage", IDS_SETTINGS_PRIVACY_SANDBOX_LEARN_MORE_DIALOG_FLEDGE_DATA_USAGE}, - {"privacySandboxLearnMoreDialogFledgeDataManagement", - IDS_SETTINGS_PRIVACY_SANDBOX_LEARN_MORE_DIALOG_FLEDGE_DATA_MANAGEMENT}, - {"privacySandboxAdPersonalizationDialogTitle", - IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_TITLE}, {"privacySandboxAdPersonalizationDialogDescription", IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_DESCRIPTION}, {"privacySandboxAdPersonalizationDialogDescriptionTrialsOff", IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_DESCRIPTION_TRIALS_OFF}, {"privacySandboxAdPersonalizationDialogDescriptionListsEmpty", IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_DESCRIPTION_LISTS_EMPTY}, - {"privacySandboxAdPersonalizationRemovedDialogTitle", - IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_REMOVED_DIALOG_TITLE}, - {"privacySandboxAdPersonalizationRemovedDialogDescription", - IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_REMOVED_DIALOG_DESCRIPTION}, {"privacySandboxAdPersonalizationDialogTopicsTitle", IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_TOPICS_TITLE}, - {"privacySandboxAdPersonalizationDialogTopicsEmpty", - IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_TOPICS_EMPTY}, - {"privacySandboxAdPersonalizationDialogRemovedTopicsLabel", - IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_REMOVED_TOPICS_LABEL}, - {"privacySandboxAdPersonalizationDialogRemovedTopicsEmpty", - IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_REMOVED_TOPICS_EMPTY}, {"privacySandboxAdPersonalizationDialogTopicsLearnMore1", IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_TOPICS_LEARN_MORE_1}, {"privacySandboxAdPersonalizationDialogTopicsLearnMore2", IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_TOPICS_LEARN_MORE_2}, {"privacySandboxAdPersonalizationDialogTopicsLearnMore3", IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_TOPICS_LEARN_MORE_3}, - {"privacySandboxAdPersonalizationDialogFledgeTitle", - IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_FLEDGE_TITLE}, - {"privacySandboxAdPersonalizationDialogFledgeEmpty", - IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_FLEDGE_EMPTY}, - {"privacySandboxAdPersonalizationDialogRemovedFledgeLabel", - IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_REMOVED_FLEDGE_LABEL}, - {"privacySandboxAdPersonalizationDialogRemovedFledgeEmpty", - IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_REMOVED_FLEDGE_EMPTY}, {"privacySandboxAdPersonalizationDialogFledgeLearnMore1", IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_FLEDGE_LEARN_MORE_1}, - {"privacySandboxAdPersonalizationDialogFledgeLearnMore2", - IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_FLEDGE_LEARN_MORE_2}, - {"privacySandboxAdPersonalizationDialogFledgeLearnMore3", - IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_FLEDGE_LEARN_MORE_3}, - {"privacySandboxAdMeasurementDialogTitle", - IDS_SETTINGS_PRIVACY_SANDBOX_AD_MEASUREMENT_DIALOG_TITLE}, {"privacySandboxAdMeasurementDialogDescription", IDS_SETTINGS_PRIVACY_SANDBOX_AD_MEASUREMENT_DIALOG_DESCRIPTION}, {"privacySandboxAdMeasurementDialogDescriptionTrialsOff", IDS_SETTINGS_PRIVACY_SANDBOX_AD_MEASUREMENT_DIALOG_DESCRIPTION_TRIALS_OFF}, - {"privacySandboxSpamAndFraudDialogTitle", - IDS_SETTINGS_PRIVACY_SANDBOX_SPAM_AND_FRAUD_DIALOG_TITLE}, - {"privacySandboxSpamAndFraudDialogDescription1", - IDS_SETTINGS_PRIVACY_SANDBOX_SPAM_AND_FRAUD_DIALOG_DESCRIPTION_1}, - {"privacySandboxSpamAndFraudDialogDescription1TrialsOff", - IDS_SETTINGS_PRIVACY_SANDBOX_SPAM_AND_FRAUD_DIALOG_DESCRIPTION_1_TRIALS_OFF}, - {"privacySandboxSpamAndFraudDialogDescription2", - IDS_SETTINGS_PRIVACY_SANDBOX_SPAM_AND_FRAUD_DIALOG_DESCRIPTION_2}, - {"privacySandboxSpamAndFraudDialogDescription3", - IDS_SETTINGS_PRIVACY_SANDBOX_SPAM_AND_FRAUD_DIALOG_DESCRIPTION_3}, {"adPrivacyLinkRowLabel", IDS_SETTINGS_AD_PRIVACY_LINK_ROW_LABEL}, {"adPrivacyLinkRowSubLabel", IDS_SETTINGS_AD_PRIVACY_LINK_ROW_SUB_LABEL}, {"adPrivacyRestrictedLinkRowSubLabel", @@ -1978,10 +1958,17 @@ void AddPrivacySandboxStrings(content::WebUIDataSource* html_source, {"topicsPageTitle", IDS_SETTINGS_TOPICS_PAGE_TITLE}, {"topicsPageToggleLabel", IDS_SETTINGS_TOPICS_PAGE_TOGGLE_LABEL}, {"topicsPageToggleSubLabel", IDS_SETTINGS_TOPICS_PAGE_TOGGLE_SUB_LABEL}, + {"topicsPageToggleSubLabelPTB", + IDS_SETTINGS_TOPICS_PAGE_TOGGLE_SUB_LABEL_PTB}, + {"topicsPageDisclaimer", IDS_SETTINGS_TOPICS_PAGE_DISCLAIMER}, {"topicsPageCurrentTopicsHeading", IDS_SETTINGS_TOPICS_PAGE_CURRENT_TOPICS_HEADING}, + {"topicsPageCurrentTopicsHeadingPTB", + IDS_SETTINGS_TOPICS_PAGE_CURRENT_TOPICS_HEADING_PTB}, {"topicsPageCurrentTopicsDescription", IDS_SETTINGS_TOPICS_PAGE_CURRENT_TOPICS_DESCRIPTION}, + {"topicsPageCurrentTopicsDescriptionPTB", + IDS_SETTINGS_TOPICS_PAGE_CURRENT_TOPICS_DESCRIPTION_PTB}, {"topicsPageCurrentTopicsDescriptionLearnMoreLink", IDS_SETTINGS_TOPICS_PAGE_CURRENT_TOPICS_DESCRIPTION_LEARN_MORE_LINK}, {"topicsPageCurrentTopicsRegionA11yDescription", @@ -1996,15 +1983,21 @@ void AddPrivacySandboxStrings(content::WebUIDataSource* html_source, IDS_SETTINGS_TOPICS_PAGE_CURRENT_TOPICS_DESCRIPTION_DISABLED}, {"topicsPageCurrentTopicsDescriptionEmpty", IDS_SETTINGS_TOPICS_PAGE_CURRENT_TOPICS_DESCRIPTION_EMPTY}, + {"topicsPageCurrentTopicsDescriptionEmptyPTB", + IDS_SETTINGS_TOPICS_PAGE_CURRENT_TOPICS_DESCRIPTION_EMPTY_PTB}, {"topicsPageBlockTopic", IDS_SETTINGS_TOPICS_PAGE_BLOCK_TOPIC}, {"topicsPageBlockTopicA11yLabel", IDS_SETTINGS_TOPICS_PAGE_BLOCK_TOPIC_A11Y_LABEL}, {"topicsPageBlockedTopicsHeading", IDS_SETTINGS_TOPICS_PAGE_BLOCKED_TOPICS_HEADING}, + {"topicsPageBlockedTopicsHeadingPTB", + IDS_SETTINGS_TOPICS_PAGE_BLOCKED_TOPICS_HEADING_PTB}, {"topicsPageBlockedTopicsDescription", IDS_SETTINGS_TOPICS_PAGE_BLOCKED_TOPICS_DESCRIPTION}, {"topicsPageBlockedTopicsDescriptionEmpty", IDS_SETTINGS_TOPICS_PAGE_BLOCKED_TOPICS_DESCRIPTION_EMPTY}, + {"topicsPageBlockedTopicsDescriptionPTB", + IDS_SETTINGS_TOPICS_PAGE_BLOCKED_TOPICS_DESCRIPTION_PTB}, {"topicsPageBlockedTopicsRegionA11yDescription", IDS_SETTINGS_TOPICS_PAGE_BLOCKED_TOPICS_REGION_A11Y_DESCRIPTION}, {"topicsPageAllowTopic", IDS_SETTINGS_TOPICS_PAGE_ALLOW_TOPIC}, @@ -2070,8 +2063,11 @@ void AddPrivacySandboxStrings(content::WebUIDataSource* html_source, IDS_SETTINGS_AD_MEASUREMENT_PAGE_CONSIDER_BULLET_1}, {"adMeasurementPageConsiderBullet2", IDS_SETTINGS_AD_MEASUREMENT_PAGE_CONSIDER_BULLET_2}, - {"adMeasurementPageConsiderBullet3", - IDS_SETTINGS_AD_MEASUREMENT_PAGE_CONSIDER_BULLET_3}, + {"manageTopicsPageDescription", + IDS_SETTINGS_MANAGE_TOPICS_PAGE_DESCRIPTION}, + {"manageTopicsHeading", IDS_SETTINGS_TOPICS_PAGE_MANAGE_TOPICS_HEADING}, + {"manageTopicsDescription", + IDS_SETTINGS_TOPICS_PAGE_MANAGE_TOPICS_DESCRIPTION}, }; html_source->AddLocalizedStrings(kLocalizedStrings); @@ -2081,11 +2077,6 @@ void AddPrivacySandboxStrings(content::WebUIDataSource* html_source, GURL(chrome::kAdPrivacyLearnMoreURL), g_browser_process->GetApplicationLocale()) .spec()); - html_source->AddString( - "privacySandboxAdMeasurementDialogControlMeasurement", - l10n_util::GetStringFUTF16( - IDS_SETTINGS_PRIVACY_SANDBOX_AD_MEASUREMENT_DIALOG_CONTROL_MEASUREMENT, - base::ASCIIToUTF16(chrome::kChromeUIHistoryURL))); // Topics and fledge link to help center articles in their learn more dialog. html_source->AddString( @@ -2104,7 +2095,12 @@ void AddPrivacySandboxStrings(content::WebUIDataSource* html_source, GURL(chrome::kAdPrivacyLearnMoreURL), g_browser_process->GetApplicationLocale()) .spec()))); - + html_source->AddString( + "manageTopicsPageDescription", + l10n_util::GetStringFUTF16( + IDS_SETTINGS_MANAGE_TOPICS_PAGE_DESCRIPTION, + base::ASCIIToUTF16( + chrome::kChromeUIPrivacySandboxManageTopicsLearnMoreURL))); // Topics and fledge both link to the cookies setting page and cross-link // each other in the footers. html_source->AddString( @@ -2114,6 +2110,14 @@ void AddPrivacySandboxStrings(content::WebUIDataSource* html_source, base::ASCIIToUTF16(chrome::kChromeUIPrivacySandboxFledgeURL), base::ASCIIToUTF16(chrome::kChromeUICookieSettingsURL))); html_source->AddString( + "topicsPageFooterPTB", + l10n_util::GetStringFUTF16( + IDS_SETTINGS_TOPICS_PAGE_FOOTER_PTB, + base::ASCIIToUTF16(chrome::kChromeUIPrivacySandboxFledgeURL), + base::ASCIIToUTF16(chrome::kChromeUICookieSettingsURL), + base::ASCIIToUTF16( + chrome::kChromeUIPrivacySandboxManageTopicsLearnMoreURL))); + html_source->AddString( "fledgePageFooter", l10n_util::GetStringFUTF16( IDS_SETTINGS_FLEDGE_PAGE_FOOTER, @@ -2151,121 +2155,117 @@ void AddPrivacySandboxStrings(content::WebUIDataSource* html_source, void AddPrivacyGuideStrings(content::WebUIDataSource* html_source) { static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"privacyGuideLabel", IDS_SETTINGS_PRIVACY_GUIDE_LABEL}, - {"privacyGuideSublabel", IDS_SETTINGS_PRIVACY_GUIDE_SUBLABEL}, - {"privacyGuidePromoHeader", IDS_SETTINGS_PRIVACY_GUIDE_PROMO_HEADER}, - {"privacyGuidePromoBody", IDS_SETTINGS_PRIVACY_GUIDE_PROMO_BODY}, - {"privacyGuidePromoStartButton", - IDS_SETTINGS_PRIVACY_GUIDE_PROMO_START_BUTTON}, - {"privacyGuideBackToSettingsAriaLabel", - IDS_SETTINGS_PRIVACY_GUIDE_BACK_TO_SETTINGS_ARIA_LABEL}, - {"privacyGuideBackToSettingsAriaRoleDescription", - IDS_SETTINGS_PRIVACY_GUIDE_BACK_TO_SETTINGS_ARIA_ROLE_DESC}, - {"privacyGuideBackButton", IDS_SETTINGS_PRIVACY_GUIDE_BACK_BUTTON}, - {"privacyGuideSteps", IDS_SETTINGS_PRIVACY_GUIDE_STEPS}, - {"privacyGuideNextButton", IDS_SETTINGS_PRIVACY_GUIDE_NEXT_BUTTON}, - {"privacyGuideFeatureDescriptionHeader", - IDS_SETTINGS_PRIVACY_GUIDE_FEATURE_DESCRIPTION_HEADER}, - {"privacyGuideThingsToConsider", - IDS_SETTINGS_PRIVACY_GUIDE_THINGS_TO_CONSIDER}, - {"privacyGuideWelcomeCardHeader", - IDS_SETTINGS_PRIVACY_GUIDE_WELCOME_CARD_HEADER}, - {"privacyGuideWelcomeCardSubHeader", - IDS_SETTINGS_PRIVACY_GUIDE_WELCOME_CARD_SUB_HEADER}, - {"privacyGuideCompletionCardHeader", - IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_HEADER}, - {"privacyGuideCompletionCardSubHeader", - IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_SUB_HEADER}, - {"privacyGuideCompletionCardSubHeaderNoLinks", - IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_SUB_HEADER_NO_LINKS}, - {"privacyGuideCompletionCardLeaveButton", - IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_LEAVE_BUTTON}, - {"privacyGuideCompletionCardPrivacySandboxLabel", - IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_PRIVACY_SANDBOX_LABEL}, - {"privacyGuideCompletionCardPrivacySandboxSubLabel", - IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_PRIVACY_SANDBOX_SUB_LABEL}, - {"privacyGuideCompletionCardWaaLabel", - IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_WAA_LABEL}, - {"privacyGuideCompletionCardWaaSubLabel", - IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_WAA_SUB_LABEL}, - {"privacyGuideComposeAdditionalSettings", - IDS_SETTINGS_PRIVACY_GUIDE_COMPOSE_HEADERIDS__ADDITIONAL_SETTINGS}, - {"privacyGuideComposeHeader", IDS_SETTINGS_PRIVACY_GUIDE_COMPOSE_HEADER}, - {"privacyGuideComposeDescription", - IDS_SETTINGS_PRIVACY_GUIDE_COMPOSE_DESCRIPTION}, - {"privacyGuideMsbbCardHeader", IDS_SETTINGS_PRIVACY_GUIDE_MSBB_CARD_HEADER}, - {"privacyGuideMsbbFeatureDescription1", - IDS_SETTINGS_PRIVACY_GUIDE_MSBB_FEATURE_DESCRIPTION1}, - {"privacyGuideMsbbFeatureDescription2", - IDS_SETTINGS_PRIVACY_GUIDE_MSBB_FEATURE_DESCRIPTION2}, - {"privacyGuideMsbbFeatureDescription3", - IDS_SETTINGS_PRIVACY_GUIDE_MSBB_FEATURE_DESCRIPTION3}, - {"privacyGuideMsbbPrivacyDescription1", - IDS_SETTINGS_PRIVACY_GUIDE_MSBB_PRIVACY_DESCRIPTION1}, - {"privacyGuideMsbbPrivacyDescription2", - IDS_SETTINGS_PRIVACY_GUIDE_MSBB_PRIVACY_DESCRIPTION2}, - {"privacyGuideHistorySyncCardHeader", - IDS_SETTINGS_PRIVACY_GUIDE_HISTORY_SYNC_CARD_HEADER}, - {"privacyGuideHistorySyncSettingLabel", - IDS_SETTINGS_PRIVACY_GUIDE_HISTORY_SYNC_SETTING_LABEL}, - {"privacyGuideHistorySyncFeatureDescription1", - IDS_SETTINGS_PRIVACY_GUIDE_HISTORY_SYNC_FEATURE_DESCRIPTION1}, - {"privacyGuideHistorySyncFeatureDescription2", - IDS_SETTINGS_PRIVACY_GUIDE_HISTORY_SYNC_FEATURE_DESCRIPTION2}, - {"privacyGuideHistorySyncPrivacyDescription1", - IDS_SETTINGS_PRIVACY_GUIDE_HISTORY_SYNC_PRIVACY_DESCRIPTION1}, - {"privacyGuideCookiesCardHeader", - IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_HEADER}, - {"privacyGuideCookiesCardBlockTpcIncognitoSubheader", - IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_INCOGNITO_SUBHEADER}, - {"privacyGuideCookiesCardBlockTpcIncognitoFeatureDescription1", - IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_INCOGNITO_FEATURE_DESCRIPTION1}, - {"privacyGuideCookiesCardBlockTpcIncognitoFeatureDescription2", - IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_INCOGNITO_FEATURE_DESCRIPTION2}, - {"privacyGuideCookiesCardBlockTpcIncognitoPrivacyDescription1", - IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_INCOGNITO_PRIVACY_DESCRIPTION1}, - {"privacyGuideCookiesCardBlockTpcIncognitoPrivacyDescription2", - IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_INCOGNITO_PRIVACY_DESCRIPTION2}, - {"privacyGuideCookiesCardBlockTpcSubheader", - IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_SUBHEADER}, - {"privacyGuideCookiesCardBlockTpcFeatureDescription1", - IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_FEATURE_DESCRIPTION1}, - {"privacyGuideCookiesCardBlockTpcFeatureDescription2", - IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_FEATURE_DESCRIPTION2}, - {"privacyGuideCookiesCardBlockTpcPrivacyDescription1", - IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_PRIVACY_DESCRIPTION1}, - {"privacyGuideSafeBrowsingCardHeader", - IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_HEADER}, - {"privacyGuideSafeBrowsingCardEnhancedProtectionPrivacyDescription1", - IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_ENHANCED_PROTECTION_PRIVACY_DESCRIPTION1}, - {"privacyGuideSafeBrowsingCardEnhancedProtectionPrivacyDescription2", - IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_ENHANCED_PROTECTION_PRIVACY_DESCRIPTION2}, - {"privacyGuideSafeBrowsingCardEnhancedProtectionPrivacyDescription3", - IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_ENHANCED_PROTECTION_PRIVACY_DESCRIPTION3}, - {"privacyGuideSafeBrowsingCardStandardProtectionFeatureDescription1", - IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_STANDARD_PROTECTION_FEATURE_DESCRIPTION1}, - {"privacyGuideSafeBrowsingCardStandardProtectionFeatureDescription2", - IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_STANDARD_PROTECTION_FEATURE_DESCRIPTION2}, + {"privacyGuideLabel", IDS_SETTINGS_PRIVACY_GUIDE_LABEL}, + {"privacyGuideSublabel", IDS_SETTINGS_PRIVACY_GUIDE_SUBLABEL}, + {"privacyGuidePromoHeader", IDS_SETTINGS_PRIVACY_GUIDE_PROMO_HEADER}, + {"privacyGuidePromoBody", IDS_SETTINGS_PRIVACY_GUIDE_PROMO_BODY}, + {"privacyGuidePromoStartButton", + IDS_SETTINGS_PRIVACY_GUIDE_PROMO_START_BUTTON}, + {"privacyGuideBackToSettingsAriaLabel", + IDS_SETTINGS_PRIVACY_GUIDE_BACK_TO_SETTINGS_ARIA_LABEL}, + {"privacyGuideBackToSettingsAriaRoleDescription", + IDS_SETTINGS_PRIVACY_GUIDE_BACK_TO_SETTINGS_ARIA_ROLE_DESC}, + {"privacyGuideBackButton", IDS_SETTINGS_PRIVACY_GUIDE_BACK_BUTTON}, + {"privacyGuideSteps", IDS_SETTINGS_PRIVACY_GUIDE_STEPS}, + {"privacyGuideNextButton", IDS_SETTINGS_PRIVACY_GUIDE_NEXT_BUTTON}, + {"privacyGuideFeatureDescriptionHeader", + IDS_SETTINGS_PRIVACY_GUIDE_FEATURE_DESCRIPTION_HEADER}, + {"privacyGuideThingsToConsider", + IDS_SETTINGS_PRIVACY_GUIDE_THINGS_TO_CONSIDER}, + {"privacyGuideWelcomeCardHeader", + IDS_SETTINGS_PRIVACY_GUIDE_WELCOME_CARD_HEADER}, + {"privacyGuideWelcomeCardSubHeader", + IDS_SETTINGS_PRIVACY_GUIDE_WELCOME_CARD_SUB_HEADER}, + {"privacyGuideCompletionCardHeader", + IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_HEADER}, + {"privacyGuideCompletionCardSubHeader", + IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_SUB_HEADER}, + {"privacyGuideCompletionCardSubHeaderNoLinks", + IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_SUB_HEADER_NO_LINKS}, + {"privacyGuideCompletionCardLeaveButton", + IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_LEAVE_BUTTON}, + {"privacyGuideCompletionCardPrivacySandboxLabel", + IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_PRIVACY_SANDBOX_LABEL}, + {"privacyGuideCompletionCardPrivacySandboxSubLabel", + IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_PRIVACY_SANDBOX_SUB_LABEL}, + {"privacyGuideCompletionCardWaaLabel", + IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_WAA_LABEL}, + {"privacyGuideCompletionCardWaaSubLabel", + IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_WAA_SUB_LABEL}, + {"privacyGuideMsbbCardHeader", + IDS_SETTINGS_PRIVACY_GUIDE_MSBB_CARD_HEADER}, + {"privacyGuideMsbbFeatureDescription1", + IDS_SETTINGS_PRIVACY_GUIDE_MSBB_FEATURE_DESCRIPTION1}, + {"privacyGuideMsbbFeatureDescription2", + IDS_SETTINGS_PRIVACY_GUIDE_MSBB_FEATURE_DESCRIPTION2}, + {"privacyGuideMsbbFeatureDescription3", + IDS_SETTINGS_PRIVACY_GUIDE_MSBB_FEATURE_DESCRIPTION3}, + {"privacyGuideMsbbPrivacyDescription1", + IDS_SETTINGS_PRIVACY_GUIDE_MSBB_PRIVACY_DESCRIPTION1}, + {"privacyGuideMsbbPrivacyDescription2", + IDS_SETTINGS_PRIVACY_GUIDE_MSBB_PRIVACY_DESCRIPTION2}, + {"privacyGuideHistorySyncCardHeader", + IDS_SETTINGS_PRIVACY_GUIDE_HISTORY_SYNC_CARD_HEADER}, + {"privacyGuideHistorySyncSettingLabel", + IDS_SETTINGS_PRIVACY_GUIDE_HISTORY_SYNC_SETTING_LABEL}, + {"privacyGuideHistorySyncFeatureDescription1", + IDS_SETTINGS_PRIVACY_GUIDE_HISTORY_SYNC_FEATURE_DESCRIPTION1}, + {"privacyGuideHistorySyncFeatureDescription2", + IDS_SETTINGS_PRIVACY_GUIDE_HISTORY_SYNC_FEATURE_DESCRIPTION2}, + {"privacyGuideHistorySyncPrivacyDescription1", + IDS_SETTINGS_PRIVACY_GUIDE_HISTORY_SYNC_PRIVACY_DESCRIPTION1}, + {"privacyGuideCookiesCardHeader", + IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_HEADER}, + {"privacyGuideCookiesCardBlockTpcIncognitoSubheader", + IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_INCOGNITO_SUBHEADER}, + {"privacyGuideCookiesCardBlockTpcIncognitoFeatureDescription1", + IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_INCOGNITO_FEATURE_DESCRIPTION1}, + {"privacyGuideCookiesCardBlockTpcIncognitoFeatureDescription2", + IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_INCOGNITO_FEATURE_DESCRIPTION2}, + {"privacyGuideCookiesCardBlockTpcIncognitoPrivacyDescription1", + IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_INCOGNITO_PRIVACY_DESCRIPTION1}, + {"privacyGuideCookiesCardBlockTpcIncognitoPrivacyDescription2", + IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_INCOGNITO_PRIVACY_DESCRIPTION2}, + {"privacyGuideCookiesCardBlockTpcSubheader", + IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_SUBHEADER}, + {"privacyGuideCookiesCardBlockTpcFeatureDescription1", + IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_FEATURE_DESCRIPTION1}, + {"privacyGuideCookiesCardBlockTpcFeatureDescription2", + IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_FEATURE_DESCRIPTION2}, + {"privacyGuideCookiesCardBlockTpcPrivacyDescription1", + IDS_SETTINGS_PRIVACY_GUIDE_COOKIES_CARD_BLOCK_TPC_PRIVACY_DESCRIPTION1}, + {"privacyGuideSafeBrowsingCardHeader", + IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_HEADER}, + {"privacyGuideSafeBrowsingCardEnhancedProtectionPrivacyDescription1", + IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_ENHANCED_PROTECTION_PRIVACY_DESCRIPTION1}, + {"privacyGuideSafeBrowsingCardEnhancedProtectionPrivacyDescription2", + IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_ENHANCED_PROTECTION_PRIVACY_DESCRIPTION2}, + {"privacyGuideSafeBrowsingCardEnhancedProtectionPrivacyDescription3", + IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_ENHANCED_PROTECTION_PRIVACY_DESCRIPTION3}, + {"privacyGuideSafeBrowsingCardStandardProtectionFeatureDescription1", + IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_STANDARD_PROTECTION_FEATURE_DESCRIPTION1}, + {"privacyGuideSafeBrowsingCardStandardProtectionFeatureDescription2", + IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_STANDARD_PROTECTION_FEATURE_DESCRIPTION2}, #if BUILDFLAG(GOOGLE_CHROME_BRANDING) - {"privacyGuideSafeBrowsingCardStandardProtectionFeatureDescription2Proxy", - IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_STANDARD_PROTECTION_FEATURE_DESCRIPTION2_PROXY}, + {"privacyGuideSafeBrowsingCardStandardProtectionFeatureDescription2Proxy", + IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_STANDARD_PROTECTION_FEATURE_DESCRIPTION2_PROXY}, #endif - {"privacyGuideSafeBrowsingCardStandardProtectionPrivacyDescription1", - IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_STANDARD_PROTECTION_PRIVACY_DESCRIPTION1}, + {"privacyGuideSafeBrowsingCardStandardProtectionPrivacyDescription1", + IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_STANDARD_PROTECTION_PRIVACY_DESCRIPTION1}, #if BUILDFLAG(GOOGLE_CHROME_BRANDING) - {"privacyGuideSafeBrowsingCardStandardProtectionPrivacyDescription1Proxy", - IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_STANDARD_PROTECTION_PRIVACY_DESCRIPTION1_PROXY}, -#endif - {"privacyGuideSearchSuggestionsCardHeader", - IDS_SETTINGS_PRIVACY_GUIDE_SEARCH_SUGGESTIONS_CARD_HEADER}, - {"privacyGuideSearchSuggestionsFeatureDescription1", - IDS_SETTINGS_PRIVACY_GUIDE_SEARCH_SUGGESTIONS_FEATURE_DESCRIPTION1}, - {"privacyGuideSearchSuggestionsPrivacyDescription1", - IDS_SETTINGS_PRIVACY_GUIDE_SEARCH_SUGGESTIONS_PRIVACY_DESCRIPTION1}, - {"privacyGuideSearchSuggestionsPrivacyDescription2", - IDS_SETTINGS_PRIVACY_GUIDE_SEARCH_SUGGESTIONS_PRIVACY_DESCRIPTION2}, - {"privacyGuideSearchSuggestionsPrivacyDescription3", - IDS_SETTINGS_PRIVACY_GUIDE_SEARCH_SUGGESTIONS_PRIVACY_DESCRIPTION3}, + {"privacyGuideSafeBrowsingCardStandardProtectionPrivacyDescription1Proxy", + IDS_SETTINGS_PRIVACY_GUIDE_SAFE_BROWSING_CARD_STANDARD_PROTECTION_PRIVACY_DESCRIPTION1_PROXY}, +#endif + {"privacyGuideSearchSuggestionsCardHeader", + IDS_SETTINGS_PRIVACY_GUIDE_SEARCH_SUGGESTIONS_CARD_HEADER}, + {"privacyGuideSearchSuggestionsFeatureDescription1", + IDS_SETTINGS_PRIVACY_GUIDE_SEARCH_SUGGESTIONS_FEATURE_DESCRIPTION1}, + {"privacyGuideSearchSuggestionsPrivacyDescription1", + IDS_SETTINGS_PRIVACY_GUIDE_SEARCH_SUGGESTIONS_PRIVACY_DESCRIPTION1}, + {"privacyGuideSearchSuggestionsPrivacyDescription2", + IDS_SETTINGS_PRIVACY_GUIDE_SEARCH_SUGGESTIONS_PRIVACY_DESCRIPTION2}, + {"privacyGuideSearchSuggestionsPrivacyDescription3", + IDS_SETTINGS_PRIVACY_GUIDE_SEARCH_SUGGESTIONS_PRIVACY_DESCRIPTION3}, }; html_source->AddLocalizedStrings(kLocalizedStrings); } @@ -2428,28 +2428,44 @@ void AddSearchInSettingsStrings(content::WebUIDataSource* html_source) { html_source->AddString("searchNoResultsHelp", help_text); } -void AddSearchStrings(content::WebUIDataSource* html_source) { +void AddSearchStrings(content::WebUIDataSource* html_source +#if BUILDFLAG(IS_CHROMEOS) + , + bool for_primary_profile +#endif // BUILDFLAG(IS_CHROMEOS) +) { static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"searchEnginesManage", IDS_SETTINGS_SEARCH_MANAGE_SEARCH_ENGINES}, - {"searchEnginesManageSiteSearch", - IDS_SETTINGS_SEARCH_MANAGE_SEARCH_ENGINES_AND_SITE_SEARCH}, - {"searchPageTitle", IDS_SETTINGS_SEARCH}, - {"searchExplanation", IDS_SETTINGS_SEARCH_EXPLANATION}, - {"searchExplanationLearnMoreA11yLabel", - IDS_SETTINGS_SEARCH_EXPLANATION_ACCESSIBILITY_LABEL}, -#if BUILDFLAG(ENABLE_SEARCH_ENGINE_CHOICE) - {"searchEngineChoiceEntryPointSubtitle", - IDS_SEARCH_ENGINE_CHOICE_SETTINGS_ENTRY_POINT_SUBTITLE}, - {"searchEnginesChange", - IDS_SEARCH_ENGINE_CHOICE_SETTINGS_CHANGE_DEFAULT_ENGINE}, - {"searchEnginesSettingsDialogSubtitle", - IDS_SEARCH_ENGINE_CHOICE_SETTINGS_SUBTITLE}, - {"searchEnginesSetAsDefaultButton", IDS_SEARCH_ENGINE_CHOICE_BUTTON_TITLE}, - {"searchEnginesCancelButton", IDS_CANCEL}, -#endif + {"searchEnginesManage", IDS_SETTINGS_SEARCH_MANAGE_SEARCH_ENGINES}, + {"searchEnginesManageSiteSearch", + IDS_SETTINGS_SEARCH_MANAGE_SEARCH_ENGINES_AND_SITE_SEARCH}, + {"searchPageTitle", IDS_SETTINGS_SEARCH}, + {"searchExplanationLearnMoreA11yLabel", + IDS_SETTINGS_SEARCH_EXPLANATION_ACCESSIBILITY_LABEL}, + {"searchEngineChoiceEntryPointSubtitle", + IDS_SEARCH_ENGINE_CHOICE_SETTINGS_ENTRY_POINT_SUBTITLE}, + {"searchEnginesChange", + IDS_SEARCH_ENGINE_CHOICE_SETTINGS_CHANGE_DEFAULT_ENGINE}, + {"searchEnginesSettingsDialogSubtitle", + IDS_SEARCH_ENGINE_CHOICE_SETTINGS_SUBTITLE}, + {"searchEnginesSetAsDefaultButton", + IDS_SEARCH_ENGINE_CHOICE_BUTTON_TITLE}, + {"searchEnginesCancelButton", IDS_CANCEL}, }; html_source->AddLocalizedStrings(kLocalizedStrings); +#if BUILDFLAG(IS_CHROMEOS) + if (for_primary_profile) { + html_source->AddLocalizedString( + "searchExplanation", IDS_SETTINGS_SEARCH_EXPLANATION_PRIMARY_PROFILE); + } else { + html_source->AddLocalizedString("searchExplanation", + IDS_SETTINGS_SEARCH_EXPLANATION); + } +#else // !BUILDFLAG(IS_CHROMEOS) + html_source->AddLocalizedString("searchExplanation", + IDS_SETTINGS_SEARCH_EXPLANATION); +#endif // BUILDFLAG(IS_CHROMEOS) + html_source->AddString("searchExplanationLearnMoreURL", chrome::kOmniboxLearnMoreURL); } @@ -2462,6 +2478,8 @@ void AddSearchEnginesStrings(content::WebUIDataSource* html_source) { IDS_SETTINGS_SEARCH_ENGINES_ADD_SEARCH_ENGINE}, {"searchEnginesEditSearchEngine", IDS_SETTINGS_SEARCH_ENGINES_EDIT_SEARCH_ENGINE}, + {"searchEnginesViewSearchEngine", + IDS_SETTINGS_SEARCH_ENGINES_VIEW_SEARCH_ENGINE}, {"searchEnginesDeleteConfirmationTitle", IDS_SETTINGS_SEARCH_ENGINES_DELETE_CONFIRMATION_TITLE}, {"searchEnginesDeleteConfirmationDescription", @@ -2492,6 +2510,7 @@ void AddSearchEnginesStrings(content::WebUIDataSource* html_source) { {"searchEnginesMakeDefault", IDS_SETTINGS_SEARCH_ENGINES_MAKE_DEFAULT}, {"searchEnginesActivate", IDS_SETTINGS_SEARCH_ENGINES_ACTIVATE}, {"searchEnginesDeactivate", IDS_SETTINGS_SEARCH_ENGINES_DEACTIVATE}, + {"searchEnginesViewDetails", IDS_SETTINGS_SEARCH_ENGINES_VIEW_DETAILS}, {"searchEnginesManageExtension", IDS_SETTINGS_SEARCH_ENGINES_MANAGE_EXTENSION}, {"searchEnginesKeyboardShortcutsTitle", @@ -2513,800 +2532,813 @@ void AddSearchEnginesStrings(content::WebUIDataSource* html_source) { void AddSiteSettingsStrings(content::WebUIDataSource* html_source, Profile* profile) { static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"addSite", IDS_SETTINGS_ADD_SITE}, - {"addSiteTitle", IDS_SETTINGS_ADD_SITE_TITLE}, - {"addSitesTitle", IDS_SETTINGS_ADD_SITES_TITLE}, - {"embeddedOnAnyHost", IDS_SETTINGS_EXCEPTIONS_EMBEDDED_ON_ANY_HOST}, - {"embeddedOnHost", IDS_SETTINGS_EXCEPTIONS_EMBEDDED_ON_HOST}, - {"editSiteTitle", IDS_SETTINGS_EDIT_SITE_TITLE}, - {"noBluetoothDevicesFound", IDS_SETTINGS_NO_BLUETOOTH_DEVICES_FOUND}, - {"noHidDevicesFound", IDS_SETTINGS_NO_HID_DEVICES_FOUND}, - {"noSerialPortsFound", IDS_SETTINGS_NO_SERIAL_PORTS_FOUND}, - {"noUsbDevicesFound", IDS_SETTINGS_NO_USB_DEVICES_FOUND}, - {"resetBluetoothConfirmation", IDS_SETTINGS_RESET_BLUETOOTH_CONFIRMATION}, - {"resetHidConfirmation", IDS_SETTINGS_RESET_HID_CONFIRMATION}, - {"resetSerialPortsConfirmation", - IDS_SETTINGS_RESET_SERIAL_PORTS_CONFIRMATION}, - {"resetUsbConfirmation", IDS_SETTINGS_RESET_USB_CONFIRMATION}, - {"siteSettingsRecentPermissionsSectionLabel", - IDS_SETTINGS_SITE_SETTINGS_RECENT_ACTIVITY}, - {"siteSettingsCategoryCamera", IDS_SITE_SETTINGS_TYPE_CAMERA}, - {"siteSettingsCameraLabel", IDS_SITE_SETTINGS_TYPE_CAMERA}, - {"thirdPartyCookiesPageTitle", IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_TITLE}, - {"thirdPartyCookiesLinkRowLabel", - IDS_SETTINGS_THIRD_PARTY_COOKIES_LINK_ROW_LABEL}, - {"thirdPartyCookiesLinkRowSublabelEnabled", - IDS_SETTINGS_THIRD_PARTY_COOKIES_LINK_ROW_SUB_LABEL_ENABLED}, - {"thirdPartyCookiesLinkRowSublabelDisabledIncognito", - IDS_SETTINGS_THIRD_PARTY_COOKIES_LINK_ROW_SUB_LABEL_DISABLED_INCOGNITO}, - {"thirdPartyCookiesLinkRowSublabelDisabled", - IDS_SETTINGS_THIRD_PARTY_COOKIES_LINK_ROW_SUB_LABEL_DISABLED}, - {"thirdPartyCookiesPageAllowRadioLabel", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_ALLOW_RADIO_LABEL}, - {"thirdPartyCookiesPageAllowExpandA11yLabel", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_ALLOW_EXPAND_A11Y_LABEL}, - {"thirdPartyCookiesPageAllowBulOne", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_ALLOW_BULLET_1}, - {"thirdPartyCookiesPageAllowBulTwo", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_ALLOW_BULLET_2}, - {"thirdPartyCookiesPageBlockIncognitoRadioLabel", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_BLOCK_INCOGNITO_RADIO_LABEL}, - {"thirdPartyCookiesPageBlockIncognitoExpandA11yLabel", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_BLOCK_INCOGNITO_EXPAND_A11Y_LABEL}, - {"thirdPartyCookiesPageBlockIncognitoBulOne", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_BLOCK_INCOGNITO_BULLET_1}, - {"thirdPartyCookiesPageBlockIncognitoBulTwo", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_BLOCK_INCOGNITO_BULLET_2}, - {"thirdPartyCookiesPageBlockRadioLabel", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_BLOCK_RADIO_LABEL}, - {"thirdPartyCookiesPageBlockExpandA11yLabel", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_BLOCK_EXPAND_A11Y_LABEL}, - {"thirdPartyCookiesPageBlockBulOne", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_BLOCK_BULLET_1}, - {"thirdPartyCookiesPageBlockBulTwo", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_BLOCK_BULLET_2}, - {"trackingProtectionLinkRowLabel", - IDS_SETTINGS_TRACKING_PROTECTION_LINK_ROW_LABEL}, - {"trackingProtectionLinkRowSubLabel", - IDS_SETTINGS_TRACKING_PROTECTION_LINK_ROW_SUB_LABEL}, - - {"thirdPartyCookiesPageDescription", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_DESCRIPTION}, - {"thirdPartyCookiesPageDefaultBehaviorHeading", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_DEFAULT_BEHAVIOR_HEADING}, - {"thirdPartyCookiesPageDefaultBehaviorDescription", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_DEFAULT_BEHAVIOR_DESCRIPTION}, - {"thirdPartyCookiesPageCustomizedBehaviorHeading", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_CUSTOMIZED_BEHAVIOR_HEADING}, - {"thirdPartyCookiesPageCustomizedBehaviorDescription", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_CUSTOMIZED_BEHAVIOR_DESCRIPTION}, - {"thirdPartyCookiesPageAllowExceptionsSubHeading", - IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_ALLOW_EXCEPTIONS_SUB_HEADING}, - {"cookiePageTitle", IDS_SETTINGS_COOKIES_PAGE}, - {"cookiePageGeneralControls", IDS_SETTINGS_COOKIES_CONTROLS}, - {"cookiePageAllowAll", IDS_SETTINGS_COOKIES_ALLOW_ALL}, - {"cookiePageAllowAllExpandA11yLabel", - IDS_SETTINGS_COOKIES_ALLOW_ALL_EXPAND_A11Y_LABEL}, - {"cookiePageAllowAllBulOne", IDS_SETTINGS_COOKIES_ALLOW_ALL_BULLET_ONE}, - {"cookiePageAllowAllBulTwo", IDS_SETTINGS_COOKIES_ALLOW_ALL_BULLET_TWO}, - {"cookiePageBlockThirdIncognito", - IDS_SETTINGS_COOKIES_BLOCK_THIRD_PARTY_INCOGNITO}, - {"cookiePageBlockThirdIncognitoExpandA11yLabel", - IDS_SETTINGS_COOKIES_BLOCK_THIRD_PARTY_INCOGNITO_EXPAND_A11Y_LABEL}, - {"cookiePageBlockThirdIncognitoBulOne", - IDS_SETTINGS_COOKIES_BLOCK_THIRD_PARTY_INCOGNITO_BULLET_ONE}, - {"cookiePageBlockThirdIncognitoBulTwo", - IDS_SETTINGS_COOKIES_BLOCK_THIRD_PARTY_INCOGNITO_BULLET_TWO}, - {"cookiePageBlockThirdIncognitoBulTwoFps", - IDS_SETTINGS_COOKIES_BLOCK_THIRD_PARTY_INCOGNITO_BULLET_TWO_FPS}, - {"cookiePageBlockThird", IDS_SETTINGS_COOKIES_BLOCK_THIRD_PARTY}, - {"cookiePageBlockThirdExpandA11yLabel", - IDS_SETTINGS_COOKIES_BLOCK_THIRD_PARTY_EXPAND_A11Y_LABEL}, - {"cookiePageBlockThirdBulOne", - IDS_SETTINGS_COOKIES_BLOCK_THIRD_PARTY_BULLET_ONE}, - {"cookiePageBlockThirdBulTwo", - IDS_SETTINGS_COOKIES_BLOCK_THIRD_PARTY_BULLET_TWO}, - {"cookiePageBlockAll", IDS_SETTINGS_COOKIES_BLOCK_ALL}, - {"cookiePageBlockAllExpandA11yLabel", - IDS_SETTINGS_COOKIES_BLOCK_ALL_EXPAND_A11Y_LABEL}, - {"cookiePageBlockAllBulOne", IDS_SETTINGS_COOKIES_BLOCK_ALL_BULLET_ONE}, - {"cookiePageBlockAllBulTwo", IDS_SETTINGS_COOKIES_BLOCK_ALL_BULLET_TWO}, - {"cookiePageBlockAllBulThree", IDS_SETTINGS_COOKIES_BLOCK_ALL_BULLET_THREE}, - {"cookiePageFpsLabel", IDS_SETTINGS_COOKIES_FIRST_PARTY_SETS_TOGGLE_LABEL}, - {"cookiePageFpsSubLabel", - IDS_SETTINGS_COOKIES_FIRST_PARTY_SETS_TOGGLE_SUB_LABEL}, - {"cookiePageClearOnExit", IDS_SETTINGS_COOKIES_CLEAR_ON_EXIT}, -#if !BUILDFLAG(IS_CHROMEOS_ASH) - {"cookiePageClearOnExitDesc", IDS_SETTINGS_COOKIES_CLEAR_ON_EXIT_DESC}, -#endif - {"cookiePageAllSitesLink", IDS_SETTINGS_COOKIES_ALL_SITES_LINK}, - {"cookiePageAllowExceptions", IDS_SETTINGS_COOKIES_ALLOW_EXCEPTIONS}, - {"cookiePageBlockExceptions", IDS_SETTINGS_COOKIES_BLOCK_EXCEPTIONS}, - {"cookiePageSessionOnlyExceptions", - IDS_SETTINGS_COOKIES_SESSION_ONLY_EXCEPTIONS}, - {"trackingProtectionPageTitle", - IDS_SETTINGS_TRACKING_PROTECTION_PAGE_TITLE}, - {"trackingProtectionPageDescription", - IDS_SETTINGS_TRACKING_PROTECTION_PAGE_DESCRIPTION}, - {"trackingProtectionBulletOne", - IDS_SETTINGS_TRACKING_PROTECTION_BULLET_ONE}, - {"trackingProtectionBulletOneDescription", - IDS_SETTINGS_TRACKING_PROTECTION_BULLET_ONE_DESCRIPTION}, - {"trackingProtectionBulletTwo", - IDS_SETTINGS_TRACKING_PROTECTION_BULLET_TWO}, - {"trackingProtectionAdvancedLabel", - IDS_SETTINGS_TRACKING_PROTECTION_ADVANCED_LABEL}, - {"trackingProtectionThirdPartyCookiesToggleLabel", - IDS_SETTINGS_TRACKING_PROTECTION_THIRD_PARTY_COOKIES_TOGGLE_LABEL}, - {"trackingProtectionThirdPartyCookiesToggleSubLabel", - IDS_SETTINGS_TRACKING_PROTECTION_THIRD_PARTY_COOKIES_TOGGLE_SUB_LABEL}, - {"trackingProtectionThirdPartyCookiesLearnMoreAriaLabel", - IDS_SETTINGS_TRACKING_PROTECTION_THIRD_PARTY_COOKIES_LEARN_MORE_ARIA_LABEL}, - {"trackingProtectionDoNotTrackToggleSubLabel", - IDS_SETTINGS_TRACKING_PROTECTION_DO_NOT_TRACK_TOGGLE_SUB_LABEL}, - {"trackingProtectionSitesAllowedCookiesTitle", - IDS_SETTINGS_TRACKING_PROTECTION_SITES_ALLOWED_COOKIES_TITLE}, - {"trackingProtectionSitesAllowedCookiesDescription", - IDS_SETTINGS_TRACKING_PROTECTION_SITES_ALLOWED_COOKIES_DESCRIPTION}, - {"siteSettingsCategoryFederatedIdentityApi", - IDS_SITE_SETTINGS_TYPE_FEDERATED_IDENTITY_API}, - {"siteSettingsCategoryHandlers", IDS_SITE_SETTINGS_TYPE_HANDLERS}, - {"siteSettingsCategoryImages", IDS_SITE_SETTINGS_TYPE_IMAGES}, - {"siteSettingsCategoryInsecureContent", - IDS_SITE_SETTINGS_TYPE_INSECURE_CONTENT}, - {"siteSettingsCategoryLocation", IDS_SITE_SETTINGS_TYPE_LOCATION}, - {"siteSettingsCategoryJavascript", IDS_SITE_SETTINGS_TYPE_JAVASCRIPT}, - {"siteSettingsCategoryMicrophone", IDS_SITE_SETTINGS_TYPE_MIC}, - {"siteSettingsMicrophoneLabel", IDS_SITE_SETTINGS_TYPE_MIC}, - {"siteSettingsCategoryNotifications", IDS_SITE_SETTINGS_TYPE_NOTIFICATIONS}, - {"siteSettingsCategoryPopups", IDS_SITE_SETTINGS_TYPE_POPUPS_REDIRECTS}, - {"siteSettingsCategoryZoomLevels", IDS_SITE_SETTINGS_TYPE_ZOOM_LEVELS}, - {"siteSettingsAllSites", IDS_SETTINGS_SITE_SETTINGS_ALL_SITES}, - {"siteSettingsAllSitesDescription", - IDS_SETTINGS_SITE_SETTINGS_ALL_SITES_DESCRIPTION}, - {"siteSettingsAllSitesSearch", IDS_SETTINGS_SITE_SETTINGS_ALL_SITES_SEARCH}, - {"siteSettingsAllSitesSort", IDS_SETTINGS_SITE_SETTINGS_ALL_SITES_SORT}, - {"siteSettingsAllSitesSortMethodMostVisited", - IDS_SETTINGS_SITE_SETTINGS_ALL_SITES_SORT_METHOD_MOST_VISITED}, - {"siteSettingsAllSitesSortMethodStorage", - IDS_SETTINGS_SITE_SETTINGS_ALL_SITES_SORT_METHOD_STORAGE}, - {"siteSettingsAllSitesSortMethodName", - IDS_SETTINGS_SITE_SETTINGS_ALL_SITES_SORT_METHOD_NAME}, - {"siteSettingsFileSystemSiteListHeader", - IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_SITE_LIST_HEADER}, - {"siteSettingsFileSystemSiteListEditHeader", - IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_SITE_LIST_EDIT_HEADER}, - {"siteSettingsFileSystemSiteListRemoveGrantLabel", - IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_SITE_LIST_REMOVE_GRANT_LABEL}, - {"siteSettingsFileSystemSiteListRemoveGrants", - IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_SITE_LIST_REMOVE_GRANTS}, - {"siteSettingsFileSystemSiteListViewHeader", - IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_SITE_LIST_VIEW_HEADER}, - {"siteSettingsFileSystemSiteListViewSiteDetails", - IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_SITE_LIST_VIEW_SITE_DETAILS}, - {"siteSettingsSiteEntryPartitionedLabel", - IDS_SETTINGS_SITE_SETTINGS_SITE_ENTRY_PARTITIONED_LABEL}, - {"siteSettingsSiteRepresentationSeparator", - IDS_SETTINGS_SITE_SETTINGS_SITE_REPRESENTATION_SEPARATOR}, - {"siteSettingsAppProtocolHandlers", - IDS_SETTINGS_SITE_SETTINGS_APP_PROTOCOL_HANDLERS}, - {"siteSettingsAppAllowedProtocolHandlersDescription", - IDS_SETTINGS_SITE_SETTINGS_APP_ALLOWED_PROTOCOL_HANDLERS_DESCRIPTION}, - {"siteSettingsAppDisallowedProtocolHandlersDescription", - IDS_SETTINGS_SITE_SETTINGS_APP_DISALLOWED_PROTOCOL_HANDLERS_DESCRIPTION}, - {"siteSettingsAutomaticDownloads", - IDS_SITE_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS}, - {"siteSettingsAutomaticDownloadsMidSentence", - IDS_SITE_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS_MID_SENTENCE}, - {"siteSettingsAutoPictureInPicture", - IDS_SITE_SETTINGS_TYPE_AUTO_PICTURE_IN_PICTURE}, - {"siteSettingsAutoPictureInPictureMidSentence", - IDS_SITE_SETTINGS_TYPE_AUTO_PICTURE_IN_PICTURE_MID_SENTENCE}, - {"siteSettingsBackgroundSync", IDS_SITE_SETTINGS_TYPE_BACKGROUND_SYNC}, - {"siteSettingsBackgroundSyncMidSentence", - IDS_SITE_SETTINGS_TYPE_BACKGROUND_SYNC_MID_SENTENCE}, - {"siteSettingsCamera", IDS_SITE_SETTINGS_TYPE_CAMERA}, - {"siteSettingsCameraMidSentence", - IDS_SITE_SETTINGS_TYPE_CAMERA_MID_SENTENCE}, - {"siteSettingsClipboard", IDS_SITE_SETTINGS_TYPE_CLIPBOARD}, - {"siteSettingsClipboardMidSentence", - IDS_SITE_SETTINGS_TYPE_CLIPBOARD_MID_SENTENCE}, - {"siteSettingsCookies", IDS_SITE_SETTINGS_TYPE_COOKIES}, - {"siteSettingsCookiesMidSentence", - IDS_SITE_SETTINGS_TYPE_COOKIES_MID_SENTENCE}, - {"siteSettingsHandlers", IDS_SITE_SETTINGS_TYPE_HANDLERS}, - {"siteSettingsHandlersMidSentence", - IDS_SITE_SETTINGS_TYPE_HANDLERS_MID_SENTENCE}, - {"siteSettingsLocation", IDS_SITE_SETTINGS_TYPE_LOCATION}, - {"siteSettingsLocationMidSentence", - IDS_SITE_SETTINGS_TYPE_LOCATION_MID_SENTENCE}, - {"siteSettingsMic", IDS_SITE_SETTINGS_TYPE_MIC}, - {"siteSettingsMicMidSentence", IDS_SITE_SETTINGS_TYPE_MIC_MID_SENTENCE}, - {"siteSettingsNotifications", IDS_SITE_SETTINGS_TYPE_NOTIFICATIONS}, - {"siteSettingsNotificationsMidSentence", - IDS_SITE_SETTINGS_TYPE_NOTIFICATIONS_MID_SENTENCE}, - {"siteSettingsImages", IDS_SITE_SETTINGS_TYPE_IMAGES}, - {"siteSettingsImagesMidSentence", - IDS_SITE_SETTINGS_TYPE_IMAGES_MID_SENTENCE}, - {"siteSettingsInsecureContent", IDS_SITE_SETTINGS_TYPE_INSECURE_CONTENT}, - {"siteSettingsInsecureContentMidSentence", - IDS_SITE_SETTINGS_TYPE_INSECURE_CONTENT_MID_SENTENCE}, - {"siteSettingsInsecureContentBlock", - IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT_BLOCK}, - {"siteSettingsJavascript", IDS_SITE_SETTINGS_TYPE_JAVASCRIPT}, - {"siteSettingsJavascriptMidSentence", - IDS_SITE_SETTINGS_TYPE_JAVASCRIPT_MID_SENTENCE}, - {"siteSettingsSound", IDS_SITE_SETTINGS_TYPE_SOUND}, - {"siteSettingsSoundMidSentence", IDS_SITE_SETTINGS_TYPE_SOUND_MID_SENTENCE}, - {"siteSettingsPdfDocuments", IDS_SITE_SETTINGS_TYPE_PDF_DOCUMENTS}, - {"siteSettingsPdfDownloadPdfs", - IDS_SETTINGS_SITE_SETTINGS_PDF_DOWNLOAD_PDFS}, - {"siteSettingsProtectedContent", IDS_SITE_SETTINGS_TYPE_PROTECTED_MEDIA_ID}, - {"siteSettingsProtectedContentMidSentence", - IDS_SITE_SETTINGS_TYPE_PROTECTED_MEDIA_ID_MID_SENTENCE}, - {"siteSettingsProtectedContentIdentifiers", - IDS_SITE_SETTINGS_TYPE_PROTECTED_MEDIA_ID}, - {"siteSettingsProtectedContentDescription", - IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_DESCRIPTION}, - {"siteSettingsProtectedContentAllowed", - IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_ALLOWED}, - {"siteSettingsProtectedContentBlocked", - IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_BLOCKED}, - {"siteSettingsProtectedContentBlockedSubLabel", - IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_BLOCKED_SUB_LABEL}, + {"addSite", IDS_SETTINGS_ADD_SITE}, + {"addSiteTitle", IDS_SETTINGS_ADD_SITE_TITLE}, + {"addSitesTitle", IDS_SETTINGS_ADD_SITES_TITLE}, + {"embeddedOnAnyHost", IDS_SETTINGS_EXCEPTIONS_EMBEDDED_ON_ANY_HOST}, + {"embeddedOnHost", IDS_SETTINGS_EXCEPTIONS_EMBEDDED_ON_HOST}, + {"editSiteTitle", IDS_SETTINGS_EDIT_SITE_TITLE}, + {"noBluetoothDevicesFound", IDS_SETTINGS_NO_BLUETOOTH_DEVICES_FOUND}, + {"noHidDevicesFound", IDS_SETTINGS_NO_HID_DEVICES_FOUND}, + {"noSerialPortsFound", IDS_SETTINGS_NO_SERIAL_PORTS_FOUND}, + {"noUsbDevicesFound", IDS_SETTINGS_NO_USB_DEVICES_FOUND}, + {"resetBluetoothConfirmation", IDS_SETTINGS_RESET_BLUETOOTH_CONFIRMATION}, + {"resetHidConfirmation", IDS_SETTINGS_RESET_HID_CONFIRMATION}, + {"resetSerialPortsConfirmation", + IDS_SETTINGS_RESET_SERIAL_PORTS_CONFIRMATION}, + {"resetUsbConfirmation", IDS_SETTINGS_RESET_USB_CONFIRMATION}, + {"siteSettingsRecentPermissionsSectionLabel", + IDS_SETTINGS_SITE_SETTINGS_RECENT_ACTIVITY}, + {"siteSettingsCategoryCamera", IDS_SITE_SETTINGS_TYPE_CAMERA}, + {"siteSettingsCameraLabel", IDS_SITE_SETTINGS_TYPE_CAMERA}, + {"thirdPartyCookiesPageTitle", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_TITLE}, + {"thirdPartyCookiesLinkRowLabel", + IDS_SETTINGS_THIRD_PARTY_COOKIES_LINK_ROW_LABEL}, + {"thirdPartyCookiesLinkRowSublabelEnabled", + IDS_SETTINGS_THIRD_PARTY_COOKIES_LINK_ROW_SUB_LABEL_ENABLED}, + {"thirdPartyCookiesLinkRowSublabelDisabledIncognito", + IDS_SETTINGS_THIRD_PARTY_COOKIES_LINK_ROW_SUB_LABEL_DISABLED_INCOGNITO}, + {"thirdPartyCookiesLinkRowSublabelDisabled", + IDS_SETTINGS_THIRD_PARTY_COOKIES_LINK_ROW_SUB_LABEL_DISABLED}, + {"thirdPartyCookiesPageAllowRadioLabel", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_ALLOW_RADIO_LABEL}, + {"thirdPartyCookiesPageAllowExpandA11yLabel", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_ALLOW_EXPAND_A11Y_LABEL}, + {"thirdPartyCookiesPageAllowBulOne", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_ALLOW_BULLET_1}, + {"thirdPartyCookiesPageAllowBulTwo", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_ALLOW_BULLET_2}, + {"thirdPartyCookiesPageBlockIncognitoRadioLabel", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_BLOCK_INCOGNITO_RADIO_LABEL}, + {"thirdPartyCookiesPageBlockIncognitoExpandA11yLabel", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_BLOCK_INCOGNITO_EXPAND_A11Y_LABEL}, + {"thirdPartyCookiesPageBlockIncognitoBulOne", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_BLOCK_INCOGNITO_BULLET_1}, + {"thirdPartyCookiesPageBlockIncognitoBulTwo", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_BLOCK_INCOGNITO_BULLET_2}, + {"thirdPartyCookiesPageBlockRadioLabel", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_BLOCK_RADIO_LABEL}, + {"thirdPartyCookiesPageBlockExpandA11yLabel", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_BLOCK_EXPAND_A11Y_LABEL}, + {"thirdPartyCookiesPageBlockBulOne", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_BLOCK_BULLET_1}, + {"thirdPartyCookiesPageBlockBulTwo", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_BLOCK_BULLET_2}, + {"trackingProtectionLinkRowLabel", + IDS_SETTINGS_TRACKING_PROTECTION_LINK_ROW_LABEL}, + {"trackingProtectionLinkRowSubLabel", + IDS_SETTINGS_TRACKING_PROTECTION_LINK_ROW_SUB_LABEL}, + + {"thirdPartyCookiesPageDescription", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_DESCRIPTION}, + {"thirdPartyCookiesPageDefaultBehaviorHeading", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_DEFAULT_BEHAVIOR_HEADING}, + {"thirdPartyCookiesPageDefaultBehaviorDescription", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_DEFAULT_BEHAVIOR_DESCRIPTION}, + {"thirdPartyCookiesPageCustomizedBehaviorHeading", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_CUSTOMIZED_BEHAVIOR_HEADING}, + {"thirdPartyCookiesPageCustomizedBehaviorDescription", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_CUSTOMIZED_BEHAVIOR_DESCRIPTION}, + {"thirdPartyCookiesPageAllowExceptionsSubHeading", + IDS_SETTINGS_THIRD_PARTY_COOKIES_PAGE_ALLOW_EXCEPTIONS_SUB_HEADING}, + {"cookiePageBlockThirdIncognitoBulTwoFps", + IDS_SETTINGS_COOKIES_BLOCK_THIRD_PARTY_INCOGNITO_BULLET_TWO_FPS}, + {"cookiePageFpsLabel", + IDS_SETTINGS_COOKIES_FIRST_PARTY_SETS_TOGGLE_LABEL}, + {"cookiePageFpsSubLabel", + IDS_SETTINGS_COOKIES_FIRST_PARTY_SETS_TOGGLE_SUB_LABEL}, + {"cookiePageAllSitesLink", IDS_SETTINGS_COOKIES_ALL_SITES_LINK}, + {"trackingProtectionPageTitle", + IDS_SETTINGS_TRACKING_PROTECTION_PAGE_TITLE}, + {"trackingProtectionPageDescription", + IDS_SETTINGS_TRACKING_PROTECTION_PAGE_DESCRIPTION}, + {"trackingProtectionBulletOne", + IDS_SETTINGS_TRACKING_PROTECTION_BULLET_ONE}, + {"trackingProtectionBulletOneDescription", + IDS_SETTINGS_TRACKING_PROTECTION_BULLET_ONE_DESCRIPTION}, + {"trackingProtectionBulletTwo", + IDS_SETTINGS_TRACKING_PROTECTION_BULLET_TWO}, + {"trackingProtectionAdvancedLabel", + IDS_SETTINGS_TRACKING_PROTECTION_ADVANCED_LABEL}, + {"trackingProtectionThirdPartyCookiesToggleLabel", + IDS_SETTINGS_TRACKING_PROTECTION_THIRD_PARTY_COOKIES_TOGGLE_LABEL}, + {"trackingProtectionThirdPartyCookiesToggleSubLabel", + IDS_SETTINGS_TRACKING_PROTECTION_THIRD_PARTY_COOKIES_TOGGLE_SUB_LABEL}, + {"trackingProtectionThirdPartyCookiesLearnMoreAriaLabel", + IDS_SETTINGS_TRACKING_PROTECTION_THIRD_PARTY_COOKIES_LEARN_MORE_ARIA_LABEL}, + {"trackingProtectionDoNotTrackToggleSubLabel", + IDS_SETTINGS_TRACKING_PROTECTION_DO_NOT_TRACK_TOGGLE_SUB_LABEL}, + {"trackingProtectionSitesAllowedCookiesTitle", + IDS_SETTINGS_TRACKING_PROTECTION_SITES_ALLOWED_COOKIES_TITLE}, + {"trackingProtectionSitesAllowedCookiesDescription", + IDS_SETTINGS_TRACKING_PROTECTION_SITES_ALLOWED_COOKIES_DESCRIPTION}, + {"siteSettingsCategoryFederatedIdentityApi", + IDS_SITE_SETTINGS_TYPE_FEDERATED_IDENTITY_API}, + {"siteSettingsCategoryHandlers", IDS_SITE_SETTINGS_TYPE_HANDLERS}, + {"siteSettingsCategoryImages", IDS_SITE_SETTINGS_TYPE_IMAGES}, + {"siteSettingsCategoryInsecureContent", + IDS_SITE_SETTINGS_TYPE_INSECURE_CONTENT}, + {"siteSettingsCategoryLocation", IDS_SITE_SETTINGS_TYPE_LOCATION}, + {"siteSettingsCategoryJavascript", IDS_SITE_SETTINGS_TYPE_JAVASCRIPT}, + {"siteSettingsCategoryJavascriptJit", + IDS_SITE_SETTINGS_TYPE_JAVASCRIPT_JIT}, + {"siteSettingsCategoryMicrophone", IDS_SITE_SETTINGS_TYPE_MIC}, + {"siteSettingsMicrophoneLabel", IDS_SITE_SETTINGS_TYPE_MIC}, + {"siteSettingsCategoryNotifications", + IDS_SITE_SETTINGS_TYPE_NOTIFICATIONS}, + {"siteSettingsCategoryPopups", IDS_SITE_SETTINGS_TYPE_POPUPS_REDIRECTS}, + {"siteSettingsCategoryZoomLevels", IDS_SITE_SETTINGS_TYPE_ZOOM_LEVELS}, + {"siteSettingsAllSites", IDS_SETTINGS_SITE_SETTINGS_ALL_SITES}, + {"siteSettingsAllSitesDescription", + IDS_SETTINGS_SITE_SETTINGS_ALL_SITES_DESCRIPTION}, + {"siteSettingsAllSitesSearch", + IDS_SETTINGS_SITE_SETTINGS_ALL_SITES_SEARCH}, + {"siteSettingsAllSitesSort", IDS_SETTINGS_SITE_SETTINGS_ALL_SITES_SORT}, + {"siteSettingsAllSitesSortMethodMostVisited", + IDS_SETTINGS_SITE_SETTINGS_ALL_SITES_SORT_METHOD_MOST_VISITED}, + {"siteSettingsAllSitesSortMethodStorage", + IDS_SETTINGS_SITE_SETTINGS_ALL_SITES_SORT_METHOD_STORAGE}, + {"siteSettingsAllSitesSortMethodName", + IDS_SETTINGS_SITE_SETTINGS_ALL_SITES_SORT_METHOD_NAME}, + {"siteSettingsFileSystemSiteListHeader", + IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_SITE_LIST_HEADER}, + {"siteSettingsFileSystemSiteListEditHeader", + IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_SITE_LIST_EDIT_HEADER}, + {"siteSettingsFileSystemSiteListRemoveGrantLabel", + IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_SITE_LIST_REMOVE_GRANT_LABEL}, + {"siteSettingsFileSystemSiteListRemoveGrants", + IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_SITE_LIST_REMOVE_GRANTS}, + {"siteSettingsFileSystemSiteListViewHeader", + IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_SITE_LIST_VIEW_HEADER}, + {"siteSettingsFileSystemSiteListViewSiteDetails", + IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_SITE_LIST_VIEW_SITE_DETAILS}, + {"siteSettingsSiteEntryPartitionedLabel", + IDS_SETTINGS_SITE_SETTINGS_SITE_ENTRY_PARTITIONED_LABEL}, + {"siteSettingsSiteRepresentationSeparator", + IDS_SETTINGS_SITE_SETTINGS_SITE_REPRESENTATION_SEPARATOR}, + {"siteSettingsAppProtocolHandlers", + IDS_SETTINGS_SITE_SETTINGS_APP_PROTOCOL_HANDLERS}, + {"siteSettingsAppAllowedProtocolHandlersDescription", + IDS_SETTINGS_SITE_SETTINGS_APP_ALLOWED_PROTOCOL_HANDLERS_DESCRIPTION}, + {"siteSettingsAppDisallowedProtocolHandlersDescription", + IDS_SETTINGS_SITE_SETTINGS_APP_DISALLOWED_PROTOCOL_HANDLERS_DESCRIPTION}, + {"siteSettingsAutomaticDownloads", + IDS_SITE_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS}, + {"siteSettingsAutomaticDownloadsMidSentence", + IDS_SITE_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS_MID_SENTENCE}, + {"siteSettingsAutoPictureInPicture", + IDS_SITE_SETTINGS_TYPE_AUTO_PICTURE_IN_PICTURE}, + {"siteSettingsAutoPictureInPictureMidSentence", + IDS_SITE_SETTINGS_TYPE_AUTO_PICTURE_IN_PICTURE_MID_SENTENCE}, + {"siteSettingsBackgroundSync", IDS_SITE_SETTINGS_TYPE_BACKGROUND_SYNC}, + {"siteSettingsBackgroundSyncMidSentence", + IDS_SITE_SETTINGS_TYPE_BACKGROUND_SYNC_MID_SENTENCE}, + {"siteSettingsCamera", IDS_SITE_SETTINGS_TYPE_CAMERA}, + {"siteSettingsCameraMidSentence", + IDS_SITE_SETTINGS_TYPE_CAMERA_MID_SENTENCE}, + {"siteSettingsClipboard", IDS_SITE_SETTINGS_TYPE_CLIPBOARD}, + {"siteSettingsClipboardMidSentence", + IDS_SITE_SETTINGS_TYPE_CLIPBOARD_MID_SENTENCE}, + {"siteSettingsCookies", IDS_SITE_SETTINGS_TYPE_COOKIES}, + {"siteSettingsCookiesMidSentence", + IDS_SITE_SETTINGS_TYPE_COOKIES_MID_SENTENCE}, + {"siteSettingsHandlers", IDS_SITE_SETTINGS_TYPE_HANDLERS}, + {"siteSettingsHandlersMidSentence", + IDS_SITE_SETTINGS_TYPE_HANDLERS_MID_SENTENCE}, + {"siteSettingsLocation", IDS_SITE_SETTINGS_TYPE_LOCATION}, + {"siteSettingsLocationMidSentence", + IDS_SITE_SETTINGS_TYPE_LOCATION_MID_SENTENCE}, + {"siteSettingsMic", IDS_SITE_SETTINGS_TYPE_MIC}, + {"siteSettingsMicMidSentence", IDS_SITE_SETTINGS_TYPE_MIC_MID_SENTENCE}, + {"siteSettingsNotifications", IDS_SITE_SETTINGS_TYPE_NOTIFICATIONS}, + {"siteSettingsNotificationsMidSentence", + IDS_SITE_SETTINGS_TYPE_NOTIFICATIONS_MID_SENTENCE}, + {"siteSettingsImages", IDS_SITE_SETTINGS_TYPE_IMAGES}, + {"siteSettingsImagesMidSentence", + IDS_SITE_SETTINGS_TYPE_IMAGES_MID_SENTENCE}, + {"siteSettingsInsecureContent", IDS_SITE_SETTINGS_TYPE_INSECURE_CONTENT}, + {"siteSettingsInsecureContentMidSentence", + IDS_SITE_SETTINGS_TYPE_INSECURE_CONTENT_MID_SENTENCE}, + {"siteSettingsInsecureContentBlock", + IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT_BLOCK}, + {"siteSettingsJavascript", IDS_SITE_SETTINGS_TYPE_JAVASCRIPT}, + {"siteSettingsJavascriptMidSentence", + IDS_SITE_SETTINGS_TYPE_JAVASCRIPT_MID_SENTENCE}, + {"siteSettingsJavascriptJit", IDS_SITE_SETTINGS_TYPE_JAVASCRIPT_JIT}, + {"siteSettingsJavascriptJitMidsentence", + IDS_SITE_SETTINGS_TYPE_JAVASCRIPT_JIT}, // Deliberately the same form. + {"siteSettingsSound", IDS_SITE_SETTINGS_TYPE_SOUND}, + {"siteSettingsSoundMidSentence", + IDS_SITE_SETTINGS_TYPE_SOUND_MID_SENTENCE}, + {"siteSettingsPdfDocuments", IDS_SITE_SETTINGS_TYPE_PDF_DOCUMENTS}, + {"siteSettingsPdfDownloadPdfs", + IDS_SETTINGS_SITE_SETTINGS_PDF_DOWNLOAD_PDFS}, + {"siteSettingsProtectedContent", + IDS_SITE_SETTINGS_TYPE_PROTECTED_MEDIA_ID}, + {"siteSettingsProtectedContentMidSentence", + IDS_SITE_SETTINGS_TYPE_PROTECTED_MEDIA_ID_MID_SENTENCE}, + {"siteSettingsProtectedContentIdentifiers", + IDS_SITE_SETTINGS_TYPE_PROTECTED_MEDIA_ID}, + {"siteSettingsProtectedContentDescription", + IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_DESCRIPTION}, + {"siteSettingsProtectedContentAllowed", + IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_ALLOWED}, + {"siteSettingsProtectedContentBlocked", + IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_BLOCKED}, + {"siteSettingsProtectedContentBlockedSubLabel", + IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_BLOCKED_SUB_LABEL}, #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) - {"siteSettingsProtectedContentIdentifiersExplanation", - IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_IDENTIFIERS_EXPLANATION}, - {"siteSettingsProtectedContentIdentifiersAllowed", - IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_IDENTIFIERS_ALLOWED}, - {"siteSettingsProtectedContentIdentifiersBlocked", - IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_IDENTIFIERS_BLOCKED}, - {"siteSettingsProtectedContentIdentifiersBlockedSubLabel", - IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_IDENTIFIERS_BLOCKED_SUB_LABEL}, - {"siteSettingsProtectedContentIdentifiersAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_IDENTIFIERS_ALLOWED_EXCEPTIONS}, - {"siteSettingsProtectedContentIdentifiersBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_IDENTIFIERS_BLOCKED_EXCEPTIONS}, + {"siteSettingsProtectedContentIdentifiersExplanation", + IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_IDENTIFIERS_EXPLANATION}, + {"siteSettingsProtectedContentIdentifiersAllowed", + IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_IDENTIFIERS_ALLOWED}, + {"siteSettingsProtectedContentIdentifiersBlocked", + IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_IDENTIFIERS_BLOCKED}, + {"siteSettingsProtectedContentIdentifiersBlockedSubLabel", + IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_IDENTIFIERS_BLOCKED_SUB_LABEL}, + {"siteSettingsProtectedContentIdentifiersAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_IDENTIFIERS_ALLOWED_EXCEPTIONS}, + {"siteSettingsProtectedContentIdentifiersBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_IDENTIFIERS_BLOCKED_EXCEPTIONS}, #endif #if BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING) - {"siteSettingsProtectedContentIdentifiersAllowedSubLabel", - IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_IDENTIFIERS_ALLOWED_SUB_LABEL}, -#endif - {"siteSettingsPopups", IDS_SITE_SETTINGS_TYPE_POPUPS_REDIRECTS}, - {"siteSettingsPopupsMidSentence", - IDS_SITE_SETTINGS_TYPE_POPUPS_REDIRECTS_MID_SENTENCE}, - {"siteSettingsHidDevices", IDS_SITE_SETTINGS_TYPE_HID_DEVICES}, - {"siteSettingsHidDevicesMidSentence", - IDS_SITE_SETTINGS_TYPE_HID_DEVICES_MID_SENTENCE}, - {"siteSettingsHidDevicesAsk", IDS_SETTINGS_SITE_SETTINGS_HID_DEVICES_ASK}, - {"siteSettingsHidDevicesBlock", - IDS_SETTINGS_SITE_SETTINGS_HID_DEVICES_BLOCK}, - {"siteSettingsMidiDevices", IDS_SITE_SETTINGS_TYPE_MIDI}, - {"siteSettingsMidiDevicesMidSentence", - IDS_SITE_SETTINGS_TYPE_MIDI_MID_SENTENCE}, - {"siteSettingsSerialPorts", IDS_SITE_SETTINGS_TYPE_SERIAL_PORTS}, - {"siteSettingsSerialPortsMidSentence", - IDS_SITE_SETTINGS_TYPE_SERIAL_PORTS_MID_SENTENCE}, - {"siteSettingsUsbDevices", IDS_SITE_SETTINGS_TYPE_USB_DEVICES}, - {"siteSettingsUsbDevicesMidSentence", - IDS_SITE_SETTINGS_TYPE_USB_DEVICES_MID_SENTENCE}, - {"siteSettingsBluetoothDevices", IDS_SITE_SETTINGS_TYPE_BLUETOOTH_DEVICES}, - {"siteSettingsBluetoothDevicesMidSentence", - IDS_SITE_SETTINGS_TYPE_BLUETOOTH_DEVICES_MID_SENTENCE}, - {"siteSettingsFileSystemWrite", - IDS_SITE_SETTINGS_TYPE_FILE_SYSTEM_ACCESS_WRITE}, - {"siteSettingsFileSystemWriteMidSentence", - IDS_SITE_SETTINGS_TYPE_FILE_SYSTEM_ACCESS_WRITE_MID_SENTENCE}, - {"siteSettingsRemoveZoomLevel", - IDS_SETTINGS_SITE_SETTINGS_REMOVE_ZOOM_LEVEL}, - {"siteSettingsZoomLevels", IDS_SITE_SETTINGS_TYPE_ZOOM_LEVELS}, - {"siteSettingsZoomLevelsMidSentence", - IDS_SITE_SETTINGS_TYPE_ZOOM_LEVELS_MID_SENTENCE}, - {"siteSettingsNoZoomedSites", IDS_SETTINGS_SITE_SETTINGS_NO_ZOOMED_SITES}, - {"siteSettingsAskBeforeSending", - IDS_SETTINGS_SITE_SETTINGS_ASK_BEFORE_SENDING}, - {"siteSettingsHandlersAskRecommended", - IDS_SETTINGS_SITE_SETTINGS_HANDLERS_ASK_RECOMMENDED}, - {"siteSettingsHandlersBlocked", - IDS_SETTINGS_SITE_SETTINGS_HANDLERS_BLOCKED}, - {"siteSettingsCookiesAllowed", - IDS_SETTINGS_SITE_SETTINGS_COOKIES_ALLOW_SITES}, - {"siteSettingsAllow", IDS_SETTINGS_SITE_SETTINGS_ALLOW}, - {"siteSettingsBlock", IDS_SETTINGS_SITE_SETTINGS_BLOCK}, - {"siteSettingsSessionOnly", IDS_SETTINGS_SITE_SETTINGS_SESSION_ONLY}, - {"siteSettingsBlocked", IDS_SETTINGS_SITE_SETTINGS_BLOCKED}, - {"siteSettingsActionAskDefault", - IDS_SETTINGS_SITE_SETTINGS_ASK_DEFAULT_MENU}, - {"siteSettingsActionAllowDefault", - IDS_SETTINGS_SITE_SETTINGS_ALLOW_DEFAULT_MENU}, - {"siteSettingsActionAutomaticDefault", - IDS_SETTINGS_SITE_SETTINGS_AUTOMATIC_DEFAULT_MENU}, - {"siteSettingsActionBlockDefault", - IDS_SETTINGS_SITE_SETTINGS_BLOCK_DEFAULT_MENU}, - {"siteSettingsActionMuteDefault", - IDS_SETTINGS_SITE_SETTINGS_MUTE_DEFAULT_MENU}, - {"siteSettingsActionAllow", IDS_SETTINGS_SITE_SETTINGS_ALLOW_MENU}, - {"siteSettingsActionBlock", IDS_SETTINGS_SITE_SETTINGS_BLOCK_MENU}, - {"siteSettingsActionAsk", IDS_SETTINGS_SITE_SETTINGS_ASK_MENU}, - {"siteSettingsActionMute", IDS_SETTINGS_SITE_SETTINGS_MUTE_MENU}, - {"siteSettingsActionReset", IDS_SETTINGS_SITE_SETTINGS_RESET_MENU}, - {"siteSettingsActionSessionOnly", - IDS_SETTINGS_SITE_SETTINGS_SESSION_ONLY_MENU}, - {"siteSettingsUsage", IDS_SETTINGS_SITE_SETTINGS_USAGE}, - {"siteSettingsUsageNone", IDS_SETTINGS_SITE_SETTINGS_USAGE_NONE}, - {"siteSettingsPermissions", IDS_SETTINGS_SITE_SETTINGS_PERMISSIONS}, - {"siteSettingsPermissionsMore", - IDS_SETTINGS_SITE_SETTINGS_PERMISSIONS_MORE}, - {"siteSettingsContent", IDS_SETTINGS_SITE_SETTINGS_CONTENT}, - {"siteSettingsContentMore", IDS_SETTINGS_SITE_SETTINGS_CONTENT_MORE}, - {"siteSettingsSourceExtensionAllow", - IDS_PAGE_INFO_PERMISSION_ALLOWED_BY_EXTENSION}, - {"siteSettingsSourceExtensionBlock", - IDS_PAGE_INFO_PERMISSION_BLOCKED_BY_EXTENSION}, - {"siteSettingsSourceExtensionAsk", - IDS_PAGE_INFO_PERMISSION_ASK_BY_EXTENSION}, - {"siteSettingsSourcePolicyAllow", - IDS_PAGE_INFO_PERMISSION_ALLOWED_BY_POLICY}, - {"siteSettingsSourcePolicyBlock", - IDS_PAGE_INFO_PERMISSION_BLOCKED_BY_POLICY}, - {"siteSettingsSourcePolicyAsk", IDS_PAGE_INFO_PERMISSION_ASK_BY_POLICY}, - {"siteSettingsAdsBlockNotBlocklistedSingular", - IDS_SETTINGS_SITE_SETTINGS_ADS_BLOCK_NOT_BLOCKLISTED_SINGULAR}, - {"siteSettingsAllowlisted", IDS_SETTINGS_SITE_SETTINGS_ALLOWLISTED}, - {"siteSettingsAdsBlockBlocklistedSingular", - IDS_SETTINGS_SITE_SETTINGS_ADS_BLOCK_BLOCKLISTED_SINGULAR}, - {"siteSettingsSourceEmbargo", - IDS_PAGE_INFO_PERMISSION_AUTOMATICALLY_BLOCKED}, - {"siteSettingsSourceInsecureOrigin", - IDS_SETTINGS_SITE_SETTINGS_SOURCE_INSECURE_ORIGIN}, - {"siteSettingsSourceKillSwitch", - IDS_SETTINGS_SITE_SETTINGS_SOURCE_KILL_SWITCH}, - {"siteSettingsReset", IDS_SETTINGS_SITE_SETTINGS_RESET_BUTTON}, - {"siteSettingsCookiesThirdPartyExceptionLabel", - IDS_SETTINGS_SITE_SETTINGS_THIRD_PARTY_COOKIES_EXCEPTION_LABEL}, - {"siteSettingsCookieRemoveSite", - IDS_SETTINGS_SITE_SETTINGS_COOKIE_REMOVE_SITE}, - {"siteSettingsDelete", IDS_SETTINGS_SITE_SETTINGS_DELETE}, - {"siteSettingsDeleteAllStorageDialogTitle", - IDS_SETTINGS_SITE_SETTINGS_DELETE_ALL_STORAGE_DIALOG_TITLE}, - {"siteSettingsDeleteDisplayedStorageDialogTitle", - IDS_SETTINGS_SITE_SETTINGS_DELETE_DISPLAYED_STORAGE_DIALOG_TITLE}, - {"siteSettingsFirstPartySetsLearnMore", - IDS_SETTINGS_SITE_SETTINGS_FIRST_PARTY_SETS_LEARN_MORE}, - {"siteSettingsFirstPartySetsLearnMoreAccessibility", - IDS_SETTINGS_SITE_SETTINGS_FIRST_PARTY_SETS_LEARN_MORE_ACCESSIBILITY}, - {"siteSettingsClearAllStorageDescription", - IDS_SETTINGS_SITE_SETTINGS_CLEAR_ALL_STORAGE_DESCRIPTION}, - {"siteSettingsClearDisplayedStorageDescription", - IDS_SETTINGS_SITE_SETTINGS_CLEAR_DISPLAYED_STORAGE_DESCRIPTION}, - {"siteSettingsDeleteAllStorageLabel", - IDS_SETTINGS_SITE_SETTINGS_DELETE_ALL_STORAGE_LABEL}, - {"siteSettingsDeleteDisplayedStorageLabel", - IDS_SETTINGS_SITE_SETTINGS_DELETE_DISPLAYED_STORAGE_LABEL}, - {"siteSettingsDeleteAllStorageConfirmation", - IDS_SETTINGS_SITE_SETTINGS_DELETE_ALL_STORAGE_CONFIRMATION}, - {"siteSettingsDeleteDisplayedStorageConfirmation", - IDS_SETTINGS_SITE_SETTINGS_DELETE_DISPLAYED_STORAGE_CONFIRMATION}, - {"siteSettingsDeleteAllStorageConfirmationInstalled", - IDS_SETTINGS_SITE_SETTINGS_DELETE_ALL_STORAGE_CONFIRMATION_INSTALLED}, - {"siteSettingsDeleteDisplayedStorageConfirmationInstalled", - IDS_SETTINGS_SITE_SETTINGS_DELETE_DISPLAYED_STORAGE_CONFIRMATION_INSTALLED}, - {"siteSettingsClearAllStorageSignOut", - IDS_SETTINGS_SITE_SETTINGS_CLEAR_ALL_STORAGE_SIGN_OUT}, - {"siteSettingsClearDisplayedStorageSignOut", - IDS_SETTINGS_SITE_SETTINGS_CLEAR_DISPLAYED_STORAGE_SIGN_OUT}, - {"siteSettingsSiteDetailsSubpageAccessibilityLabel", - IDS_SETTINGS_SITE_SETTINGS_SITE_DETAILS_SUBPAGE_ACCESSIBILITY_LABEL}, - {"firstPartySetsMoreActionsTitle", - IDS_SETTINGS_SITE_SETTINGS_FIRST_PARTY_SETS_MORE_ACTIONS_TITLE}, - {"firstPartySetsShowRelatedSitesButton", - IDS_SETTINGS_SITE_SETTINGS_FIRST_PARTY_SETS_SHOW_RELATED_SITES_BUTTON}, - {"firstPartySetsSiteDeleteStorageButton", - IDS_SETTINGS_SITE_SETTINGS_FIRST_PARTY_SETS_SITE_DELETE_STORAGE_BUTTON}, - {"siteSettingsSiteClearStorage", - IDS_SETTINGS_SITE_SETTINGS_SITE_CLEAR_STORAGE}, - {"siteSettingsSiteClearStorageConfirmation", - IDS_SETTINGS_SITE_SETTINGS_SITE_CLEAR_STORAGE_CONFIRMATION}, - {"siteSettingsSiteClearStorageConfirmationNew", - IDS_SETTINGS_SITE_SETTINGS_SITE_CLEAR_STORAGE_CONFIRMATION_NEW}, - {"siteSettingsSiteDeleteStorageDialogTitle", - IDS_SETTINGS_SITE_SETTINGS_SITE_DELETE_STORAGE_DIALOG_TITLE}, - {"siteSettingsSiteClearStorageSignOut", - IDS_SETTINGS_SITE_SETTINGS_SITE_CLEAR_STORAGE_SIGN_OUT}, - {"siteSettingsSiteDeleteStorageOfflineData", - IDS_SETTINGS_SITE_SETTINGS_SITE_DELETE_STORAGE_OFFLINE_DATA}, - {"siteSettingsRemoveSiteAdPersonalization", - IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_AD_PERSONALIZATION}, - {"siteSettingsSiteGroupDeleteOfflineData", - IDS_SETTINGS_SITE_SETTINGS_SITE_GROUP_DELETE_OFFLINE_DATA}, - {"siteSettingsSiteResetAll", IDS_SETTINGS_SITE_SETTINGS_SITE_RESET_ALL}, - {"siteSettingsSiteResetConfirmation", - IDS_SETTINGS_SITE_SETTINGS_SITE_RESET_CONFIRMATION}, - {"siteSettingsRemoveSite", IDS_SETTINGS_SITE_SETTINGS_COOKIE_REMOVE_SITE}, - {"siteSettingsRemoveSiteOriginDialogTitle", - IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_ORIGIN_DIALOG_TITLE}, - {"siteSettingsRemoveSiteOriginAppDialogTitle", - IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_ORIGIN_APP_DIALOG_TITLE}, - {"siteSettingsRemoveSiteOriginPartitionedDialogTitle", - IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_ORIGIN_PARTITIONED_DIALOG_TITLE}, - {"siteSettingsRemoveSiteGroupDialogTitle", - IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_GROUP_DIALOG_TITLE}, - {"siteSettingsRemoveSiteGroupAppDialogTitle", - IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_GROUP_APP_DIALOG_TITLE}, - {"siteSettingsRemoveSiteGroupAppPluralDialogTitle", - IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_GROUP_APP_PLURAL_DIALOG_TITLE}, - {"siteSettingsRemoveSiteOriginLogout", - IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_ORIGIN_LOGOUT}, - {"siteSettingsRemoveSiteGroupLogout", - IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_GROUP_LOGOUT}, - {"siteSettingsRemoveSiteOfflineData", - IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_OFFLINE_DATA}, - {"siteSettingsRemoveSitePermissions", - IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_PERMISSIONS}, - {"siteSettingsRemoveSiteConfirm", - IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_CONFIRM}, - {"thirdPartyCookie", IDS_NEW_TAB_OTR_THIRD_PARTY_COOKIE}, - {"thirdPartyCookieSublabel", IDS_NEW_TAB_OTR_THIRD_PARTY_COOKIE_SUBLABEL}, - {"handlerIsDefault", IDS_SETTINGS_SITE_SETTINGS_HANDLER_IS_DEFAULT}, - {"handlerSetDefault", IDS_SETTINGS_SITE_SETTINGS_HANDLER_SET_DEFAULT}, - {"handlerRemove", IDS_SETTINGS_SITE_SETTINGS_REMOVE}, - {"incognitoSiteOnly", IDS_SETTINGS_SITE_SETTINGS_INCOGNITO_ONLY}, - {"incognitoSiteExceptionDesc", - IDS_SETTINGS_SITE_SETTINGS_INCOGNITO_SITE_EXCEPTION_DESC}, - {"noSitesAdded", IDS_SETTINGS_SITE_NO_SITES_ADDED}, - {"siteSettingsDefaultBehavior", - IDS_SETTINGS_SITE_SETTINGS_DEFAULT_BEHAVIOR}, - {"siteSettingsDefaultBehaviorDescription", - IDS_SETTINGS_SITE_SETTINGS_DEFAULT_BEHAVIOR_DESCRIPTION}, - {"siteSettingsNotificationsDefaultBehaviorDescription", - IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_DEFAULT_BEHAVIOR_DESC}, - {"siteSettingsCustomizedBehaviors", - IDS_SETTINGS_SITE_SETTINGS_CUSTOMIZED_BEHAVIORS}, - {"siteSettingsCustomizedBehaviorsDescription", - IDS_SETTINGS_SITE_SETTINGS_CUSTOMIZED_BEHAVIORS_DESCRIPTION}, - {"siteSettingsCustomizedBehaviorsDescriptionShort", - IDS_SETTINGS_SITE_SETTINGS_CUSTOMIZED_BEHAVIORS_DESCRIPTION_SHORT}, - {"siteSettingsAdsDescription", IDS_SETTINGS_SITE_SETTINGS_ADS_DESCRIPTION}, - {"siteSettingsAdsAllowed", IDS_SETTINGS_SITE_SETTINGS_ADS_ALLOWED}, - {"siteSettingsAdsBlocked", IDS_SETTINGS_SITE_SETTINGS_ADS_BLOCKED}, - {"siteSettingsAdsAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_ADS_ALLOWED_EXCEPTIONS}, - {"siteSettingsAdsBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_ADS_BLOCKED_EXCEPTIONS}, - {"siteSettingsArDescription", IDS_SETTINGS_SITE_SETTINGS_AR_DESCRIPTION}, - {"siteSettingsArAllowed", IDS_SETTINGS_SITE_SETTINGS_AR_ALLOWED}, - {"siteSettingsArBlocked", IDS_SETTINGS_SITE_SETTINGS_AR_BLOCKED}, - {"siteSettingsArAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_AR_ALLOWED_EXCEPTIONS}, - {"siteSettingsArBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_AR_BLOCKED_EXCEPTIONS}, - {"siteSettingsAutomaticDownloadsDescription", - IDS_SETTINGS_SITE_SETTINGS_AUTOMATIC_DOWNLOADS_DESCRIPTION}, - {"siteSettingsAutomaticDownloadsAllowed", - IDS_SETTINGS_SITE_SETTINGS_AUTOMATIC_DOWNLOADS_ALLOWED}, - {"siteSettingsAutomaticDownloadsBlocked", - IDS_SETTINGS_SITE_SETTINGS_AUTOMATIC_DOWNLOADS_BLOCKED}, - {"siteSettingsAutomaticDownloadsAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_AUTOMATIC_DOWNLOADS_ALLOWED_EXCEPTIONS}, - {"siteSettingsAutomaticDownloadsBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_AUTOMATIC_DOWNLOADS_BLOCKED_EXCEPTIONS}, - {"siteSettingsAutoPictureInPictureDescription", - IDS_SETTINGS_SITE_SETTINGS_AUTO_PICTURE_IN_PICTURE_DESCRIPTION}, - {"siteSettingsAutoPictureInPictureAllowed", - IDS_SETTINGS_SITE_SETTINGS_AUTO_PICTURE_IN_PICTURE_ALLOWED}, - {"siteSettingsAutoPictureInPictureBlocked", - IDS_SETTINGS_SITE_SETTINGS_AUTO_PICTURE_IN_PICTURE_BLOCKED}, - {"siteSettingsAutoPictureInPictureAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_AUTO_PICTURE_IN_PICTURE_ALLOWED_EXCEPTIONS}, - {"siteSettingsAutoPictureInPictureBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_AUTO_PICTURE_IN_PICTURE_BLOCKED_EXCEPTIONS}, - {"siteSettingsBackgroundSyncDescription", - IDS_SETTINGS_SITE_SETTINGS_BACKGROUND_SYNC_DESCRIPTION}, - {"siteSettingsBackgroundSyncAllowed", - IDS_SETTINGS_SITE_SETTINGS_BACKGROUND_SYNC_ALLOWED}, - {"siteSettingsBackgroundSyncBlocked", - IDS_SETTINGS_SITE_SETTINGS_BACKGROUND_SYNC_BLOCKED}, - {"siteSettingsBackgroundSyncBlockedSubLabel", - IDS_SETTINGS_SITE_SETTINGS_BACKGROUND_SYNC_BLOCKED_SUB_LABEL}, - {"siteSettingsBackgroundSyncAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_BACKGROUND_SYNC_ALLOWED_EXCEPTIONS}, - {"siteSettingsBackgroundSyncBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_BACKGROUND_SYNC_BLOCKED_EXCEPTIONS}, - {"siteSettingsBluetoothDevicesDescription", - IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_DEVICES_DESCRIPTION}, - {"siteSettingsBluetoothDevicesAllowed", - IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_DEVICES_ALLOWED}, - {"siteSettingsBluetoothDevicesBlocked", - IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_DEVICES_BLOCKED}, - {"siteSettingsCameraDescription", - IDS_SETTINGS_SITE_SETTINGS_CAMERA_DESCRIPTION}, - {"siteSettingsCameraAllowed", IDS_SETTINGS_SITE_SETTINGS_CAMERA_ALLOWED}, - {"siteSettingsCameraBlocked", IDS_SETTINGS_SITE_SETTINGS_CAMERA_BLOCKED}, - {"siteSettingsCameraBlockedSubLabel", - IDS_SETTINGS_SITE_SETTINGS_CAMERA_BLOCKED_SUB_LABEL}, - {"siteSettingsCameraAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_CAMERA_ALLOWED_EXCEPTIONS}, - {"siteSettingsCameraBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_CAMERA_BLOCKED_EXCEPTIONS}, - {"siteSettingsClipboardDescription", - IDS_SETTINGS_SITE_SETTINGS_CLIPBOARD_DESCRIPTION}, - {"siteSettingsClipboardAllowed", - IDS_SETTINGS_SITE_SETTINGS_CLIPBOARD_ALLOWED}, - {"siteSettingsClipboardBlocked", - IDS_SETTINGS_SITE_SETTINGS_CLIPBOARD_BLOCKED}, - {"siteSettingsClipboardAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_CLIPBOARD_ALLOWED_EXCEPTIONS}, - {"siteSettingsClipboardBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_CLIPBOARD_BLOCKED_EXCEPTIONS}, - {"siteSettingsDeviceUseDescription", - IDS_SETTINGS_SITE_SETTINGS_DEVICE_USE_DESCRIPTION}, - {"siteSettingsDeviceUseAllowed", - IDS_SETTINGS_SITE_SETTINGS_DEVICE_USE_ALLOWED}, - {"siteSettingsDeviceUseBlocked", - IDS_SETTINGS_SITE_SETTINGS_DEVICE_USE_BLOCKED}, - {"siteSettingsDeviceUseAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_DEVICE_USE_ALLOWED_EXCEPTIONS}, - {"siteSettingsDeviceUseBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_DEVICE_USE_BLOCKED_EXCEPTIONS}, - {"siteSettingsFederatedIdentityApi", - IDS_SITE_SETTINGS_TYPE_FEDERATED_IDENTITY_API}, - {"siteSettingsFederatedIdentityApiAllowed", - IDS_SETTINGS_SITE_SETTINGS_FEDERATED_IDENTITY_API_ALLOWED}, - {"siteSettingsFederatedIdentityApiBlocked", - IDS_SETTINGS_SITE_SETTINGS_FEDERATED_IDENTITY_API_BLOCKED}, - {"siteSettingsFederatedIdentityApiAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_FEDERATED_IDENTITY_API_ALLOWED_EXCEPTIONS}, - {"siteSettingsFederatedIdentityApiBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_FEDERATED_IDENTITY_API_BLOCKED_EXCEPTIONS}, - {"siteSettingsFederatedIdentityApiDescription", - IDS_SETTINGS_SITE_SETTINGS_FEDERATED_IDENTITY_API_DESCRIPTION}, - {"siteSettingsFederatedIdentityApiMidSentence", - IDS_SITE_SETTINGS_TYPE_FEDERATED_IDENTITY_API_MID_SENTENCE}, - {"siteSettingsFileSystemWriteDescription", - IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_WRITE_DESCRIPTION}, - {"siteSettingsFileSystemWriteAllowed", - IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_WRITE_ALLOWED}, - {"siteSettingsFileSystemWriteBlocked", - IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_WRITE_BLOCKED}, - {"siteSettingsFileSystemWriteBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_WRITE_BLOCKED_EXCEPTIONS}, - {"siteSettingsFontsDescription", - IDS_SETTINGS_SITE_SETTINGS_FONTS_DESCRIPTION}, - {"siteSettingsFontsAllowed", IDS_SETTINGS_SITE_SETTINGS_FONTS_ALLOWED}, - {"siteSettingsFontsBlocked", IDS_SETTINGS_SITE_SETTINGS_FONTS_BLOCKED}, - {"siteSettingsFontsAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_FONTS_ALLOWED_EXCEPTIONS}, - {"siteSettingsFontsBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_FONTS_BLOCKED_EXCEPTIONS}, - {"siteSettingsHidDevicesDescription", - IDS_SETTINGS_SITE_SETTINGS_HID_DEVICES_DESCRIPTION}, - {"siteSettingsHidDevicesAllowed", - IDS_SETTINGS_SITE_SETTINGS_HID_DEVICES_ALLOWED}, - {"siteSettingsHidDevicesBlocked", - IDS_SETTINGS_SITE_SETTINGS_HID_DEVICES_BLOCKED}, - {"siteSettingsImagesDescription", - IDS_SETTINGS_SITE_SETTINGS_IMAGES_DESCRIPTION}, - {"siteSettingsImagesAllowed", IDS_SETTINGS_SITE_SETTINGS_IMAGES_ALLOWED}, - {"siteSettingsImagesBlocked", IDS_SETTINGS_SITE_SETTINGS_IMAGES_BLOCKED}, - {"siteSettingsImagesBlockedSubLabel", - IDS_SETTINGS_SITE_SETTINGS_IMAGES_BLOCKED_SUB_LABEL}, - {"siteSettingsImagesAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_IMAGES_ALLOWED_EXCEPTIONS}, - {"siteSettingsImagedBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_IMAGES_BLOCKED_EXCEPTIONS}, - {"siteSettingsInsecureContentDescription", - IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT_DESCRIPTION}, - {"siteSettingsInsecureContentAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT_ALLOWED_EXCEPTIONS}, - {"siteSettingsInsecureContentBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT_BLOCKED_EXCEPTIONS}, - {"siteSettingsJavascriptDescription", - IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_DESCRIPTION}, - {"siteSettingsJavascriptAllowed", - IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_ALLOWED}, - {"siteSettingsJavascriptBlocked", - IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_BLOCKED}, - {"siteSettingsJavascriptAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_ALLOWED_EXCEPTIONS}, - {"siteSettingsJavascriptBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_BLOCKED_EXCEPTIONS}, - {"siteSettingsLocationDescription", - IDS_SETTINGS_SITE_SETTINGS_LOCATION_DESCRIPTION}, - {"siteSettingsLocationAllowed", - IDS_SETTINGS_SITE_SETTINGS_LOCATION_ALLOWED}, - {"siteSettingsLocationAskQuiet", - IDS_SETTINGS_SITE_SETTINGS_PERMISSION_QUIET}, - {"siteSettingsLocationAskCPSS", IDS_SETTINGS_SITE_SETTINGS_PERMISSION_CPSS}, - {"siteSettingsLocationAskLoud", IDS_SETTINGS_SITE_SETTINGS_PERMISSION_LOUD}, - {"siteSettingsLocationBlocked", - IDS_SETTINGS_SITE_SETTINGS_LOCATION_BLOCKED}, - {"siteSettingsLocationBlockedSubLabel", - IDS_SETTINGS_SITE_SETTINGS_LOCATION_BLOCKED_SUB_LABEL}, - {"siteSettingsLocationAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_LOCATION_ALLOWED_EXCEPTIONS}, - {"siteSettingsLocationBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_LOCATION_BLOCKED_EXCEPTIONS}, - {"siteSettingsMicDescription", IDS_SETTINGS_SITE_SETTINGS_MIC_DESCRIPTION}, - {"siteSettingsMicAllowed", IDS_SETTINGS_SITE_SETTINGS_MIC_ALLOWED}, - {"siteSettingsMicBlocked", IDS_SETTINGS_SITE_SETTINGS_MIC_BLOCKED}, - {"siteSettingsMicBlockedSubLabel", - IDS_SETTINGS_SITE_SETTINGS_MIC_BLOCKED_SUB_LABEL}, - {"siteSettingsMicAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_MIC_ALLOWED_EXCEPTIONS}, - {"siteSettingsMicBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_MIC_BLOCKED_EXCEPTIONS}, - {"siteSettingsMidiDescription", - IDS_SETTINGS_SITE_SETTINGS_MIDI_DESCRIPTION}, - {"siteSettingsMidiAllowed", IDS_SETTINGS_SITE_SETTINGS_MIDI_ALLOWED}, - {"siteSettingsMidiBlocked", IDS_SETTINGS_SITE_SETTINGS_MIDI_BLOCKED}, - {"siteSettingsMidiAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_MIDI_ALLOWED_EXCEPTIONS}, - {"siteSettingsMidiBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_MIDI_BLOCKED_EXCEPTIONS}, - {"siteSettingsMotionSensorsDescription", - IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_DESCRIPTION}, - {"siteSettingsMotionSensorsAllowed", - IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_ALLOWED}, - {"siteSettingsMotionSensorsBlocked", - IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_BLOCKED}, - {"siteSettingsMotionSensorsBlockedSubLabel", - IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_BLOCKED_SUB_LABEL}, - {"siteSettingsMotionSensorsAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_ALLOWED_EXCEPTIONS}, - {"siteSettingsMotionSensorsBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_BLOCKED_EXCEPTIONS}, - {"siteSettingsNotificationsDescription", - IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_DESCRIPTION}, - {"siteSettingsNotificationsAllowed", - IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_ALLOWED}, - {"siteSettingsNotificationsPartial", - IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_PARTIAL}, - {"siteSettingsNotificationsPartialSubLabel", - IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_PARTIAL_SUB_LABEL}, - {"siteSettingsNotificationsAskState", - IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_ASK_STATE}, - {"siteSettingsNotificationsAskQuiet", - IDS_SETTINGS_SITE_SETTINGS_PERMISSION_QUIET}, - {"siteSettingsNotificationsAskCPSS", - IDS_SETTINGS_SITE_SETTINGS_PERMISSION_CPSS}, - {"siteSettingsNotificationsAskLoud", - IDS_SETTINGS_SITE_SETTINGS_PERMISSION_LOUD}, - {"siteSettingsNotificationsBlocked", - IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_BLOCKED}, - {"siteSettingsNotificationsBlockedSubLabel", - IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_BLOCKED_SUB_LABEL}, - {"siteSettingsNotificationsAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_ALLOWED_EXCEPTIONS}, - {"siteSettingsNotificationsBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_BLOCKED_EXCEPTIONS}, - {"siteSettingsPaymentHandlersDescription", - IDS_SETTINGS_SITE_SETTINGS_PAYMENT_HANDLERS_DESCRIPTION}, - {"siteSettingsPaymentHandlersAllowed", - IDS_SETTINGS_SITE_SETTINGS_PAYMENT_HANDLERS_ALLOWED}, - {"siteSettingsPaymentHandlersBlocked", - IDS_SETTINGS_SITE_SETTINGS_PAYMENT_HANDLERS_BLOCKED}, - {"siteSettingsPaymentHandlersAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_PAYMENT_HANDLERS_ALLOWED_EXCEPTIONS}, - {"siteSettingsPaymentHandlersBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_PAYMENT_HANDLERS_BLOCKED_EXCEPTIONS}, - {"siteSettingsPdfsDescription", - IDS_SETTINGS_SITE_SETTINGS_PDFS_DESCRIPTION}, - {"siteSettingsPdfsAllowed", IDS_SETTINGS_SITE_SETTINGS_PDFS_ALLOWED}, - {"siteSettingsPdfsBlocked", IDS_SETTINGS_SITE_SETTINGS_PDFS_BLOCKED}, - {"siteSettingsPopupsDescription", - IDS_SETTINGS_SITE_SETTINGS_POPUPS_DESCRIPTION}, - {"siteSettingsPopupsAllowed", IDS_SETTINGS_SITE_SETTINGS_POPUPS_ALLOWED}, - {"siteSettingsPopupsBlocked", IDS_SETTINGS_SITE_SETTINGS_POPUPS_BLOCKED}, - {"siteSettingsPopupsAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_POPUPS_ALLOWED_EXCEPTIONS}, - {"siteSettingsPopupsBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_POPUPS_BLOCKED_EXCEPTIONS}, - {"siteSettingsProtocolHandlersDescription", - IDS_SETTINGS_SITE_SETTINGS_PROTOCOL_HANDLERS_DESCRIPTION}, - {"siteSettingsProtocolHandlersAllowed", - IDS_SETTINGS_SITE_SETTINGS_PROTOCOL_HANDLERS_ALLOWED}, - {"siteSettingsProtocolHandlersBlocked", - IDS_SETTINGS_SITE_SETTINGS_PROTOCOL_HANDLERS_BLOCKED}, - {"siteSettingsProtocolHandlersBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_PROTOCOL_HANDLERS_BLOCKED_EXCEPTIONS}, - {"siteSettingsSerialPortsDescription", - IDS_SETTINGS_SITE_SETTINGS_SERIAL_PORTS_DESCRIPTION}, - {"siteSettingsSerialPortsAllowed", - IDS_SETTINGS_SITE_SETTINGS_SERIAL_PORTS_ALLOWED}, - {"siteSettingsSerialPortsBlocked", - IDS_SETTINGS_SITE_SETTINGS_SERIAL_PORTS_BLOCKED}, - {"siteSettingsSoundDescription", - IDS_SETTINGS_SITE_SETTINGS_SOUND_DESCRIPTION}, - {"siteSettingsSoundAllowed", IDS_SETTINGS_SITE_SETTINGS_SOUND_ALLOWED}, - {"siteSettingsSoundBlocked", IDS_SETTINGS_SITE_SETTINGS_SOUND_BLOCKED}, - {"siteSettingsSoundBlockedSubLabel", - IDS_SETTINGS_SITE_SETTINGS_SOUND_BLOCKED_SUB_LABEL}, - {"siteSettingsSoundAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_SOUND_ALLOWED_EXCEPTIONS}, - {"siteSettingsSoundBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_SOUND_BLOCKED_EXCEPTIONS}, - {"siteSettingsUsbDescription", IDS_SETTINGS_SITE_SETTINGS_USB_DESCRIPTION}, - {"siteSettingsUsbAllowed", IDS_SETTINGS_SITE_SETTINGS_USB_ALLOWED}, - {"siteSettingsUsbBlocked", IDS_SETTINGS_SITE_SETTINGS_USB_BLOCKED}, - {"siteSettingsVrDescription", IDS_SETTINGS_SITE_SETTINGS_VR_DESCRIPTION}, - {"siteSettingsVrAllowed", IDS_SETTINGS_SITE_SETTINGS_VR_ALLOWED}, - {"siteSettingsVrBlocked", IDS_SETTINGS_SITE_SETTINGS_VR_BLOCKED}, - {"siteSettingsVrAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_VR_ALLOWED_EXCEPTIONS}, - {"siteSettingsVrBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_VR_BLOCKED_EXCEPTIONS}, - {"siteSettingsZoomLevelsDescription", - IDS_SETTINGS_SITE_SETTINGS_ZOOM_LEVELS_DESCRIPTION}, - {"siteSettingsAds", IDS_SITE_SETTINGS_TYPE_ADS}, - {"siteSettingsAdsMidSentence", IDS_SITE_SETTINGS_TYPE_ADS_MID_SENTENCE}, - {"siteSettingsPaymentHandler", IDS_SITE_SETTINGS_TYPE_PAYMENT_HANDLER}, - {"siteSettingsPaymentHandlerMidSentence", - IDS_SITE_SETTINGS_TYPE_PAYMENT_HANDLER_MID_SENTENCE}, - {"siteSettingsBlockAutoplaySetting", - IDS_SETTINGS_SITE_SETTINGS_BLOCK_AUTOPLAY}, - {"emptyAllSitesPage", IDS_SETTINGS_SITE_SETTINGS_EMPTY_ALL_SITES_PAGE}, - {"noSitesFound", IDS_SETTINGS_SITE_SETTINGS_NO_SITES_FOUND}, - {"siteSettingsBluetoothScanning", - IDS_SITE_SETTINGS_TYPE_BLUETOOTH_SCANNING}, - {"siteSettingsBluetoothScanningMidSentence", - IDS_SITE_SETTINGS_TYPE_BLUETOOTH_SCANNING_MID_SENTENCE}, - {"siteSettingsBluetoothScanningDescription", - IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_SCANNING_DESCRIPTION}, - {"siteSettingsBluetoothScanningAsk", - IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_SCANNING_ASK}, - {"siteSettingsBluetoothScanningBlock", - IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_SCANNING_BLOCK}, - {"siteSettingsBluetoothScanningAllowedExceptions", - IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_SCANNING_ALLOWED_EXCEPTIONS}, - {"siteSettingsBluetoothScanningBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_SCANNING_BLOCKED_EXCEPTIONS}, - {"siteSettingsAr", IDS_SITE_SETTINGS_TYPE_AR}, - {"siteSettingsArMidSentence", IDS_SITE_SETTINGS_TYPE_AR_MID_SENTENCE}, - {"siteSettingsArAsk", IDS_SETTINGS_SITE_SETTINGS_AR_ASK}, - {"siteSettingsArBlock", IDS_SETTINGS_SITE_SETTINGS_AR_BLOCK}, - {"siteSettingsVr", IDS_SITE_SETTINGS_TYPE_VR}, - {"siteSettingsVrMidSentence", IDS_SITE_SETTINGS_TYPE_VR_MID_SENTENCE}, - {"siteSettingsWindowManagement", IDS_SITE_SETTINGS_TYPE_WINDOW_MANAGEMENT}, - {"siteSettingsWindowManagementMidSentence", - IDS_SITE_SETTINGS_TYPE_WINDOW_MANAGEMENT_MID_SENTENCE}, - {"siteSettingsWindowManagementDescription", - IDS_SETTINGS_SITE_SETTINGS_WINDOW_MANAGEMENT_DESCRIPTION}, - {"siteSettingsWindowManagementAsk", - IDS_SETTINGS_SITE_SETTINGS_WINDOW_MANAGEMENT_ASK}, - {"siteSettingsWindowManagementBlocked", - IDS_SETTINGS_SITE_SETTINGS_WINDOW_MANAGEMENT_BLOCKED}, - {"siteSettingsWindowManagementAskExceptions", - IDS_SETTINGS_SITE_SETTINGS_WINDOW_MANAGEMENT_ASK_EXCEPTIONS}, - {"siteSettingsWindowManagementBlockedExceptions", - IDS_SETTINGS_SITE_SETTINGS_WINDOW_MANAGEMENT_BLOCKED_EXCEPTIONS}, - {"siteSettingsFontAccessMidSentence", - IDS_SITE_SETTINGS_TYPE_FONT_ACCESS_MID_SENTENCE}, - {"siteSettingsIdleDetection", IDS_SITE_SETTINGS_TYPE_IDLE_DETECTION}, - {"siteSettingsIdleDetectionMidSentence", - IDS_SITE_SETTINGS_TYPE_IDLE_DETECTION_MID_SENTENCE}, - {"siteSettingsExtensionIdDescription", - IDS_SETTINGS_SITE_SETTINGS_EXTENSION_ID_DESCRIPTION}, - {"siteSettingsSiteDataAllowedSubLabel", - IDS_SETTINGS_SITE_SETTINGS_PAGE_SITE_DATA_ALLOWED_SUB_LABEL}, - {"siteSettingsSiteDataBlockedSubLabel", - IDS_SETTINGS_SITE_SETTINGS_PAGE_SITE_DATA_BLOCKED_SUB_LABEL}, - {"siteSettingsSiteDataDeleteOnExitSubLabel", - IDS_SETTINGS_SITE_SETTINGS_PAGE_SITE_DATA_DELETE_ON_EXIT_SUB_LABEL}, - {"siteSettingsAntiAbuse", IDS_SITE_SETTINGS_TYPE_ANTI_ABUSE}, - {"siteSettingsAntiAbuseDescription", IDS_SETTINGS_ANTI_ABUSE_DESCRIPTION}, - {"siteSettingsAntiAbuseEnabledSubLabel", - IDS_SETTINGS_ANTI_ABUSE_ENABLED_SUB_LABEL}, - {"siteSettingsAntiAbuseDisabledSubLabel", - IDS_SETTINGS_ANTI_ABUSE_DISABLED_SUB_LABEL}, - {"antiAbuseWhenOnHeader", IDS_SETTINGS_ANTI_ABUSE_WHEN_ON_HEADER}, - {"antiAbuseWhenOnSectionOne", IDS_SETTINGS_ANTI_ABUSE_WHEN_ON_SECTION_ONE}, - {"antiAbuseWhenOnSectionTwo", IDS_SETTINGS_ANTI_ABUSE_WHEN_ON_SECTION_TWO}, - {"antiAbuseWhenOnSectionThree", - IDS_SETTINGS_ANTI_ABUSE_WHEN_ON_SECTION_THREE}, - {"antiAbuseThingsToConsiderHeader", - IDS_SETTINGS_ANTI_ABUSE_THINGS_TO_CONSIDER_HEADER}, - {"antiAbuseThingsToConsiderSectionOne", - IDS_SETTINGS_ANTI_ABUSE_THINGS_TO_CONSIDER_SECTION_ONE}, + {"siteSettingsProtectedContentIdentifiersAllowedSubLabel", + IDS_SETTINGS_SITE_SETTINGS_PROTECTED_CONTENT_IDENTIFIERS_ALLOWED_SUB_LABEL}, +#endif + {"siteSettingsPopups", IDS_SITE_SETTINGS_TYPE_POPUPS_REDIRECTS}, + {"siteSettingsPopupsMidSentence", + IDS_SITE_SETTINGS_TYPE_POPUPS_REDIRECTS_MID_SENTENCE}, + {"siteSettingsHidDevices", IDS_SITE_SETTINGS_TYPE_HID_DEVICES}, + {"siteSettingsHidDevicesMidSentence", + IDS_SITE_SETTINGS_TYPE_HID_DEVICES_MID_SENTENCE}, + {"siteSettingsHidDevicesAsk", IDS_SETTINGS_SITE_SETTINGS_HID_DEVICES_ASK}, + {"siteSettingsHidDevicesBlock", + IDS_SETTINGS_SITE_SETTINGS_HID_DEVICES_BLOCK}, + {"siteSettingsMidiDevices", IDS_SITE_SETTINGS_TYPE_MIDI}, + {"siteSettingsMidiDevicesMidSentence", + IDS_SITE_SETTINGS_TYPE_MIDI_MID_SENTENCE}, + {"siteSettingsSerialPorts", IDS_SITE_SETTINGS_TYPE_SERIAL_PORTS}, + {"siteSettingsSerialPortsMidSentence", + IDS_SITE_SETTINGS_TYPE_SERIAL_PORTS_MID_SENTENCE}, + {"siteSettingsUsbDevices", IDS_SITE_SETTINGS_TYPE_USB_DEVICES}, + {"siteSettingsUsbDevicesMidSentence", + IDS_SITE_SETTINGS_TYPE_USB_DEVICES_MID_SENTENCE}, + {"siteSettingsBluetoothDevices", + IDS_SITE_SETTINGS_TYPE_BLUETOOTH_DEVICES}, + {"siteSettingsBluetoothDevicesMidSentence", + IDS_SITE_SETTINGS_TYPE_BLUETOOTH_DEVICES_MID_SENTENCE}, + {"siteSettingsFileSystemWrite", + IDS_SITE_SETTINGS_TYPE_FILE_SYSTEM_ACCESS_WRITE}, + {"siteSettingsFileSystemWriteMidSentence", + IDS_SITE_SETTINGS_TYPE_FILE_SYSTEM_ACCESS_WRITE_MID_SENTENCE}, + {"siteSettingsRemoveZoomLevel", + IDS_SETTINGS_SITE_SETTINGS_REMOVE_ZOOM_LEVEL}, + {"siteSettingsZoomLevels", IDS_SITE_SETTINGS_TYPE_ZOOM_LEVELS}, + {"siteSettingsZoomLevelsMidSentence", + IDS_SITE_SETTINGS_TYPE_ZOOM_LEVELS_MID_SENTENCE}, + {"siteSettingsNoZoomedSites", IDS_SETTINGS_SITE_SETTINGS_NO_ZOOMED_SITES}, + {"siteSettingsAskBeforeSending", + IDS_SETTINGS_SITE_SETTINGS_ASK_BEFORE_SENDING}, + {"siteSettingsHandlersAskRecommended", + IDS_SETTINGS_SITE_SETTINGS_HANDLERS_ASK_RECOMMENDED}, + {"siteSettingsHandlersBlocked", + IDS_SETTINGS_SITE_SETTINGS_HANDLERS_BLOCKED}, + {"siteSettingsCookiesAllowed", + IDS_SETTINGS_SITE_SETTINGS_COOKIES_ALLOW_SITES}, + {"siteSettingsAllow", IDS_SETTINGS_SITE_SETTINGS_ALLOW}, + {"siteSettingsBlock", IDS_SETTINGS_SITE_SETTINGS_BLOCK}, + {"siteSettingsSessionOnly", IDS_SETTINGS_SITE_SETTINGS_SESSION_ONLY}, + {"siteSettingsBlocked", IDS_SETTINGS_SITE_SETTINGS_BLOCKED}, + {"siteSettingsActionAskDefault", + IDS_SETTINGS_SITE_SETTINGS_ASK_DEFAULT_MENU}, + {"siteSettingsActionAllowDefault", + IDS_SETTINGS_SITE_SETTINGS_ALLOW_DEFAULT_MENU}, + {"siteSettingsActionAutomaticDefault", + IDS_SETTINGS_SITE_SETTINGS_AUTOMATIC_DEFAULT_MENU}, + {"siteSettingsActionBlockDefault", + IDS_SETTINGS_SITE_SETTINGS_BLOCK_DEFAULT_MENU}, + {"siteSettingsActionMuteDefault", + IDS_SETTINGS_SITE_SETTINGS_MUTE_DEFAULT_MENU}, + {"siteSettingsActionAllow", IDS_SETTINGS_SITE_SETTINGS_ALLOW_MENU}, + {"siteSettingsActionBlock", IDS_SETTINGS_SITE_SETTINGS_BLOCK_MENU}, + {"siteSettingsActionAsk", IDS_SETTINGS_SITE_SETTINGS_ASK_MENU}, + {"siteSettingsActionMute", IDS_SETTINGS_SITE_SETTINGS_MUTE_MENU}, + {"siteSettingsActionReset", IDS_SETTINGS_SITE_SETTINGS_RESET_MENU}, + {"siteSettingsActionSessionOnly", + IDS_SETTINGS_SITE_SETTINGS_SESSION_ONLY_MENU}, + {"siteSettingsUsage", IDS_SETTINGS_SITE_SETTINGS_USAGE}, + {"siteSettingsUsageNone", IDS_SETTINGS_SITE_SETTINGS_USAGE_NONE}, + {"siteSettingsPermissions", IDS_SETTINGS_SITE_SETTINGS_PERMISSIONS}, + {"siteSettingsPermissionsMore", + IDS_SETTINGS_SITE_SETTINGS_PERMISSIONS_MORE}, + {"siteSettingsContent", IDS_SETTINGS_SITE_SETTINGS_CONTENT}, + {"siteSettingsContentMore", IDS_SETTINGS_SITE_SETTINGS_CONTENT_MORE}, + {"siteSettingsSourceExtensionAllow", + IDS_PAGE_INFO_PERMISSION_ALLOWED_BY_EXTENSION}, + {"siteSettingsSourceExtensionBlock", + IDS_PAGE_INFO_PERMISSION_BLOCKED_BY_EXTENSION}, + {"siteSettingsSourceExtensionAsk", + IDS_PAGE_INFO_PERMISSION_ASK_BY_EXTENSION}, + {"siteSettingsSourcePolicyAllow", + IDS_PAGE_INFO_PERMISSION_ALLOWED_BY_POLICY}, + {"siteSettingsSourcePolicyBlock", + IDS_PAGE_INFO_PERMISSION_BLOCKED_BY_POLICY}, + {"siteSettingsSourcePolicyAsk", IDS_PAGE_INFO_PERMISSION_ASK_BY_POLICY}, + {"siteSettingsAdsBlockNotBlocklistedSingular", + IDS_SETTINGS_SITE_SETTINGS_ADS_BLOCK_NOT_BLOCKLISTED_SINGULAR}, + {"siteSettingsAllowlisted", IDS_SETTINGS_SITE_SETTINGS_ALLOWLISTED}, + {"siteSettingsAdsBlockBlocklistedSingular", + IDS_SETTINGS_SITE_SETTINGS_ADS_BLOCK_BLOCKLISTED_SINGULAR}, + {"siteSettingsSourceEmbargo", + IDS_PAGE_INFO_PERMISSION_AUTOMATICALLY_BLOCKED}, + {"siteSettingsSourceInsecureOrigin", + IDS_SETTINGS_SITE_SETTINGS_SOURCE_INSECURE_ORIGIN}, + {"siteSettingsSourceKillSwitch", + IDS_SETTINGS_SITE_SETTINGS_SOURCE_KILL_SWITCH}, + {"siteSettingsReset", IDS_SETTINGS_SITE_SETTINGS_RESET_BUTTON}, + {"siteSettingsCookiesThirdPartyExceptionLabel", + IDS_SETTINGS_SITE_SETTINGS_THIRD_PARTY_COOKIES_EXCEPTION_LABEL}, + {"siteSettingsCookieRemoveSite", + IDS_SETTINGS_SITE_SETTINGS_COOKIE_REMOVE_SITE}, + {"siteSettingsDelete", IDS_SETTINGS_SITE_SETTINGS_DELETE}, + {"siteSettingsDeleteAllStorageDialogTitle", + IDS_SETTINGS_SITE_SETTINGS_DELETE_ALL_STORAGE_DIALOG_TITLE}, + {"siteSettingsDeleteDisplayedStorageDialogTitle", + IDS_SETTINGS_SITE_SETTINGS_DELETE_DISPLAYED_STORAGE_DIALOG_TITLE}, + {"siteSettingsFirstPartySetsLearnMore", + IDS_SETTINGS_SITE_SETTINGS_FIRST_PARTY_SETS_LEARN_MORE}, + {"siteSettingsFirstPartySetsLearnMoreAccessibility", + IDS_SETTINGS_SITE_SETTINGS_FIRST_PARTY_SETS_LEARN_MORE_ACCESSIBILITY}, + {"siteSettingsClearAllStorageDescription", + IDS_SETTINGS_SITE_SETTINGS_CLEAR_ALL_STORAGE_DESCRIPTION}, + {"siteSettingsClearDisplayedStorageDescription", + IDS_SETTINGS_SITE_SETTINGS_CLEAR_DISPLAYED_STORAGE_DESCRIPTION}, + {"siteSettingsDeleteAllStorageLabel", + IDS_SETTINGS_SITE_SETTINGS_DELETE_ALL_STORAGE_LABEL}, + {"siteSettingsDeleteDisplayedStorageLabel", + IDS_SETTINGS_SITE_SETTINGS_DELETE_DISPLAYED_STORAGE_LABEL}, + {"siteSettingsDeleteAllStorageConfirmation", + IDS_SETTINGS_SITE_SETTINGS_DELETE_ALL_STORAGE_CONFIRMATION}, + {"siteSettingsDeleteDisplayedStorageConfirmation", + IDS_SETTINGS_SITE_SETTINGS_DELETE_DISPLAYED_STORAGE_CONFIRMATION}, + {"siteSettingsDeleteAllStorageConfirmationInstalled", + IDS_SETTINGS_SITE_SETTINGS_DELETE_ALL_STORAGE_CONFIRMATION_INSTALLED}, + {"siteSettingsDeleteDisplayedStorageConfirmationInstalled", + IDS_SETTINGS_SITE_SETTINGS_DELETE_DISPLAYED_STORAGE_CONFIRMATION_INSTALLED}, + {"siteSettingsClearAllStorageSignOut", + IDS_SETTINGS_SITE_SETTINGS_CLEAR_ALL_STORAGE_SIGN_OUT}, + {"siteSettingsClearDisplayedStorageSignOut", + IDS_SETTINGS_SITE_SETTINGS_CLEAR_DISPLAYED_STORAGE_SIGN_OUT}, + {"siteSettingsSiteDetailsSubpageAccessibilityLabel", + IDS_SETTINGS_SITE_SETTINGS_SITE_DETAILS_SUBPAGE_ACCESSIBILITY_LABEL}, + {"firstPartySetsMoreActionsTitle", + IDS_SETTINGS_SITE_SETTINGS_FIRST_PARTY_SETS_MORE_ACTIONS_TITLE}, + {"firstPartySetsShowRelatedSitesButton", + IDS_SETTINGS_SITE_SETTINGS_FIRST_PARTY_SETS_SHOW_RELATED_SITES_BUTTON}, + {"firstPartySetsSiteDeleteStorageButton", + IDS_SETTINGS_SITE_SETTINGS_FIRST_PARTY_SETS_SITE_DELETE_STORAGE_BUTTON}, + {"siteSettingsSiteClearStorage", + IDS_SETTINGS_SITE_SETTINGS_SITE_CLEAR_STORAGE}, + {"siteSettingsSiteClearStorageConfirmation", + IDS_SETTINGS_SITE_SETTINGS_SITE_CLEAR_STORAGE_CONFIRMATION}, + {"siteSettingsSiteClearStorageConfirmationNew", + IDS_SETTINGS_SITE_SETTINGS_SITE_CLEAR_STORAGE_CONFIRMATION_NEW}, + {"siteSettingsSiteDeleteStorageDialogTitle", + IDS_SETTINGS_SITE_SETTINGS_SITE_DELETE_STORAGE_DIALOG_TITLE}, + {"siteSettingsSiteClearStorageSignOut", + IDS_SETTINGS_SITE_SETTINGS_SITE_CLEAR_STORAGE_SIGN_OUT}, + {"siteSettingsSiteDeleteStorageOfflineData", + IDS_SETTINGS_SITE_SETTINGS_SITE_DELETE_STORAGE_OFFLINE_DATA}, + {"siteSettingsRemoveSiteAdPersonalization", + IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_AD_PERSONALIZATION}, + {"siteSettingsSiteGroupDeleteOfflineData", + IDS_SETTINGS_SITE_SETTINGS_SITE_GROUP_DELETE_OFFLINE_DATA}, + {"siteSettingsSiteResetAll", IDS_SETTINGS_SITE_SETTINGS_SITE_RESET_ALL}, + {"siteSettingsSiteResetConfirmation", + IDS_SETTINGS_SITE_SETTINGS_SITE_RESET_CONFIRMATION}, + {"siteSettingsRemoveSiteOriginDialogTitle", + IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_ORIGIN_DIALOG_TITLE}, + {"siteSettingsRemoveSiteOriginAppDialogTitle", + IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_ORIGIN_APP_DIALOG_TITLE}, + {"siteSettingsRemoveSiteOriginPartitionedDialogTitle", + IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_ORIGIN_PARTITIONED_DIALOG_TITLE}, + {"siteSettingsRemoveSiteGroupDialogTitle", + IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_GROUP_DIALOG_TITLE}, + {"siteSettingsRemoveSiteGroupAppDialogTitle", + IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_GROUP_APP_DIALOG_TITLE}, + {"siteSettingsRemoveSiteGroupAppPluralDialogTitle", + IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_GROUP_APP_PLURAL_DIALOG_TITLE}, + {"siteSettingsRemoveSiteOriginLogout", + IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_ORIGIN_LOGOUT}, + {"siteSettingsRemoveSiteGroupLogout", + IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_GROUP_LOGOUT}, + {"siteSettingsRemoveSiteOfflineData", + IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_OFFLINE_DATA}, + {"siteSettingsRemoveSitePermissions", + IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_PERMISSIONS}, + {"siteSettingsRemoveSiteConfirm", + IDS_SETTINGS_SITE_SETTINGS_REMOVE_SITE_CONFIRM}, + {"thirdPartyCookie", IDS_NEW_TAB_OTR_THIRD_PARTY_COOKIE}, + {"thirdPartyCookieSublabel", IDS_NEW_TAB_OTR_THIRD_PARTY_COOKIE_SUBLABEL}, + {"handlerIsDefault", IDS_SETTINGS_SITE_SETTINGS_HANDLER_IS_DEFAULT}, + {"handlerSetDefault", IDS_SETTINGS_SITE_SETTINGS_HANDLER_SET_DEFAULT}, + {"handlerRemove", IDS_SETTINGS_SITE_SETTINGS_REMOVE}, + {"incognitoSiteOnly", IDS_SETTINGS_SITE_SETTINGS_INCOGNITO_ONLY}, + {"incognitoSiteExceptionDesc", + IDS_SETTINGS_SITE_SETTINGS_INCOGNITO_SITE_EXCEPTION_DESC}, + {"noSitesAdded", IDS_SETTINGS_SITE_NO_SITES_ADDED}, + {"siteSettingsDefaultBehavior", + IDS_SETTINGS_SITE_SETTINGS_DEFAULT_BEHAVIOR}, + {"siteSettingsDefaultBehaviorDescription", + IDS_SETTINGS_SITE_SETTINGS_DEFAULT_BEHAVIOR_DESCRIPTION}, + {"siteSettingsNotificationsDefaultBehaviorDescription", + IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_DEFAULT_BEHAVIOR_DESC}, + {"siteSettingsCustomizedBehaviors", + IDS_SETTINGS_SITE_SETTINGS_CUSTOMIZED_BEHAVIORS}, + {"siteSettingsCustomizedBehaviorsDescription", + IDS_SETTINGS_SITE_SETTINGS_CUSTOMIZED_BEHAVIORS_DESCRIPTION}, + {"siteSettingsCustomizedBehaviorsDescriptionShort", + IDS_SETTINGS_SITE_SETTINGS_CUSTOMIZED_BEHAVIORS_DESCRIPTION_SHORT}, + {"siteSettingsAdsDescription", + IDS_SETTINGS_SITE_SETTINGS_ADS_DESCRIPTION}, + {"siteSettingsAdsAllowed", IDS_SETTINGS_SITE_SETTINGS_ADS_ALLOWED}, + {"siteSettingsAdsBlocked", IDS_SETTINGS_SITE_SETTINGS_ADS_BLOCKED}, + {"siteSettingsAdsAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_ADS_ALLOWED_EXCEPTIONS}, + {"siteSettingsAdsBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_ADS_BLOCKED_EXCEPTIONS}, + {"siteSettingsArDescription", IDS_SETTINGS_SITE_SETTINGS_AR_DESCRIPTION}, + {"siteSettingsArAllowed", IDS_SETTINGS_SITE_SETTINGS_AR_ALLOWED}, + {"siteSettingsArBlocked", IDS_SETTINGS_SITE_SETTINGS_AR_BLOCKED}, + {"siteSettingsArAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_AR_ALLOWED_EXCEPTIONS}, + {"siteSettingsArBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_AR_BLOCKED_EXCEPTIONS}, + {"siteSettingsAutomaticDownloadsDescription", + IDS_SETTINGS_SITE_SETTINGS_AUTOMATIC_DOWNLOADS_DESCRIPTION}, + {"siteSettingsAutomaticDownloadsAllowed", + IDS_SETTINGS_SITE_SETTINGS_AUTOMATIC_DOWNLOADS_ALLOWED}, + {"siteSettingsAutomaticDownloadsBlocked", + IDS_SETTINGS_SITE_SETTINGS_AUTOMATIC_DOWNLOADS_BLOCKED}, + {"siteSettingsAutomaticDownloadsAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_AUTOMATIC_DOWNLOADS_ALLOWED_EXCEPTIONS}, + {"siteSettingsAutomaticDownloadsBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_AUTOMATIC_DOWNLOADS_BLOCKED_EXCEPTIONS}, + {"siteSettingsAutoPictureInPictureDescription", + IDS_SETTINGS_SITE_SETTINGS_AUTO_PICTURE_IN_PICTURE_DESCRIPTION}, + {"siteSettingsAutoPictureInPictureAllowed", + IDS_SETTINGS_SITE_SETTINGS_AUTO_PICTURE_IN_PICTURE_ALLOWED}, + {"siteSettingsAutoPictureInPictureBlocked", + IDS_SETTINGS_SITE_SETTINGS_AUTO_PICTURE_IN_PICTURE_BLOCKED}, + {"siteSettingsAutoPictureInPictureAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_AUTO_PICTURE_IN_PICTURE_ALLOWED_EXCEPTIONS}, + {"siteSettingsAutoPictureInPictureBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_AUTO_PICTURE_IN_PICTURE_BLOCKED_EXCEPTIONS}, + {"siteSettingsBackgroundSyncDescription", + IDS_SETTINGS_SITE_SETTINGS_BACKGROUND_SYNC_DESCRIPTION}, + {"siteSettingsBackgroundSyncAllowed", + IDS_SETTINGS_SITE_SETTINGS_BACKGROUND_SYNC_ALLOWED}, + {"siteSettingsBackgroundSyncBlocked", + IDS_SETTINGS_SITE_SETTINGS_BACKGROUND_SYNC_BLOCKED}, + {"siteSettingsBackgroundSyncBlockedSubLabel", + IDS_SETTINGS_SITE_SETTINGS_BACKGROUND_SYNC_BLOCKED_SUB_LABEL}, + {"siteSettingsBackgroundSyncAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_BACKGROUND_SYNC_ALLOWED_EXCEPTIONS}, + {"siteSettingsBackgroundSyncBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_BACKGROUND_SYNC_BLOCKED_EXCEPTIONS}, + {"siteSettingsBluetoothDevicesDescription", + IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_DEVICES_DESCRIPTION}, + {"siteSettingsBluetoothDevicesAllowed", + IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_DEVICES_ALLOWED}, + {"siteSettingsBluetoothDevicesBlocked", + IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_DEVICES_BLOCKED}, + {"siteSettingsCameraDescription", + IDS_SETTINGS_SITE_SETTINGS_CAMERA_DESCRIPTION}, + {"siteSettingsCameraAllowed", IDS_SETTINGS_SITE_SETTINGS_CAMERA_ALLOWED}, + {"siteSettingsCameraBlocked", IDS_SETTINGS_SITE_SETTINGS_CAMERA_BLOCKED}, + {"siteSettingsCameraBlockedSubLabel", + IDS_SETTINGS_SITE_SETTINGS_CAMERA_BLOCKED_SUB_LABEL}, + {"siteSettingsCameraAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_CAMERA_ALLOWED_EXCEPTIONS}, + {"siteSettingsCameraBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_CAMERA_BLOCKED_EXCEPTIONS}, + {"siteSettingsClipboardDescription", + IDS_SETTINGS_SITE_SETTINGS_CLIPBOARD_DESCRIPTION}, + {"siteSettingsClipboardAllowed", + IDS_SETTINGS_SITE_SETTINGS_CLIPBOARD_ALLOWED}, + {"siteSettingsClipboardBlocked", + IDS_SETTINGS_SITE_SETTINGS_CLIPBOARD_BLOCKED}, + {"siteSettingsClipboardAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_CLIPBOARD_ALLOWED_EXCEPTIONS}, + {"siteSettingsClipboardBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_CLIPBOARD_BLOCKED_EXCEPTIONS}, + {"siteSettingsDeviceUseDescription", + IDS_SETTINGS_SITE_SETTINGS_DEVICE_USE_DESCRIPTION}, + {"siteSettingsDeviceUseAllowed", + IDS_SETTINGS_SITE_SETTINGS_DEVICE_USE_ALLOWED}, + {"siteSettingsDeviceUseBlocked", + IDS_SETTINGS_SITE_SETTINGS_DEVICE_USE_BLOCKED}, + {"siteSettingsDeviceUseAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_DEVICE_USE_ALLOWED_EXCEPTIONS}, + {"siteSettingsDeviceUseBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_DEVICE_USE_BLOCKED_EXCEPTIONS}, + {"siteSettingsFederatedIdentityApi", + IDS_SITE_SETTINGS_TYPE_FEDERATED_IDENTITY_API}, + {"siteSettingsFederatedIdentityApiAllowed", + IDS_SETTINGS_SITE_SETTINGS_FEDERATED_IDENTITY_API_ALLOWED}, + {"siteSettingsFederatedIdentityApiBlocked", + IDS_SETTINGS_SITE_SETTINGS_FEDERATED_IDENTITY_API_BLOCKED}, + {"siteSettingsFederatedIdentityApiAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_FEDERATED_IDENTITY_API_ALLOWED_EXCEPTIONS}, + {"siteSettingsFederatedIdentityApiBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_FEDERATED_IDENTITY_API_BLOCKED_EXCEPTIONS}, + {"siteSettingsFederatedIdentityApiDescription", + IDS_SETTINGS_SITE_SETTINGS_FEDERATED_IDENTITY_API_DESCRIPTION}, + {"siteSettingsFederatedIdentityApiMidSentence", + IDS_SITE_SETTINGS_TYPE_FEDERATED_IDENTITY_API_MID_SENTENCE}, + {"siteSettingsFileSystemWriteDescription", + IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_WRITE_DESCRIPTION}, + {"siteSettingsFileSystemWriteAllowed", + IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_WRITE_ALLOWED}, + {"siteSettingsFileSystemWriteBlocked", + IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_WRITE_BLOCKED}, + {"siteSettingsFileSystemWriteBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_WRITE_BLOCKED_EXCEPTIONS}, + {"siteSettingsFontsDescription", + IDS_SETTINGS_SITE_SETTINGS_FONTS_DESCRIPTION}, + {"siteSettingsFontsAllowed", IDS_SETTINGS_SITE_SETTINGS_FONTS_ALLOWED}, + {"siteSettingsFontsBlocked", IDS_SETTINGS_SITE_SETTINGS_FONTS_BLOCKED}, + {"siteSettingsFontsAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_FONTS_ALLOWED_EXCEPTIONS}, + {"siteSettingsFontsBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_FONTS_BLOCKED_EXCEPTIONS}, + {"siteSettingsHidDevicesDescription", + IDS_SETTINGS_SITE_SETTINGS_HID_DEVICES_DESCRIPTION}, + {"siteSettingsHidDevicesAllowed", + IDS_SETTINGS_SITE_SETTINGS_HID_DEVICES_ALLOWED}, + {"siteSettingsHidDevicesBlocked", + IDS_SETTINGS_SITE_SETTINGS_HID_DEVICES_BLOCKED}, + {"siteSettingsImagesDescription", + IDS_SETTINGS_SITE_SETTINGS_IMAGES_DESCRIPTION}, + {"siteSettingsImagesAllowed", IDS_SETTINGS_SITE_SETTINGS_IMAGES_ALLOWED}, + {"siteSettingsImagesBlocked", IDS_SETTINGS_SITE_SETTINGS_IMAGES_BLOCKED}, + {"siteSettingsImagesBlockedSubLabel", + IDS_SETTINGS_SITE_SETTINGS_IMAGES_BLOCKED_SUB_LABEL}, + {"siteSettingsImagesAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_IMAGES_ALLOWED_EXCEPTIONS}, + {"siteSettingsImagedBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_IMAGES_BLOCKED_EXCEPTIONS}, + {"siteSettingsInsecureContentDescription", + IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT_DESCRIPTION}, + {"siteSettingsInsecureContentAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT_ALLOWED_EXCEPTIONS}, + {"siteSettingsInsecureContentBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT_BLOCKED_EXCEPTIONS}, + {"siteSettingsJavascriptDescription", + IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_DESCRIPTION}, + {"siteSettingsJavascriptAllowed", + IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_ALLOWED}, + {"siteSettingsJavascriptBlocked", + IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_BLOCKED}, + {"siteSettingsJavascriptAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_ALLOWED_EXCEPTIONS}, + {"siteSettingsJavascriptBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_BLOCKED_EXCEPTIONS}, + {"siteSettingsJavascriptJitDescription", + IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_JIT_DESCRIPTION}, + {"siteSettingsJavascriptJitAllowed", + IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_JIT_ALLOWED}, + {"siteSettingsJavascriptJitAllowedSubLabel", + IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_JIT_ALLOWED_SUB_LABEL}, + {"siteSettingsJavascriptJitBlocked", + IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_JIT_BLOCKED}, + {"siteSettingsJavascriptJitBlockedSubLabel", + IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_JIT_BLOCKED_SUB_LABEL}, + {"siteSettingsJavascriptJitAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_JIT_ALLOWED_EXCEPTIONS}, + {"siteSettingsJavascriptJitBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT_JIT_BLOCKED_EXCEPTIONS}, + {"siteSettingsLocationDescription", + IDS_SETTINGS_SITE_SETTINGS_LOCATION_DESCRIPTION}, + {"siteSettingsLocationAllowed", + IDS_SETTINGS_SITE_SETTINGS_LOCATION_ALLOWED}, + {"siteSettingsLocationAskQuiet", + IDS_SETTINGS_SITE_SETTINGS_PERMISSION_QUIET}, + {"siteSettingsLocationAskCPSS", + IDS_SETTINGS_SITE_SETTINGS_PERMISSION_CPSS}, + {"siteSettingsLocationAskLoud", + IDS_SETTINGS_SITE_SETTINGS_PERMISSION_LOUD}, + {"siteSettingsLocationBlocked", + IDS_SETTINGS_SITE_SETTINGS_LOCATION_BLOCKED}, + {"siteSettingsLocationBlockedSubLabel", + IDS_SETTINGS_SITE_SETTINGS_LOCATION_BLOCKED_SUB_LABEL}, + {"siteSettingsLocationAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_LOCATION_ALLOWED_EXCEPTIONS}, + {"siteSettingsLocationBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_LOCATION_BLOCKED_EXCEPTIONS}, + {"siteSettingsMicDescription", + IDS_SETTINGS_SITE_SETTINGS_MIC_DESCRIPTION}, + {"siteSettingsMicAllowed", IDS_SETTINGS_SITE_SETTINGS_MIC_ALLOWED}, + {"siteSettingsMicBlocked", IDS_SETTINGS_SITE_SETTINGS_MIC_BLOCKED}, + {"siteSettingsMicBlockedSubLabel", + IDS_SETTINGS_SITE_SETTINGS_MIC_BLOCKED_SUB_LABEL}, + {"siteSettingsMicAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_MIC_ALLOWED_EXCEPTIONS}, + {"siteSettingsMicBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_MIC_BLOCKED_EXCEPTIONS}, + {"siteSettingsMidiDescription", + IDS_SETTINGS_SITE_SETTINGS_MIDI_DESCRIPTION}, + {"siteSettingsMidiAllowed", IDS_SETTINGS_SITE_SETTINGS_MIDI_ALLOWED}, + {"siteSettingsMidiBlocked", IDS_SETTINGS_SITE_SETTINGS_MIDI_BLOCKED}, + {"siteSettingsMidiAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_MIDI_ALLOWED_EXCEPTIONS}, + {"siteSettingsMidiBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_MIDI_BLOCKED_EXCEPTIONS}, + {"siteSettingsMotionSensorsDescription", + IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_DESCRIPTION}, + {"siteSettingsMotionSensorsAllowed", + IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_ALLOWED}, + {"siteSettingsMotionSensorsBlocked", + IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_BLOCKED}, + {"siteSettingsMotionSensorsBlockedSubLabel", + IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_BLOCKED_SUB_LABEL}, + {"siteSettingsMotionSensorsAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_ALLOWED_EXCEPTIONS}, + {"siteSettingsMotionSensorsBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_MOTION_SENSORS_BLOCKED_EXCEPTIONS}, + {"siteSettingsNotificationsDescription", + IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_DESCRIPTION}, + {"siteSettingsNotificationsAllowed", + IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_ALLOWED}, + {"siteSettingsNotificationsPartial", + IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_PARTIAL}, + {"siteSettingsNotificationsPartialSubLabel", + IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_PARTIAL_SUB_LABEL}, + {"siteSettingsNotificationsAskState", + IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_ASK_STATE}, + {"siteSettingsNotificationsAskQuiet", + IDS_SETTINGS_SITE_SETTINGS_PERMISSION_QUIET}, + {"siteSettingsNotificationsAskCPSS", + IDS_SETTINGS_SITE_SETTINGS_PERMISSION_CPSS}, + {"siteSettingsNotificationsAskLoud", + IDS_SETTINGS_SITE_SETTINGS_PERMISSION_LOUD}, + {"siteSettingsNotificationsBlocked", + IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_BLOCKED}, + {"siteSettingsNotificationsBlockedSubLabel", + IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_BLOCKED_SUB_LABEL}, + {"siteSettingsNotificationsAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_ALLOWED_EXCEPTIONS}, + {"siteSettingsNotificationsBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS_BLOCKED_EXCEPTIONS}, + {"siteSettingsPaymentHandlersDescription", + IDS_SETTINGS_SITE_SETTINGS_PAYMENT_HANDLERS_DESCRIPTION}, + {"siteSettingsPaymentHandlersAllowed", + IDS_SETTINGS_SITE_SETTINGS_PAYMENT_HANDLERS_ALLOWED}, + {"siteSettingsPaymentHandlersBlocked", + IDS_SETTINGS_SITE_SETTINGS_PAYMENT_HANDLERS_BLOCKED}, + {"siteSettingsPaymentHandlersAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_PAYMENT_HANDLERS_ALLOWED_EXCEPTIONS}, + {"siteSettingsPaymentHandlersBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_PAYMENT_HANDLERS_BLOCKED_EXCEPTIONS}, + {"siteSettingsPdfsDescription", + IDS_SETTINGS_SITE_SETTINGS_PDFS_DESCRIPTION}, + {"siteSettingsPdfsAllowed", IDS_SETTINGS_SITE_SETTINGS_PDFS_ALLOWED}, + {"siteSettingsPdfsBlocked", IDS_SETTINGS_SITE_SETTINGS_PDFS_BLOCKED}, + {"siteSettingsPopupsDescription", + IDS_SETTINGS_SITE_SETTINGS_POPUPS_DESCRIPTION}, + {"siteSettingsPopupsAllowed", IDS_SETTINGS_SITE_SETTINGS_POPUPS_ALLOWED}, + {"siteSettingsPopupsBlocked", IDS_SETTINGS_SITE_SETTINGS_POPUPS_BLOCKED}, + {"siteSettingsPopupsAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_POPUPS_ALLOWED_EXCEPTIONS}, + {"siteSettingsPopupsBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_POPUPS_BLOCKED_EXCEPTIONS}, + {"siteSettingsProtocolHandlersDescription", + IDS_SETTINGS_SITE_SETTINGS_PROTOCOL_HANDLERS_DESCRIPTION}, + {"siteSettingsProtocolHandlersAllowed", + IDS_SETTINGS_SITE_SETTINGS_PROTOCOL_HANDLERS_ALLOWED}, + {"siteSettingsProtocolHandlersBlocked", + IDS_SETTINGS_SITE_SETTINGS_PROTOCOL_HANDLERS_BLOCKED}, + {"siteSettingsProtocolHandlersBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_PROTOCOL_HANDLERS_BLOCKED_EXCEPTIONS}, + {"siteSettingsSerialPortsDescription", + IDS_SETTINGS_SITE_SETTINGS_SERIAL_PORTS_DESCRIPTION}, + {"siteSettingsSerialPortsAllowed", + IDS_SETTINGS_SITE_SETTINGS_SERIAL_PORTS_ALLOWED}, + {"siteSettingsSerialPortsBlocked", + IDS_SETTINGS_SITE_SETTINGS_SERIAL_PORTS_BLOCKED}, + {"siteSettingsSoundDescription", + IDS_SETTINGS_SITE_SETTINGS_SOUND_DESCRIPTION}, + {"siteSettingsSoundAllowed", IDS_SETTINGS_SITE_SETTINGS_SOUND_ALLOWED}, + {"siteSettingsSoundBlocked", IDS_SETTINGS_SITE_SETTINGS_SOUND_BLOCKED}, + {"siteSettingsSoundBlockedSubLabel", + IDS_SETTINGS_SITE_SETTINGS_SOUND_BLOCKED_SUB_LABEL}, + {"siteSettingsSoundAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_SOUND_ALLOWED_EXCEPTIONS}, + {"siteSettingsSoundBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_SOUND_BLOCKED_EXCEPTIONS}, + {"siteSettingsUsbDescription", + IDS_SETTINGS_SITE_SETTINGS_USB_DESCRIPTION}, + {"siteSettingsUsbAllowed", IDS_SETTINGS_SITE_SETTINGS_USB_ALLOWED}, + {"siteSettingsUsbBlocked", IDS_SETTINGS_SITE_SETTINGS_USB_BLOCKED}, + {"siteSettingsVrDescription", IDS_SETTINGS_SITE_SETTINGS_VR_DESCRIPTION}, + {"siteSettingsVrAllowed", IDS_SETTINGS_SITE_SETTINGS_VR_ALLOWED}, + {"siteSettingsVrBlocked", IDS_SETTINGS_SITE_SETTINGS_VR_BLOCKED}, + {"siteSettingsVrAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_VR_ALLOWED_EXCEPTIONS}, + {"siteSettingsVrBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_VR_BLOCKED_EXCEPTIONS}, + {"siteSettingsZoomLevelsDescription", + IDS_SETTINGS_SITE_SETTINGS_ZOOM_LEVELS_DESCRIPTION}, + {"siteSettingsAds", IDS_SITE_SETTINGS_TYPE_ADS}, + {"siteSettingsAdsMidSentence", IDS_SITE_SETTINGS_TYPE_ADS_MID_SENTENCE}, + {"siteSettingsPaymentHandler", IDS_SITE_SETTINGS_TYPE_PAYMENT_HANDLER}, + {"siteSettingsPaymentHandlerMidSentence", + IDS_SITE_SETTINGS_TYPE_PAYMENT_HANDLER_MID_SENTENCE}, + {"siteSettingsBlockAutoplaySetting", + IDS_SETTINGS_SITE_SETTINGS_BLOCK_AUTOPLAY}, + {"emptyAllSitesPage", IDS_SETTINGS_SITE_SETTINGS_EMPTY_ALL_SITES_PAGE}, + {"noSitesFound", IDS_SETTINGS_SITE_SETTINGS_NO_SITES_FOUND}, + {"siteSettingsBluetoothScanning", + IDS_SITE_SETTINGS_TYPE_BLUETOOTH_SCANNING}, + {"siteSettingsBluetoothScanningMidSentence", + IDS_SITE_SETTINGS_TYPE_BLUETOOTH_SCANNING_MID_SENTENCE}, + {"siteSettingsBluetoothScanningDescription", + IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_SCANNING_DESCRIPTION}, + {"siteSettingsBluetoothScanningAsk", + IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_SCANNING_ASK}, + {"siteSettingsBluetoothScanningBlock", + IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_SCANNING_BLOCK}, + {"siteSettingsBluetoothScanningAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_SCANNING_ALLOWED_EXCEPTIONS}, + {"siteSettingsBluetoothScanningBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_SCANNING_BLOCKED_EXCEPTIONS}, + {"siteSettingsAr", IDS_SITE_SETTINGS_TYPE_AR}, + {"siteSettingsArMidSentence", IDS_SITE_SETTINGS_TYPE_AR_MID_SENTENCE}, + {"siteSettingsArAsk", IDS_SETTINGS_SITE_SETTINGS_AR_ASK}, + {"siteSettingsArBlock", IDS_SETTINGS_SITE_SETTINGS_AR_BLOCK}, + {"siteSettingsVr", IDS_SITE_SETTINGS_TYPE_VR}, + {"siteSettingsVrMidSentence", IDS_SITE_SETTINGS_TYPE_VR_MID_SENTENCE}, + {"siteSettingsWebPrinting", IDS_SITE_SETTINGS_TYPE_WEB_PRINTING}, + {"siteSettingsWebPrintingMidSentence", + IDS_SITE_SETTINGS_TYPE_WEB_PRINTING_MID_SENTENCE}, + {"siteSettingsWebPrintingDescription", + IDS_SETTINGS_SITE_SETTINGS_WEB_PRINTING_DESCRIPTION}, + {"siteSettingsWebPrintingAsk", + IDS_SETTINGS_SITE_SETTINGS_WEB_PRINTING_ASK}, + {"siteSettingsWebPrintingBlock", + IDS_SETTINGS_SITE_SETTINGS_WEB_PRINTING_BLOCK}, + {"siteSettingsWebPrintingAllowedExceptions", + IDS_SETTINGS_SITE_SETTINGS_WEB_PRINTING_ALLOWED_EXCEPTIONS}, + {"siteSettingsWebPrintingBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_WEB_PRINTING_BLOCKED_EXCEPTIONS}, + {"siteSettingsWindowManagement", + IDS_SITE_SETTINGS_TYPE_WINDOW_MANAGEMENT}, + {"siteSettingsWindowManagementMidSentence", + IDS_SITE_SETTINGS_TYPE_WINDOW_MANAGEMENT_MID_SENTENCE}, + {"siteSettingsWindowManagementDescription", + IDS_SETTINGS_SITE_SETTINGS_WINDOW_MANAGEMENT_DESCRIPTION}, + {"siteSettingsWindowManagementAsk", + IDS_SETTINGS_SITE_SETTINGS_WINDOW_MANAGEMENT_ASK}, + {"siteSettingsWindowManagementBlocked", + IDS_SETTINGS_SITE_SETTINGS_WINDOW_MANAGEMENT_BLOCKED}, + {"siteSettingsWindowManagementAskExceptions", + IDS_SETTINGS_SITE_SETTINGS_WINDOW_MANAGEMENT_ASK_EXCEPTIONS}, + {"siteSettingsWindowManagementBlockedExceptions", + IDS_SETTINGS_SITE_SETTINGS_WINDOW_MANAGEMENT_BLOCKED_EXCEPTIONS}, + {"siteSettingsFontAccessMidSentence", + IDS_SITE_SETTINGS_TYPE_FONT_ACCESS_MID_SENTENCE}, + {"siteSettingsIdleDetection", IDS_SITE_SETTINGS_TYPE_IDLE_DETECTION}, + {"siteSettingsIdleDetectionMidSentence", + IDS_SITE_SETTINGS_TYPE_IDLE_DETECTION_MID_SENTENCE}, + {"siteSettingsExtensionIdDescription", + IDS_SETTINGS_SITE_SETTINGS_EXTENSION_ID_DESCRIPTION}, + {"siteSettingsSiteDataAllowedSubLabel", + IDS_SETTINGS_SITE_SETTINGS_PAGE_SITE_DATA_ALLOWED_SUB_LABEL}, + {"siteSettingsSiteDataBlockedSubLabel", + IDS_SETTINGS_SITE_SETTINGS_PAGE_SITE_DATA_BLOCKED_SUB_LABEL}, + {"siteSettingsSiteDataDeleteOnExitSubLabel", + IDS_SETTINGS_SITE_SETTINGS_PAGE_SITE_DATA_DELETE_ON_EXIT_SUB_LABEL}, + {"siteSettingsAntiAbuse", IDS_SITE_SETTINGS_TYPE_ANTI_ABUSE}, + {"siteSettingsAntiAbuseDescription", IDS_SETTINGS_ANTI_ABUSE_DESCRIPTION}, + {"siteSettingsAntiAbuseEnabledSubLabel", + IDS_SETTINGS_ANTI_ABUSE_ENABLED_SUB_LABEL}, + {"siteSettingsAntiAbuseDisabledSubLabel", + IDS_SETTINGS_ANTI_ABUSE_DISABLED_SUB_LABEL}, + {"antiAbuseWhenOnHeader", IDS_SETTINGS_ANTI_ABUSE_WHEN_ON_HEADER}, + {"antiAbuseWhenOnSectionOne", + IDS_SETTINGS_ANTI_ABUSE_WHEN_ON_SECTION_ONE}, + {"antiAbuseWhenOnSectionTwo", + IDS_SETTINGS_ANTI_ABUSE_WHEN_ON_SECTION_TWO}, + {"antiAbuseWhenOnSectionThree", + IDS_SETTINGS_ANTI_ABUSE_WHEN_ON_SECTION_THREE}, + {"antiAbuseThingsToConsiderHeader", + IDS_SETTINGS_ANTI_ABUSE_THINGS_TO_CONSIDER_HEADER}, + {"antiAbuseThingsToConsiderSectionOne", + IDS_SETTINGS_ANTI_ABUSE_THINGS_TO_CONSIDER_SECTION_ONE}, + {"siteSettingsPerformance", IDS_SITE_SETTINGS_TYPE_PERFORMANCE}, + {"siteSettingsPerformanceSublabel", + IDS_SITE_SETTINGS_TYPE_PERFORMANCE_SUBLABEL}, }; html_source->AddLocalizedStrings(kLocalizedStrings); @@ -3317,7 +3349,8 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source, IDS_SETTINGS_TRACKING_PROTECTION_BULLET_TWO_DESCRIPTION, chrome::kUserBypassHelpCenterURL, l10n_util::GetStringUTF16( - IDS_SETTINGS_TRACKING_PROTECTION_BULLET_TWO_LEARN_MORE_ARIA_LABEL))); + IDS_SETTINGS_TRACKING_PROTECTION_BULLET_TWO_LEARN_MORE_ARIA_LABEL), + l10n_util::GetStringUTF16(IDS_SETTINGS_OPENS_IN_NEW_TAB))); html_source->AddString( "trackingProtectionRollbackNotice", l10n_util::GetStringFUTF16( @@ -3354,6 +3387,10 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source, "enablePaymentHandlerContentSetting", base::FeatureList::IsEnabled(features::kServiceWorkerPaymentApps)); + html_source->AddBoolean( + "enableWebPrintingContentSetting", + base::FeatureList::IsEnabled(blink::features::kWebPrinting)); + html_source->AddBoolean("enableFederatedIdentityApiContentSetting", base::FeatureList::IsEnabled(features::kFedCm)); @@ -3366,6 +3403,8 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source, base::FeatureList::IsEnabled( features::kWebBluetoothNewPermissionsBackend)); + // TODO(crbug.com/1467574): Remove `kFileSystemAccessPersistentPermissions` + // flag after FSA Persistent Permissions feature launch. html_source->AddBoolean( "showPersistentPermissions", base::FeatureList::IsEnabled( @@ -3378,7 +3417,7 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source, html_source->AddBoolean( "blockMidiByDefault", - base::FeatureList::IsEnabled(permissions::features::kBlockMidiByDefault)); + base::FeatureList::IsEnabled(features::kBlockMidiByDefault)); // The exception placeholder should not be translated. See // crbug.com/1095878. @@ -3420,8 +3459,6 @@ void AddSiteDataPageStrings(content::WebUIDataSource* html_source, IDS_SETTINGS_SITE_DATA_PAGE_ALLOW_RADIO_SUB_LABEL}, {"siteDataPageClearOnExitRadioLabel", IDS_SETTINGS_SITE_DATA_PAGE_CLEAR_ON_EXIT_RADIO_LABEL}, - {"siteDataPageClearOnExitRadioSubLabel", - IDS_SETTINGS_SITE_DATA_PAGE_CLEAR_ON_EXIT_RADIO_SUBLABEL}, {"siteDataPageBlockRadioLabel", IDS_SETTINGS_SITE_DATA_PAGE_BLOCK_RADIO_LABEL}, {"siteDataPageBlockRadioSublabel", @@ -3446,23 +3483,28 @@ void AddSiteDataPageStrings(content::WebUIDataSource* html_source, IDS_SETTINGS_SITE_DATA_PAGE_BLOCK_CONFIRM_DIALOG_CANCEL_BUTTON}, }; html_source->AddLocalizedStrings(kLocalizedStrings); + html_source->AddLocalizedString( + "siteDataPageClearOnExitRadioSubLabel", + base::FeatureList::IsEnabled(switches::kUnoDesktop) + ? IDS_SETTINGS_SITE_DATA_PAGE_CLEAR_ON_EXIT_WITH_EXCEPTION_RADIO_SUBLABEL + : IDS_SETTINGS_SITE_DATA_PAGE_CLEAR_ON_EXIT_RADIO_SUBLABEL); } #if !BUILDFLAG(IS_CHROMEOS_ASH) void AddSystemStrings(content::WebUIDataSource* html_source) { static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"systemPageTitle", IDS_SETTINGS_SYSTEM}, + {"systemPageTitle", IDS_SETTINGS_SYSTEM}, #if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_CHROMEOS_LACROS) - {"backgroundAppsLabel", IDS_SETTINGS_SYSTEM_BACKGROUND_APPS_LABEL}, + {"backgroundAppsLabel", IDS_SETTINGS_SYSTEM_BACKGROUND_APPS_LABEL}, #endif #if !BUILDFLAG(IS_CHROMEOS_LACROS) - {"hardwareAccelerationLabel", - IDS_SETTINGS_SYSTEM_HARDWARE_ACCELERATION_LABEL}, - {"proxySettingsLabel", IDS_SETTINGS_SYSTEM_PROXY_SETTINGS_LABEL}, + {"hardwareAccelerationLabel", + IDS_SETTINGS_SYSTEM_HARDWARE_ACCELERATION_LABEL}, + {"proxySettingsLabel", IDS_SETTINGS_SYSTEM_PROXY_SETTINGS_LABEL}, #endif #if BUILDFLAG(IS_CHROMEOS_LACROS) - {"useAshProxyLabel", IDS_SETTINGS_SYSTEM_USE_ASH_PROXY_LABEL}, - {"usesAshProxyLabel", IDS_SETTINGS_SYSTEM_USES_ASH_PROXY_LABEL}, + {"useAshProxyLabel", IDS_SETTINGS_SYSTEM_USE_ASH_PROXY_LABEL}, + {"usesAshProxyLabel", IDS_SETTINGS_SYSTEM_USES_ASH_PROXY_LABEL}, #endif }; html_source->AddLocalizedStrings(kLocalizedStrings); @@ -3656,7 +3698,16 @@ void AddLocalizedStrings(content::WebUIDataSource* html_source, AddResetStrings(html_source, profile); AddSearchEnginesStrings(html_source); AddSearchInSettingsStrings(html_source); +#if BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_CHROMEOS_LACROS) + const bool for_primary_profile = profile->IsMainProfile(); +#else // !BUILDFLAG(IS_CHROMEOS_LACROS) + const bool for_primary_profile = true; +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) + AddSearchStrings(html_source, for_primary_profile); +#else // !BUILDFLAG(IS_CHROMEOS) AddSearchStrings(html_source); +#endif // BUILDFLAG(IS_CHROMEOS) AddSiteSettingsStrings(html_source, profile); AddSiteDataPageStrings(html_source, profile); AddStorageAccessStrings(html_source); diff --git a/chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc index dc129a6908d..da1355890df 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc +++ b/chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc @@ -105,7 +105,7 @@ class ManageProfileHandlerTest : public testing::Test { EXPECT_TRUE(profiles::IsDefaultAvatarIconUrl(*icon_url, &url_icon_index)); EXPECT_EQ(icon_index, url_icon_index); EXPECT_TRUE(!icon_dict.FindString("label")->empty()); - absl::optional<bool> current_selected = icon_dict.FindBool("selected"); + std::optional<bool> current_selected = icon_dict.FindBool("selected"); if (selected_index == icon_index) { EXPECT_FALSE(selected_found); EXPECT_TRUE(current_selected.value_or(false)); @@ -355,7 +355,7 @@ TEST_F(ManageProfileHandlerTest, ProfileThemeColorsChangedWebUIEvent) { entry()->SetAvatarIconIndex(37); web_ui()->ClearTrackedCalls(); - entry()->SetProfileThemeColors(absl::nullopt); + entry()->SetProfileThemeColors(std::nullopt); EXPECT_EQ(1U, web_ui()->call_data().size()); const content::TestWebUI::CallData& data_1 = *web_ui()->call_data().back(); diff --git a/chromium/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.cc b/chromium/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.cc index e57305f2131..fd22a9680d7 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.cc @@ -6,13 +6,13 @@ #include <stddef.h> -#include <memory> #include <utility> #include "base/functional/bind.h" +#include "chrome/browser/media/prefs/capture_device_ranking.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/common/pref_names.h" #include "components/prefs/pref_service.h" +#include "extensions/buildflags/buildflags.h" #if BUILDFLAG(ENABLE_EXTENSIONS) #include "extensions/strings/grit/extensions_strings.h" @@ -24,6 +24,16 @@ namespace { const char kAudio[] = "mic"; const char kVideo[] = "camera"; +blink::MediaStreamDevices::const_iterator GetPreferredDeviceInfoIter( + const std::string& id, + const blink::MediaStreamDevices& infos) { + auto preferred_iter = std::find_if( + infos.begin(), infos.end(), + [id](const blink::MediaStreamDevice& info) { return info.id == id; }); + CHECK(preferred_iter < infos.end()); + return preferred_iter; +} + } // namespace namespace settings { @@ -31,8 +41,7 @@ namespace settings { MediaDevicesSelectionHandler::MediaDevicesSelectionHandler(Profile* profile) : profile_(profile) {} -MediaDevicesSelectionHandler::~MediaDevicesSelectionHandler() { -} +MediaDevicesSelectionHandler::~MediaDevicesSelectionHandler() = default; void MediaDevicesSelectionHandler::OnJavascriptAllowed() { // Register to the device observer list to get up-to-date device lists. @@ -58,12 +67,22 @@ void MediaDevicesSelectionHandler::RegisterMessages() { void MediaDevicesSelectionHandler::OnUpdateAudioDevices( const blink::MediaStreamDevices& devices) { - UpdateDevicesMenu(AUDIO, devices); + PrefService* prefs = profile_->GetPrefs(); + audio_device_infos_ = devices; + media_prefs::PreferenceRankAudioDeviceInfos(*prefs, audio_device_infos_); + UpdateDevicesMenu(kAudio, audio_device_infos_); } void MediaDevicesSelectionHandler::OnUpdateVideoDevices( const blink::MediaStreamDevices& devices) { - UpdateDevicesMenu(VIDEO, devices); + PrefService* prefs = profile_->GetPrefs(); + video_device_infos_ = devices; + media_prefs::PreferenceRankVideoDeviceInfos(*prefs, video_device_infos_); + UpdateDevicesMenu(kVideo, video_device_infos_); +} + +void MediaDevicesSelectionHandler::SetWebUiForTest(content::WebUI* web_ui) { + set_web_ui(web_ui); } void MediaDevicesSelectionHandler::GetDefaultCaptureDevices( @@ -76,73 +95,60 @@ void MediaDevicesSelectionHandler::GetDefaultCaptureDevices( const std::string& type = args[0].GetString(); DCHECK(!type.empty()); - if (type == kAudio) - UpdateDevicesMenuForType(AUDIO); - else if (type == kVideo) - UpdateDevicesMenuForType(VIDEO); + if (type == kAudio) { + OnUpdateAudioDevices( + MediaCaptureDevicesDispatcher::GetInstance()->GetAudioCaptureDevices()); + } else if (type == kVideo) { + OnUpdateVideoDevices( + MediaCaptureDevicesDispatcher::GetInstance()->GetVideoCaptureDevices()); + } } void MediaDevicesSelectionHandler::SetDefaultCaptureDevice( const base::Value::List& args) { - DCHECK_EQ(2U, args.size()); + CHECK_EQ(2U, args.size()); if (!args[0].is_string() || !args[1].is_string()) { NOTREACHED(); return; } const std::string& type = args[0].GetString(); - const std::string& device = args[1].GetString(); + const std::string& device_id = args[1].GetString(); - DCHECK(!type.empty()); - DCHECK(!device.empty()); + CHECK(!type.empty()); + CHECK(!device_id.empty()); PrefService* prefs = profile_->GetPrefs(); - if (type == kAudio) - prefs->SetString(prefs::kDefaultAudioCaptureDevice, device); - else if (type == kVideo) - prefs->SetString(prefs::kDefaultVideoCaptureDevice, device); - else + if (type == kAudio) { + auto preferred_iter = + GetPreferredDeviceInfoIter(device_id, audio_device_infos_); + media_prefs::UpdateAudioDevicePreferenceRanking(*prefs, preferred_iter, + audio_device_infos_); + } else if (type == kVideo) { + auto preferred_iter = + GetPreferredDeviceInfoIter(device_id, video_device_infos_); + media_prefs::UpdateVideoDevicePreferenceRanking(*prefs, preferred_iter, + video_device_infos_); + } else { NOTREACHED(); + } } void MediaDevicesSelectionHandler::UpdateDevicesMenu( - DeviceType type, + std::string type, const blink::MediaStreamDevices& devices) { AllowJavascript(); - // Get the default device unique id from prefs. - PrefService* prefs = profile_->GetPrefs(); - std::string default_device; - std::string device_type; - switch (type) { - case AUDIO: - default_device = prefs->GetString(prefs::kDefaultAudioCaptureDevice); - device_type = kAudio; - break; - case VIDEO: - default_device = prefs->GetString(prefs::kDefaultVideoCaptureDevice); - device_type = kVideo; - break; - } - // Build the list of devices to send to JS. - std::string default_id; base::Value::List device_list; for (const auto& device : devices) { base::Value::Dict entry; entry.Set("name", GetDeviceDisplayName(device)); entry.Set("id", device.id); device_list.Append(std::move(entry)); - if (device.id == default_device) - default_id = default_device; } - // Use the first device as the default device if the preferred default device - // does not exist in the OS. - if (!devices.empty() && default_id.empty()) - default_id = devices[0].id; - - base::Value default_value(default_id); - base::Value type_value(device_type); + base::Value default_value(devices.empty() ? "" : devices.front().id); + base::Value type_value(type); FireWebUIListener("updateDevicesMenu", type_value, device_list, default_value); @@ -162,7 +168,7 @@ std::string MediaDevicesSelectionHandler::GetDeviceDisplayName( break; case media::VideoFacingMode::MEDIA_VIDEO_FACING_NONE: break; - case media::VideoFacingMode::NUM_MEDIA_VIDEO_FACING_MODES: + default: NOTREACHED(); break; } @@ -173,20 +179,4 @@ std::string MediaDevicesSelectionHandler::GetDeviceDisplayName( return device.name + " " + facing_info; } -void MediaDevicesSelectionHandler::UpdateDevicesMenuForType(DeviceType type) { - blink::MediaStreamDevices devices; - switch (type) { - case AUDIO: - devices = MediaCaptureDevicesDispatcher::GetInstance()-> - GetAudioCaptureDevices(); - break; - case VIDEO: - devices = MediaCaptureDevicesDispatcher::GetInstance()-> - GetVideoCaptureDevices(); - break; - } - - UpdateDevicesMenu(type, devices); -} - } // namespace settings diff --git a/chromium/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.h b/chromium/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.h index c9f1dd19f08..ef68a3dcfca 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.h @@ -9,7 +9,7 @@ #include "base/scoped_observation.h" #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" -#include "content/public/browser/web_contents.h" +#include "third_party/blink/public/common/mediastream/media_devices.h" namespace settings { @@ -35,12 +35,9 @@ class MediaDevicesSelectionHandler void OnUpdateAudioDevices(const blink::MediaStreamDevices& devices) override; void OnUpdateVideoDevices(const blink::MediaStreamDevices& devices) override; - private: - enum DeviceType { - AUDIO, - VIDEO, - }; + void SetWebUiForTest(content::WebUI* web_ui); + private: // Fetches the list of default capture devices. void GetDefaultCaptureDevices(const base::Value::List& args); @@ -50,8 +47,7 @@ class MediaDevicesSelectionHandler void SetDefaultCaptureDevice(const base::Value::List& args); // Helpers methods to update the device menus. - void UpdateDevicesMenuForType(DeviceType type); - void UpdateDevicesMenu(DeviceType type, + void UpdateDevicesMenu(std::string type, const blink::MediaStreamDevices& devices); // Gets the human readable name of the device. @@ -63,6 +59,9 @@ class MediaDevicesSelectionHandler base::ScopedObservation<MediaCaptureDevicesDispatcher, MediaCaptureDevicesDispatcher::Observer> observation_{this}; + + blink::MediaStreamDevices audio_device_infos_; + blink::MediaStreamDevices video_device_infos_; }; } // namespace settings diff --git a/chromium/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler_unittest.cc new file mode 100644 index 00000000000..61ed083c932 --- /dev/null +++ b/chromium/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler_unittest.cc @@ -0,0 +1,154 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.h" +#include "base/test/test_future.h" +#include "chrome/test/base/testing_profile.h" +#include "content/public/test/browser_task_environment.h" +#include "content/public/test/test_web_ui.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { +MATCHER(DeviceEq, "") { + const auto& actual_device = std::get<0>(arg).GetDict(); + const auto& expected_device = std::get<1>(arg); + + return expected_device.id == *actual_device.FindString("id") && + expected_device.name == *actual_device.FindString("name"); +} +} // namespace + +namespace settings { + +class MediaDevicesSelectionHandlerTest + : public testing::Test, + public content::TestWebUI::JavascriptCallObserver { + public: + MediaDevicesSelectionHandlerTest() : handler_(&profile_) {} + + void SetUp() override { + handler_.SetWebUiForTest(&test_web_ui_); + handler_.RegisterMessages(); + EXPECT_TRUE(test_web_ui_.call_data().empty()); + handler_.AllowJavascriptForTesting(); + test_web_ui_.ClearTrackedCalls(); + test_web_ui_.AddJavascriptCallObserver(this); + } + + void VerifyUpdateDevicesMenu( + const blink::MediaStreamDevices& expected_devices, + const blink::MediaStreamDevice& expected_default_device, + const std::string& type) { + ASSERT_EQ(1u, test_web_ui_.call_data().size()); + auto& last_call_data = *(test_web_ui_.call_data().back()); + EXPECT_EQ("cr.webUIListenerCallback", last_call_data.function_name()); + EXPECT_EQ("updateDevicesMenu", last_call_data.arg1()->GetString()); + EXPECT_EQ(type, last_call_data.arg2()->GetString()); + EXPECT_THAT(last_call_data.arg3()->GetList(), + testing::Pointwise(DeviceEq(), expected_devices)); + EXPECT_EQ(expected_default_device.id, last_call_data.arg4()->GetString()); + test_web_ui_.ClearTrackedCalls(); + } + + bool WaitForUpdateDevicesMenuCall() { + bool result = on_update_devices_menu_future_.Wait(); + on_update_devices_menu_future_.Clear(); + return result; + } + + protected: + content::TestWebUI test_web_ui_; + + private: + void OnJavascriptFunctionCalled( + const content::TestWebUI::CallData& call_data) override { + const std::string* function_name = call_data.arg1()->GetIfString(); + if (function_name && *function_name == "updateDevicesMenu") { + on_update_devices_menu_future_.GetCallback().Run(); + } + } + + content::BrowserTaskEnvironment task_environment_; + TestingProfile profile_; + + MediaDevicesSelectionHandler handler_; + base::test::TestFuture<void> on_update_devices_menu_future_; +}; + +TEST_F(MediaDevicesSelectionHandlerTest, SetDefaultAudioDevice) { + const blink::MediaStreamDevice kIntegratedDevice( + /*type=*/blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE, + /*id=*/"integrated_device", + /*name=*/"Integrated Device"); + const blink::MediaStreamDevice kUsbDevice( + /*type=*/blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE, + /*id=*/"usb_device", + /*name=*/"USB Device"); + + blink::MediaStreamDevices devices{kIntegratedDevice, kUsbDevice}; + + auto* devices_dispatcher = MediaCaptureDevicesDispatcher::GetInstance(); + devices_dispatcher->SetTestAudioCaptureDevices(devices); + devices_dispatcher->OnAudioCaptureDevicesChanged(); + + ASSERT_TRUE(WaitForUpdateDevicesMenuCall()); + + const std::string kMic = "mic"; + // Verify that the list order is unmodified if pref is unset. + VerifyUpdateDevicesMenu(devices, kIntegratedDevice, kMic); + + base::Value::List setDefaultArgs; + setDefaultArgs.Append(kMic); + setDefaultArgs.Append(kUsbDevice.id); + test_web_ui_.ProcessWebUIMessage(GURL(), "setDefaultCaptureDevice", + std::move(setDefaultArgs)); + + base::Value::List getDefaultArgs; + getDefaultArgs.Append(kMic); + test_web_ui_.ProcessWebUIMessage(GURL(), "getDefaultCaptureDevices", + std::move(getDefaultArgs)); + + ASSERT_TRUE(WaitForUpdateDevicesMenuCall()); + VerifyUpdateDevicesMenu({kUsbDevice, kIntegratedDevice}, kUsbDevice, kMic); +} + +TEST_F(MediaDevicesSelectionHandlerTest, SetDefaultVideoDevice) { + const blink::MediaStreamDevice kIntegratedDevice( + /*type=*/blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE, + /*id=*/"integrated_device", + /*name=*/"Integrated Device"); + const blink::MediaStreamDevice kUsbDevice( + /*type=*/blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE, + /*id=*/"usb_device", + /*name=*/"USB Device"); + + blink::MediaStreamDevices devices{kIntegratedDevice, kUsbDevice}; + + auto* devices_dispatcher = MediaCaptureDevicesDispatcher::GetInstance(); + devices_dispatcher->SetTestVideoCaptureDevices(devices); + devices_dispatcher->OnVideoCaptureDevicesChanged(); + + ASSERT_TRUE(WaitForUpdateDevicesMenuCall()); + + const std::string kCamera = "camera"; + // Verify that the list order is unmodified if pref is unset. + VerifyUpdateDevicesMenu(devices, kIntegratedDevice, kCamera); + + base::Value::List setDefaultArgs; + setDefaultArgs.Append(kCamera); + setDefaultArgs.Append(kUsbDevice.id); + test_web_ui_.ProcessWebUIMessage(GURL(), "setDefaultCaptureDevice", + std::move(setDefaultArgs)); + + base::Value::List getDefaultArgs; + getDefaultArgs.Append(kCamera); + test_web_ui_.ProcessWebUIMessage(GURL(), "getDefaultCaptureDevices", + std::move(getDefaultArgs)); + + ASSERT_TRUE(WaitForUpdateDevicesMenuCall()); + VerifyUpdateDevicesMenu({kUsbDevice, kIntegratedDevice}, kUsbDevice, kCamera); +} + +} // namespace settings diff --git a/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc b/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc index a9481790a10..d4b52c6a3ab 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc @@ -5,6 +5,7 @@ #include "chrome/browser/ui/webui/settings/settings_secure_dns_handler.h" #include <memory> +#include <optional> #include <utility> #include "base/check.h" @@ -26,7 +27,6 @@ #include "net/dns/public/doh_provider_entry.h" #include "net/dns/public/secure_dns_mode.h" #include "net/dns/public/util.h" -#include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/base/l10n/l10n_util.h" namespace secure_dns = chrome_browser_net::secure_dns; @@ -49,7 +49,7 @@ base::Value::Dict CreateSecureDnsSettingDict() { dict.Set("mode", SecureDnsConfig::ModeToString(config.mode())); dict.Set("config", config.doh_servers().ToString()); #if BUILDFLAG(IS_CHROMEOS_ASH) - absl::optional<std::string> doh_with_identifiers_servers_for_display = + std::optional<std::string> doh_with_identifiers_servers_for_display = SystemNetworkContextManager::GetStubResolverConfigReader() ->GetDohWithIdentifiersDisplayServers(); dict.Set("dohWithIdentifiersActive", @@ -122,15 +122,7 @@ void SecureDnsHandler::OnJavascriptDisallowed() { base::Value::List SecureDnsHandler::GetSecureDnsResolverList() { base::Value::List resolvers; - - // Add a custom option to the front of the list - base::Value::Dict custom; - custom.Set("name", l10n_util::GetStringUTF8(IDS_SETTINGS_CUSTOM)); - custom.Set("value", std::string()); // Empty value means custom. - custom.Set("policy", std::string()); - resolvers.Append(std::move(custom)); - - for (const auto* entry : providers_) { + for (const net::DohProviderEntry* entry : providers_) { net::DnsOverHttpsConfig doh_config({entry->doh_server_config}); base::Value::Dict dict; dict.Set("name", entry->ui_name); @@ -139,9 +131,7 @@ base::Value::List SecureDnsHandler::GetSecureDnsResolverList() { resolvers.Append(std::move(dict)); } - // Randomize the order of the resolvers, but keep custom in first place. - base::RandomShuffle(std::next(resolvers.begin()), resolvers.end()); - + base::RandomShuffle(resolvers.begin(), resolvers.end()); return resolvers; } @@ -209,7 +199,7 @@ void SecureDnsHandler::HandleProbeConfig(const base::Value::List& args) { probe_callback_id_ = args[0].GetString(); const std::string& doh_config = args[1].GetString(); DCHECK(!runner_); - absl::optional<net::DnsOverHttpsConfig> parsed = + std::optional<net::DnsOverHttpsConfig> parsed = net::DnsOverHttpsConfig::FromString(doh_config); DCHECK(parsed.has_value()); // `doh_config` must be valid. runner_ = diff --git a/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler_browsertest.cc b/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler_browsertest.cc index 27d0ba2a6ff..9038745bc67 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler_browsertest.cc +++ b/chromium/chrome/browser/ui/webui/settings/settings_secure_dns_handler_browsertest.cc @@ -186,7 +186,7 @@ class SecureDnsHandlerTest : public InProcessBrowserTest { *out_doh_config = *doh_config; // Get the forced management description. - absl::optional<int> management_mode = dict->FindInt("managementMode"); + std::optional<int> management_mode = dict->FindInt("managementMode"); if (!management_mode.has_value()) return false; *out_management_mode = *management_mode; @@ -213,7 +213,7 @@ class SecureDnsHandlerTest : public InProcessBrowserTest { const base::Value::Dict* dict = data->arg2()->GetIfDict(); if (!dict) return false; - absl::optional<bool> doh_with_identifiers_active = + std::optional<bool> doh_with_identifiers_active = dict->FindBool("dohWithIdentifiersActive"); if (!doh_with_identifiers_active) return false; @@ -357,10 +357,9 @@ IN_PROC_BROWSER_TEST_F(SecureDnsHandlerTest, DropdownList) { EXPECT_EQ(kWebUiFunctionName, call_data.arg1()->GetString()); ASSERT_TRUE(call_data.arg2()->GetBool()); - // Check results. + // Check results (no providers set for testing). const base::Value::List& resolver_list = call_data.arg3()->GetList(); - ASSERT_GE(resolver_list.size(), 1U); - EXPECT_TRUE(resolver_list[0].GetDict().FindString("value")->empty()); + ASSERT_GE(resolver_list.size(), 0U); } IN_PROC_BROWSER_TEST_F(SecureDnsHandlerTest, DropdownListContents) { @@ -368,9 +367,8 @@ IN_PROC_BROWSER_TEST_F(SecureDnsHandlerTest, DropdownListContents) { handler_->SetProvidersForTesting(entries); const base::Value::List resolver_list = handler_->GetSecureDnsResolverList(); - EXPECT_EQ(entries.size() + 1, resolver_list.size()); - EXPECT_TRUE(resolver_list[0].GetDict().FindString("value")->empty()); - for (const auto* entry : entries) { + EXPECT_EQ(entries.size(), resolver_list.size()); + for (const net::DohProviderEntry* entry : entries) { EXPECT_TRUE(FindDropdownItem(resolver_list, entry->ui_name, entry->doh_server_config.server_template(), entry->privacy_policy)); diff --git a/chromium/chrome/browser/ui/webui/settings/settings_security_key_handler.cc b/chromium/chrome/browser/ui/webui/settings/settings_security_key_handler.cc index 815c4f16666..a621cdbfd79 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_security_key_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/settings_security_key_handler.cc @@ -4,12 +4,14 @@ #include "chrome/browser/ui/webui/settings/settings_security_key_handler.h" +#include <optional> #include <string> #include <utility> #include <vector> #include "base/base64.h" #include "base/containers/contains.h" +#include "base/containers/cxx20_erase_vector.h" #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/ranges/algorithm.h" @@ -35,7 +37,6 @@ #include "device/fido/public_key_credential_user_entity.h" #include "device/fido/reset_request_handler.h" #include "device/fido/set_pin_request_handler.h" -#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/icu/source/common/unicode/locid.h" #include "ui/base/l10n/l10n_util.h" @@ -146,7 +147,7 @@ void SecurityKeysPINHandler::HandleStartSetPIN(const base::Value::List& args) { void SecurityKeysPINHandler::OnGatherPIN(uint32_t current_min_pin_length, uint32_t new_min_pin_length, - absl::optional<int64_t> num_retries) { + std::optional<int64_t> num_retries) { DCHECK_EQ(State::kStartSetPIN, state_); DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -491,9 +492,9 @@ void SecurityKeysCredentialHandler::OnCredentialManagementReady() { void SecurityKeysCredentialHandler::OnHaveCredentials( device::CtapDeviceResponseCode status, - absl::optional<std::vector<device::AggregatedEnumerateCredentialsResponse>> + std::optional<std::vector<device::AggregatedEnumerateCredentialsResponse>> responses, - absl::optional<size_t> remaining_credentials) { + std::optional<size_t> remaining_credentials) { DCHECK_EQ(State::kGettingCredentials, state_); DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(credential_management_); @@ -839,7 +840,7 @@ void SecurityKeysBioEnrollmentHandler::HandleEnumerate( void SecurityKeysBioEnrollmentHandler::OnHaveEnumeration( device::CtapDeviceResponseCode code, - absl::optional<std::map<std::vector<uint8_t>, std::string>> enrollments) { + std::optional<std::map<std::vector<uint8_t>, std::string>> enrollments) { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(!callback_id_.empty()); DCHECK_EQ(state_, State::kEnumerating); @@ -906,7 +907,7 @@ void SecurityKeysBioEnrollmentHandler::OnEnrollmentFinished( void SecurityKeysBioEnrollmentHandler::OnHavePostEnrollmentEnumeration( std::vector<uint8_t> enrolled_template_id, device::CtapDeviceResponseCode code, - absl::optional<std::map<std::vector<uint8_t>, std::string>> enrollments) { + std::optional<std::map<std::vector<uint8_t>, std::string>> enrollments) { DCHECK_EQ(state_, State::kEnrolling); DCHECK(!callback_id_.empty()); state_ = State::kReady; @@ -1060,13 +1061,11 @@ void SecurityKeysPhonesHandler::HandleRename(const base::Value::List& args) { Profile::FromBrowserContext(browser_ctx)); // Remove the device that is getting renamed from the set of linked devices. - auto new_end = std::remove_if( - known_devices->linked_devices.begin(), - known_devices->linked_devices.end(), - [&public_key](const std::unique_ptr<device::cablev2::Pairing>& device) - -> bool { return device->peer_public_key_x962 == public_key; }); - known_devices->linked_devices.erase(new_end, - known_devices->linked_devices.end()); + base::EraseIf( + known_devices->linked_devices, + [&public_key](const std::unique_ptr<device::cablev2::Pairing>& device) { + return device->peer_public_key_x962 == public_key; + }); PrefService* const prefs = Profile::FromBrowserContext(browser_ctx)->GetPrefs(); @@ -1084,7 +1083,7 @@ void SecurityKeysPhonesHandler::DoEnumerate(const base::Value& callback_id) { base::Value::List synced; base::Value::List linked; - absl::optional<std::string> last_synced_device_name; + std::optional<std::string> last_synced_device_name; for (const auto& pairing : pairings) { base::Value::Dict dict; dict.Set("name", pairing->name); @@ -1208,7 +1207,7 @@ void PasskeysHandler::DoEnumerate(std::string callback_id) { void PasskeysHandler::OnEnumerateComplete( std::string callback_id, - absl::optional<std::vector<device::DiscoverableCredentialMetadata>> + std::optional<std::vector<device::DiscoverableCredentialMetadata>> credentials) { base::Value result; diff --git a/chromium/chrome/browser/ui/webui/settings/settings_security_key_handler.h b/chromium/chrome/browser/ui/webui/settings/settings_security_key_handler.h index 2d7707d2149..401d66970b7 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_security_key_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/settings_security_key_handler.h @@ -6,6 +6,7 @@ #define CHROME_BROWSER_UI_WEBUI_SETTINGS_SETTINGS_SECURITY_KEY_HANDLER_H_ #include <memory> +#include <optional> #include <string> #include "base/memory/weak_ptr.h" @@ -17,7 +18,6 @@ #include "device/fido/credential_management_handler.h" #include "device/fido/fido_constants.h" #include "device/fido/fido_discovery_factory.h" -#include "third_party/abseil-cpp/absl/types/optional.h" namespace device { struct AggregatedEnumerateCredentialsResponse; @@ -82,7 +82,7 @@ class SecurityKeysPINHandler : public SecurityKeysHandlerBase { void HandleStartSetPIN(const base::Value::List& args); void OnGatherPIN(uint32_t current_min_pin_length, uint32_t new_min_pin_length, - absl::optional<int64_t> num_retries); + std::optional<int64_t> num_retries); void OnSetPINComplete(device::CtapDeviceResponseCode code); void HandleSetPIN(const base::Value::List& args); @@ -123,7 +123,7 @@ class SecurityKeysResetHandler : public SecurityKeysHandlerBase { State state_ = State::kNone; std::unique_ptr<device::ResetRequestHandler> reset_; - absl::optional<device::CtapDeviceResponseCode> reset_result_; + std::optional<device::CtapDeviceResponseCode> reset_result_; std::string callback_id_; base::WeakPtrFactory<SecurityKeysResetHandler> weak_factory_{this}; @@ -165,10 +165,9 @@ class SecurityKeysCredentialHandler : public SecurityKeysHandlerBase { void OnCredentialManagementReady(); void OnHaveCredentials( device::CtapDeviceResponseCode status, - absl::optional< - std::vector<device::AggregatedEnumerateCredentialsResponse>> + std::optional<std::vector<device::AggregatedEnumerateCredentialsResponse>> responses, - absl::optional<size_t> remaining_credentials); + std::optional<size_t> remaining_credentials); void OnGatherPIN(device::CredentialManagementHandler::AuthenticatorProperties authenticator_properties, base::OnceCallback<void(std::string)>); @@ -226,7 +225,7 @@ class SecurityKeysBioEnrollmentHandler : public SecurityKeysHandlerBase { void HandleEnumerate(const base::Value::List& args); void OnHaveEnumeration( device::CtapDeviceResponseCode, - absl::optional<std::map<std::vector<uint8_t>, std::string>>); + std::optional<std::map<std::vector<uint8_t>, std::string>>); void OnEnrollingResponse(device::BioEnrollmentSampleStatus, uint8_t); void OnEnrollmentFinished(device::CtapDeviceResponseCode, @@ -234,7 +233,7 @@ class SecurityKeysBioEnrollmentHandler : public SecurityKeysHandlerBase { void OnHavePostEnrollmentEnumeration( std::vector<uint8_t> enrolled_template_id, device::CtapDeviceResponseCode code, - absl::optional<std::map<std::vector<uint8_t>, std::string>> enrollments); + std::optional<std::map<std::vector<uint8_t>, std::string>> enrollments); void HandleDelete(const base::Value::List& args); void OnDelete(device::CtapDeviceResponseCode); @@ -299,7 +298,7 @@ class PasskeysHandler : public SettingsPageUIHandler { void DoEnumerate(std::string callback_id); void OnEnumerateComplete( std::string callback_id, - absl::optional<std::vector<device::DiscoverableCredentialMetadata>> + std::optional<std::vector<device::DiscoverableCredentialMetadata>> credentials); std::unique_ptr<LocalCredentialManagement> local_cred_man_{nullptr}; diff --git a/chromium/chrome/browser/ui/webui/settings/settings_security_key_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/settings_security_key_handler_unittest.cc index 9bd166c708e..06d78dc5ac0 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_security_key_handler_unittest.cc +++ b/chromium/chrome/browser/ui/webui/settings/settings_security_key_handler_unittest.cc @@ -339,7 +339,7 @@ class MockLocalCredentialManagement : public LocalCredentialManagement { void, Enumerate, (base::OnceCallback<void( - absl::optional<std::vector<device::DiscoverableCredentialMetadata>>)> + std::optional<std::vector<device::DiscoverableCredentialMetadata>>)> callback)); MOCK_METHOD(void, Delete, @@ -423,7 +423,7 @@ TEST_F(PasskeysHandlerTest, TestHandleEdit) { }); EXPECT_CALL(*weak_local_cred_man_, Enumerate) .WillOnce([](base::OnceCallback< - void(absl::optional< + void(std::optional< std::vector<device::DiscoverableCredentialMetadata>>)> callback) { std::vector<device::DiscoverableCredentialMetadata> credential_metadata{ @@ -462,7 +462,7 @@ TEST_F(PasskeysHandlerTest, TestRecordPasskeyDelete) { EXPECT_CALL(*weak_local_cred_man_, Enumerate) .WillOnce( [](base::OnceCallback<void( - absl::optional<std::vector< + std::optional<std::vector< device::DiscoverableCredentialMetadata>>)> callback) { std::move(callback).Run(/*credential_metadata=*/{}); base::RunLoop().RunUntilIdle(); diff --git a/chromium/chrome/browser/ui/webui/settings/settings_ui.cc b/chromium/chrome/browser/ui/webui/settings/settings_ui.cc index 3bf10e1933d..f0a747d230c 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_ui.cc +++ b/chromium/chrome/browser/ui/webui/settings/settings_ui.cc @@ -19,6 +19,8 @@ #include "chrome/browser/commerce/shopping_service_factory.h" #include "chrome/browser/companion/core/features.h" #include "chrome/browser/download/bubble/download_bubble_prefs.h" +#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h" +#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h" #include "chrome/browser/performance_manager/public/user_tuning/user_performance_tuning_manager.h" #include "chrome/browser/performance_manager/public/user_tuning/user_tuning_utils.h" #include "chrome/browser/preloading/preloading_features.h" @@ -27,6 +29,7 @@ #include "chrome/browser/privacy_sandbox/tracking_protection_onboarding_factory.h" #include "chrome/browser/privacy_sandbox/tracking_protection_settings_factory.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/search_engine_choice/search_engine_choice_service_factory.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/signin/signin_features.h" #include "chrome/browser/ui/browser_element_identifiers.h" @@ -84,7 +87,6 @@ #include "components/commerce/core/commerce_feature_list.h" #include "components/commerce/core/shopping_service.h" #include "components/compose/buildflags.h" -#include "components/compose/core/browser/compose_features.h" #include "components/content_settings/core/common/features.h" #include "components/favicon_base/favicon_url_parser.h" #include "components/password_manager/core/common/password_manager_features.h" @@ -96,9 +98,9 @@ #include "components/privacy_sandbox/tracking_protection_settings.h" #include "components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_utils.h" #include "components/safe_browsing/core/common/features.h" +#include "components/search_engines/search_engine_choice/search_engine_choice_service.h" #include "components/search_engines/search_engine_choice_utils.h" #include "components/signin/public/base/signin_pref_names.h" -#include "components/signin/public/base/signin_switches.h" #include "components/sync/base/features.h" #include "content/public/browser/url_data_source.h" #include "content/public/browser/web_contents.h" @@ -185,6 +187,10 @@ #include "chrome/browser/ui/webui/settings/mac_system_settings_handler.h" #endif +#if BUILDFLAG(ENABLE_COMPOSE) +#include "chrome/browser/compose/compose_enabling.h" +#endif + namespace settings { // static @@ -317,14 +323,18 @@ SettingsUI::SettingsUI(content::WebUI* web_ui) } const bool is_search_engine_choice_settings_ui = - base::FeatureList::IsEnabled(switches::kSearchEngineChoiceSettingsUi) && search_engines::IsChoiceScreenFlagEnabled( search_engines::ChoicePromo::kAny); html_source->AddBoolean("searchEngineChoiceSettingsUi", is_search_engine_choice_settings_ui); - if (is_search_engine_choice_settings_ui) { - AddGeneratedIconResources(html_source, /*directory=*/"images/"); - } + + search_engines::SearchEngineChoiceService* + search_engine_choice_dialog_service = + search_engines::SearchEngineChoiceServiceFactory::GetForProfile( + profile); + const bool is_eea_country = search_engines::IsEeaChoiceCountry( + search_engine_choice_dialog_service->GetCountryId()); + html_source->AddBoolean("useLargeSearchEngineIcons", is_eea_country); #if BUILDFLAG(IS_CHROMEOS_ASH) html_source->AddBoolean( @@ -379,20 +389,18 @@ SettingsUI::SettingsUI(content::WebUI* web_ui) IsHashRealTimeLookupEligibleInSession()); html_source->AddBoolean( + "enableHttpsFirstModeNewSettings", + base::FeatureList::IsEnabled(features::kHttpsFirstModeIncognito)); + + html_source->AddBoolean( "enablePageContentSetting", base::FeatureList::IsEnabled(features::kPageContentOptIn) || base::FeatureList::IsEnabled( companion::features::kCompanionEnablePageContent)); -#if BUILDFLAG(ENABLE_COMPOSE) - html_source->AddBoolean( - "enableComposeSetting", - base::FeatureList::IsEnabled(compose::features::kEnableCompose)); -#endif - html_source->AddBoolean( "downloadBubblePartialViewControlledByPref", - download::IsDownloadBubbleEnabled(profile) && + download::IsDownloadBubbleEnabled() && download::IsDownloadBubblePartialViewControlledByPref()); #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) @@ -477,20 +485,12 @@ SettingsUI::SettingsUI(content::WebUI* web_ui) PrivacySandboxServiceFactory::GetForProfile(profile); bool is_privacy_sandbox_restricted = privacy_sandbox_service->IsPrivacySandboxRestricted(); - bool is_privacy_sandbox_settings_4 = - base::FeatureList::IsEnabled(privacy_sandbox::kPrivacySandboxSettings4); bool is_restricted_notice_enabled = privacy_sandbox_service->IsRestrictedNoticeEnabled(); html_source->AddBoolean("isPrivacySandboxRestricted", is_privacy_sandbox_restricted); - html_source->AddBoolean("isPrivacySandboxSettings4", - is_privacy_sandbox_settings_4); html_source->AddBoolean("isPrivacySandboxRestrictedNoticeEnabled", is_restricted_notice_enabled); - if (!is_privacy_sandbox_restricted && !is_privacy_sandbox_settings_4) { - html_source->AddResourcePath( - "privacySandbox", IDR_SETTINGS_PRIVACY_SANDBOX_PRIVACY_SANDBOX_HTML); - } html_source->AddBoolean( "privateStateTokensEnabled", @@ -505,9 +505,11 @@ SettingsUI::SettingsUI(content::WebUI* web_ui) base::FeatureList::IsEnabled( content_settings::features::kSafetyCheckUnusedSitePermissions)); +#if BUILDFLAG(ENABLE_EXTENSIONS) html_source->AddBoolean( "safetyCheckExtensionsReviewEnabled", base::FeatureList::IsEnabled(features::kSafetyCheckExtensions)); +#endif html_source->AddBoolean("enableSafetyHub", base::FeatureList::IsEnabled(features::kSafetyHub)); @@ -523,20 +525,21 @@ SettingsUI::SettingsUI(content::WebUI* web_ui) onboarding_service && onboarding_service->IsOffboarded() && base::FeatureList::IsEnabled( privacy_sandbox::kTrackingProtectionSettingsPageRollbackNotice)); + html_source->AddBoolean( + "isProactiveTopicsBlockingEnabled", + base::FeatureList::IsEnabled( + privacy_sandbox::kPrivacySandboxProactiveTopicsBlocking)); // Performance AddSettingsPageUIHandler(std::make_unique<PerformanceHandler>()); html_source->AddBoolean( - "isHighEfficiencyMultistateModeEnabled", + "isMemorySaverMultistateModeEnabled", base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyMultistateMode)); + performance_manager::features::kMemorySaverMultistateMode)); html_source->AddBoolean( "isDiscardExceptionsImprovementsEnabled", base::FeatureList::IsEnabled( performance_manager::features::kDiscardExceptionsImprovements)); - html_source->AddBoolean("isPerformanceSettingsPreloadingSubpageEnabled", - base::FeatureList::IsEnabled( - features::kPerformanceSettingsPreloadingSubpage)); html_source->AddBoolean( "isPerformanceSettingsPreloadingSubpageV2Enabled", features::kPerformanceSettingsPreloadingSubpageV2.Get()); @@ -554,6 +557,41 @@ SettingsUI::SettingsUI(content::WebUI* web_ui) base::FeatureList::IsEnabled( blink::features::kMediaSessionEnterPictureInPicture)); + // AI + optimization_guide::proto::ModelExecutionFeature + optimization_guide_features[3] = { + optimization_guide::proto::ModelExecutionFeature:: + MODEL_EXECUTION_FEATURE_COMPOSE, + optimization_guide::proto::ModelExecutionFeature:: + MODEL_EXECUTION_FEATURE_TAB_ORGANIZATION, + optimization_guide::proto::ModelExecutionFeature:: + MODEL_EXECUTION_FEATURE_WALLPAPER_SEARCH, + }; + + auto* optimization_guide_service = + OptimizationGuideKeyedServiceFactory::GetForProfile(profile); + bool optimization_guide_feature_visible[4] = {false, false, false, false}; + + for (size_t i = 0; i < 3; i++) { + const bool visible = optimization_guide_service && + optimization_guide_service->IsSettingVisible( + optimization_guide_features[i]); + optimization_guide_feature_visible[i + 1] = visible; + + // The main toggle is visible only if at least one of the sub toggles is + // visible. + optimization_guide_feature_visible[0] |= visible; + } + + html_source->AddBoolean("showAdvancedFeaturesMainControl", + optimization_guide_feature_visible[0]); + html_source->AddBoolean("showComposeControl", + optimization_guide_feature_visible[1]); + html_source->AddBoolean("showTabOrganizationControl", + optimization_guide_feature_visible[2]); + html_source->AddBoolean("showWallpaperSearchControl", + optimization_guide_feature_visible[3]); + TryShowHatsSurveyWithTimeout(); } @@ -679,7 +717,10 @@ void SettingsUI::CreateHelpBubbleHandler( mojo::PendingReceiver<help_bubble::mojom::HelpBubbleHandler> handler) { help_bubble_handler_ = std::make_unique<user_education::HelpBubbleHandler>( std::move(handler), std::move(client), this, - std::vector<ui::ElementIdentifier>{kEnhancedProtectionSettingElementId}); + std::vector<ui::ElementIdentifier>{ + kEnhancedProtectionSettingElementId, + kAnonymizedUrlCollectionPersonalizationSettingId, + }); } void SettingsUI::CreateCustomizeColorSchemeModeHandler( diff --git a/chromium/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc index 37a52507f12..24b7710a9e7 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc +++ b/chromium/chrome/browser/ui/webui/settings/settings_ui_browsertest.cc @@ -56,7 +56,7 @@ IN_PROC_BROWSER_TEST_F(SettingsUITest, TriggerHappinessTrackingSurveys) { browser()->profile(), base::BindRepeating(&BuildMockHatsService))); EXPECT_CALL(*mock_hats_service_, LaunchDelayedSurveyForWebContents(kHatsSurveyTriggerSettings, _, - _, _, _, _)); + _, _, _, _, _, _, _, _)); ASSERT_TRUE(NavigateToURL(browser(), GURL(chrome::kChromeUISettingsURL))); base::RunLoop().RunUntilIdle(); } diff --git a/chromium/chrome/browser/ui/webui/settings/settings_utils.cc b/chromium/chrome/browser/ui/webui/settings/settings_utils.cc index 21b970227f6..5b1e436866a 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_utils.cc +++ b/chromium/chrome/browser/ui/webui/settings/settings_utils.cc @@ -28,10 +28,4 @@ base::RefCountedMemory* GetFaviconResourceBytes( IDR_SETTINGS_FAVICON, scale_factor); } -base::RefCountedMemory* GetPrivacySandboxFaviconResourceBytes( - ui::ResourceScaleFactor scale_factor) { - return ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytesForScale( - IDR_FLAGS_FAVICON, scale_factor); -} - } // namespace settings_utils diff --git a/chromium/chrome/browser/ui/webui/settings/settings_utils.h b/chromium/chrome/browser/ui/webui/settings/settings_utils.h index a4cbb90206a..b89bd9c52bd 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_utils.h +++ b/chromium/chrome/browser/ui/webui/settings/settings_utils.h @@ -38,9 +38,6 @@ bool FixupAndValidateStartupPage(const std::string& url_string, base::RefCountedMemory* GetFaviconResourceBytes( ui::ResourceScaleFactor scale_factor); -base::RefCountedMemory* GetPrivacySandboxFaviconResourceBytes( - ui::ResourceScaleFactor scale_factor); - #if BUILDFLAG(IS_MAC) void ValidateSavedFonts(PrefService* prefs); #endif diff --git a/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc b/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc index ce91f4fbbd8..c3072e9b457 100644 --- a/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc +++ b/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc @@ -31,14 +31,11 @@ #include "content/public/browser/web_ui_data_source.h" #include "content/public/common/content_features.h" #include "media/base/media_switches.h" -#include "services/network/public/mojom/content_security_policy.mojom.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/webui/web_ui_util.h" #if BUILDFLAG(IS_CHROMEOS_ASH) #include "ash/constants/ash_features.h" -#include "chrome/browser/ash/crosapi/browser_util.h" -#include "chrome/browser/nearby_sharing/common/nearby_share_features.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(IS_CHROMEOS) @@ -258,86 +255,6 @@ void AddSharedSyncPageStrings(content::WebUIDataSource* html_source) { html_source->AddString("syncErrorsHelpUrl", chrome::kSyncErrorsHelpURL); } -#if BUILDFLAG(IS_CHROMEOS_ASH) -void AddNearbyShareData(content::WebUIDataSource* html_source) { - static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"nearbyShareTitle", IDS_SETTINGS_NEARBY_SHARE_TITLE}, - {"nearbyShareSetUpButtonTitle", - IDS_SETTINGS_NEARBY_SHARE_SET_UP_BUTTON_TITLE}, - {"nearbyShareDeviceNameRowTitle", - IDS_SETTINGS_NEARBY_SHARE_DEVICE_NAME_ROW_TITLE}, - {"nearbyShareDeviceNameDialogTitle", - IDS_SETTINGS_NEARBY_SHARE_DEVICE_NAME_DIALOG_TITLE}, - {"nearbyShareDeviceNameFieldLabel", - IDS_SETTINGS_NEARBY_SHARE_DEVICE_NAME_FIELD_LABEL}, - {"nearbyShareEditDeviceName", IDS_SETTINGS_NEARBY_SHARE_EDIT_DEVICE_NAME}, - {"fastInitiationNotificationToggleTitle", - IDS_SETTINGS_NEARBY_SHARE_FAST_INITIATION_NOTIFICATION_TOGGLE_TITLE}, - {"fastInitiationNotificationToggleDescription", - IDS_SETTINGS_NEARBY_SHARE_FAST_INITIATION_NOTIFICATION_TOGGLE_DESCRIPTION}, - {"fastInitiationNotificationToggleAriaLabel", - IDS_SETTINGS_NEARBY_SHARE_FAST_INITIATION_NOTIFICATION_TOGGLE_ARIA_LABEL}, - {"nearbyShareDeviceNameAriaDescription", - IDS_SETTINGS_NEARBY_SHARE_DEVICE_NAME_ARIA_DESCRIPTION}, - {"nearbyShareConfirmDeviceName", - IDS_SETTINGS_NEARBY_SHARE_CONFIRM_DEVICE_NAME}, - {"nearbyShareManageContactsLabel", - IDS_SETTINGS_NEARBY_SHARE_MANAGE_CONTACTS_LABEL}, - {"nearbyShareManageContactsRowTitle", - IDS_SETTINGS_NEARBY_SHARE_MANAGE_CONTACTS_ROW_TITLE}, - {"nearbyShareEditDataUsage", IDS_SETTINGS_NEARBY_SHARE_EDIT_DATA_USAGE}, - {"nearbyShareUpdateDataUsage", - IDS_SETTINGS_NEARBY_SHARE_UPDATE_DATA_USAGE}, - {"nearbyShareDataUsageDialogTitle", - IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_DIALOG_TITLE}, - {"nearbyShareDataUsageWifiOnlyLabel", - IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_WIFI_ONLY_LABEL}, - {"nearbyShareDataUsageWifiOnlyDescription", - IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_WIFI_ONLY_DESCRIPTION}, - {"nearbyShareDataUsageDataLabel", - IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_MOBILE_DATA_LABEL}, - {"nearbyShareDataUsageDataDescription", - IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_MOBILE_DATA_DESCRIPTION}, - {"nearbyShareDataUsageDataTooltip", - IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_MOBILE_DATA_TOOLTIP}, - {"nearbyShareDataUsageOfflineLabel", - IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_OFFLINE_LABEL}, - {"nearbyShareDataUsageOfflineDescription", - IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_OFFLINE_DESCRIPTION}, - {"nearbyShareDataUsageDataEditButtonDescription", - IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_EDIT_BUTTON_DATA_DESCRIPTION}, - {"nearbyShareDataUsageWifiOnlyEditButtonDescription", - IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_EDIT_BUTTON_WIFI_ONLY_DESCRIPTION}, - {"nearbyShareDataUsageOfflineEditButtonDescription", - IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_EDIT_BUTTON_OFFLINE_DESCRIPTION}, - {"nearbyShareContactVisibilityRowTitle", - IDS_SETTINGS_NEARBY_SHARE_CONTACT_VISIBILITY_ROW_TITLE}, - {"nearbyShareEditVisibility", IDS_SETTINGS_NEARBY_SHARE_EDIT_VISIBILITY}, - {"nearbyShareVisibilityDialogTitle", - IDS_SETTINGS_NEARBY_SHARE_VISIBILITY_DIALOG_TITLE}, - {"nearbyShareDescription", IDS_SETTINGS_NEARBY_SHARE_DESCRIPTION}, - {"nearbyShareHighVisibilityTitle", - IDS_SETTINGS_NEARBY_SHARE_HIGH_VISIBILITY_TITLE}, - {"nearbyShareHighVisibilityOn", - IDS_SETTINGS_NEARBY_SHARE_HIGH_VISIBILITY_ON}, - {"nearbyShareHighVisibilityOff", - IDS_SETTINGS_NEARBY_SHARE_HIGH_VISIBILITY_OFF}, - {"nearbyShareVisibilityDialogSave", - IDS_SETTINGS_NEARBY_SHARE_VISIBILITY_DIALOG_SAVE}}; - - html_source->AddLocalizedStrings(kLocalizedStrings); - - // To use lottie, the worker-src CSP needs to be updated for the web ui that - // is using it. Since as of now there are only a couple of webuis using - // lottie animations, this update has to be performed manually. As the usage - // increases, set this as the default so manual override is no longer - // required. - html_source->OverrideContentSecurityPolicy( - network::mojom::CSPDirectiveName::WorkerSrc, - "worker-src blob: chrome://resources 'self';"); -} -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - void AddSecureDnsStrings(content::WebUIDataSource* html_source) { #if BUILDFLAG(IS_CHROMEOS_ASH) const bool kIsRevampEnabled = @@ -368,10 +285,8 @@ void AddSecureDnsStrings(content::WebUIDataSource* html_source) { IDS_SETTINGS_SECURE_DNS_DISABLED_FOR_PARENTAL_CONTROL}, {"secureDnsAutomaticModeDescription", IDS_SETTINGS_AUTOMATIC_MODE_DESCRIPTION}, - {"secureDnsAutomaticModeDescriptionSecondary", - IDS_SETTINGS_AUTOMATIC_MODE_DESCRIPTION_SECONDARY}, - {"secureDnsSecureModeA11yLabel", - IDS_SETTINGS_SECURE_MODE_DESCRIPTION_ACCESSIBILITY_LABEL}, + {"secureDnsCustomProviderDescription", + IDS_SETTINGS_SECURE_DNS_CUSTOM_DESCRIPTION}, {"secureDnsDropdownA11yLabel", IDS_SETTINGS_SECURE_DNS_DROPDOWN_ACCESSIBILITY_LABEL}, {"secureDnsSecureDropdownModeDescription", diff --git a/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h b/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h index 302a8e22c3e..3d1f528cf87 100644 --- a/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h +++ b/chromium/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h @@ -29,11 +29,6 @@ void AddPasswordPromptDialogStrings(content::WebUIDataSource* html_source); // elements. void AddSharedSyncPageStrings(content::WebUIDataSource* html_source); -#if BUILDFLAG(IS_CHROMEOS_ASH) -// Adds load time data used by the <settings-nearby-share-subpage>. -void AddNearbyShareData(content::WebUIDataSource* html_source); -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - // Adds strings used by the <settings-secure-dns> element. void AddSecureDnsStrings(content::WebUIDataSource* html_source); } // namespace settings diff --git a/chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc b/chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc index 10bdd4b7852..5ad75538d4f 100644 --- a/chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc @@ -65,6 +65,7 @@ #include "chrome/common/url_constants.h" #include "chrome/grit/generated_resources.h" #include "components/browsing_data/content/browsing_data_model.h" +#include "components/browsing_data/core/features.h" #include "components/browsing_topics/browsing_topics_service.h" #include "components/content_settings/core/browser/cookie_settings.h" #include "components/content_settings/core/browser/website_settings_registry.h" @@ -99,6 +100,7 @@ #include "extensions/common/permissions/permissions_data.h" #include "services/network/public/cpp/is_potentially_trustworthy.h" #include "storage/common/file_system/file_system_util.h" +#include "third_party/abseil-cpp/absl/types/variant.h" #include "third_party/blink/public/common/page/page_zoom.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/text/bytes_formatting.h" @@ -269,7 +271,7 @@ void InsertOriginIntoGroup( SiteSettingsHandler::AllSitesMap* site_group_map, const url::Origin& origin, bool is_origin_with_cookies = false, - absl::optional<GroupingKey> partition_grouping_key = absl::nullopt) { + std::optional<GroupingKey> partition_grouping_key = std::nullopt) { const url::Origin& placeholder_origin = GetPlaceholderOrigin(); bool is_partitioned = partition_grouping_key.has_value(); GroupingKey grouping_key = partition_grouping_key.has_value() @@ -306,7 +308,9 @@ void InsertOriginIntoGroup( } } group->second.insert({origin, is_partitioned}); - auto placeholder = group->second.find({placeholder_origin, is_partitioned}); + // Find the placeholder with unpartitioned state as it's no longer needed. + auto placeholder = + group->second.find({placeholder_origin, /*is_partitioned=*/false}); if (placeholder != group->second.end()) { group->second.erase(placeholder); } @@ -379,7 +383,7 @@ void UpdateDataFromModel( std::map<url::Origin, int64_t>* origin_size_map, const url::Origin& origin, int64_t size, - absl::optional<GroupingKey> partition_grouping_key = absl::nullopt) { + std::optional<GroupingKey> partition_grouping_key = std::nullopt) { UpdateDataForOrigin(origin, size, origin_size_map); InsertOriginIntoGroup(all_sites_map, origin, /*is_origin_with_cookies=*/false, @@ -390,52 +394,6 @@ void LogAllSitesAction(AllSitesAction2 action) { UMA_HISTOGRAM_ENUMERATION("WebsiteSettings.AllSitesAction2", action); } -int GetNumCookieExceptionsOfTypes(HostContentSettingsMap* map, - const std::set<ContentSetting> types) { - ContentSettingsForOneType output = - map->GetSettingsForOneType(ContentSettingsType::COOKIES); - return base::ranges::count_if( - output, [types](const ContentSettingPatternSource setting) { - return types.count( - content_settings::ValueToContentSetting(setting.setting_value)); - }); -} - -std::string GetCookieSettingDescription(Profile* profile) { - HostContentSettingsMap* map = - HostContentSettingsMapFactory::GetForProfile(profile); - auto content_setting = - map->GetDefaultContentSetting(ContentSettingsType::COOKIES, nullptr); - - auto control_mode = static_cast<content_settings::CookieControlsMode>( - profile->GetPrefs()->GetInteger(prefs::kCookieControlsMode)); - - // Determine what the effective cookie setting is. These conditions are not - // mutually exclusive and rely on ordering. - if (content_setting == ContentSetting::CONTENT_SETTING_BLOCK) { - return l10n_util::GetPluralStringFUTF8( - IDS_SETTINGS_SITE_SETTINGS_COOKIES_BLOCK, - GetNumCookieExceptionsOfTypes( - map, {ContentSetting::CONTENT_SETTING_ALLOW, - ContentSetting::CONTENT_SETTING_SESSION_ONLY})); - } - switch (control_mode) { - case content_settings::CookieControlsMode::kBlockThirdParty: - return l10n_util::GetStringUTF8( - IDS_SETTINGS_SITE_SETTINGS_COOKIES_BLOCK_THIRD_PARTY); - case content_settings::CookieControlsMode::kIncognitoOnly: - return l10n_util::GetStringUTF8( - IDS_SETTINGS_SITE_SETTINGS_COOKIES_BLOCK_THIRD_PARTY_INCOGNITO); - case content_settings::CookieControlsMode::kOff: - // We do not make a distinction between allow and clear on exit. - return l10n_util::GetPluralStringFUTF8( - IDS_SETTINGS_SITE_SETTINGS_COOKIES_ALLOW, - GetNumCookieExceptionsOfTypes( - map, {ContentSetting::CONTENT_SETTING_BLOCK})); - } - NOTREACHED(); -} - // Removes all nodes from |model| which match |origin| and/or belong to // |grouping_key|. At least one of |origin| or |grouping_key| must be set. If // only |origin| is set, then unpartitioned storage for that origin is removed. @@ -444,11 +402,11 @@ std::string GetCookieSettingDescription(Profile* profile) { // removed. If both |origin| and |grouping_key| are set, then only storage for // |origin| partitioned by |grouping_key| is removed. void RemoveMatchingNodes(CookiesTreeModel* model, - absl::optional<url::Origin> origin, - absl::optional<GroupingKey> grouping_key) { + std::optional<url::Origin> origin, + std::optional<GroupingKey> grouping_key) { DCHECK(origin || grouping_key); - absl::optional<std::string> group_etld_plus1 = - grouping_key.has_value() ? grouping_key->GetEtldPlusOne() : absl::nullopt; + std::optional<std::string> group_etld_plus1 = + grouping_key.has_value() ? grouping_key->GetEtldPlusOne() : std::nullopt; std::vector<CookieTreeNode*> nodes_to_delete; for (const auto& host_node : model->GetRoot()->children()) { @@ -515,12 +473,18 @@ void RemoveMatchingNodes(CookiesTreeModel* model, model->DeleteCookieNode(node); } -// Returns the registable domain (eTLD+1) for the `origin`. If it doesn't exist, +// Returns the registrable domain (eTLD+1) for the `host`. If it doesn't exist, // returns the host. -std::string GetEtldPlusOne(const url::Origin& origin) { +std::string GetEtldPlusOneForHost(const std::string& host) { auto eltd_plus_one = net::registry_controlled_domains::GetDomainAndRegistry( - origin, net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); - return eltd_plus_one.empty() ? origin.host() : eltd_plus_one; + host, net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); + return eltd_plus_one.empty() ? host : eltd_plus_one; +} + +// Returns the registrable domain (eTLD+1) for the `origin`. If it doesn't +// exist, returns the host. +std::string GetEtldPlusOne(const url::Origin& origin) { + return GetEtldPlusOneForHost(origin.host()); } // Converts |etld_plus1| into an HTTPS SchemefulSite. @@ -530,18 +494,20 @@ net::SchemefulSite ConvertEtldToSchemefulSite(const std::string etld_plus1) { "/")); } -// Iterates over host nodes in `tree_model` which contains all sites that have -// storage set and uses them to retrieve first party set membership information. -// Returns a map of site eTLD+1 matched with their FPS owner and count of first -// party set members. +// Iterates over host nodes in `cookies_tree_model` and data owners in +// `browsing_data_model` which contains all sites that have storage set and uses +// them to retrieve first party set membership information. Returns a map of +// site eTLD+1 matched with their FPS owner and count of first party set +// members. std::map<std::string, std::pair<std::string, int>> GetFpsMap( PrivacySandboxService* privacy_sandbox_service, - CookiesTreeModel* tree_model) { + CookiesTreeModel* cookies_tree_model, + BrowsingDataModel* browsing_data_model) { // Used to count unique eTLD+1 owned by a FPS owner. std::map<std::string, std::set<std::string>> fps_owner_to_members; // Count members by unique eTLD+1 for each first party set. - for (const auto& host_node : tree_model->GetRoot()->children()) { + for (const auto& host_node : cookies_tree_model->GetRoot()->children()) { std::string etld_plus1 = GetEtldPlusOne(host_node->GetDetailedInfo().origin); auto schemeful_site = ConvertEtldToSchemefulSite(etld_plus1); @@ -552,6 +518,19 @@ std::map<std::string, std::pair<std::string, int>> GetFpsMap( } } + if (browsing_data_model) { + for (const auto& entry : *browsing_data_model) { + std::string etld_plus1 = GetEtldPlusOneForHost( + BrowsingDataModel::GetHost(entry.data_owner.get())); + auto schemeful_site = ConvertEtldToSchemefulSite(etld_plus1); + auto fps_owner = privacy_sandbox_service->GetFirstPartySetOwner( + schemeful_site.GetURL()); + if (fps_owner.has_value()) { + fps_owner_to_members[fps_owner->GetURL().host()].insert(etld_plus1); + } + } + } + // site eTLD+1 : {owner site eTLD+1, # of sites in that first party set} std::map<std::string, std::pair<std::string, int>> fps_map; for (auto fps : fps_owner_to_members) { @@ -584,11 +563,13 @@ void ConvertSiteGroupMapToList( const std::set<url::Origin>& origin_permission_set, base::Value::List* list_value, Profile* profile, - CookiesTreeModel* tree_model) { + CookiesTreeModel* tree_model, + BrowsingDataModel* browsing_data_model) { DCHECK(profile); auto* privacy_sandbox_service = PrivacySandboxServiceFactory::GetForProfile(profile); - auto fps_map = GetFpsMap(privacy_sandbox_service, tree_model); + auto fps_map = + GetFpsMap(privacy_sandbox_service, tree_model, browsing_data_model); base::flat_set<url::Origin> installed_origins = GetInstalledAppOrigins(profile); site_engagement::SiteEngagementService* engagement_service = @@ -599,8 +580,8 @@ void ConvertSiteGroupMapToList( site_group.Set(kGroupingKey, grouping_key.Serialize()); // eTLD+1 is the effective top level domain + 1. - absl::optional<std::string> etld_plus1 = grouping_key.GetEtldPlusOne(); - absl::optional<url::Origin> group_origin = grouping_key.GetOrigin(); + std::optional<std::string> etld_plus1 = grouping_key.GetEtldPlusOne(); + std::optional<url::Origin> group_origin = grouping_key.GetOrigin(); CHECK(etld_plus1 || group_origin); site_group.Set(site_settings::kDisplayName, etld_plus1.has_value() @@ -715,18 +696,18 @@ std::string GroupingKey::Serialize() const { value_); } -absl::optional<std::string> GroupingKey::GetEtldPlusOne() const { +std::optional<std::string> GroupingKey::GetEtldPlusOne() const { if (absl::holds_alternative<std::string>(value_)) { return absl::get<std::string>(value_); } - return absl::nullopt; + return std::nullopt; } -absl::optional<url::Origin> GroupingKey::GetOrigin() const { +std::optional<url::Origin> GroupingKey::GetOrigin() const { if (absl::holds_alternative<url::Origin>(value_)) { return absl::get<url::Origin>(value_); } - return absl::nullopt; + return std::nullopt; } url::Origin GroupingKey::ToOrigin() const { @@ -790,11 +771,6 @@ void SiteSettingsHandler::RegisterMessages() { base::BindRepeating(&SiteSettingsHandler::HandleGetCategoryList, base::Unretained(this))); web_ui()->RegisterMessageCallback( - "getCookieSettingDescription", - base::BindRepeating( - &SiteSettingsHandler::HandleGetCookieSettingDescription, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( "getRecentSitePermissions", base::BindRepeating(&SiteSettingsHandler::HandleGetRecentSitePermissions, base::Unretained(this))); @@ -928,12 +904,6 @@ void SiteSettingsHandler::OnJavascriptAllowed() { prefs::kBlockAutoplayEnabled, base::BindRepeating(&SiteSettingsHandler::SendBlockAutoplayStatus, base::Unretained(this))); - - // Listen for prefs that impact the effective cookie setting - pref_change_registrar_->Add( - prefs::kCookieControlsMode, - base::BindRepeating(&SiteSettingsHandler::SendCookieSettingDescription, - base::Unretained(this))); } void SiteSettingsHandler::OnJavascriptDisallowed() { @@ -941,7 +911,6 @@ void SiteSettingsHandler::OnJavascriptDisallowed() { chooser_observations_.RemoveAllObservations(); host_zoom_map_subscriptions_.clear(); pref_change_registrar_->Remove(prefs::kBlockAutoplayEnabled); - pref_change_registrar_->Remove(prefs::kCookieControlsMode); observed_profiles_.RemoveAllObservations(); } @@ -960,6 +929,7 @@ void SiteSettingsHandler::OnGetUsageInfo() { // the browsing data (hostname is insufficient) in CookieTreeModel or the new // BrowsingDataModel. std::string usage_hostname = GURL(usage_origin_).host(); + int num_cookies = 0; for (const auto& site : root->children()) { std::string title = base::UTF16ToUTF8(site->GetTitle()); if (title != usage_hostname) { @@ -971,7 +941,6 @@ void SiteSettingsHandler::OnGetUsageInfo() { // inspected. // TODO (crbug.com/1271155): This is slow, the replacement for the // CookiesTreeModel should improve this significantly. - int num_cookies = 0; for (const auto& site_child : site->children()) { if (site_child->GetDetailedInfo().node_type != CookieTreeNode::DetailedInfo::TYPE_COOKIES) { @@ -988,42 +957,47 @@ void SiteSettingsHandler::OnGetUsageInfo() { return !detailed_info.cookie->IsPartitioned(); }); } - if (num_cookies != 0) { - cookie_string = base::UTF16ToUTF8(l10n_util::GetPluralStringFUTF16( - IDS_SETTINGS_SITE_SETTINGS_NUM_COOKIES, num_cookies)); - } - - auto* privacy_sandbox_service = - PrivacySandboxServiceFactory::GetForProfile(profile_); - auto fps_map = - GetFpsMap(privacy_sandbox_service, cookies_tree_model_.get()); - auto etld_plus1 = GetEtldPlusOne(site->GetDetailedInfo().origin); - if (fps_map.count(etld_plus1)) { - fps_string = - base::UTF16ToUTF8(base::i18n::MessageFormatter::FormatWithNamedArgs( - l10n_util::GetStringUTF16( - IDS_SETTINGS_SITE_SETTINGS_FIRST_PARTY_SETS_MEMBERSHIP_LABEL), - "MEMBERS", static_cast<int>(fps_map[etld_plus1].second), - "FPS_OWNER", fps_map[etld_plus1].first)); - fpsPolicy = privacy_sandbox_service->IsPartOfManagedFirstPartySet( - ConvertEtldToSchemefulSite(etld_plus1)); - } break; } + auto usage_origin = url::Origin::Create(GURL(usage_origin_)); for (const BrowsingDataModel::BrowsingDataEntryView& entry : *browsing_data_model_) { - auto usage_origin = url::Origin::Create(GURL(usage_origin_)); if (!entry.Matches(usage_origin)) { continue; } size += entry.data_details->storage_size; + // Display only first party cookies. + if (!entry.GetThirdPartyPartitioningSite().has_value()) { + num_cookies += entry.data_details->cookie_count; + } + } + + if (num_cookies > 0) { + cookie_string = base::UTF16ToUTF8(l10n_util::GetPluralStringFUTF16( + IDS_SETTINGS_SITE_SETTINGS_NUM_COOKIES, num_cookies)); } if (size > 0) { usage_string = base::UTF16ToUTF8(ui::FormatBytes(size)); } + auto* privacy_sandbox_service = + PrivacySandboxServiceFactory::GetForProfile(profile_); + auto fps_map = GetFpsMap(privacy_sandbox_service, cookies_tree_model_.get(), + browsing_data_model_.get()); + auto etld_plus1 = GetEtldPlusOne(usage_origin); + if (fps_map.count(etld_plus1)) { + fps_string = + base::UTF16ToUTF8(base::i18n::MessageFormatter::FormatWithNamedArgs( + l10n_util::GetStringUTF16( + IDS_SETTINGS_SITE_SETTINGS_FIRST_PARTY_SETS_MEMBERSHIP_LABEL), + "MEMBERS", static_cast<int>(fps_map[etld_plus1].second), + "FPS_OWNER", fps_map[etld_plus1].first)); + fpsPolicy = privacy_sandbox_service->IsPartOfManagedFirstPartySet( + ConvertEtldToSchemefulSite(etld_plus1)); + } + FireWebUIListener("usage-total-changed", base::Value(usage_origin_), base::Value(usage_string), base::Value(cookie_string), base::Value(fps_string), base::Value(fpsPolicy)); @@ -1065,12 +1039,6 @@ void SiteSettingsHandler::OnContentSettingChanged( content_type == ContentSettingsType::SOUND) { SendBlockAutoplayStatus(); } - - // If the default cookie setting changed we should update the effective - // setting description. - if (content_type == ContentSettingsType::COOKIES) { - SendCookieSettingDescription(); - } } void SiteSettingsHandler::OnOffTheRecordProfileCreated( @@ -1086,7 +1054,7 @@ void SiteSettingsHandler::OnProfileWillBeDestroyed(Profile* profile) { } void SiteSettingsHandler::OnObjectPermissionChanged( - absl::optional<ContentSettingsType> guard_content_settings_type, + std::optional<ContentSettingsType> guard_content_settings_type, ContentSettingsType data_content_settings_type) { if (!guard_content_settings_type || !site_settings::HasRegisteredGroupName(*guard_content_settings_type) || @@ -1140,8 +1108,11 @@ void SiteSettingsHandler::HandleClearUnpartitionedUsage( if (origin.opaque()) return; AllowJavascript(); - DCHECK(cookies_tree_model_); - RemoveMatchingNodes(cookies_tree_model_.get(), origin, absl::nullopt); + if (!base::FeatureList::IsEnabled( + browsing_data::features::kDeprecateCookiesTreeModel)) { + DCHECK(cookies_tree_model_); + RemoveMatchingNodes(cookies_tree_model_.get(), origin, std::nullopt); + } // TODO(crbug.com/1368048) - Permission info loading before storage info // can result in an interleaving of actions that means this pointer is @@ -1170,12 +1141,15 @@ void SiteSettingsHandler::HandleClearUnpartitionedUsage( replacements.SetSchemeStr(url::kHttpsScheme); https_url = https_url.ReplaceComponents(replacements); auto https_origin = url::Origin::Create(https_url); - - // Also remove matching cookies node with HTTPS scheme if it exists to - // avoid confusion when cookies already exist when refreshing clear site - // data page. Notes: this also means HTTPS sites cookie will be cleared when - // user clear HTTP scheme Cookie. - RemoveMatchingNodes(cookies_tree_model_.get(), https_origin, absl::nullopt); + if (!base::FeatureList::IsEnabled( + browsing_data::features::kDeprecateCookiesTreeModel)) { + // Also remove matching cookies node with HTTPS scheme if it exists to + // avoid confusion when cookies already exist when refreshing clear site + // data page. Notes: this also means HTTPS sites cookie will be cleared + // when user clear HTTP scheme Cookie. + RemoveMatchingNodes(cookies_tree_model_.get(), https_origin, + std::nullopt); + } affected_origins.emplace_back(https_origin); } @@ -1187,23 +1161,23 @@ void SiteSettingsHandler::HandleClearPartitionedUsage( CHECK_EQ(2U, args.size()); auto origin = url::Origin::Create(GURL(args[0].GetString())); auto grouping_key = GroupingKey::Deserialize(args[1].GetString()); - - RemoveMatchingNodes(cookies_tree_model_.get(), origin, grouping_key); - absl::optional<std::string> group_etld_plus1 = grouping_key.GetEtldPlusOne(); + if (!base::FeatureList::IsEnabled( + browsing_data::features::kDeprecateCookiesTreeModel)) { + RemoveMatchingNodes(cookies_tree_model_.get(), origin, grouping_key); + } // The group key should always be an eTLD+1 because there aren't any // partitioned entries for IWAs (which have a non-eTLD+1 grouping key). + absl::optional<std::string> group_etld_plus1 = grouping_key.GetEtldPlusOne(); DCHECK(group_etld_plus1); net::SchemefulSite https_top_level_site( ConvertEtldToOrigin(*group_etld_plus1, true)); - browsing_data_model_->RemovePartitionedBrowsingData( origin.host(), https_top_level_site, base::DoNothing()); net::SchemefulSite http_top_level_site = net::SchemefulSite(ConvertEtldToOrigin(*group_etld_plus1, false)); - browsing_data_model_->RemovePartitionedBrowsingData( origin.host(), http_top_level_site, base::DoNothing()); } @@ -1347,7 +1321,8 @@ void SiteSettingsHandler::HandleGetAllSites(const base::Value::List& args) { // Respond with currently available data. ConvertSiteGroupMapToList(all_sites_map_, origin_permission_set_, &result, - profile, cookies_tree_model_.get()); + profile, cookies_tree_model_.get(), + browsing_data_model_.get()); LogAllSitesAction(AllSitesAction2::kLoadPage); @@ -1369,15 +1344,6 @@ void SiteSettingsHandler::HandleGetCategoryList(const base::Value::List& args) { ResolveJavascriptCallback(base::Value(callback_id), result); } -void SiteSettingsHandler::HandleGetCookieSettingDescription( - const base::Value::List& args) { - AllowJavascript(); - CHECK_EQ(1U, args.size()); - std::string callback_id = args[0].GetString(); - ResolveJavascriptCallback(base::Value(callback_id), - base::Value(GetCookieSettingDescription(profile_))); -} - void SiteSettingsHandler::HandleGetRecentSitePermissions( const base::Value::List& args) { AllowJavascript(); @@ -1427,14 +1393,15 @@ void SiteSettingsHandler::HandleGetRecentSitePermissions( base::Value::List SiteSettingsHandler::PopulateCookiesAndUsageData( Profile* profile) { std::map<url::Origin, int64_t> origin_size_map; - std::map<std::pair<std::string, absl::optional<std::string>>, int> + std::map<std::pair<std::string, std::optional<std::string>>, int> host_cookie_map; base::Value::List list_value; GetOriginStorage(&all_sites_map_, &origin_size_map); GetHostCookies(&all_sites_map_, &host_cookie_map); ConvertSiteGroupMapToList(all_sites_map_, origin_permission_set_, &list_value, - profile, cookies_tree_model_.get()); + profile, cookies_tree_model_.get(), + browsing_data_model_.get()); // Merge the origin usage and cookies number into |list_value|. for (base::Value& item : list_value) { @@ -1444,10 +1411,10 @@ base::Value::List SiteSettingsHandler::PopulateCookiesAndUsageData( auto grouping_key = GroupingKey::Deserialize(*site_group.FindString(kGroupingKey)); // Add the number of eTLD+1 scoped cookies. - absl::optional<std::string> etld_plus1 = grouping_key.GetEtldPlusOne(); + std::optional<std::string> etld_plus1 = grouping_key.GetEtldPlusOne(); if (etld_plus1.has_value()) { const auto& etld_plus1_cookie_num_it = - std::as_const(host_cookie_map).find({*etld_plus1, absl::nullopt}); + std::as_const(host_cookie_map).find({*etld_plus1, std::nullopt}); if (etld_plus1_cookie_num_it != host_cookie_map.end()) { cookie_num += etld_plus1_cookie_num_it->second; } @@ -1467,7 +1434,7 @@ base::Value::List SiteSettingsHandler::PopulateCookiesAndUsageData( } const auto& host_cookie_num_it = host_cookie_map.find( - {origin.host(), (is_partitioned ? etld_plus1 : absl::nullopt)}); + {origin.host(), (is_partitioned ? etld_plus1 : std::nullopt)}); if (host_cookie_num_it != host_cookie_map.end()) { origin_info.Set(kNumCookies, host_cookie_num_it->second); // Add cookies numbers for origins that aren't an eTLD+1. @@ -1653,8 +1620,8 @@ void SiteSettingsHandler::HandleGetFileSystemGrants( void SiteSettingsHandler::HandleRevokeFileSystemGrant( const base::Value::List& args) { - // TODO(crbug.com/1373962): Remove feature flag check after persisted - // permissions is fully launched. + // TODO(crbug.com/1467574): Remove `kFileSystemAccessPersistentPermissions` + // flag after FSA Persistent Permissions feature launch. DCHECK(base::FeatureList::IsEnabled( features::kFileSystemAccessPersistentPermissions)); CHECK_EQ(2U, args.size()); @@ -1675,8 +1642,8 @@ void SiteSettingsHandler::HandleRevokeFileSystemGrant( void SiteSettingsHandler::HandleRevokeFileSystemGrants( const base::Value::List& args) { - // TODO(crbug.com/1373962): Remove feature flag check after persisted - // permissions is fully launched. + // TODO(crbug.com/1467574): Remove `kFileSystemAccessPersistentPermissions` + // flag after FSA Persistent Permissions feature launch. DCHECK(base::FeatureList::IsEnabled( features::kFileSystemAccessPersistentPermissions)); @@ -1785,7 +1752,7 @@ void SiteSettingsHandler::HandleSetOriginPermissions( // permissions have been updated. // Info bar should only be shown on pages with the same origin and // on the same profile - for (auto* it : *BrowserList::GetInstance()) { + for (Browser* it : *BrowserList::GetInstance()) { TabStripModel* tab_strip = it->tab_strip_model(); for (int i = 0; i < tab_strip->count(); ++i) { content::WebContents* web_contents = tab_strip->GetWebContentsAt(i); @@ -2257,6 +2224,8 @@ void SiteSettingsHandler::ObserveSourcesForProfile(Profile* profile) { chooser_observations_.AddObservation(bluetooth_context); } + // TODO(crbug.com/1467574): Remove `kFileSystemAccessPersistentPermissions` + // flag after FSA Persistent Permissions feature launch. if (base::FeatureList::IsEnabled( features::kFileSystemAccessPersistentPermissions)) { auto* file_system_access_permission_context = @@ -2295,6 +2264,8 @@ void SiteSettingsHandler::StopObservingSourcesForProfile(Profile* profile) { chooser_observations_.RemoveObservation(bluetooth_context); } + // TODO(crbug.com/1467574): Remove `kFileSystemAccessPersistentPermissions` + // flag after FSA Persistent Permissions feature launch. if (base::FeatureList::IsEnabled( features::kFileSystemAccessPersistentPermissions)) { auto* file_system_access_permission_context = @@ -2342,7 +2313,7 @@ void SiteSettingsHandler::GetOriginStorage( // If the storage is partitioned on a third party we need to ensure the // grouping key matches the top-site and doesn't default to the origin // in the UI. - absl::optional<GroupingKey> partition_grouping_key = absl::nullopt; + std::optional<GroupingKey> partition_grouping_key = std::nullopt; auto third_party_partitioning_site = entry.GetThirdPartyPartitioningSite(); if (third_party_partitioning_site) { partition_grouping_key = GroupingKey::Create(url::Origin::Create( @@ -2356,8 +2327,36 @@ void SiteSettingsHandler::GetOriginStorage( void SiteSettingsHandler::GetHostCookies( AllSitesMap* all_sites_map, - std::map<std::pair<std::string, absl::optional<std::string>>, int>* + std::map<std::pair<std::string, std::optional<std::string>>, int>* host_cookie_map) { + if (base::FeatureList::IsEnabled( + browsing_data::features::kDeprecateCookiesTreeModel)) { + for (const auto& [owner, key, details] : *browsing_data_model_) { + const net::CanonicalCookie* cookie = + absl::get_if<net::CanonicalCookie>(&key.get()); + // Skip data keys that don't have cookies. + if (!cookie) { + continue; + } + absl::optional<std::string> partition_etld_plus1 = absl::nullopt; + absl::optional<GroupingKey> partition_grouping_key = absl::nullopt; + if (cookie->IsPartitioned()) { + partition_etld_plus1 = cookie->PartitionKey()->site().GetURL().host(); + partition_grouping_key = + GroupingKey::CreateFromEtldPlus1(*partition_etld_plus1); + } + + const auto owner_host = BrowsingDataModel::GetHost(owner.get()); + const auto origin = ConvertEtldToOrigin( + owner_host, + browsing_data::IsHttpsCookieSourceScheme(cookie->SourceScheme())); + InsertOriginIntoGroup(all_sites_map, origin, + /*is_origin_with_cookies=*/true, + partition_grouping_key); + (*host_cookie_map)[{owner_host, partition_etld_plus1}]++; + } + return; + } CHECK(cookies_tree_model_.get()); // Get sites that don't have data but have cookies. // TODO(crbug.com/1271155): Query the Browsing Data Model instead when cookie @@ -2383,8 +2382,8 @@ void SiteSettingsHandler::GetHostCookies( CookieTreeNode::DetailedInfo::TYPE_COOKIE); DCHECK(detailed_info.cookie); - absl::optional<std::string> partition_etld_plus1 = absl::nullopt; - absl::optional<GroupingKey> partition_grouping_key = absl::nullopt; + std::optional<std::string> partition_etld_plus1 = std::nullopt; + std::optional<GroupingKey> partition_grouping_key = std::nullopt; if (detailed_info.cookie->IsPartitioned()) { partition_etld_plus1 = detailed_info.cookie->PartitionKey()->site().GetURL().host(); @@ -2406,19 +2405,19 @@ void SiteSettingsHandler::HandleClearSiteGroupDataAndCookies( auto grouping_key = GroupingKey::Deserialize(args[0].GetString()); net::SchemefulSite https_top_level_site; net::SchemefulSite http_top_level_site; - if (absl::optional<std::string> etld_plus_one = + if (std::optional<std::string> etld_plus_one = grouping_key.GetEtldPlusOne()) { https_top_level_site = net::SchemefulSite(ConvertEtldToOrigin(*etld_plus_one, true)); http_top_level_site = net::SchemefulSite(ConvertEtldToOrigin(*etld_plus_one, false)); - } else if (absl::optional<url::Origin> origin = grouping_key.GetOrigin()) { + } else if (std::optional<url::Origin> origin = grouping_key.GetOrigin()) { https_top_level_site = net::SchemefulSite(*origin); http_top_level_site = net::SchemefulSite(*origin); } AllowJavascript(); - RemoveMatchingNodes(cookies_tree_model_.get(), absl::nullopt, grouping_key); + RemoveMatchingNodes(cookies_tree_model_.get(), std::nullopt, grouping_key); // Retrieve all of the origin entries grouped under this group. std::vector<url::Origin> affected_origins; @@ -2518,6 +2517,14 @@ void SiteSettingsHandler::RemoveNonModelData( ->SetWebsiteSettingDefaultScope( origin.GetURL(), GURL(), ContentSettingsType::REDUCED_ACCEPT_LANGUAGE, base::Value()); + // Once user clears site setting data for `origins`, the Durable storage bit + // should also be reset. + // TODO(crbug.com/1499305): This should be replaced when integrated with + // the BrowserDataModel. + HostContentSettingsMapFactory::GetForProfile(profile_) + ->SetWebsiteSettingDefaultScope(origin.GetURL(), GURL(), + ContentSettingsType::DURABLE_STORAGE, + base::Value()); } #if BUILDFLAG(IS_WIN) @@ -2565,11 +2572,6 @@ BrowsingDataModel* SiteSettingsHandler::GetBrowsingDataModelForTesting() { return browsing_data_model_.get(); } -void SiteSettingsHandler::SendCookieSettingDescription() { - FireWebUIListener("cookieSettingDescriptionChanged", - base::Value(GetCookieSettingDescription(profile_))); -} - // Dictionary keys for an individual `FileSystemPermissionGrant`. // Schema (per grant): // { @@ -2598,8 +2600,8 @@ void SiteSettingsHandler::SendCookieSettingDescription() { base::Value::List SiteSettingsHandler::PopulateFileSystemGrantData() { base::Value::List grants; - // TODO(crbug.com/1373962): Remove feature flag check after persisted - // permissions is fully launched. + // TODO(crbug.com/1467574): Remove `kFileSystemAccessPersistentPermissions` + // flag after FSA Persistent Permissions feature launch. if (!base::FeatureList::IsEnabled( features::kFileSystemAccessPersistentPermissions)) { return grants; diff --git a/chromium/chrome/browser/ui/webui/settings/site_settings_handler.h b/chromium/chrome/browser/ui/webui/settings/site_settings_handler.h index 68042895eb1..cd8a9d673ee 100644 --- a/chromium/chrome/browser/ui/webui/settings/site_settings_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/site_settings_handler.h @@ -7,6 +7,7 @@ #include <map> #include <memory> +#include <optional> #include <set> #include <string> #include <vector> @@ -27,7 +28,6 @@ #include "components/prefs/pref_store.h" #include "content/public/browser/host_zoom_map.h" #include "ppapi/buildflags/buildflags.h" -#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/abseil-cpp/absl/types/variant.h" #include "url/origin.h" @@ -61,11 +61,11 @@ class SiteSettingsHandler // Returns the eTLD+1 that this GroupingKey represents, or nullopt if it // doesn't represent an eTLD+1. - absl::optional<std::string> GetEtldPlusOne() const; + std::optional<std::string> GetEtldPlusOne() const; // Returns the origin that this GroupingKey represents, or nullopt if it // doesn't represent an origin. - absl::optional<url::Origin> GetOrigin() const; + std::optional<url::Origin> GetOrigin() const; bool operator<(const GroupingKey& other) const; @@ -115,7 +115,7 @@ class SiteSettingsHandler // ObjectPermissionContextBase::PermissionObserver implementation: void OnObjectPermissionChanged( - absl::optional<ContentSettingsType> guard_content_settings_type, + std::optional<ContentSettingsType> guard_content_settings_type, ContentSettingsType data_content_settings_type) override; void OnZoomLevelChanged(const content::HostZoomMap::ZoomLevelChange& change); @@ -144,9 +144,6 @@ class SiteSettingsHandler // the front end when fetching finished. void HandleGetAllSites(const base::Value::List& args); - // Returns a string for display describing the current cookie settings. - void HandleGetCookieSettingDescription(const base::Value::List& args); - // Returns a list containing the most recent permission changes for the // content types that are visiblein settings, grouped by origin/profile // (incognito, regular) combinations, limited to N origin/profile pairings. @@ -255,7 +252,7 @@ class SiteSettingsHandler // stores the information in the |all_sites_map| and |host_cookie_map|. void GetHostCookies( AllSitesMap* all_sites_map, - std::map<std::pair<std::string, absl::optional<std::string>>, int>* + std::map<std::pair<std::string, std::optional<std::string>>, int>* host_cookie_map); // Returns a list of content settings types that are controlled via a standard @@ -293,10 +290,6 @@ class SiteSettingsHandler // CookiesTreeModel is deprecated. void RemoveNonModelData(const std::vector<url::Origin>& origins); - // Notifies the JS side the effective cookies setting has changed and - // provides the updated description label for display. - void SendCookieSettingDescription(); - // Returns a dictionary containing the lists of the allowed permission // grant objects granted via the File System Access API, per origin. base::Value::List PopulateFileSystemGrantData(); diff --git a/chromium/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc index 51b309fdd91..ca5ae214304 100644 --- a/chromium/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc +++ b/chromium/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc @@ -5,6 +5,7 @@ #include "chrome/browser/ui/webui/settings/site_settings_handler.h" #include <memory> +#include <optional> #include <string> #include <tuple> #include <utility> @@ -74,6 +75,7 @@ #include "components/browsing_data/content/fake_browsing_data_model.h" #include "components/browsing_data/content/mock_cookie_helper.h" #include "components/browsing_data/content/mock_local_storage_helper.h" +#include "components/browsing_data/core/features.h" #include "components/browsing_topics/browsing_topics_service.h" #include "components/browsing_topics/test_util.h" #include "components/client_hints/common/client_hints.h" @@ -124,7 +126,6 @@ #include "services/device/public/mojom/serial.mojom.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/storage_key/storage_key.h" #include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom.h" #include "ui/base/l10n/l10n_util.h" @@ -265,10 +266,32 @@ void RegisterWebApp(Profile* profile, apps::AppPtr app) { /*should_notify_initialized=*/true); } +std::unique_ptr<net::CanonicalCookie> CreateCookieKey( + const GURL& url, + const std::string& cookie_line, + absl::optional<net::CookiePartitionKey> cookie_partition_key = + absl::nullopt) { + return net::CanonicalCookie::Create(url, cookie_line, base::Time::Now(), + absl::nullopt /* server_time */, + cookie_partition_key); +} + +void RemoveModelEntries( + std::vector<browsing_data_model_test_util::BrowsingDataEntry>& + model_entries, + const std::vector<browsing_data_model_test_util::BrowsingDataEntry>& + entries_to_remove) { + for (const auto& entry : entries_to_remove) { + model_entries.erase( + std::remove(model_entries.begin(), model_entries.end(), entry), + model_entries.end()); + } +} + struct TestModels { scoped_refptr<browsing_data::MockCookieHelper> cookie_helper; scoped_refptr<browsing_data::MockLocalStorageHelper> local_storage_helper; - const raw_ref<FakeBrowsingDataModel, ExperimentalAsh> browsing_data_model; + const raw_ref<FakeBrowsingDataModel> browsing_data_model; }; } // namespace @@ -404,14 +427,14 @@ class SiteSettingsHandlerBaseTest : public testing::Test { const base::Value* event_data = data.arg2(); ASSERT_TRUE(event_data->is_dict()); - absl::optional<bool> enabled = event_data->GetDict().FindBool("enabled"); + std::optional<bool> enabled = event_data->GetDict().FindBool("enabled"); ASSERT_TRUE(enabled.has_value()); EXPECT_EQ(expected_enabled, *enabled); const base::Value::Dict* pref_data = event_data->GetDict().FindDict("pref"); ASSERT_TRUE(pref_data); - absl::optional<bool> value = pref_data->FindBool("value"); + std::optional<bool> value = pref_data->FindBool("value"); ASSERT_TRUE(value.has_value()); EXPECT_EQ(expected_value, *value); } @@ -566,7 +589,7 @@ class SiteSettingsHandlerBaseTest : public testing::Test { // exceptions. const auto* description = exception.FindString(site_settings::kDescription); ASSERT_FALSE(description); - absl::optional<bool> incognito = + std::optional<bool> incognito = exception.FindBool(site_settings::kIncognito); ASSERT_FALSE(incognito.has_value()); @@ -616,7 +639,7 @@ class SiteSettingsHandlerBaseTest : public testing::Test { ASSERT_EQ(expected_embedding_exception.embedding_display_name, *embedding_display_name); - absl::optional<bool> incognito = + std::optional<bool> incognito = embedding_exception.FindBool(site_settings::kIncognito); ASSERT_TRUE(incognito.has_value()); EXPECT_EQ(expected_embedding_exception.incognito, *incognito); @@ -681,7 +704,7 @@ class SiteSettingsHandlerBaseTest : public testing::Test { ASSERT_EQ(content_settings::ContentSettingToString(expected_setting), *setting); - absl::optional<bool> incognito = + std::optional<bool> incognito = exception.FindBool(site_settings::kIncognito); ASSERT_TRUE(incognito.has_value()); EXPECT_EQ(expected_incognito, *incognito); @@ -726,7 +749,7 @@ class SiteSettingsHandlerBaseTest : public testing::Test { const base::Value* result = data.arg3(); ASSERT_TRUE(result->is_dict()); - absl::optional<bool> valid = result->GetDict().FindBool("isValid"); + std::optional<bool> valid = result->GetDict().FindBool("isValid"); ASSERT_TRUE(valid.has_value()); EXPECT_EQ(expected_validity, *valid); @@ -863,10 +886,9 @@ class SiteSettingsHandlerBaseTest : public testing::Test { auto fake_browsing_data_model = std::make_unique<FakeBrowsingDataModel>( ChromeBrowsingDataModelDelegate::CreateForProfile(profile())); - std::move(setup).Run( - {mock_browsing_data_cookie_helper, - mock_browsing_data_local_storage_helper, - ToRawRef<ExperimentalAsh>(*fake_browsing_data_model)}); + std::move(setup).Run({mock_browsing_data_cookie_helper, + mock_browsing_data_local_storage_helper, + ToRawRef(*fake_browsing_data_model)}); mock_browsing_data_local_storage_helper->Notify(); mock_browsing_data_cookie_helper->Notify(); @@ -879,56 +901,79 @@ class SiteSettingsHandlerBaseTest : public testing::Test { // storage nodes, will update all other nodes in the future. void SetupModels() { SetupModels(base::BindLambdaForTesting([this](const TestModels& models) { - models.local_storage_helper->AddLocalStorageForStorageKey( - blink::StorageKey::CreateFromStringForTesting( - "https://www.example.com/"), - 2); - - models.cookie_helper->AddCookieSamples(GURL("http://example.com"), "A=1"); - models.cookie_helper->AddCookieSamples(GURL("https://www.example.com/"), - "B=1"); - models.cookie_helper->AddCookieSamples(GURL("http://abc.example.com"), - "C=1"); - models.cookie_helper->AddCookieSamples(GURL("http://google.com"), "A=1"); - models.cookie_helper->AddCookieSamples(GURL("http://google.com"), "B=1"); - models.cookie_helper->AddCookieSamples(GURL("http://google.com.au"), - "A=1"); - - models.cookie_helper->AddCookieSamples( - GURL("https://www.example.com"), - "__Host-A=1; Path=/; Partitioned; Secure;", - net::CookiePartitionKey::FromURLForTesting( - GURL("https://google.com.au"))); - models.cookie_helper->AddCookieSamples( - GURL("https://google.com.au"), - "__Host-A=1; Path=/; Partitioned; Secure;", - net::CookiePartitionKey::FromURLForTesting( - GURL("https://google.com.au"))); - models.cookie_helper->AddCookieSamples( - GURL("https://www.another-example.com"), - "__Host-A=1; Path=/; Partitioned; Secure;", - net::CookiePartitionKey::FromURLForTesting( - GURL("https://google.com.au"))); - models.cookie_helper->AddCookieSamples( - GURL("https://www.example.com"), - "__Host-A=1; Path=/; Partitioned; Secure;", - net::CookiePartitionKey::FromURLForTesting( - GURL("https://google.com"))); - - // Add an entry which will not be grouped with any other entries. This - // will require a placeholder origin to be correctly added & removed. - models.cookie_helper->AddCookieSamples(GURL("http://ungrouped.com"), - "A=1"); - - const auto browsing_data_model_entries = { - kGoogleUnpartitionedEntry, kExampleUnpartitionedEntry, - kGoogleOnExampleEntry, kExampleOnGoogleSecureEntry, - kExampleOnGoogleInsecureEntry}; + std::vector<browsing_data_model_test_util::BrowsingDataEntry> + browsing_data_model_entries = { + kGoogleUnpartitionedEntry, kExampleUnpartitionedEntry, + kGoogleOnExampleEntry, kExampleOnGoogleSecureEntry, + kExampleOnGoogleInsecureEntry}; + if (base::FeatureList::IsEnabled( + browsing_data::features::kDeprecateCookiesTreeModel)) { + browsing_data_model_entries.insert( + browsing_data_model_entries.end(), + { + kExampleLocalStorage, + kHttpExampleCookie, + kHttpsWwwExampleCookie, + kPartitionedHttpsWwwExampleOnGoogleAuCookie, + kPartitionedHttpsWwwExampleOnGoogleCookie, + kHttpAbcExampleCookie, + kHttpGoogleCookieA, + kHttpGoogleCookieB, + kHttpGoogleAuCookie, + kPartitionedHttpsGoogleAu1PCookie, + kPartitionedHttpsWwwAnotherExampleOnGoogleAuCookie, + kUngroupedHttpCookie, + }); + } else { + models.local_storage_helper->AddLocalStorageForStorageKey( + blink::StorageKey::CreateFromStringForTesting( + "https://www.example.com/"), + 2); + + models.cookie_helper->AddCookieSamples(GURL("http://example.com"), + "A=1"); + models.cookie_helper->AddCookieSamples(GURL("https://www.example.com/"), + "B=1"); + models.cookie_helper->AddCookieSamples(GURL("http://abc.example.com"), + "C=1"); + models.cookie_helper->AddCookieSamples(GURL("http://google.com"), + "A=1"); + models.cookie_helper->AddCookieSamples(GURL("http://google.com"), + "B=1"); + models.cookie_helper->AddCookieSamples(GURL("http://google.com.au"), + "A=1"); + + models.cookie_helper->AddCookieSamples( + GURL("https://www.example.com"), + "__Host-A=1; Path=/; Partitioned; Secure;", + net::CookiePartitionKey::FromURLForTesting( + GURL("https://google.com.au"))); + models.cookie_helper->AddCookieSamples( + GURL("https://google.com.au"), + "__Host-A=1; Path=/; Partitioned; Secure;", + net::CookiePartitionKey::FromURLForTesting( + GURL("https://google.com.au"))); + models.cookie_helper->AddCookieSamples( + GURL("https://www.another-example.com"), + "__Host-A=1; Path=/; Partitioned; Secure;", + net::CookiePartitionKey::FromURLForTesting( + GURL("https://google.com.au"))); + models.cookie_helper->AddCookieSamples( + GURL("https://www.example.com"), + "__Host-A=1; Path=/; Partitioned; Secure;", + net::CookiePartitionKey::FromURLForTesting( + GURL("https://google.com"))); + + // Add an entry which will not be grouped with any other entries. This + // will require a placeholder origin to be correctly added & removed. + models.cookie_helper->AddCookieSamples(GURL("http://ungrouped.com"), + "A=1"); + } for (const auto& entry : browsing_data_model_entries) { models.browsing_data_model->AddBrowsingData( entry.data_key, *(entry.data_details.storage_types.begin()), - entry.data_details.storage_size); + entry.data_details.storage_size, entry.data_details.cookie_count); } })); } @@ -971,13 +1016,13 @@ class SiteSettingsHandlerBaseTest : public testing::Test { void SetupDefaultFirstPartySets(MockPrivacySandboxService* mock_service) { EXPECT_CALL(*mock_service, GetFirstPartySetOwner(_)) .WillRepeatedly( - [&](const GURL& url) -> absl::optional<net::SchemefulSite> { + [&](const GURL& url) -> std::optional<net::SchemefulSite> { auto first_party_sets = GetTestFirstPartySets(); if (first_party_sets.count(net::SchemefulSite(url))) { return first_party_sets[net::SchemefulSite(url)]; } - return absl::nullopt; + return std::nullopt; }); } @@ -1047,9 +1092,13 @@ class SiteSettingsHandlerBaseTest : public testing::Test { const ContentSettingsType kPermissionStorageAccess = ContentSettingsType::STORAGE_ACCESS; - // The number of listeners that are expected to fire when any content setting - // is changed. - const size_t kNumberContentSettingListeners = 2; + // The number of listeners that are expected to fire when notification content + // setting is changed. + const size_t kNumberNotificationsContentSettingListeners = 2; + + // The number of listeners that are expected to fire when cookies content + // setting is changed. + const size_t kNumberCookiesContentSettingListeners = 1; // Browsing data model constants. Here, instead of in the anon namespace, to // avoid static GURL creation. @@ -1093,6 +1142,106 @@ class SiteSettingsHandlerBaseTest : public testing::Test { /*third_party_partitioning_allowed=*/true), {{BrowsingDataModel::StorageType::kQuotaStorage}, 100, 0}}; + const browsing_data_model_test_util::BrowsingDataEntry kHttpExampleCookie{ + "example.com", + *(CreateCookieKey(GURL("http://example.com"), "A=1")), + {{BrowsingDataModel::StorageType::kCookie}, + /*storage_size=*/0, + /*cookie_count=*/1}}; + + const browsing_data_model_test_util::BrowsingDataEntry kExampleLocalStorage{ + "www.example.com", + blink::StorageKey::CreateFromStringForTesting("https://www.example.com/"), + {{BrowsingDataModel::StorageType::kLocalStorage}, + /*storage_size=*/2, + /*cookie_count=*/0}}; + + const browsing_data_model_test_util::BrowsingDataEntry kHttpsWwwExampleCookie{ + "www.example.com", + *(CreateCookieKey(GURL("https://www.example.com"), "B=1")), + {{BrowsingDataModel::StorageType::kCookie}, + /*storage_size=*/0, + /*cookie_count=*/1}}; + + const browsing_data_model_test_util::BrowsingDataEntry + kPartitionedHttpsWwwExampleOnGoogleAuCookie{ + "www.example.com", + *(CreateCookieKey(GURL("https://www.example.com"), + "__Host-A=1; Path=/; Partitioned; Secure;", + net::CookiePartitionKey::FromURLForTesting( + GURL("https://google.com.au")))), + {{BrowsingDataModel::StorageType::kCookie}, + /*storage_size=*/0, + /*cookie_count=*/1}}; + + const browsing_data_model_test_util::BrowsingDataEntry + kPartitionedHttpsWwwExampleOnGoogleCookie{ + "www.example.com", + *(CreateCookieKey(GURL("https://www.example.com"), + "__Host-A=1; Path=/; Partitioned; Secure;", + net::CookiePartitionKey::FromURLForTesting( + GURL("https://google.com")))), + {{BrowsingDataModel::StorageType::kCookie}, + /*storage_size=*/0, + /*cookie_count=*/1}}; + + const browsing_data_model_test_util::BrowsingDataEntry kHttpAbcExampleCookie{ + "abc.example.com", + *(CreateCookieKey(GURL("http://abc.example.com"), "C=1")), + {{BrowsingDataModel::StorageType::kCookie}, + /*storage_size=*/0, + /*cookie_count=*/1}}; + + const browsing_data_model_test_util::BrowsingDataEntry kHttpGoogleCookieA{ + "google.com", + *(CreateCookieKey(GURL("http://google.com"), "A=1")), + {{BrowsingDataModel::StorageType::kCookie}, + /*storage_size=*/0, + /*cookie_count=*/1}}; + + const browsing_data_model_test_util::BrowsingDataEntry kHttpGoogleCookieB{ + "google.com", + *(CreateCookieKey(GURL("http://google.com"), "B=1")), + {{BrowsingDataModel::StorageType::kCookie}, + /*storage_size=*/0, + /*cookie_count=*/1}}; + + const browsing_data_model_test_util::BrowsingDataEntry kHttpGoogleAuCookie{ + "google.com.au", + *(CreateCookieKey(GURL("http://google.com.au"), "A=1")), + {{BrowsingDataModel::StorageType::kCookie}, + /*storage_size=*/0, + /*cookie_count=*/1}}; + + const browsing_data_model_test_util::BrowsingDataEntry + kPartitionedHttpsGoogleAu1PCookie{ + "google.com.au", + *(CreateCookieKey(GURL("https://google.com.au"), + "__Host-A=1; Path=/; Partitioned; Secure;", + net::CookiePartitionKey::FromURLForTesting( + GURL("https://google.com.au")))), + {{BrowsingDataModel::StorageType::kCookie}, + /*storage_size=*/0, + /*cookie_count=*/1}}; + + const browsing_data_model_test_util::BrowsingDataEntry + kPartitionedHttpsWwwAnotherExampleOnGoogleAuCookie{ + "www.another-example.com", + *(CreateCookieKey(GURL("https://www.another-example.com"), + "__Host-A=1; Path=/; Partitioned; Secure;", + net::CookiePartitionKey::FromURLForTesting( + GURL("https://google.com.au")))), + {{BrowsingDataModel::StorageType::kCookie}, + /*storage_size=*/0, + /*cookie_count=*/1}}; + + const browsing_data_model_test_util::BrowsingDataEntry kUngroupedHttpCookie{ + "ungrouped.com", + *(CreateCookieKey(GURL("http://ungrouped.com"), "A=1")), + {{BrowsingDataModel::StorageType::kCookie}, + /*storage_size=*/0, + /*cookie_count=*/1}}; + private: content::BrowserTaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; @@ -1109,15 +1258,212 @@ class SiteSettingsHandlerBaseTest : public testing::Test { raw_ptr<MockPrivacySandboxService> mock_privacy_sandbox_service_; }; +class SiteSettingsHandlerSchemeTest + : public SiteSettingsHandlerBaseTest, + public testing::WithParamInterface<std::tuple<bool, bool>> { + public: + SiteSettingsHandlerSchemeTest() { + if (IsDeprecateCookiesTreeModelEnabled()) { + feature_list_.InitAndEnableFeature( + browsing_data::features::kDeprecateCookiesTreeModel); + } else { + feature_list_.InitAndDisableFeature( + browsing_data::features::kDeprecateCookiesTreeModel); + } + } + + protected: + bool IsHttps() { return std::get<0>(GetParam()); } + bool IsDeprecateCookiesTreeModelEnabled() { return std::get<1>(GetParam()); } + + private: + base::test::ScopedFeatureList feature_list_; +}; + +// 1.True if testing for handle clear unpartitioned usage with +// HTTPS scheme URL. When set to true, the tests use HTTPS scheme as origin. +// When set to false, the tests use HTTP scheme as origin. +// 2. Boolean to enable/disable the `kDeprecateCookiesTreeModel` feature. +INSTANTIATE_TEST_SUITE_P(All, + SiteSettingsHandlerSchemeTest, + testing::Combine(testing::Bool(), testing::Bool())); + +TEST_P(SiteSettingsHandlerSchemeTest, StorageAccessExceptions_Description_All) { + const std::string kOrigin("google.com"); + const std::string kEmbeddingOrigin("example.com"); + + const ContentSetting content_setting = + IsHttps() ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; + + SetContentSettingCustomScope(kOrigin, kEmbeddingOrigin, + kPermissionStorageAccess, content_setting); + + base::Value::List get_exception_list_args; + get_exception_list_args.Append(kCallbackId); + get_exception_list_args.Append( + content_settings::ContentSettingToString(content_setting)); + handler()->HandleGetStorageAccessExceptionList(get_exception_list_args); + + // Verify that the grouped exception is correct. + ValidateStorageAccessList(/*expected_total_calls=*/2U, + /*expected_num_groups=*/1U); + + ValidateStorageAccessException( + kOrigin, kOrigin, content_setting, + {{kEmbeddingOrigin, kEmbeddingOrigin, /*incognito=*/false}}); +} + +TEST_P(SiteSettingsHandlerSchemeTest, HandleClearUnpartitionedUsage) { + SetupModels(); + std::vector<browsing_data_model_test_util::BrowsingDataEntry> + expected_browsing_data_model_entries; + if (IsDeprecateCookiesTreeModelEnabled()) { + expected_browsing_data_model_entries = { + kGoogleUnpartitionedEntry, + kExampleUnpartitionedEntry, + kGoogleOnExampleEntry, + kExampleOnGoogleSecureEntry, + kExampleOnGoogleInsecureEntry, + kExampleLocalStorage, + kHttpExampleCookie, + kHttpsWwwExampleCookie, + kPartitionedHttpsWwwExampleOnGoogleAuCookie, + kPartitionedHttpsWwwExampleOnGoogleCookie, + kHttpAbcExampleCookie, + kHttpGoogleCookieA, + kHttpGoogleCookieB, + kHttpGoogleAuCookie, + kPartitionedHttpsGoogleAu1PCookie, + kPartitionedHttpsWwwAnotherExampleOnGoogleAuCookie, + kUngroupedHttpCookie, + }; + browsing_data_model_test_util::ValidateBrowsingDataEntries( + handler()->GetBrowsingDataModelForTesting(), + expected_browsing_data_model_entries); + } else { + EXPECT_EQ(28u, handler() + ->GetCookiesTreeModelForTesting() + ->GetRoot() + ->GetTotalNodeCount()); + expected_browsing_data_model_entries = { + kGoogleUnpartitionedEntry, kExampleUnpartitionedEntry, + kGoogleOnExampleEntry, kExampleOnGoogleSecureEntry, + kExampleOnGoogleInsecureEntry, + }; + browsing_data_model_test_util::ValidateBrowsingDataEntries( + handler()->GetBrowsingDataModelForTesting(), + expected_browsing_data_model_entries); + } + + base::Value::List args; + args.Append(IsHttps() ? "https://www.example.com/" + : "http://www.example.com/"); + handler()->HandleClearUnpartitionedUsage(args); + + // Confirm that only the unpartitioned items for example.com have been + // cleared. + if (IsDeprecateCookiesTreeModelEnabled()) { + RemoveModelEntries(expected_browsing_data_model_entries, + { + kExampleUnpartitionedEntry, + kExampleLocalStorage, + kHttpsWwwExampleCookie, + }); + browsing_data_model_test_util::ValidateBrowsingDataEntries( + handler()->GetBrowsingDataModelForTesting(), + expected_browsing_data_model_entries); + } else { + RemoveModelEntries(expected_browsing_data_model_entries, + { + kExampleUnpartitionedEntry, + }); + browsing_data_model_test_util::ValidateBrowsingDataEntries( + handler()->GetBrowsingDataModelForTesting(), + expected_browsing_data_model_entries); + + auto remaining_host_nodes = GetHostNodes(GURL("https://www.example.com")); + + // There should only be partitioned cookie entries remaining for the site. + ASSERT_EQ(1u, remaining_host_nodes.size()); + ASSERT_EQ(1u, remaining_host_nodes[0]->children().size()); + const auto& storage_node = remaining_host_nodes[0]->children()[0]; + ASSERT_EQ(CookieTreeNode::DetailedInfo::TYPE_COOKIES, + storage_node->GetDetailedInfo().node_type); + ASSERT_EQ(2u, storage_node->children().size()); + for (const auto& cookie_node : storage_node->children()) { + const auto& cookie = cookie_node->GetDetailedInfo().cookie; + EXPECT_EQ("www.example.com", cookie->Domain()); + EXPECT_TRUE(cookie->IsPartitioned()); + } + } + + args = base::Value::List(); + args.Append("https://google.com.au/"); + handler()->HandleClearUnpartitionedUsage(args); + + if (IsDeprecateCookiesTreeModelEnabled()) { + // First-party partitioned storage should be cleared. + RemoveModelEntries(expected_browsing_data_model_entries, + { + kHttpGoogleAuCookie, + kPartitionedHttpsGoogleAu1PCookie, + }); + browsing_data_model_test_util::ValidateBrowsingDataEntries( + handler()->GetBrowsingDataModelForTesting(), + expected_browsing_data_model_entries); + } else { + // Partitioned storage, even when keyed on the cookie domain site, should + // not be cleared. + auto remaining_host_nodes = GetHostNodes(GURL("https://google.com.au")); + + // A single partitioned cookie should remain. + ASSERT_EQ(1u, remaining_host_nodes.size()); + ASSERT_EQ(1u, remaining_host_nodes[0]->children().size()); + const auto& cookies_node = remaining_host_nodes[0]->children()[0]; + ASSERT_EQ(1u, cookies_node->children().size()); + const auto& cookie_node = cookies_node->children()[0]; + const auto& cookie = cookie_node->GetDetailedInfo().cookie; + EXPECT_TRUE(cookie->IsPartitioned()); + } + + args = base::Value::List(); + args.Append("https://www.google.com/"); + handler()->HandleClearUnpartitionedUsage(args); + + // The unpartitioned Google and Example entries should be removed. + RemoveModelEntries(expected_browsing_data_model_entries, + { + kGoogleUnpartitionedEntry, + }); + browsing_data_model_test_util::ValidateBrowsingDataEntries( + handler()->GetBrowsingDataModelForTesting(), + expected_browsing_data_model_entries); +} + class SiteSettingsHandlerTest : public SiteSettingsHandlerBaseTest, - public testing::WithParamInterface<bool> {}; + public testing::WithParamInterface<bool> { + public: + SiteSettingsHandlerTest() { + if (IsDeprecateCookiesTreeModelEnabled()) { + feature_list_.InitAndEnableFeature( + browsing_data::features::kDeprecateCookiesTreeModel); + } else { + feature_list_.InitAndDisableFeature( + browsing_data::features::kDeprecateCookiesTreeModel); + } + } + + protected: + bool IsDeprecateCookiesTreeModelEnabled() { return GetParam(); } + + private: + base::test::ScopedFeatureList feature_list_; +}; -// True if testing for handle clear unpartitioned usage with HTTPS scheme URL. -// When set to true, the tests use HTTPS scheme as origin. When set to -// false, the tests use HTTP scheme as origin. +// Boolean to enable/disable the `kDeprecateCookiesTreeModel` feature. INSTANTIATE_TEST_SUITE_P(All, SiteSettingsHandlerTest, testing::Bool()); -TEST_F(SiteSettingsHandlerTest, GetAndSetDefault) { +TEST_P(SiteSettingsHandlerTest, GetAndSetDefault) { // Test the JS -> C++ -> JS callback path for getting and setting defaults. base::Value::List get_args; get_args.Append(kCallbackId); @@ -1142,7 +1488,7 @@ TEST_F(SiteSettingsHandlerTest, GetAndSetDefault) { } // Flaky on CrOS and Linux. https://crbug.com/930481 -TEST_F(SiteSettingsHandlerTest, GetAllSites) { +TEST_P(SiteSettingsHandlerTest, GetAllSites) { SetupModels(); base::Value::List get_all_sites_args; @@ -1374,7 +1720,7 @@ TEST_F(SiteSettingsHandlerTest, GetAllSites) { run_loop.RunUntilIdle(); } -TEST_F(SiteSettingsHandlerTest, Cookies) { +TEST_P(SiteSettingsHandlerTest, Cookies) { base::Value::List get_all_sites_args; get_all_sites_args.Append(kCallbackId); @@ -1382,9 +1728,19 @@ TEST_F(SiteSettingsHandlerTest, Cookies) { // AllSitesMap, returns the correct origin in GetAllSites. // This corresponds to case 1 in InsertOriginIntoGroup. { - SetupModels(base::BindLambdaForTesting([](const TestModels& models) { - models.cookie_helper->AddCookieSamples(GURL("http://c1.com"), "A=1"); - })); + if (IsDeprecateCookiesTreeModelEnabled()) { + SetupModels(base::BindLambdaForTesting([](const TestModels& models) { + models.browsing_data_model->AddBrowsingData( + *(CreateCookieKey(GURL("http://c1.com"), "A=1")), + BrowsingDataModel::StorageType::kCookie, + /*storage_size=*/0, + /*cookie_count=*/1); + })); + } else { + SetupModels(base::BindLambdaForTesting([](const TestModels& models) { + models.cookie_helper->AddCookieSamples(GURL("http://c1.com"), "A=1"); + })); + } base::Value::List site_groups = GetOnStorageFetchedSentList(); @@ -1406,10 +1762,25 @@ TEST_F(SiteSettingsHandlerTest, Cookies) { // returned in GetAllSites. // This corresponds to case 2 in InsertOriginIntoGroup. { - SetupModels(base::BindLambdaForTesting([](const TestModels& models) { - models.cookie_helper->AddCookieSamples(GURL("https://c2.com"), "A=1"); - models.cookie_helper->AddCookieSamples(GURL("https://c2.com"), "B=1"); - })); + if (IsDeprecateCookiesTreeModelEnabled()) { + SetupModels(base::BindLambdaForTesting([](const TestModels& models) { + models.browsing_data_model->AddBrowsingData( + *(CreateCookieKey(GURL("https://c2.com"), "A=1")), + BrowsingDataModel::StorageType::kCookie, + /*storage_size=*/0, + /*cookie_count=*/1); + models.browsing_data_model->AddBrowsingData( + *(CreateCookieKey(GURL("https://c2.com"), "B=1")), + BrowsingDataModel::StorageType::kCookie, + /*storage_size=*/0, + /*cookie_count=*/1); + })); + } else { + SetupModels(base::BindLambdaForTesting([](const TestModels& models) { + models.cookie_helper->AddCookieSamples(GURL("https://c2.com"), "A=1"); + models.cookie_helper->AddCookieSamples(GURL("https://c2.com"), "B=1"); + })); + } base::Value::List site_groups = GetOnStorageFetchedSentList(); @@ -1431,12 +1802,25 @@ TEST_F(SiteSettingsHandlerTest, Cookies) { // one exists. // This corresponds to case 3 in InsertOriginIntoGroup. { - SetupModels(base::BindLambdaForTesting([](const TestModels& models) { - models.browsing_data_model->AddBrowsingData( - url::Origin::Create(GURL("https://w.c3.com")), - BrowsingDataModel::StorageType::kTrustTokens, 50); - models.cookie_helper->AddCookieSamples(GURL("http://w.c3.com"), "A=1"); - })); + if (IsDeprecateCookiesTreeModelEnabled()) { + SetupModels(base::BindLambdaForTesting([](const TestModels& models) { + models.browsing_data_model->AddBrowsingData( + url::Origin::Create(GURL("https://w.c3.com")), + BrowsingDataModel::StorageType::kTrustTokens, 50); + models.browsing_data_model->AddBrowsingData( + *(CreateCookieKey(GURL("http://w.c3.com"), "A=1")), + BrowsingDataModel::StorageType::kCookie, + /*storage_size=*/0, + /*cookie_count=*/1); + })); + } else { + SetupModels(base::BindLambdaForTesting([](const TestModels& models) { + models.browsing_data_model->AddBrowsingData( + url::Origin::Create(GURL("https://w.c3.com")), + BrowsingDataModel::StorageType::kTrustTokens, 50); + models.cookie_helper->AddCookieSamples(GURL("http://w.c3.com"), "A=1"); + })); + } base::Value::List site_groups = GetOnStorageFetchedSentList(); @@ -1457,10 +1841,25 @@ TEST_F(SiteSettingsHandlerTest, Cookies) { // Tests that placeholder cookie eTLD+1 origins get removed from AllSitesMap // when a more specific origin is added later. { - SetupModels(base::BindLambdaForTesting([](const TestModels& models) { - models.cookie_helper->AddCookieSamples(GURL("https://c4.com"), "B=1"); - models.cookie_helper->AddCookieSamples(GURL("https://w.c4.com"), "A=1"); - })); + if (IsDeprecateCookiesTreeModelEnabled()) { + SetupModels(base::BindLambdaForTesting([](const TestModels& models) { + models.browsing_data_model->AddBrowsingData( + *(CreateCookieKey(GURL("https://c4.com"), "B=1")), + BrowsingDataModel::StorageType::kCookie, + /*storage_size=*/0, + /*cookie_count=*/1); + models.browsing_data_model->AddBrowsingData( + *(CreateCookieKey(GURL("https://w.c4.com"), "A=1")), + BrowsingDataModel::StorageType::kCookie, + /*storage_size=*/0, + /*cookie_count=*/1); + })); + } else { + SetupModels(base::BindLambdaForTesting([](const TestModels& models) { + models.cookie_helper->AddCookieSamples(GURL("https://c4.com"), "B=1"); + models.cookie_helper->AddCookieSamples(GURL("https://w.c4.com"), "A=1"); + })); + } base::Value::List site_groups = GetOnStorageFetchedSentList(); @@ -1479,7 +1878,7 @@ TEST_F(SiteSettingsHandlerTest, Cookies) { } } -TEST_F(SiteSettingsHandlerTest, GetRecentSitePermissions) { +TEST_P(SiteSettingsHandlerTest, GetRecentSitePermissions) { // Constants used only in this test. std::string kAllowed = content_settings::ContentSettingToString(CONTENT_SETTING_ALLOW); @@ -1587,7 +1986,7 @@ TEST_F(SiteSettingsHandlerTest, GetRecentSitePermissions) { } } -TEST_F(SiteSettingsHandlerTest, OnStorageFetched) { +TEST_P(SiteSettingsHandlerTest, OnStorageFetched) { SetupModels(); handler()->ClearAllSitesMapForTesting(); @@ -1763,11 +2162,11 @@ TEST_F(SiteSettingsHandlerTest, OnStorageFetched) { } } -TEST_F(SiteSettingsHandlerTest, InstalledApps) { +TEST_P(SiteSettingsHandlerTest, InstalledApps) { GURL start_url("http://abc.example.com/path"); RegisterWebApp( profile(), - MakeApp(web_app::GenerateAppId(/*manifest_id=*/absl::nullopt, start_url), + MakeApp(web_app::GenerateAppId(/*manifest_id=*/std::nullopt, start_url), apps::AppType::kWeb, start_url.spec(), apps::Readiness::kReady, apps::InstallReason::kSync)); @@ -1817,7 +2216,7 @@ TEST_F(SiteSettingsHandlerTest, InstalledApps) { } } -TEST_F(SiteSettingsHandlerTest, IncognitoExceptions) { +TEST_P(SiteSettingsHandlerTest, IncognitoExceptions) { constexpr char kOriginToBlock[] = "https://www.blocked.com:443"; auto validate_exception = [&kOriginToBlock](const base::Value& exception) { @@ -1874,7 +2273,7 @@ TEST_F(SiteSettingsHandlerTest, IncognitoExceptions) { DestroyIncognitoProfile(); } -TEST_F(SiteSettingsHandlerTest, ResetCategoryPermissionForEmbargoedOrigins) { +TEST_P(SiteSettingsHandlerTest, ResetCategoryPermissionForEmbargoedOrigins) { constexpr char kOriginToBlock[] = "https://www.blocked.com:443"; constexpr char kOriginToEmbargo[] = "https://embargoed.co.uk"; @@ -1958,7 +2357,7 @@ TEST_F(SiteSettingsHandlerTest, ResetCategoryPermissionForEmbargoedOrigins) { } } -TEST_F(SiteSettingsHandlerTest, ResetCategoryPermissionForInvalidOrigins) { +TEST_P(SiteSettingsHandlerTest, ResetCategoryPermissionForInvalidOrigins) { constexpr char kInvalidOrigin[] = "example.com"; auto url = GURL(kInvalidOrigin); EXPECT_FALSE(url.is_valid()); @@ -1989,7 +2388,7 @@ TEST_F(SiteSettingsHandlerTest, ResetCategoryPermissionForInvalidOrigins) { handler()->HandleResetCategoryPermissionForPattern(reset_args); } -TEST_F(SiteSettingsHandlerTest, SetCategory_GetException_ResetCategory) { +TEST_P(SiteSettingsHandlerTest, SetCategory_GetException_ResetCategory) { const std::string google("https://www.google.com:443"); { // Test the JS -> C++ -> JS callback path for configuring origins, by @@ -2036,7 +2435,7 @@ TEST_F(SiteSettingsHandlerTest, SetCategory_GetException_ResetCategory) { ValidateNoOrigin(6U); } -TEST_F(SiteSettingsHandlerTest, NotificationPermissionRevokeUkm) { +TEST_P(SiteSettingsHandlerTest, NotificationPermissionRevokeUkm) { const std::string google("https://www.google.com"); ukm::TestAutoSetUkmRecorder ukm_recorder; auto* history_service = HistoryServiceFactory::GetForProfile( @@ -2075,7 +2474,7 @@ TEST_F(SiteSettingsHandlerTest, NotificationPermissionRevokeUkm) { auto entries = ukm_recorder.GetEntriesByName("Permission"); EXPECT_EQ(1u, entries.size()); - auto* entry = entries.front(); + auto* entry = entries.front().get(); ukm_recorder.ExpectEntrySourceHasUrl(entry, GURL(google)); EXPECT_EQ( @@ -2095,7 +2494,7 @@ TEST_F(SiteSettingsHandlerTest, NotificationPermissionRevokeUkm) { #else #define MAYBE_DefaultSettingSource DefaultSettingSource #endif -TEST_F(SiteSettingsHandlerTest, MAYBE_DefaultSettingSource) { +TEST_P(SiteSettingsHandlerTest, MAYBE_DefaultSettingSource) { // Use a non-default port to verify the display name does not strip this // off. const std::string google("https://www.google.com:183"); @@ -2171,7 +2570,7 @@ TEST_F(SiteSettingsHandlerTest, MAYBE_DefaultSettingSource) { site_settings::SiteSettingSource::kPolicy, 10U); } -TEST_F(SiteSettingsHandlerTest, GetAndSetOriginPermissions) { +TEST_P(SiteSettingsHandlerTest, GetAndSetOriginPermissions) { const std::string origin_with_port("https://www.example.com:443"); // The display name won't show the port if it's default for that scheme. const std::string origin("www.example.com"); @@ -2214,7 +2613,7 @@ TEST_F(SiteSettingsHandlerTest, GetAndSetOriginPermissions) { site_settings::SiteSettingSource::kDefault, 4U); } -TEST_F(SiteSettingsHandlerTest, GetAndSetForInvalidURLs) { +TEST_P(SiteSettingsHandlerTest, GetAndSetForInvalidURLs) { const std::string origin("arbitrary string"); EXPECT_FALSE(GURL(origin).is_valid()); base::Value::List get_args; @@ -2250,7 +2649,7 @@ TEST_F(SiteSettingsHandlerTest, GetAndSetForInvalidURLs) { site_settings::SiteSettingSource::kInsecureOrigin, 2U); } -TEST_F(SiteSettingsHandlerTest, SetCategoryPermissionForPattern) { +TEST_P(SiteSettingsHandlerTest, SetCategoryPermissionForPattern) { const std::string kOrigin = "https://www.example.com:443"; base::Value::List set_args; @@ -2262,7 +2661,8 @@ TEST_F(SiteSettingsHandlerTest, SetCategoryPermissionForPattern) { set_args.Append(false); // Incognito. handler()->HandleSetCategoryPermissionForPattern(set_args); - EXPECT_EQ(kNumberContentSettingListeners, web_ui()->call_data().size()); + EXPECT_EQ(kNumberNotificationsContentSettingListeners, + web_ui()->call_data().size()); HostContentSettingsMap* map = HostContentSettingsMapFactory::GetForProfile(profile()); @@ -2272,7 +2672,7 @@ TEST_F(SiteSettingsHandlerTest, SetCategoryPermissionForPattern) { kPermissionNotifications)); } -TEST_F(SiteSettingsHandlerTest, SetCategoryPermissionForPattern_WildCard) { +TEST_P(SiteSettingsHandlerTest, SetCategoryPermissionForPattern_WildCard) { const std::string kWildcardOrigin = "[*.]example.com"; const std::string kRealOrigin = "https://www.example.com"; @@ -2285,7 +2685,8 @@ TEST_F(SiteSettingsHandlerTest, SetCategoryPermissionForPattern_WildCard) { set_args.Append(false); // Incognito. handler()->HandleSetCategoryPermissionForPattern(set_args); - EXPECT_EQ(kNumberContentSettingListeners, web_ui()->call_data().size()); + EXPECT_EQ(kNumberNotificationsContentSettingListeners, + web_ui()->call_data().size()); HostContentSettingsMap* map = HostContentSettingsMapFactory::GetForProfile(profile()); @@ -2295,7 +2696,7 @@ TEST_F(SiteSettingsHandlerTest, SetCategoryPermissionForPattern_WildCard) { kPermissionNotifications)); } -TEST_F(SiteSettingsHandlerTest, +TEST_P(SiteSettingsHandlerTest, SetCategoryPermissionForPattern_SecondaryPattern) { const std::string kOrigin = "https://www.example.com:443"; const std::string kSecondary = "https://www.secondary.com:443"; @@ -2320,7 +2721,7 @@ TEST_F(SiteSettingsHandlerTest, kPermissionStorageAccess)); } -TEST_F(SiteSettingsHandlerTest, SetCategoryPermissionForPattern_Incognito) { +TEST_P(SiteSettingsHandlerTest, SetCategoryPermissionForPattern_Incognito) { const std::string kOrigin = "https://www.example.com:443"; CreateIncognitoProfile(); @@ -2374,7 +2775,7 @@ TEST_F(SiteSettingsHandlerTest, SetCategoryPermissionForPattern_Incognito) { DestroyIncognitoProfile(); } -TEST_F(SiteSettingsHandlerTest, +TEST_P(SiteSettingsHandlerTest, SetCategoryPermissionForPattern_ExceptionHelpers) { ContentSettingsPattern pattern = ContentSettingsPattern::FromString("[*.]google.com"); @@ -2431,7 +2832,7 @@ TEST_F(SiteSettingsHandlerTest, handler()->HandleSetCategoryPermissionForPattern(args); } -TEST_F(SiteSettingsHandlerTest, SetCategoryPermissionForPattern_SessionOnly) { +TEST_P(SiteSettingsHandlerTest, SetCategoryPermissionForPattern_SessionOnly) { const std::string kGoogleWithPort("https://www.google.com:443"); base::Value::List set_args; set_args.Append(kGoogleWithPort); // Primary pattern. @@ -2442,10 +2843,11 @@ TEST_F(SiteSettingsHandlerTest, SetCategoryPermissionForPattern_SessionOnly) { set_args.Append(false); // Incognito. handler()->HandleSetCategoryPermissionForPattern(set_args); - EXPECT_EQ(kNumberContentSettingListeners, web_ui()->call_data().size()); + EXPECT_EQ(kNumberCookiesContentSettingListeners, + web_ui()->call_data().size()); } -TEST_F(SiteSettingsHandlerTest, ExtensionDisplayName) { +TEST_P(SiteSettingsHandlerTest, ExtensionDisplayName) { // When the extension is loaded, displayName is the extension's name and id. auto extension = LoadExtension(kExtensionName); auto extension_url = extension->url().spec(); @@ -2485,7 +2887,7 @@ TEST_F(SiteSettingsHandlerTest, ExtensionDisplayName) { } } -TEST_F(SiteSettingsHandlerTest, PatternsAndContentType) { +TEST_P(SiteSettingsHandlerTest, PatternsAndContentType) { unsigned counter = 1; for (const auto& test_case : kPatternsAndContentTypeTestCases) { base::Value::List args; @@ -2499,7 +2901,7 @@ TEST_F(SiteSettingsHandlerTest, PatternsAndContentType) { } } -TEST_F(SiteSettingsHandlerTest, Incognito) { +TEST_P(SiteSettingsHandlerTest, Incognito) { base::Value::List args; handler()->HandleUpdateIncognitoStatus(args); ValidateIncognitoExists(false, 1U); @@ -2511,7 +2913,7 @@ TEST_F(SiteSettingsHandlerTest, Incognito) { ValidateIncognitoExists(false, 3U); } -TEST_F(SiteSettingsHandlerTest, ZoomLevels) { +TEST_P(SiteSettingsHandlerTest, ZoomLevels) { std::string http_host("www.google.com"); std::string error_host("chromewebdata"); std::string data_url("data:text/plain;base64,SGVsbG8sIFdvcmxkIQ=="); @@ -2547,7 +2949,7 @@ TEST_F(SiteSettingsHandlerTest, ZoomLevels) { EXPECT_EQ(default_level, level); } -TEST_F(SiteSettingsHandlerTest, TemporaryCookieExceptions) { +TEST_P(SiteSettingsHandlerTest, TemporaryCookieExceptions) { // Set a temporary exception directly, instead of relying on any helpers that // have duration configurable via feature parameters. constexpr int kExpirationDurationInDays = 100; @@ -2585,13 +2987,14 @@ TEST_F(SiteSettingsHandlerTest, TemporaryCookieExceptions) { CHECK_DEREF(exception_list[0].GetDict().FindString("description"))); } -class SiteSettingsHandlerIsolatedWebAppTest : public SiteSettingsHandlerTest { +class SiteSettingsHandlerIsolatedWebAppTest + : public SiteSettingsHandlerBaseTest { public: void SetUp() override { web_app::test::AwaitStartWebAppProviderAndSubsystems(profile()); InstallIsolatedWebApp(iwa_url(), "IWA Name"); - SiteSettingsHandlerTest::SetUp(); + SiteSettingsHandlerBaseTest::SetUp(); } protected: @@ -2733,7 +3136,11 @@ class SiteSettingsHandlerInfobarTest : public BrowserWithTestWindowTest { CreateBrowser(profile(), browser()->type(), false, window2_.get()); window3_ = CreateBrowserWindow(); - TestingProfile* profile2_ = CreateProfile2(); + // Creates the second profile used by this test. + TestingProfile* profile2_ = profile_manager()->CreateTestingProfile( + "testing_profile2@test", nullptr, std::u16string(), 0, + GetTestingFactories()); + browser3_ = CreateBrowser(profile2_, browser()->type(), false, window3_.get()); @@ -2801,14 +3208,6 @@ class SiteSettingsHandlerInfobarTest : public BrowserWithTestWindowTest { // browser2 and browser() which are from profile() Browser* browser3() { return browser3_.get(); } - // Creates the second profile used by this test. The caller doesn't own the - // return value. - TestingProfile* CreateProfile2() { - return profile_manager()->CreateTestingProfile("testing_profile2@test", - nullptr, std::u16string(), 0, - GetTestingFactories()); - } - const std::string_view kNotifications = site_settings::ContentSettingsTypeToGroupName( ContentSettingsType::NOTIFICATIONS); @@ -3019,7 +3418,7 @@ TEST_F(SiteSettingsHandlerInfobarTest, EXPECT_TRUE(url::IsSameOriginWith(origin, tab_url)); } -TEST_F(SiteSettingsHandlerTest, BlockAutoplay_SendOnRequest) { +TEST_P(SiteSettingsHandlerTest, BlockAutoplay_SendOnRequest) { base::Value::List args; handler()->HandleFetchBlockAutoplayStatus(args); @@ -3027,7 +3426,7 @@ TEST_F(SiteSettingsHandlerTest, BlockAutoplay_SendOnRequest) { ValidateBlockAutoplay(true, true); } -TEST_F(SiteSettingsHandlerTest, BlockAutoplay_SoundSettingUpdate) { +TEST_P(SiteSettingsHandlerTest, BlockAutoplay_SoundSettingUpdate) { SetSoundContentSettingDefault(CONTENT_SETTING_BLOCK); base::RunLoop().RunUntilIdle(); @@ -3041,7 +3440,7 @@ TEST_F(SiteSettingsHandlerTest, BlockAutoplay_SoundSettingUpdate) { ValidateBlockAutoplay(true, true); } -TEST_F(SiteSettingsHandlerTest, BlockAutoplay_PrefUpdate) { +TEST_P(SiteSettingsHandlerTest, BlockAutoplay_PrefUpdate) { profile()->GetPrefs()->SetBoolean(prefs::kBlockAutoplayEnabled, false); base::RunLoop().RunUntilIdle(); @@ -3055,7 +3454,7 @@ TEST_F(SiteSettingsHandlerTest, BlockAutoplay_PrefUpdate) { ValidateBlockAutoplay(true, true); } -TEST_F(SiteSettingsHandlerTest, BlockAutoplay_Update) { +TEST_P(SiteSettingsHandlerTest, BlockAutoplay_Update) { EXPECT_TRUE(profile()->GetPrefs()->GetBoolean(prefs::kBlockAutoplayEnabled)); base::Value::List data; @@ -3065,7 +3464,7 @@ TEST_F(SiteSettingsHandlerTest, BlockAutoplay_Update) { EXPECT_FALSE(profile()->GetPrefs()->GetBoolean(prefs::kBlockAutoplayEnabled)); } -TEST_F(SiteSettingsHandlerTest, ExcludeWebUISchemesInLists) { +TEST_P(SiteSettingsHandlerTest, ExcludeWebUISchemesInLists) { SetupModels(); const ContentSettingsType content_settings_type = ContentSettingsType::NOTIFICATIONS; @@ -3154,7 +3553,7 @@ TEST_F(SiteSettingsHandlerTest, ExcludeWebUISchemesInLists) { // GetOriginPermissions() returns the allowlisted exception. We explicitly // return this, so developers can easily test things (e.g. by navigating to // chrome://settings/content/siteDetails?site=chrome://example). -TEST_F(SiteSettingsHandlerTest, IncludeWebUISchemesInGetOriginPermissions) { +TEST_P(SiteSettingsHandlerTest, IncludeWebUISchemesInGetOriginPermissions) { const ContentSettingsType content_settings_type = ContentSettingsType::NOTIFICATIONS; @@ -3189,7 +3588,7 @@ TEST_F(SiteSettingsHandlerTest, IncludeWebUISchemesInGetOriginPermissions) { } } -TEST_F(SiteSettingsHandlerTest, StorageAccessExceptions_DiffPatterns) { +TEST_P(SiteSettingsHandlerTest, StorageAccessExceptions_DiffPatterns) { const std::string kOrigin("https://[*.]google.com:443"); const std::string kDisplayName("google.com"); @@ -3231,7 +3630,7 @@ TEST_F(SiteSettingsHandlerTest, StorageAccessExceptions_DiffPatterns) { /*index=*/1U); } -TEST_F(SiteSettingsHandlerTest, StorageAccessExceptions_SamePrimaryPattern) { +TEST_P(SiteSettingsHandlerTest, StorageAccessExceptions_SamePrimaryPattern) { const std::string kOrigin("https://[*.]google.com:443"); const std::string kDisplayName("google.com"); @@ -3264,7 +3663,7 @@ TEST_F(SiteSettingsHandlerTest, StorageAccessExceptions_SamePrimaryPattern) { /*index=*/0U); } -TEST_F(SiteSettingsHandlerTest, StorageAccessExceptions_DiffType) { +TEST_P(SiteSettingsHandlerTest, StorageAccessExceptions_DiffType) { const std::string kOrigin("https://[*.]google.com:443"); const std::string kEmbeddingOrigin("https://[*.]example.com:443"); @@ -3281,7 +3680,7 @@ TEST_F(SiteSettingsHandlerTest, StorageAccessExceptions_DiffType) { ValidateNoOrigin(2U); } -TEST_F(SiteSettingsHandlerTest, StorageAccessExceptions_AutoGranted) { +TEST_P(SiteSettingsHandlerTest, StorageAccessExceptions_AutoGranted) { const std::string kOrigin("https://[*.]google.com:443"); const std::string kEmbeddingOrigin("https://[*.]example.com:443"); @@ -3302,7 +3701,7 @@ TEST_F(SiteSettingsHandlerTest, StorageAccessExceptions_AutoGranted) { ValidateNoOrigin(2U); } -TEST_F(SiteSettingsHandlerTest, StorageAccessExceptions_Incognito) { +TEST_P(SiteSettingsHandlerTest, StorageAccessExceptions_Incognito) { const std::string kOrigin("https://[*.]google.com:443"); const std::string kDisplayName("google.com"); @@ -3331,7 +3730,7 @@ TEST_F(SiteSettingsHandlerTest, StorageAccessExceptions_Incognito) { {{kEmbeddingOrigin, kEmbeddingDisplayName, /*incognito=*/true}}); } -TEST_F(SiteSettingsHandlerTest, StorageAccessExceptions_NormalAndIncognito) { +TEST_P(SiteSettingsHandlerTest, StorageAccessExceptions_NormalAndIncognito) { const std::string kOrigin("https://[*.]google.com:443"); const std::string kDisplayName("google.com"); @@ -3389,7 +3788,7 @@ TEST_F(SiteSettingsHandlerTest, StorageAccessExceptions_NormalAndIncognito) { /*index=*/0U); } -TEST_F(SiteSettingsHandlerTest, +TEST_P(SiteSettingsHandlerTest, StorageAccessExceptions_NormalAndIncognito_SamePatterns) { const std::string kOrigin("https://[*.]google.com:443"); const std::string kDisplayName("google.com"); @@ -3423,7 +3822,7 @@ TEST_F(SiteSettingsHandlerTest, {kEmbeddingOrigin, kEmbeddingDisplayName, /*incognito=*/true}}); } -TEST_F(SiteSettingsHandlerTest, StorageAccessExceptions_Extension) { +TEST_P(SiteSettingsHandlerTest, StorageAccessExceptions_Extension) { auto extension = LoadExtension(kExtensionName); auto extension_url = extension->url().spec(); @@ -3461,32 +3860,7 @@ TEST_F(SiteSettingsHandlerTest, StorageAccessExceptions_Extension) { {{kEmbeddingOrigin, kEmbeddingDisplayName, /*incognito=*/false}}); } -TEST_P(SiteSettingsHandlerTest, StorageAccessExceptions_Description_All) { - const std::string kOrigin("google.com"); - const std::string kEmbeddingOrigin("example.com"); - - const ContentSetting content_setting = - GetParam() ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; - - SetContentSettingCustomScope(kOrigin, kEmbeddingOrigin, - kPermissionStorageAccess, content_setting); - - base::Value::List get_exception_list_args; - get_exception_list_args.Append(kCallbackId); - get_exception_list_args.Append( - content_settings::ContentSettingToString(content_setting)); - handler()->HandleGetStorageAccessExceptionList(get_exception_list_args); - - // Verify that the grouped exception is correct. - ValidateStorageAccessList(/*expected_total_calls=*/2U, - /*expected_num_groups=*/1U); - - ValidateStorageAccessException( - kOrigin, kOrigin, content_setting, - {{kEmbeddingOrigin, kEmbeddingOrigin, /*incognito=*/false}}); -} - -TEST_F(SiteSettingsHandlerTest, StorageAccessExceptions_Description_Embargoed) { +TEST_P(SiteSettingsHandlerTest, StorageAccessExceptions_Description_Embargoed) { const std::string kOrigin("https://google.com:443"); const std::string kDisplayName("google.com"); @@ -3519,7 +3893,7 @@ TEST_F(SiteSettingsHandlerTest, StorageAccessExceptions_Description_Embargoed) { /*expected_incognito=*/false); } -TEST_F(SiteSettingsHandlerTest, +TEST_P(SiteSettingsHandlerTest, StorageAccessExceptions_Description_EmbargoedTwoProfiles) { const std::string kOrigin("https://google.com:443"); const std::string kDisplayName("google.com"); @@ -3661,9 +4035,9 @@ TEST_P(StorageAccessSiteSettingsHandlerLifetimeTest, } class PersistentPermissionsSiteSettingsHandlerTest - : public SiteSettingsHandlerTest { + : public SiteSettingsHandlerBaseTest { void SetUp() override { - SiteSettingsHandlerTest::SetUp(); + SiteSettingsHandlerBaseTest::SetUp(); handler_ = std::make_unique<SiteSettingsHandler>(&profile_); handler_->set_web_ui(web_ui()); handler_->AllowJavascript(); @@ -3678,6 +4052,8 @@ class PersistentPermissionsSiteSettingsHandlerTest // when Persistent Permissions is launched. // Enable Persisted Permissions. + // TODO(crbug.com/1467574): Remove `kFileSystemAccessPersistentPermissions` + // flag after FSA Persistent Permissions feature launch. feature_list_.InitAndEnableFeature( features::kFileSystemAccessPersistentPermissions); } @@ -4547,16 +4923,13 @@ class SiteSettingsHandlerChooserExceptionTest // HandleSetOriginPermissions caused WebUIListenerCallbacks: // * contentSettingsChooserPermissionChanged once - // * contentSettingsSitePermissionChanged for each visible content type + // * contentSettingsSitePermissionChanged once // * contentSettingsSitePermissionChanged again for `content_type()` - const size_t kContentSettingsTypeCount = - site_settings::GetVisiblePermissionCategories().size(); - EXPECT_EQ(kContentSettingsTypeCount + 3, web_ui()->call_data().size()); + EXPECT_EQ(3u, web_ui()->call_data().size()); { const base::Value::List& exceptions = - GetChooserExceptionListFromWebUiCallData( - group_name, - /*expected_total_calls=*/kContentSettingsTypeCount + 4); + GetChooserExceptionListFromWebUiCallData(group_name, + /*expected_total_calls=*/4u); switch (content_type()) { case ContentSettingsType::BLUETOOTH_CHOOSER_DATA: EXPECT_TRUE(exceptions.empty()); @@ -4627,16 +5000,11 @@ class SiteSettingsHandlerChooserExceptionTest handler()->HandleSetOriginPermissions(args); GetChooserContext(profile())->FlushScheduledSaveSettingsCalls(); - // HandleSetOriginPermissions caused WebUIListenerCallbacks: - // * contentSettingsSitePermissionChanged for each visible content type - const size_t kContentSettingsTypeCount = - site_settings::GetVisiblePermissionCategories().size(); - EXPECT_EQ(kContentSettingsTypeCount + 1, web_ui()->call_data().size()); + EXPECT_EQ(1u, web_ui()->call_data().size()); { const base::Value::List& exceptions = - GetChooserExceptionListFromWebUiCallData( - group_name, - /*expected_total_calls=*/kContentSettingsTypeCount + 2); + GetChooserExceptionListFromWebUiCallData(group_name, + /*expected_total_calls=*/2u); switch (content_type()) { case ContentSettingsType::BLUETOOTH_CHOOSER_DATA: EXPECT_TRUE(exceptions.empty()); @@ -5562,22 +5930,47 @@ TEST_F(SiteSettingsHandlerUsbTest, HandleSetOriginPermissionsPolicyOnly) { TestHandleSetOriginPermissionsPolicyOnly(); } -TEST_F(SiteSettingsHandlerTest, HandleClearSiteGroupDataAndCookies) { +TEST_P(SiteSettingsHandlerTest, HandleClearSiteGroupDataAndCookies) { SetupModels(); - - EXPECT_EQ(28u, handler() - ->GetCookiesTreeModelForTesting() - ->GetRoot() - ->GetTotalNodeCount()); - browsing_data_model_test_util::ValidateBrowsingDataEntries( - handler()->GetBrowsingDataModelForTesting(), - { - kGoogleUnpartitionedEntry, - kExampleUnpartitionedEntry, - kGoogleOnExampleEntry, - kExampleOnGoogleSecureEntry, - kExampleOnGoogleInsecureEntry, - }); + std::vector<browsing_data_model_test_util::BrowsingDataEntry> + expected_browsing_data_model_entries; + if (IsDeprecateCookiesTreeModelEnabled()) { + expected_browsing_data_model_entries = { + kGoogleUnpartitionedEntry, + kExampleUnpartitionedEntry, + kGoogleOnExampleEntry, + kExampleOnGoogleSecureEntry, + kExampleOnGoogleInsecureEntry, + kExampleLocalStorage, + kHttpExampleCookie, + kHttpsWwwExampleCookie, + kPartitionedHttpsWwwExampleOnGoogleAuCookie, + kPartitionedHttpsWwwExampleOnGoogleCookie, + kHttpAbcExampleCookie, + kHttpGoogleCookieA, + kHttpGoogleCookieB, + kHttpGoogleAuCookie, + kPartitionedHttpsGoogleAu1PCookie, + kPartitionedHttpsWwwAnotherExampleOnGoogleAuCookie, + kUngroupedHttpCookie, + }; + browsing_data_model_test_util::ValidateBrowsingDataEntries( + handler()->GetBrowsingDataModelForTesting(), + expected_browsing_data_model_entries); + } else { + EXPECT_EQ(28u, handler() + ->GetCookiesTreeModelForTesting() + ->GetRoot() + ->GetTotalNodeCount()); + expected_browsing_data_model_entries = { + kGoogleUnpartitionedEntry, kExampleUnpartitionedEntry, + kGoogleOnExampleEntry, kExampleOnGoogleSecureEntry, + kExampleOnGoogleInsecureEntry, + }; + browsing_data_model_test_util::ValidateBrowsingDataEntries( + handler()->GetBrowsingDataModelForTesting(), + expected_browsing_data_model_entries); + } auto verify_site_group = [](const base::Value& site_group, std::string expected_etld_plus1) { @@ -5599,41 +5992,57 @@ TEST_F(SiteSettingsHandlerTest, HandleClearSiteGroupDataAndCookies) { // Items partitioned on example.com, as well as unpartitioned example.com // storage should be removed. - browsing_data_model_test_util::ValidateBrowsingDataEntries( - handler()->GetBrowsingDataModelForTesting(), - { - kGoogleUnpartitionedEntry, - kExampleOnGoogleSecureEntry, - kExampleOnGoogleInsecureEntry, - }); - - // All host nodes for non-secure example.com, and abc.example.com, which do - // not have any unpartitioned storage, should have been removed. - ASSERT_EQ(0u, GetHostNodes(GURL("http://example.com")).size()); - ASSERT_EQ(0u, GetHostNodes(GURL("http://abc.example.com")).size()); - - // Confirm that partitioned cookies for www.example.com have not been deleted, - auto remaining_host_nodes = GetHostNodes(GURL("https://www.example.com")); - - // example.com storage partitioned on other sites should still remain. - { - ASSERT_EQ(1u, remaining_host_nodes.size()); - ASSERT_EQ(1u, remaining_host_nodes[0]->children().size()); - const auto& storage_node = remaining_host_nodes[0]->children()[0]; - ASSERT_EQ(CookieTreeNode::DetailedInfo::TYPE_COOKIES, - storage_node->GetDetailedInfo().node_type); - ASSERT_EQ(2u, storage_node->children().size()); - for (const auto& cookie_node : storage_node->children()) { - const auto& cookie = cookie_node->GetDetailedInfo().cookie; - EXPECT_EQ("www.example.com", cookie->Domain()); - EXPECT_TRUE(cookie->IsPartitioned()); + if (IsDeprecateCookiesTreeModelEnabled()) { + RemoveModelEntries(expected_browsing_data_model_entries, + { + kExampleUnpartitionedEntry, + kExampleLocalStorage, + kHttpExampleCookie, + kHttpsWwwExampleCookie, + kHttpAbcExampleCookie, + kGoogleOnExampleEntry, + }); + browsing_data_model_test_util::ValidateBrowsingDataEntries( + handler()->GetBrowsingDataModelForTesting(), + expected_browsing_data_model_entries); + } else { + RemoveModelEntries(expected_browsing_data_model_entries, + { + kExampleUnpartitionedEntry, + kGoogleOnExampleEntry, + }); + browsing_data_model_test_util::ValidateBrowsingDataEntries( + handler()->GetBrowsingDataModelForTesting(), + expected_browsing_data_model_entries); + // All host nodes for non-secure example.com, and abc.example.com, which do + // not have any unpartitioned storage, should have been removed. + ASSERT_EQ(0u, GetHostNodes(GURL("http://example.com")).size()); + ASSERT_EQ(0u, GetHostNodes(GURL("http://abc.example.com")).size()); + + // Confirm that partitioned cookies for www.example.com have not been + // deleted, + auto remaining_host_nodes = GetHostNodes(GURL("https://www.example.com")); + + // example.com storage partitioned on other sites should still remain. + { + ASSERT_EQ(1u, remaining_host_nodes.size()); + ASSERT_EQ(1u, remaining_host_nodes[0]->children().size()); + const auto& storage_node = remaining_host_nodes[0]->children()[0]; + ASSERT_EQ(CookieTreeNode::DetailedInfo::TYPE_COOKIES, + storage_node->GetDetailedInfo().node_type); + ASSERT_EQ(2u, storage_node->children().size()); + for (const auto& cookie_node : storage_node->children()) { + const auto& cookie = cookie_node->GetDetailedInfo().cookie; + EXPECT_EQ("www.example.com", cookie->Domain()); + EXPECT_TRUE(cookie->IsPartitioned()); + } } - } - EXPECT_EQ(19u, handler() - ->GetCookiesTreeModelForTesting() - ->GetRoot() - ->GetTotalNodeCount()); + EXPECT_EQ(19u, handler() + ->GetCookiesTreeModelForTesting() + ->GetRoot() + ->GetTotalNodeCount()); + } storage_and_cookie_list = GetOnStorageFetchedSentList(); EXPECT_EQ(3U, storage_and_cookie_list.size()); @@ -5645,14 +6054,29 @@ TEST_F(SiteSettingsHandlerTest, HandleClearSiteGroupDataAndCookies) { args.Append(GroupingKey::CreateFromEtldPlus1("google.com").Serialize()); handler()->HandleClearSiteGroupDataAndCookies(args); - - EXPECT_EQ(14u, handler() - ->GetCookiesTreeModelForTesting() - ->GetRoot() - ->GetTotalNodeCount()); - // Google's 1P storage, as well as example on Google should have been cleared. - browsing_data_model_test_util::ValidateBrowsingDataEntries( - handler()->GetBrowsingDataModelForTesting(), {}); + if (IsDeprecateCookiesTreeModelEnabled()) { + RemoveModelEntries(expected_browsing_data_model_entries, + { + kGoogleUnpartitionedEntry, + kExampleOnGoogleSecureEntry, + kExampleOnGoogleInsecureEntry, + kHttpGoogleCookieA, + kHttpGoogleCookieB, + kPartitionedHttpsWwwExampleOnGoogleCookie, + }); + browsing_data_model_test_util::ValidateBrowsingDataEntries( + handler()->GetBrowsingDataModelForTesting(), + expected_browsing_data_model_entries); + } else { + EXPECT_EQ(14u, handler() + ->GetCookiesTreeModelForTesting() + ->GetRoot() + ->GetTotalNodeCount()); + // Google's 1P storage, as well as example on Google should have been + // cleared. + browsing_data_model_test_util::ValidateBrowsingDataEntries( + handler()->GetBrowsingDataModelForTesting(), {}); + } storage_and_cookie_list = GetOnStorageFetchedSentList(); EXPECT_EQ(2U, storage_and_cookie_list.size()); @@ -5665,18 +6089,31 @@ TEST_F(SiteSettingsHandlerTest, HandleClearSiteGroupDataAndCookies) { handler()->HandleClearSiteGroupDataAndCookies(args); // No nodes representing storage partitioned on google.com.au should be // present. - for (const auto& host_node : - handler()->GetCookiesTreeModelForTesting()->GetRoot()->children()) { - for (const auto& storage_node : host_node->children()) { - if (storage_node->GetDetailedInfo().node_type != - CookieTreeNode::DetailedInfo::TYPE_COOKIES) { - continue; - } - for (const auto& cookie_node : storage_node->children()) { - const auto& cookie = cookie_node->GetDetailedInfo().cookie; - if (cookie->IsPartitioned()) { - EXPECT_NE("google.com.au", - cookie->PartitionKey()->site().GetURL().host()); + if (IsDeprecateCookiesTreeModelEnabled()) { + RemoveModelEntries(expected_browsing_data_model_entries, + { + kPartitionedHttpsWwwExampleOnGoogleAuCookie, + kHttpGoogleAuCookie, + kPartitionedHttpsGoogleAu1PCookie, + kPartitionedHttpsWwwAnotherExampleOnGoogleAuCookie, + }); + browsing_data_model_test_util::ValidateBrowsingDataEntries( + handler()->GetBrowsingDataModelForTesting(), + expected_browsing_data_model_entries); + } else { + for (const auto& host_node : + handler()->GetCookiesTreeModelForTesting()->GetRoot()->children()) { + for (const auto& storage_node : host_node->children()) { + if (storage_node->GetDetailedInfo().node_type != + CookieTreeNode::DetailedInfo::TYPE_COOKIES) { + continue; + } + for (const auto& cookie_node : storage_node->children()) { + const auto& cookie = cookie_node->GetDetailedInfo().cookie; + if (cookie->IsPartitioned()) { + EXPECT_NE("google.com.au", + cookie->PartitionKey()->site().GetURL().host()); + } } } } @@ -5695,87 +6132,9 @@ TEST_F(SiteSettingsHandlerTest, HandleClearSiteGroupDataAndCookies) { EXPECT_EQ(0U, storage_and_cookie_list.size()); } -TEST_P(SiteSettingsHandlerTest, HandleClearUnpartitionedUsage) { - SetupModels(); - - EXPECT_EQ(28u, handler() - ->GetCookiesTreeModelForTesting() - ->GetRoot() - ->GetTotalNodeCount()); - - browsing_data_model_test_util::ValidateBrowsingDataEntries( - handler()->GetBrowsingDataModelForTesting(), - { - kGoogleUnpartitionedEntry, - kExampleUnpartitionedEntry, - kGoogleOnExampleEntry, - kExampleOnGoogleSecureEntry, - kExampleOnGoogleInsecureEntry, - }); - - base::Value::List args; - args.Append(GetParam() ? "https://www.example.com/" - : "http://www.example.com/"); - handler()->HandleClearUnpartitionedUsage(args); - - // Confirm that only the unpartitioned items for example.com have been - // cleared. - browsing_data_model_test_util::ValidateBrowsingDataEntries( - handler()->GetBrowsingDataModelForTesting(), - { - kGoogleUnpartitionedEntry, - kGoogleOnExampleEntry, - kExampleOnGoogleSecureEntry, - kExampleOnGoogleInsecureEntry, - }); - - auto remaining_host_nodes = GetHostNodes(GURL("https://www.example.com")); - - // There should only be partitioned cookie entries remaining for the site. - ASSERT_EQ(1u, remaining_host_nodes.size()); - ASSERT_EQ(1u, remaining_host_nodes[0]->children().size()); - const auto& storage_node = remaining_host_nodes[0]->children()[0]; - ASSERT_EQ(CookieTreeNode::DetailedInfo::TYPE_COOKIES, - storage_node->GetDetailedInfo().node_type); - ASSERT_EQ(2u, storage_node->children().size()); - for (const auto& cookie_node : storage_node->children()) { - const auto& cookie = cookie_node->GetDetailedInfo().cookie; - EXPECT_EQ("www.example.com", cookie->Domain()); - EXPECT_TRUE(cookie->IsPartitioned()); - } - - // Partitioned storage, even when keyed on the cookie domain site, should - // not be cleared. - args = base::Value::List(); - args.Append("https://google.com.au/"); - handler()->HandleClearUnpartitionedUsage(args); - - remaining_host_nodes = GetHostNodes(GURL("https://google.com.au")); - - // A single partitioned cookie should remain. - ASSERT_EQ(1u, remaining_host_nodes.size()); - ASSERT_EQ(1u, remaining_host_nodes[0]->children().size()); - const auto& cookies_node = remaining_host_nodes[0]->children()[0]; - ASSERT_EQ(1u, cookies_node->children().size()); - const auto& cookie_node = cookies_node->children()[0]; - const auto& cookie = cookie_node->GetDetailedInfo().cookie; - EXPECT_TRUE(cookie->IsPartitioned()); - - args = base::Value::List(); - args.Append("https://www.google.com/"); - handler()->HandleClearUnpartitionedUsage(args); - - // The unpartitioned Google and Example entries should be removed. - browsing_data_model_test_util::ValidateBrowsingDataEntries( - handler()->GetBrowsingDataModelForTesting(), - { - kGoogleOnExampleEntry, - kExampleOnGoogleSecureEntry, - kExampleOnGoogleInsecureEntry, - }); - -// Clearing Site Specific Media Licenses Tests #if BUILDFLAG(IS_WIN) +TEST_P(SiteSettingsHandlerTest, ClearSiteSpecificMediaLicenses) { + SetupModels(); PrefService* user_prefs = profile()->GetPrefs(); // In the beginning, there should be nothing stored in the origin data. @@ -5800,6 +6159,7 @@ TEST_P(SiteSettingsHandlerTest, HandleClearUnpartitionedUsage) { // The code above adds origin data for both google and example.com EXPECT_EQ(2u, user_prefs->GetDict(prefs::kMediaCdmOriginData).size()); + base::Value::List args; args = base::Value::List(); args.Append("https://www.google.com/"); handler()->HandleClearUnpartitionedUsage(args); @@ -5809,11 +6169,10 @@ TEST_P(SiteSettingsHandlerTest, HandleClearUnpartitionedUsage) { EXPECT_EQ(1u, user_prefs->GetDict(prefs::kMediaCdmOriginData).size()); EXPECT_TRUE(user_prefs->GetDict(prefs::kMediaCdmOriginData) .contains("https://www.example.com/")); - -#endif // BUILDFLAG(IS_WIN) } +#endif // BUILDFLAG(IS_WIN) -TEST_F(SiteSettingsHandlerTest, ClearClientHints) { +TEST_P(SiteSettingsHandlerTest, ClearClientHints) { // Confirm that when the user clears unpartitioned storage, or the eTLD+1 // group, client hints are also cleared. SetupModels(); @@ -5896,7 +6255,7 @@ TEST_F(SiteSettingsHandlerTest, ClearClientHints) { EXPECT_EQ(0U, client_hints_settings.size()); } -TEST_F(SiteSettingsHandlerTest, ClearReducedAcceptLanguage) { +TEST_P(SiteSettingsHandlerTest, ClearReducedAcceptLanguage) { // Confirm that when the user clears unpartitioned storage, or the eTLD+1 // group, reduce accept language are also cleared. SetupModels(); @@ -5974,161 +6333,190 @@ TEST_F(SiteSettingsHandlerTest, ClearReducedAcceptLanguage) { EXPECT_EQ(0U, accept_language_settings.size()); } -TEST_F(SiteSettingsHandlerTest, HandleClearPartitionedUsage) { +TEST_P(SiteSettingsHandlerTest, ClearDurableStorage) { + // Confirm that when the user clears durable storage or the eTLD+1 + // group, durable storage are also cleared. + SetupModels(); + handler()->OnStorageFetched(); + + GURL hosts[] = {GURL("https://example.com/"), GURL("https://www.example.com"), + GURL("https://google.com/"), GURL("https://www.google.com/")}; + + HostContentSettingsMap* host_content_settings_map = + HostContentSettingsMapFactory::GetForProfile(profile()); + + // Add setting for the hosts. + for (const auto& host : hosts) { + host_content_settings_map->SetContentSettingDefaultScope( + host, GURL(), ContentSettingsType::DURABLE_STORAGE, + ContentSetting::CONTENT_SETTING_ALLOW); + } + + // Clear at the eTLD+1 level and ensure affected origins are cleared. + base::Value::List args; + args.Append(GroupingKey::CreateFromEtldPlus1("example.com").Serialize()); + handler()->HandleClearSiteGroupDataAndCookies(args); + ContentSettingsForOneType settings = + host_content_settings_map->GetSettingsForOneType( + ContentSettingsType::DURABLE_STORAGE); + + // ContentSettingsType::DURABLE_STORAGE has a default settings type for the + // wildcard '*' set to BLOCK. Here, we expect 2 but we put 3. + EXPECT_EQ(3U, settings.size()); + + EXPECT_EQ(ContentSettingsPattern::FromURLNoWildcard(hosts[2]), + settings.at(0).primary_pattern); + EXPECT_EQ(ContentSettingsPattern::Wildcard(), + settings.at(0).secondary_pattern); + EXPECT_EQ(ContentSetting::CONTENT_SETTING_ALLOW, + settings.at(0).setting_value); + + EXPECT_EQ(ContentSettingsPattern::FromURLNoWildcard(hosts[3]), + settings.at(1).primary_pattern); + EXPECT_EQ(ContentSettingsPattern::Wildcard(), + settings.at(1).secondary_pattern); + EXPECT_EQ(ContentSetting::CONTENT_SETTING_ALLOW, + settings.at(1).setting_value); + + // Clear unpartitioned usage data, which should only affect the specific + // origin. + args.clear(); + args.Append("https://google.com/"); + handler()->HandleClearUnpartitionedUsage(args); + + // Validate the reduce accept language has been cleared. + settings = host_content_settings_map->GetSettingsForOneType( + ContentSettingsType::DURABLE_STORAGE); + + // ContentSettingsType::DURABLE_STORAGE has a default settings type for the + // wildcard '*' set to BLOCK. Here, we expect 1 but we put 2. + EXPECT_EQ(2U, settings.size()); + + // www.google.com should be the only remaining entry. + EXPECT_EQ(ContentSettingsPattern::FromURLNoWildcard(hosts[3]), + settings.at(0).primary_pattern); + EXPECT_EQ(ContentSettingsPattern::Wildcard(), + settings.at(0).secondary_pattern); + EXPECT_EQ(ContentSetting::CONTENT_SETTING_ALLOW, + settings.at(0).setting_value); + + // Clear unpartitioned usage data through HTTPS scheme, make sure https site + // durable storage have been cleared when the specific origin HTTPS + // scheme exist. + args.clear(); + args.Append("http://www.google.com/"); + handler()->HandleClearUnpartitionedUsage(args); + + // Validate the durable storage has been cleared. + settings = host_content_settings_map->GetSettingsForOneType( + ContentSettingsType::DURABLE_STORAGE); + + // ContentSettingsType::DURABLE_STORAGE has a default settings type for the + // wildcard '*' set to BLOCK. Therefore, when there's only one rule, it means + // that there are none. + EXPECT_EQ(1U, settings.size()); +} + +TEST_P(SiteSettingsHandlerTest, HandleClearPartitionedUsage) { // Confirm that removing unpartitioned storage correctly removes the // appropriate nodes. SetupModels(); - - EXPECT_EQ(28u, handler() - ->GetCookiesTreeModelForTesting() - ->GetRoot() - ->GetTotalNodeCount()); - browsing_data_model_test_util::ValidateBrowsingDataEntries( - handler()->GetBrowsingDataModelForTesting(), - { - kGoogleUnpartitionedEntry, - kExampleUnpartitionedEntry, - kGoogleOnExampleEntry, - kExampleOnGoogleSecureEntry, - kExampleOnGoogleInsecureEntry, - }); + std::vector<browsing_data_model_test_util::BrowsingDataEntry> + expected_browsing_data_model_entries; + if (IsDeprecateCookiesTreeModelEnabled()) { + expected_browsing_data_model_entries = { + kGoogleUnpartitionedEntry, + kExampleUnpartitionedEntry, + kGoogleOnExampleEntry, + kExampleOnGoogleSecureEntry, + kExampleOnGoogleInsecureEntry, + kExampleLocalStorage, + kHttpExampleCookie, + kHttpsWwwExampleCookie, + kPartitionedHttpsWwwExampleOnGoogleAuCookie, + kPartitionedHttpsWwwExampleOnGoogleCookie, + kHttpAbcExampleCookie, + kHttpGoogleCookieA, + kHttpGoogleCookieB, + kHttpGoogleAuCookie, + kPartitionedHttpsGoogleAu1PCookie, + kPartitionedHttpsWwwAnotherExampleOnGoogleAuCookie, + kUngroupedHttpCookie, + }; + browsing_data_model_test_util::ValidateBrowsingDataEntries( + handler()->GetBrowsingDataModelForTesting(), + expected_browsing_data_model_entries); + } else { + EXPECT_EQ(28u, handler() + ->GetCookiesTreeModelForTesting() + ->GetRoot() + ->GetTotalNodeCount()); + expected_browsing_data_model_entries = { + kGoogleUnpartitionedEntry, kExampleUnpartitionedEntry, + kGoogleOnExampleEntry, kExampleOnGoogleSecureEntry, + kExampleOnGoogleInsecureEntry, + }; + browsing_data_model_test_util::ValidateBrowsingDataEntries( + handler()->GetBrowsingDataModelForTesting(), + expected_browsing_data_model_entries); + } base::Value::List args; args.Append("https://www.example.com/"); args.Append(GroupingKey::CreateFromEtldPlus1("google.com").Serialize()); handler()->HandleClearPartitionedUsage(args); + if (IsDeprecateCookiesTreeModelEnabled()) { + RemoveModelEntries(expected_browsing_data_model_entries, + { + kExampleOnGoogleSecureEntry, + kExampleOnGoogleInsecureEntry, + kPartitionedHttpsWwwExampleOnGoogleCookie, + }); + + browsing_data_model_test_util::ValidateBrowsingDataEntries( + handler()->GetBrowsingDataModelForTesting(), + expected_browsing_data_model_entries); + } else { + // This should have only removed cookies for embedded.com partitioned on + // google.com, leaving other cookies and storage untouched. + auto remaining_host_nodes = GetHostNodes(GURL("https://www.example.com")); + ASSERT_EQ(1u, remaining_host_nodes.size()); - // This should have only removed cookies for embedded.com partitioned on - // google.com, leaving other cookies and storage untouched. - auto remaining_host_nodes = GetHostNodes(GURL("https://www.example.com")); - ASSERT_EQ(1u, remaining_host_nodes.size()); - - // Both cookies and local storage type nodes should remain. - ASSERT_EQ(2u, remaining_host_nodes[0]->children().size()); + // Both cookies and local storage type nodes should remain. + ASSERT_EQ(2u, remaining_host_nodes[0]->children().size()); - for (const auto& storage_node : remaining_host_nodes[0]->children()) { - if (storage_node->GetDetailedInfo().node_type == - CookieTreeNode::DetailedInfo::TYPE_COOKIES) { - // Two cookies should remain, one unpartitioned and one partitioned on - // a different site. - ASSERT_EQ(2u, storage_node->children().size()); - for (const auto& cookie_node : storage_node->children()) { - const auto& cookie = cookie_node->GetDetailedInfo().cookie; - if (cookie->IsPartitioned()) - ASSERT_EQ("google.com.au", - cookie->PartitionKey()->site().GetURL().host()); + for (const auto& storage_node : remaining_host_nodes[0]->children()) { + if (storage_node->GetDetailedInfo().node_type == + CookieTreeNode::DetailedInfo::TYPE_COOKIES) { + // Two cookies should remain, one unpartitioned and one partitioned on + // a different site. + ASSERT_EQ(2u, storage_node->children().size()); + for (const auto& cookie_node : storage_node->children()) { + const auto& cookie = cookie_node->GetDetailedInfo().cookie; + if (cookie->IsPartitioned()) { + ASSERT_EQ("google.com.au", + cookie->PartitionKey()->site().GetURL().host()); + } + } + } else { + ASSERT_EQ(storage_node->GetDetailedInfo().node_type, + CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGES); } - } else { - ASSERT_EQ(storage_node->GetDetailedInfo().node_type, - CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGES); } - } - // Both of the entries for Example on Google should have been removed. - browsing_data_model_test_util::ValidateBrowsingDataEntries( - handler()->GetBrowsingDataModelForTesting(), - { - kGoogleUnpartitionedEntry, - kExampleUnpartitionedEntry, - kGoogleOnExampleEntry, - }); -} - -TEST_F(SiteSettingsHandlerTest, CookieSettingDescription) { - const auto kBlocked = [](int num) { - return l10n_util::GetPluralStringFUTF8( - IDS_SETTINGS_SITE_SETTINGS_COOKIES_BLOCK, num); - }; - const auto kAllowed = [](int num) { - return l10n_util::GetPluralStringFUTF8( - IDS_SETTINGS_SITE_SETTINGS_COOKIES_ALLOW, num); - }; - const std::string kBlockThirdParty = l10n_util::GetStringUTF8( - IDS_SETTINGS_SITE_SETTINGS_COOKIES_BLOCK_THIRD_PARTY); - const std::string kBlockThirdPartyIncognito = l10n_util::GetStringUTF8( - IDS_SETTINGS_SITE_SETTINGS_COOKIES_BLOCK_THIRD_PARTY_INCOGNITO); - - // Enforce expected default profile setting. - profile()->GetPrefs()->SetInteger( - prefs::kCookieControlsMode, - static_cast<int>(content_settings::CookieControlsMode::kIncognitoOnly)); - auto* content_settings = - HostContentSettingsMapFactory::GetForProfile(profile()); - content_settings->SetDefaultContentSetting( - ContentSettingsType::COOKIES, ContentSetting::CONTENT_SETTING_ALLOW); - web_ui()->ClearTrackedCalls(); - - // Validate get method works. - base::Value::List get_args; - get_args.Append(kCallbackId); - handler()->HandleGetCookieSettingDescription(get_args); - const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); - - EXPECT_EQ("cr.webUIResponse", data.function_name()); - EXPECT_EQ(kCallbackId, data.arg1()->GetString()); - ASSERT_TRUE(data.arg2()->GetBool()); - EXPECT_EQ(kBlockThirdPartyIncognito, data.arg3()->GetString()); - - // Multiple listeners will be called when prefs and content settings are - // changed in this test. Increment our expected call_data index accordingly. - int expected_call_index = 0; - const int kPrefListenerIndex = 1; - const int kContentSettingListenerIndex = 2; - - // Check updates are working, - profile()->GetPrefs()->SetInteger( - prefs::kCookieControlsMode, - static_cast<int>(content_settings::CookieControlsMode::kBlockThirdParty)); - expected_call_index += kPrefListenerIndex; - ValidateCookieSettingUpdate(kBlockThirdParty, expected_call_index); - - content_settings->SetDefaultContentSetting( - ContentSettingsType::COOKIES, ContentSetting::CONTENT_SETTING_BLOCK); - expected_call_index += kContentSettingListenerIndex; - ValidateCookieSettingUpdate(kBlocked(0), expected_call_index); - - // Check changes which do not affect the effective cookie setting. - profile()->GetPrefs()->SetInteger( - prefs::kCookieControlsMode, - static_cast<int>(content_settings::CookieControlsMode::kOff)); - expected_call_index += kPrefListenerIndex; - ValidateCookieSettingUpdate(kBlocked(0), expected_call_index); - - // Set to allow and check previous changes are respected. - content_settings->SetDefaultContentSetting( - ContentSettingsType::COOKIES, ContentSetting::CONTENT_SETTING_ALLOW); - expected_call_index += kContentSettingListenerIndex; - ValidateCookieSettingUpdate(kAllowed(0), expected_call_index); - - // Confirm exceptions are counted correctly. - GURL url1("https://example.com"); - GURL url2("http://example.com"); - GURL url3("http://another.example.com"); - content_settings->SetContentSettingDefaultScope( - url1, url1, ContentSettingsType::COOKIES, - ContentSetting::CONTENT_SETTING_BLOCK); - expected_call_index += kContentSettingListenerIndex; - ValidateCookieSettingUpdate(kAllowed(1), expected_call_index); - - content_settings->SetContentSettingDefaultScope( - url2, url2, ContentSettingsType::COOKIES, - ContentSetting::CONTENT_SETTING_ALLOW); - expected_call_index += kContentSettingListenerIndex; - ValidateCookieSettingUpdate(kAllowed(1), expected_call_index); - - content_settings->SetContentSettingDefaultScope( - url3, url3, ContentSettingsType::COOKIES, - ContentSetting::CONTENT_SETTING_SESSION_ONLY); - expected_call_index += kContentSettingListenerIndex; - ValidateCookieSettingUpdate(kAllowed(1), expected_call_index); - - content_settings->SetDefaultContentSetting( - ContentSettingsType::COOKIES, ContentSetting::CONTENT_SETTING_BLOCK); - expected_call_index += kContentSettingListenerIndex; - ValidateCookieSettingUpdate(kBlocked(2), expected_call_index); + // Both of the entries for Example on Google should have been removed. + RemoveModelEntries(expected_browsing_data_model_entries, + { + kExampleOnGoogleSecureEntry, + kExampleOnGoogleInsecureEntry, + }); + browsing_data_model_test_util::ValidateBrowsingDataEntries( + handler()->GetBrowsingDataModelForTesting(), + expected_browsing_data_model_entries); + } } -TEST_F(SiteSettingsHandlerTest, HandleGetFpsMembershipLabel) { +TEST_P(SiteSettingsHandlerTest, HandleGetFpsMembershipLabel) { base::Value::List args; args.Append("getFpsMembershipLabel"); args.Append(5); @@ -6142,7 +6530,7 @@ TEST_F(SiteSettingsHandlerTest, HandleGetFpsMembershipLabel) { EXPECT_EQ("5 sites in google.com's group", data.arg3()->GetString()); } -TEST_F(SiteSettingsHandlerTest, HandleGetFormattedBytes) { +TEST_P(SiteSettingsHandlerTest, HandleGetFormattedBytes) { const double size = 120000000000; base::Value::List get_args; get_args.Append(kCallbackId); @@ -6158,7 +6546,7 @@ TEST_F(SiteSettingsHandlerTest, HandleGetFormattedBytes) { data.arg3()->GetString()); } -TEST_F(SiteSettingsHandlerTest, HandleGetUsageInfo) { +TEST_P(SiteSettingsHandlerTest, HandleGetUsageInfo) { SetupDefaultFirstPartySets(mock_privacy_sandbox_service()); EXPECT_CALL(*mock_privacy_sandbox_service(), IsPartOfManagedFirstPartySet(_)) @@ -6173,13 +6561,19 @@ TEST_F(SiteSettingsHandlerTest, HandleGetUsageInfo) { // Confirm that usage info only returns unpartitioned storage. SetupModels(); - EXPECT_EQ(28u, handler() - ->GetCookiesTreeModelForTesting() - ->GetRoot() - ->GetTotalNodeCount()); - EXPECT_EQ(5, - std::distance(handler()->GetBrowsingDataModelForTesting()->begin(), + if (IsDeprecateCookiesTreeModelEnabled()) { + EXPECT_EQ( + 17, std::distance(handler()->GetBrowsingDataModelForTesting()->begin(), handler()->GetBrowsingDataModelForTesting()->end())); + } else { + EXPECT_EQ(28u, handler() + ->GetCookiesTreeModelForTesting() + ->GetRoot() + ->GetTotalNodeCount()); + EXPECT_EQ( + 5, std::distance(handler()->GetBrowsingDataModelForTesting()->begin(), + handler()->GetBrowsingDataModelForTesting()->end())); + } base::Value::List args; args.Append("http://www.example.com"); @@ -6217,7 +6611,7 @@ TEST_F(SiteSettingsHandlerTest, HandleGetUsageInfo) { ValidateUsageInfo("http://ungrouped.com//", "", "1 cookie", "", false); } -TEST_F(SiteSettingsHandlerTest, FirstPartySetsMembership) { +TEST_P(SiteSettingsHandlerTest, FirstPartySetsMembership) { SetupDefaultFirstPartySets(mock_privacy_sandbox_service()); EXPECT_CALL(*mock_privacy_sandbox_service(), IsPartOfManagedFirstPartySet(_)) @@ -6249,7 +6643,7 @@ TEST_F(SiteSettingsHandlerTest, FirstPartySetsMembership) { ValidateSitesWithFps(storage_and_cookie_list, first_party_sets); } -TEST_F(SiteSettingsHandlerTest, IsolatedWebAppUsageInfo) { +TEST_P(SiteSettingsHandlerTest, IsolatedWebAppUsageInfo) { std::string iwa_url = "isolated-app://" "aerugqztij5biqquuk3mfwpsaibuegaqcitgfchwuosuofdjabzqaaic/"; @@ -6266,7 +6660,7 @@ TEST_F(SiteSettingsHandlerTest, IsolatedWebAppUsageInfo) { /*expected_fps_member_count_string=*/"", /*expected_fps_policy=*/false); } -TEST_F(SiteSettingsHandlerTest, IsolatedWebAppClearSiteGroupDataAndCookies) { +TEST_P(SiteSettingsHandlerTest, IsolatedWebAppClearSiteGroupDataAndCookies) { GURL iwa_url1( "isolated-app://" "abcdefztij5biqquuk3mfwpsaibuegaqcitgfchwuosuofdjabzqaaic/"); @@ -6302,7 +6696,7 @@ TEST_F(SiteSettingsHandlerTest, IsolatedWebAppClearSiteGroupDataAndCookies) { verify_site_group(all_sites_list[0], iwa_url2, 2000); } -TEST_F(SiteSettingsHandlerTest, IsolatedWebAppClearUnpartitionedUsage) { +TEST_P(SiteSettingsHandlerTest, IsolatedWebAppClearUnpartitionedUsage) { GURL iwa_url( "isolated-app://" "abcdefztij5biqquuk3mfwpsaibuegaqcitgfchwuosuofdjabzqaaic/"); diff --git a/chromium/chrome/browser/ui/webui/settings/site_settings_helper.cc b/chromium/chrome/browser/ui/webui/settings/site_settings_helper.cc index c0cc4dbb11a..75160b23271 100644 --- a/chromium/chrome/browser/ui/webui/settings/site_settings_helper.cc +++ b/chromium/chrome/browser/ui/webui/settings/site_settings_helper.cc @@ -46,7 +46,6 @@ #include "components/content_settings/core/common/content_settings_pattern.h" #include "components/content_settings/core/common/content_settings_utils.h" #include "components/permissions/contexts/bluetooth_chooser_context.h" -#include "components/permissions/features.h" #include "components/permissions/object_permission_context_base.h" #include "components/permissions/permission_decision_auto_blocker.h" #include "components/permissions/permission_util.h" @@ -96,6 +95,7 @@ const ContentSettingsTypeNameEntry kContentSettingsTypeGroupNames[] = { {ContentSettingsType::COOKIES, "cookies"}, {ContentSettingsType::IMAGES, "images"}, {ContentSettingsType::JAVASCRIPT, "javascript"}, + {ContentSettingsType::JAVASCRIPT_JIT, "javascript-jit"}, {ContentSettingsType::POPUPS, "popups"}, {ContentSettingsType::GEOLOCATION, "location"}, {ContentSettingsType::NOTIFICATIONS, "notifications"}, @@ -138,6 +138,8 @@ const ContentSettingsTypeNameEntry kContentSettingsTypeGroupNames[] = { {ContentSettingsType::ANTI_ABUSE, "anti-abuse"}, {ContentSettingsType::STORAGE_ACCESS, "storage-access"}, {ContentSettingsType::AUTO_PICTURE_IN_PICTURE, "auto-picture-in-picture"}, + {ContentSettingsType::CAPTURED_SURFACE_CONTROL, "captured-surface-control"}, + {ContentSettingsType::WEB_PRINTING, "web-printing"}, // Add new content settings here if a corresponding Javascript string // representation for it is not required, for example if the content setting @@ -173,11 +175,11 @@ const ContentSettingsTypeNameEntry kContentSettingsTypeGroupNames[] = { {ContentSettingsType::FILE_SYSTEM_LAST_PICKED_DIRECTORY, nullptr}, {ContentSettingsType::DISPLAY_CAPTURE, nullptr}, {ContentSettingsType::FEDERATED_IDENTITY_SHARING, nullptr}, - {ContentSettingsType::JAVASCRIPT_JIT, nullptr}, {ContentSettingsType::HTTP_ALLOWED, nullptr}, {ContentSettingsType::HTTPS_ENFORCED, nullptr}, {ContentSettingsType::FORMFILL_METADATA, nullptr}, - {ContentSettingsType::FEDERATED_IDENTITY_ACTIVE_SESSION, nullptr}, + {ContentSettingsType::DEPRECATED_FEDERATED_IDENTITY_ACTIVE_SESSION, + nullptr}, {ContentSettingsType::AUTO_DARK_WEB_CONTENT, nullptr}, {ContentSettingsType::REQUEST_DESKTOP_SITE, nullptr}, {ContentSettingsType::NOTIFICATION_INTERACTIONS, nullptr}, @@ -198,12 +200,17 @@ const ContentSettingsTypeNameEntry kContentSettingsTypeGroupNames[] = { {ContentSettingsType::THIRD_PARTY_STORAGE_PARTITIONING, nullptr}, {ContentSettingsType::ALL_SCREEN_CAPTURE, nullptr}, {ContentSettingsType::COOKIE_CONTROLS_METADATA, nullptr}, - {ContentSettingsType::TPCD_SUPPORT, nullptr}, + {ContentSettingsType::TPCD_TRIAL, nullptr}, {ContentSettingsType::TPCD_METADATA_GRANTS, nullptr}, // TODO(crbug.com/1011533): Update the name once the design is finalized // for the integration with Safety Hub. {ContentSettingsType::FILE_SYSTEM_ACCESS_EXTENDED_PERMISSION, nullptr}, {ContentSettingsType::TPCD_HEURISTICS_GRANTS, nullptr}, + {ContentSettingsType::FILE_SYSTEM_ACCESS_RESTORE_PERMISSION, nullptr}, + // TODO(crbug.com/1464851): Update name once UI design is done. + {ContentSettingsType::SMART_CARD_GUARD, nullptr}, + {ContentSettingsType::SMART_CARD_DATA, nullptr}, + {ContentSettingsType::TOP_LEVEL_TPCD_TRIAL, nullptr}, }; static_assert(std::size(kContentSettingsTypeGroupNames) == @@ -310,13 +317,9 @@ SiteSettingSource CalculateSiteSettingSource( return SiteSettingSource::kPreference; } -bool PatternAppliesToWebUISchemes(const ContentSettingPatternSource& pattern) { - return pattern.primary_pattern.GetScheme() == - ContentSettingsPattern::SchemeType::SCHEME_CHROME || - pattern.primary_pattern.GetScheme() == - ContentSettingsPattern::SchemeType::SCHEME_CHROMEUNTRUSTED || - pattern.primary_pattern.GetScheme() == - ContentSettingsPattern::SchemeType::SCHEME_DEVTOOLS; +bool IsFromWebUIAllowlistSource(const ContentSettingPatternSource& pattern) { + return HostContentSettingsMap::GetProviderTypeFromSource(pattern.source) == + HostContentSettingsMap::WEBUI_ALLOWLIST_PROVIDER; } // If the given |pattern| represents an individual origin, Isolated Web App, or @@ -522,6 +525,7 @@ const std::vector<ContentSettingsType>& GetVisiblePermissionCategories() { ContentSettingsType::MEDIASTREAM_CAMERA, ContentSettingsType::MEDIASTREAM_MIC, ContentSettingsType::MIXEDSCRIPT, + ContentSettingsType::JAVASCRIPT_JIT, ContentSettingsType::NOTIFICATIONS, ContentSettingsType::POPUPS, #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) @@ -571,13 +575,16 @@ const std::vector<ContentSettingsType>& GetVisiblePermissionCategories() { base_types->push_back(ContentSettingsType::AUTO_PICTURE_IN_PICTURE); } - if (base::FeatureList::IsEnabled( - permissions::features::kBlockMidiByDefault)) { + if (base::FeatureList::IsEnabled(features::kBlockMidiByDefault)) { base_types->push_back(ContentSettingsType::MIDI); } else { base_types->push_back(ContentSettingsType::MIDI_SYSEX); } + if (base::FeatureList::IsEnabled(blink::features::kWebPrinting)) { + base_types->push_back(ContentSettingsType::WEB_PRINTING); + } + initialized = true; } @@ -848,8 +855,8 @@ void GetRawExceptionsForContentSettingsType( continue; } - // Don't add WebUI settings. - if (PatternAppliesToWebUISchemes(setting)) { + // Don't add allowlisted settings. + if (IsFromWebUIAllowlistSource(setting)) { continue; } @@ -861,20 +868,15 @@ void GetRawExceptionsForContentSettingsType( } auto content_setting = setting.GetContentSetting(); - + // There is no user-facing concept of SESSION_ONLY cookie exceptions that + // use secondary patterns. These are instead presented as ALLOW. + // TODO(crbug.com/1404436): Perform a one time migration of the actual + // content settings when the extension API no-longer allows them to be + // created. if (type == ContentSettingsType::COOKIES && - base::FeatureList::IsEnabled( - privacy_sandbox::kPrivacySandboxSettings4)) { - // With the changes to settings introduced in PrivacySandboxSettings4, - // there is no user-facing concept of SESSION_ONLY cookie exceptions that - // use secondary patterns. These are instead presented as ALLOW. - // TODO(crbug.com/1404436): Perform a one time migration of the actual - // content settings when the extension API no-longer allows them to be - // created. - if (content_setting == ContentSetting::CONTENT_SETTING_SESSION_ONLY && - setting.secondary_pattern != ContentSettingsPattern::Wildcard()) { - content_setting = ContentSetting::CONTENT_SETTING_ALLOW; - } + content_setting == ContentSetting::CONTENT_SETTING_SESSION_ONLY && + setting.secondary_pattern != ContentSettingsPattern::Wildcard()) { + content_setting = ContentSetting::CONTENT_SETTING_ALLOW; } all_patterns_settings[{setting.primary_pattern, setting.source}][{ @@ -960,6 +962,8 @@ void GetExceptionsForContentType(ContentSettingsType type, // Display the URLs with File System entries that are granted // permissions via File System Access Persistent Permissions. + // TODO(crbug.com/1467574): Remove `kFileSystemAccessPersistentPermissions` + // flag after FSA Persistent Permissions feature launch. if (base::FeatureList::IsEnabled( features::kFileSystemAccessPersistentPermissions) && (type == ContentSettingsType::FILE_SYSTEM_READ_GUARD || @@ -1070,7 +1074,7 @@ ContentSetting GetContentSettingForOrigin(Profile* profile, permissions::PermissionDecisionAutoBlocker* auto_blocker = permissions::PermissionsClient::Get() ->GetPermissionDecisionAutoBlocker(profile); - absl::optional<content::PermissionResult> embargo_result = + std::optional<content::PermissionResult> embargo_result = auto_blocker->GetEmbargoResult(origin, content_type); if (embargo_result) { result = embargo_result.value(); @@ -1097,11 +1101,12 @@ std::vector<ContentSettingPatternSource> GetSingleOriginExceptionsForContentType(HostContentSettingsMap* map, ContentSettingsType content_type) { ContentSettingsForOneType entries = map->GetSettingsForOneType(content_type); - // Exclude any entries that don't represent a single webby top-frame origin. + // Exclude any entries that are allowlisted or don't represent a single + // top-frame origin. base::EraseIf(entries, [](const ContentSettingPatternSource& e) { return !content_settings::PatternAppliesToSingleOrigin( e.primary_pattern, e.secondary_pattern) || - PatternAppliesToWebUISchemes(e); + IsFromWebUIAllowlistSource(e); }); return entries; } diff --git a/chromium/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc b/chromium/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc index 8434a85320f..a15e07160d5 100644 --- a/chromium/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc +++ b/chromium/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc @@ -49,6 +49,7 @@ #include "services/device/public/cpp/test/fake_usb_device_manager.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/webui/webui_allowlist.h" #include "url/gurl.h" #if BUILDFLAG(ENABLE_EXTENSIONS) @@ -142,7 +143,7 @@ TEST_F(SiteSettingsHelperTest, ExceptionListWithEmbargoedAndBlockedOrigins) { ASSERT_EQ(2U, exceptions.size()); // Get last added origin. - absl::optional<bool> is_embargoed = + std::optional<bool> is_embargoed = exceptions[0].GetDict().FindBool(site_settings::kIsEmbargoed); ASSERT_TRUE(is_embargoed.has_value()); // Last added origin is blocked, |embargo| key should be false. @@ -363,7 +364,7 @@ TEST_F(SiteSettingsHelperTest, ExceptionListFedCmEmbargo) { // |exceptions| should have an exception for the embargoed origin. ASSERT_EQ(1U, exceptions.size()); - absl::optional<bool> is_embargoed = + std::optional<bool> is_embargoed = exceptions[0].GetDict().FindBool(site_settings::kIsEmbargoed); ASSERT_TRUE(is_embargoed.has_value()); EXPECT_TRUE(*is_embargoed); @@ -373,6 +374,44 @@ TEST_F(SiteSettingsHelperTest, ExceptionListFedCmEmbargo) { EXPECT_EQ(kOriginToEmbargo, *primary_pattern); } +TEST_F(SiteSettingsHelperTest, ExceptionListIgnoresWebUIAllowlist) { + TestingProfile profile; + auto* allowlist = WebUIAllowlist::GetOrCreate(&profile); + + // Confirm that WebUI allowlist entries are excluded from the exception list. + allowlist->RegisterAutoGrantedPermission( + url::Origin::Create(GURL("chrome://example.com")), + ContentSettingsType::COOKIES); + + // Secondary patterns should also be ignored. + allowlist->RegisterAutoGrantedThirdPartyCookies( + url::Origin::Create(GURL("chrome-untrusted://another-example.com")), + { + ContentSettingsPattern::FromURL(GURL("https://embedded-1.com")), + ContentSettingsPattern::FromURL(GURL("https://embedded-2.com")), + }); + + base::Value::List exceptions; + site_settings::GetExceptionsForContentType(ContentSettingsType::COOKIES, + &profile, + /*web_ui=*/nullptr, + /*incognito=*/false, &exceptions); + ASSERT_EQ(0U, exceptions.size()); + + // Exceptions from other sources that use a WebUI scheme should however be + // displayed. + auto* map = HostContentSettingsMapFactory::GetForProfile(&profile); + map->SetContentSettingDefaultScope( + GURL("chrome://example"), GURL("chrome-untrusted://another-example"), + ContentSettingsType::COOKIES, CONTENT_SETTING_BLOCK); + + site_settings::GetExceptionsForContentType(ContentSettingsType::COOKIES, + &profile, + /*web_ui=*/nullptr, + /*incognito=*/false, &exceptions); + ASSERT_EQ(1U, exceptions.size()); +} + TEST_F(SiteSettingsHelperTest, CheckExceptionOrder) { TestingProfile profile; HostContentSettingsMap* map = @@ -393,7 +432,8 @@ TEST_F(SiteSettingsHelperTest, CheckExceptionOrder) { policy_provider->SetWebsiteSetting( ContentSettingsPattern::FromString(star_google_com), ContentSettingsPattern::Wildcard(), kContentType, - base::Value(CONTENT_SETTING_BLOCK)); + base::Value(CONTENT_SETTING_BLOCK), /*constraints=*/{}, + content_settings::PartitionKey::GetDefaultForTesting()); policy_provider->set_read_only(true); content_settings::TestUtils::OverrideProvider( map, std::move(policy_provider), HostContentSettingsMap::POLICY_PROVIDER); @@ -411,7 +451,8 @@ TEST_F(SiteSettingsHelperTest, CheckExceptionOrder) { extension_provider->SetWebsiteSetting( ContentSettingsPattern::FromString(drive_google_com), ContentSettingsPattern::Wildcard(), kContentType, - base::Value(CONTENT_SETTING_ASK)); + base::Value(CONTENT_SETTING_ASK), /*constraints=*/{}, + content_settings::PartitionKey::GetDefaultForTesting()); extension_provider->set_read_only(true); content_settings::TestUtils::OverrideProvider( map, std::move(extension_provider), @@ -485,10 +526,11 @@ TEST_F(SiteSettingsHelperTest, ContentSettingSource) { // Extension. auto extension_provider = std::make_unique<content_settings::MockProvider>(); - extension_provider->SetWebsiteSetting(ContentSettingsPattern::FromURL(origin), - ContentSettingsPattern::FromURL(origin), - kContentType, - base::Value(CONTENT_SETTING_BLOCK)); + extension_provider->SetWebsiteSetting( + ContentSettingsPattern::FromURL(origin), + ContentSettingsPattern::FromURL(origin), kContentType, + base::Value(CONTENT_SETTING_BLOCK), /*constraints=*/{}, + content_settings::PartitionKey::GetDefaultForTesting()); extension_provider->set_read_only(true); content_settings::TestUtils::OverrideProvider( map, std::move(extension_provider), @@ -500,10 +542,11 @@ TEST_F(SiteSettingsHelperTest, ContentSettingSource) { // Enterprise policy. auto policy_provider = std::make_unique<content_settings::MockProvider>(); - policy_provider->SetWebsiteSetting(ContentSettingsPattern::FromURL(origin), - ContentSettingsPattern::FromURL(origin), - kContentType, - base::Value(CONTENT_SETTING_ALLOW)); + policy_provider->SetWebsiteSetting( + ContentSettingsPattern::FromURL(origin), + ContentSettingsPattern::FromURL(origin), kContentType, + base::Value(CONTENT_SETTING_ALLOW), /*constraints=*/{}, + content_settings::PartitionKey::GetDefaultForTesting()); policy_provider->set_read_only(true); content_settings::TestUtils::OverrideProvider( map, std::move(policy_provider), HostContentSettingsMap::POLICY_PROVIDER); @@ -559,45 +602,35 @@ TEST_F(SiteSettingsHelperTest, CookieExceptions) { kContentTypeCookies, test_case.initial_setting); } - for (const auto feature_state : std::vector<bool>{true, false}) { - base::test::ScopedFeatureList feature_list_; - feature_list_.InitWithFeatureState( - privacy_sandbox::kPrivacySandboxSettings4, feature_state); - - base::Value::List exceptions; - site_settings::GetExceptionsForContentType(kContentTypeCookies, &profile, - /*web_ui=*/nullptr, - /*incognito=*/false, - &exceptions); + base::Value::List exceptions; + site_settings::GetExceptionsForContentType(kContentTypeCookies, &profile, + /*web_ui=*/nullptr, + /*incognito=*/false, &exceptions); - // Convert the test cases, and the returned dictionary, into tuples for - // unordered comparison, as the order of exception is not relevant. - std::vector<std::tuple<std::string, std::string, std::string>> expected = - base::test::ToVector(test_cases, [&](const auto& test_case) { - // make_tuple as we've some temporary rvalues. - return std::make_tuple( - test_case.primary_pattern, - test_case.secondary_pattern == - ContentSettingsPattern::Wildcard().ToString() - ? "" - : test_case.secondary_pattern, - content_settings::ContentSettingToString( - feature_state ? test_case.updated_setting - : test_case.initial_setting)); - }); - - std::vector<std::tuple<std::string, std::string, std::string>> actual = - base::test::ToVector(exceptions, [](const auto& exception) { - const base::Value::Dict& dict = exception.GetDict(); - return std::make_tuple(*dict.FindString(kOrigin), - *dict.FindString(kEmbeddingOrigin), - *dict.FindString(kSetting)); - }); - - EXPECT_THAT(actual, testing::UnorderedElementsAreArray(expected)) - << "Privacy Sandbox Settings 4 " - << (feature_state ? "enabled" : "disabled"); - } + // Convert the test cases, and the returned dictionary, into tuples for + // unordered comparison, as the order of exception is not relevant. + std::vector<std::tuple<std::string, std::string, std::string>> expected = + base::test::ToVector(test_cases, [&](const auto& test_case) { + // make_tuple as we've some temporary rvalues. + return std::make_tuple( + test_case.primary_pattern, + test_case.secondary_pattern == + ContentSettingsPattern::Wildcard().ToString() + ? "" + : test_case.secondary_pattern, + content_settings::ContentSettingToString( + test_case.updated_setting)); + }); + + std::vector<std::tuple<std::string, std::string, std::string>> actual = + base::test::ToVector(exceptions, [](const auto& exception) { + const base::Value::Dict& dict = exception.GetDict(); + return std::make_tuple(*dict.FindString(kOrigin), + *dict.FindString(kEmbeddingOrigin), + *dict.FindString(kSetting)); + }); + + EXPECT_THAT(actual, testing::UnorderedElementsAreArray(expected)); } TEST_F(SiteSettingsHelperTest, GetExpirationDescription) { @@ -713,7 +746,7 @@ void ExpectValidSiteExceptionObject(const base::Value& actual_site_object, ASSERT_TRUE(source_value); EXPECT_EQ(*source_value, source); - absl::optional<bool> incognito_value = actual_site_dict.FindBool(kIncognito); + std::optional<bool> incognito_value = actual_site_dict.FindBool(kIncognito); ASSERT_TRUE(incognito_value.has_value()); EXPECT_EQ(*incognito_value, incognito); } |