diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-08-28 15:28:34 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-08-28 13:54:51 +0000 |
commit | 2a19c63448c84c1805fb1a585c3651318bb86ca7 (patch) | |
tree | eb17888e8531aa6ee5e85721bd553b832a7e5156 /chromium/chrome/browser/ui/webui/settings | |
parent | b014812705fc80bff0a5c120dfcef88f349816dc (diff) |
BASELINE: Update Chromium to 69.0.3497.70
Change-Id: I2b7b56e4e7a8b26656930def0d4575dc32b900a0
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/chrome/browser/ui/webui/settings')
38 files changed, 1218 insertions, 575 deletions
diff --git a/chromium/chrome/browser/ui/webui/settings/about_handler.cc b/chromium/chrome/browser/ui/webui/settings/about_handler.cc index 8bd560132b1..067049dbd29 100644 --- a/chromium/chrome/browser/ui/webui/settings/about_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/about_handler.cc @@ -66,6 +66,7 @@ #include "chrome/browser/ui/webui/help/version_updater_chromeos.h" #include "chromeos/chromeos_switches.h" #include "chromeos/dbus/power_manager_client.h" +#include "chromeos/dbus/util/version_loader.h" #include "chromeos/network/network_state.h" #include "chromeos/network/network_state_handler.h" #include "chromeos/system/statistics_provider.h" @@ -321,6 +322,11 @@ AboutHandler* AboutHandler::Create(content::WebUIDataSource* html_source, IDS_ABOUT_CROS_VERSION_LICENSE, base::ASCIIToUTF16(chrome::kChromeUIOSCreditsURL)); html_source->AddString("aboutProductOsLicense", os_license); + base::string16 os_with_linux_license = l10n_util::GetStringFUTF16( + IDS_ABOUT_CROS_WITH_LINUX_VERSION_LICENSE, + base::ASCIIToUTF16(chrome::kChromeUIOSCreditsURL)); + html_source->AddString("aboutProductOsWithLinuxLicense", + os_with_linux_license); html_source->AddBoolean("aboutEnterpriseManaged", IsEnterpriseManaged()); base::Time build_time = base::SysInfo::GetLsbReleaseTime(); @@ -646,6 +652,7 @@ void AboutHandler::RequestUpdate() { void AboutHandler::SetUpdateStatus(VersionUpdater::Status status, int progress, + bool rollback, const std::string& version, int64_t size, const base::string16& message) { @@ -656,6 +663,7 @@ void AboutHandler::SetUpdateStatus(VersionUpdater::Status status, event->SetString("status", UpdateStatusToString(status)); event->SetString("message", message); event->SetInteger("progress", progress); + event->SetBoolean("rollback", rollback); event->SetString("version", version); // DictionaryValue does not support int64_t, so convert to string. event->SetString("size", base::Int64ToString(size)); diff --git a/chromium/chrome/browser/ui/webui/settings/about_handler.h b/chromium/chrome/browser/ui/webui/settings/about_handler.h index 3cbfa4a8d4b..4c8ae08a292 100644 --- a/chromium/chrome/browser/ui/webui/settings/about_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/about_handler.h @@ -22,7 +22,6 @@ #if defined(OS_CHROMEOS) #include "base/task/cancelable_task_tracker.h" #include "chrome/browser/chromeos/tpm_firmware_update.h" -#include "chromeos/system/version_loader.h" #endif // defined(OS_CHROMEOS) namespace base { @@ -128,6 +127,7 @@ class AboutHandler : public settings::SettingsPageUIHandler, // Callback method which forwards status updates to the page. void SetUpdateStatus(VersionUpdater::Status status, int progress, + bool rollback, const std::string& version, int64_t size, const base::string16& fail_message); diff --git a/chromium/chrome/browser/ui/webui/settings/change_password_handler.cc b/chromium/chrome/browser/ui/webui/settings/change_password_handler.cc index 6d64f7bbd08..090962aebcf 100644 --- a/chromium/chrome/browser/ui/webui/settings/change_password_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/change_password_handler.cc @@ -54,6 +54,8 @@ void ChangePasswordHandler::HandleInitialize(const base::ListValue* args) { void ChangePasswordHandler::HandleChangePassword(const base::ListValue* args) { service_->OnUserAction( web_ui()->GetWebContents(), + safe_browsing::LoginReputationClientRequest::PasswordReuseEvent:: + SIGN_IN_PASSWORD, safe_browsing::PasswordProtectionService::CHROME_SETTINGS, safe_browsing::PasswordProtectionService::CHANGE_PASSWORD); } diff --git a/chromium/chrome/browser/ui/webui/settings/chrome_cleanup_handler.cc b/chromium/chrome/browser/ui/webui/settings/chrome_cleanup_handler.cc index f07c59b79c0..271e31ac2b6 100644 --- a/chromium/chrome/browser/ui/webui/settings/chrome_cleanup_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/chrome_cleanup_handler.cc @@ -44,24 +44,27 @@ std::unique_ptr<base::ListValue> GetFilesAsListStorage( return value; } -// Returns a ListValue containing a copy of the registry keys stored in -// |registry_keys|. -std::unique_ptr<base::ListValue> GetRegistryKeysAsListStorage( - const std::set<base::string16>& registry_keys) { +// Returns a ListValue containing a copy of the strings stored in |string_set|. +std::unique_ptr<base::ListValue> GetStringSetAsListStorage( + const std::set<base::string16>& string_set) { auto value = std::make_unique<base::ListValue>(); - for (const base::string16& key : registry_keys) - value->AppendString(key); + for (const base::string16& string : string_set) + value->AppendString(string); return value; } base::DictionaryValue GetScannerResultsAsDictionary( - const safe_browsing::ChromeCleanerScannerResults& scanner_results) { + const safe_browsing::ChromeCleanerScannerResults& scanner_results, + Profile* profile) { base::DictionaryValue value; value.SetList("files", GetFilesAsListStorage(scanner_results.files_to_delete())); value.SetList("registryKeys", - GetRegistryKeysAsListStorage(scanner_results.registry_keys())); + GetStringSetAsListStorage(scanner_results.registry_keys())); + std::set<base::string16> extensions; + scanner_results.FetchExtensionNames(profile, &extensions); + value.SetList("extensions", GetStringSetAsListStorage(extensions)); return value; } @@ -178,7 +181,7 @@ void ChromeCleanupHandler::OnInfected( const safe_browsing::ChromeCleanerScannerResults& scanner_results) { FireWebUIListener("chrome-cleanup-on-infected", base::Value(is_powered_by_partner), - GetScannerResultsAsDictionary(scanner_results)); + GetScannerResultsAsDictionary(scanner_results, profile_)); } void ChromeCleanupHandler::OnCleaning( @@ -186,7 +189,7 @@ void ChromeCleanupHandler::OnCleaning( const safe_browsing::ChromeCleanerScannerResults& scanner_results) { FireWebUIListener("chrome-cleanup-on-cleaning", base::Value(is_powered_by_partner), - GetScannerResultsAsDictionary(scanner_results)); + GetScannerResultsAsDictionary(scanner_results, profile_)); } void ChromeCleanupHandler::OnRebootRequired() { @@ -194,14 +197,9 @@ void ChromeCleanupHandler::OnRebootRequired() { } void ChromeCleanupHandler::OnLogsEnabledChanged(bool logs_enabled) { - // Logs are considered managed if the logs themselves are managed or if the - // entire cleanup feature is disabled by policy. - PrefService* local_state = g_browser_process->local_state(); - bool is_managed = !controller_->IsAllowedByPolicy() || - (local_state && local_state->IsManagedPreference( - prefs::kSwReporterReportingEnabled)); FireWebUIListener("chrome-cleanup-upload-permission-change", - base::Value(is_managed), base::Value(logs_enabled)); + base::Value(controller_->IsReportingManagedByPolicy()), + base::Value(logs_enabled)); } void ChromeCleanupHandler::OnLogsEnabledPrefChanged() { diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc index aba28c25d50..46968303b50 100644 --- a/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc @@ -14,6 +14,7 @@ #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" +#include "chrome/browser/ui/webui/signin/inline_login_handler_dialog_chromeos.h" #include "chromeos/account_manager/account_manager.h" #include "chromeos/account_manager/account_manager_factory.h" #include "components/signin/core/browser/account_tracker_service.h" @@ -29,15 +30,28 @@ AccountManagerUIHandler::AccountManagerUIHandler( AccountTrackerService* account_tracker_service) : account_manager_(account_manager), account_tracker_service_(account_tracker_service), - weak_factory_(this) {} + weak_factory_(this) { + DCHECK(account_manager_); + DCHECK(account_tracker_service_); -AccountManagerUIHandler::~AccountManagerUIHandler() = default; + account_manager_->AddObserver(this); + account_tracker_service_->AddObserver(this); +} + +AccountManagerUIHandler::~AccountManagerUIHandler() { + account_manager_->RemoveObserver(this); + account_tracker_service_->RemoveObserver(this); +} void AccountManagerUIHandler::RegisterMessages() { web_ui()->RegisterMessageCallback( "getAccounts", base::BindRepeating(&AccountManagerUIHandler::HandleGetAccounts, weak_factory_.GetWeakPtr())); + web_ui()->RegisterMessageCallback( + "addAccount", + base::BindRepeating(&AccountManagerUIHandler::HandleAddAccount, + weak_factory_.GetWeakPtr())); } void AccountManagerUIHandler::HandleGetAccounts(const base::ListValue* args) { @@ -71,6 +85,12 @@ void AccountManagerUIHandler::GetAccountsCallbackHandler( account_tracker_service_->FindAccountInfoByGaiaId(account_key.id); DCHECK(!account_info.IsEmpty()); + if (account_info.full_name.empty()) { + // Account info has not been fully fetched yet from GAIA. Ignore this + // account. + continue; + } + base::DictionaryValue account; account.SetString("fullName", account_info.full_name); account.SetString("email", account_info.email); @@ -96,9 +116,52 @@ void AccountManagerUIHandler::GetAccountsCallbackHandler( ResolveJavascriptCallback(callback_id, accounts); } +void AccountManagerUIHandler::HandleAddAccount(const base::ListValue* args) { + AllowJavascript(); + InlineLoginHandlerDialogChromeOS::Show(); +} + void AccountManagerUIHandler::OnJavascriptAllowed() {} void AccountManagerUIHandler::OnJavascriptDisallowed() {} +// |AccountManager::Observer| overrides. +// Note: We need to listen on |AccountManager| in addition to +// |AccountTrackerService| because there is no guarantee that |AccountManager| +// (our source of truth) will have a newly added account by the time +// |AccountTrackerService| has it. +void AccountManagerUIHandler::OnTokenUpserted( + const AccountManager::AccountKey& account_key) { + RefreshUI(); +} + +void AccountManagerUIHandler::OnAccountRemoved( + const AccountManager::AccountKey& account_key) { + RefreshUI(); +} + +// |AccountTrackerService::Observer| overrides. +// For newly added accounts, |AccountTrackerService| may take some time to +// fetch user's full name and account image. Whenever that is completed, we +// may need to update the UI with this new set of information. +// Note that we may be listening to |AccountTrackerService| but we still +// consider |AccountManager| to be the source of truth for account list. +void AccountManagerUIHandler::OnAccountUpdated(const AccountInfo& info) { + RefreshUI(); +} + +void AccountManagerUIHandler::OnAccountImageUpdated( + const std::string& account_id, + const gfx::Image& image) { + RefreshUI(); +} + +void AccountManagerUIHandler::OnAccountRemoved(const AccountInfo& account_key) { +} + +void AccountManagerUIHandler::RefreshUI() { + FireWebUIListener("accounts-changed"); +} + } // namespace settings } // namespace chromeos diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h index 95316717231..078a51cb189 100644 --- a/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h @@ -5,19 +5,21 @@ #ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_ACCOUNT_MANAGER_HANDLER_H_ #define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_ACCOUNT_MANAGER_HANDLER_H_ +#include <string> #include <vector> #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" #include "chromeos/account_manager/account_manager.h" - -class AccountTrackerService; +#include "components/signin/core/browser/account_tracker_service.h" namespace chromeos { namespace settings { -class AccountManagerUIHandler : public ::settings::SettingsPageUIHandler { +class AccountManagerUIHandler : public ::settings::SettingsPageUIHandler, + public AccountManager::Observer, + public AccountTrackerService::Observer { public: // Accepts non-owning pointers to |AccountManager| and // |AccountTrackerService|. Both of these must outlive |this| instance. @@ -30,15 +32,33 @@ class AccountManagerUIHandler : public ::settings::SettingsPageUIHandler { void OnJavascriptAllowed() override; void OnJavascriptDisallowed() override; + // |AccountManager::Observer| overrides. + // |AccountManager| is considered to be the source of truth for account + // information. + void OnTokenUpserted(const AccountManager::AccountKey& account_key) override; + void OnAccountRemoved(const AccountManager::AccountKey& account_key) override; + + // |AccountTrackerService::Observer| overrides. + void OnAccountUpdated(const AccountInfo& info) override; + void OnAccountImageUpdated(const std::string& account_id, + const gfx::Image& image) override; + void OnAccountRemoved(const AccountInfo& account_key) override; + private: // WebUI "getAccounts" message callback. void HandleGetAccounts(const base::ListValue* args); + // WebUI "addAccount" message callback. + void HandleAddAccount(const base::ListValue* args); + // |AccountManager::GetAccounts| callback. void GetAccountsCallbackHandler( base::Value callback_id, std::vector<AccountManager::AccountKey> account_keys); + // Refreshes the UI. + void RefreshUI(); + // A non-owning pointer to |AccountManager|. AccountManager* const account_manager_; diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.cc index 1a3824cb28e..20b842fa019 100644 --- a/chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.cc @@ -57,14 +57,20 @@ void AndroidAppsHandler::OnJavascriptDisallowed() { void AndroidAppsHandler::OnAppRegistered( const std::string& app_id, const ArcAppListPrefs::AppInfo& app_info) { - OnAppChanged(app_id); + HandleAppChanged(app_id); +} + +void AndroidAppsHandler::OnAppStatesChanged( + const std::string& app_id, + const ArcAppListPrefs::AppInfo& app_info) { + HandleAppChanged(app_id); } void AndroidAppsHandler::OnAppRemoved(const std::string& app_id) { - OnAppChanged(app_id); + HandleAppChanged(app_id); } -void AndroidAppsHandler::OnAppChanged(const std::string& app_id) { +void AndroidAppsHandler::HandleAppChanged(const std::string& app_id) { if (app_id != arc::kSettingsAppId) return; SendAndroidAppsInfo(); diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h index 94d6e16c132..cb89bc38224 100644 --- a/chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h @@ -37,17 +37,19 @@ class AndroidAppsHandler : public ::settings::SettingsPageUIHandler, void OnJavascriptDisallowed() override; // ArcAppListPrefs::Observer - void OnAppRemoved(const std::string& app_id) override; void OnAppRegistered(const std::string& app_id, const ArcAppListPrefs::AppInfo& app_info) override; + void OnAppStatesChanged(const std::string& app_id, + const ArcAppListPrefs::AppInfo& app_info) override; + void OnAppRemoved(const std::string& app_id) override; // arc::ArcSessionManager::Observer: void OnArcPlayStoreEnabledChanged(bool enabled) override; private: std::unique_ptr<base::DictionaryValue> BuildAndroidAppsInfo(); - void OnAppChanged(const std::string& app_id); void HandleRequestAndroidAppsInfo(const base::ListValue* args); + void HandleAppChanged(const std::string& app_id); void SendAndroidAppsInfo(); void ShowAndroidAppsSettings(const base::ListValue* args); void ShowAndroidManageAppLinks(const base::ListValue* args); diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc index 03a08cad53e..4b100018022 100644 --- a/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc @@ -31,12 +31,14 @@ void CrostiniHandler::RegisterMessages() { void CrostiniHandler::HandleRequestCrostiniInstallerView( const base::ListValue* args) { AllowJavascript(); - ShowCrostiniInstallerView(Profile::FromWebUI(web_ui())); + ShowCrostiniInstallerView(Profile::FromWebUI(web_ui()), + CrostiniUISurface::kSettings); } void CrostiniHandler::HandleRequestRemoveCrostini(const base::ListValue* args) { AllowJavascript(); - ShowCrostiniUninstallerView(Profile::FromWebUI(web_ui())); + ShowCrostiniUninstallerView(Profile::FromWebUI(web_ui()), + CrostiniUISurface::kSettings); } } // namespace settings diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc index 98fc7863982..3c61e3ba330 100644 --- a/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc @@ -220,8 +220,7 @@ CupsPrintersHandler::CupsPrintersHandler(content::WebUI* webui) ppd_provider_(CreatePpdProvider(profile_)), printer_configurer_(PrinterConfigurer::Create(profile_)), printers_manager_( - CupsPrintersManagerFactory::GetInstance()->GetForBrowserContext( - profile_)), + CupsPrintersManagerFactory::GetForBrowserContext(profile_)), printers_manager_observer_(this), weak_factory_(this) {} @@ -334,7 +333,8 @@ void CupsPrintersHandler::HandleUpdateCupsPrinter(const base::ListValue* args) { // TODO(xdai): Replace "on-add-cups-printer" callback with Promise resolve // function. - FireWebUIListener("on-add-cups-printer", base::Value(true), + FireWebUIListener("on-add-cups-printer", + base::Value(PrinterSetupResult::kSuccess), base::Value(printer_name)); } diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc index 04fe8449120..9b221939c81 100644 --- a/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc @@ -24,6 +24,8 @@ #include "chrome/browser/browsing_data/browsing_data_local_storage_helper.h" #include "chrome/browser/browsing_data/browsing_data_service_worker_helper.h" #include "chrome/browser/chromeos/arc/arc_util.h" +#include "chrome/browser/chromeos/crostini/crostini_manager.h" +#include "chrome/browser/chromeos/crostini/crostini_util.h" #include "chrome/browser/chromeos/drive/file_system_util.h" #include "chrome/browser/chromeos/file_manager/path_util.h" #include "chrome/browser/platform_util.h" @@ -64,7 +66,7 @@ const int64_t kSpaceLowBytes = 1 * 1024 * 1024 * 1024; } // namespace -StorageHandler::StorageHandler() +StorageHandler::StorageHandler(Profile* profile) : browser_cache_size_(-1), has_browser_cache_size_(false), browser_site_data_size_(-1), @@ -73,7 +75,9 @@ StorageHandler::StorageHandler() updating_drive_cache_size_(false), updating_browsing_data_size_(false), updating_android_size_(false), + updating_crostini_size_(false), updating_other_users_size_(false), + profile_(profile), weak_ptr_factory_(this) {} StorageHandler::~StorageHandler() { @@ -106,26 +110,23 @@ void StorageHandler::HandleUpdateStorageInfo(const base::ListValue* args) { UpdateDownloadsSize(); UpdateDriveCacheSize(); UpdateBrowsingDataSize(); - UpdateOtherUsersSize(); UpdateAndroidSize(); + UpdateCrostiniSize(); + UpdateOtherUsersSize(); } void StorageHandler::HandleOpenDownloads( const base::ListValue* unused_args) { - Profile* const profile = Profile::FromWebUI(web_ui()); const base::FilePath downloads_path = - file_manager::util::GetDownloadsFolderForProfile(profile); - platform_util::OpenItem( - profile, - downloads_path, - platform_util::OPEN_FOLDER, - platform_util::OpenOperationCallback()); + file_manager::util::GetDownloadsFolderForProfile(profile_); + platform_util::OpenItem(profile_, downloads_path, platform_util::OPEN_FOLDER, + platform_util::OpenOperationCallback()); } void StorageHandler::HandleOpenArcStorage( const base::ListValue* unused_args) { - auto* arc_storage_manager = arc::ArcStorageManager::GetForBrowserContext( - Profile::FromWebUI(web_ui())); + auto* arc_storage_manager = + arc::ArcStorageManager::GetForBrowserContext(profile_); if (arc_storage_manager) arc_storage_manager->OpenPrivateVolumeSettings(); } @@ -133,17 +134,20 @@ void StorageHandler::HandleOpenArcStorage( void StorageHandler::HandleClearDriveCache( const base::ListValue* unused_args) { drive::FileSystemInterface* const file_system = - drive::util::GetFileSystemByProfile(Profile::FromWebUI(web_ui())); + drive::util::GetFileSystemByProfile(profile_); file_system->FreeDiskSpaceIfNeededFor( std::numeric_limits<int64_t>::max(), // Removes as much as possible. base::Bind(&StorageHandler::OnClearDriveCacheDone, weak_ptr_factory_.GetWeakPtr())); } +void StorageHandler::OnClearDriveCacheDone(bool /*success*/) { + UpdateDriveCacheSize(); +} + void StorageHandler::UpdateSizeStat() { - Profile* const profile = Profile::FromWebUI(web_ui()); const base::FilePath downloads_path = - file_manager::util::GetDownloadsFolderForProfile(profile); + file_manager::util::GetDownloadsFolderForProfile(profile_); int64_t* total_size = new int64_t(0); int64_t* available_size = new int64_t(0); @@ -179,9 +183,8 @@ void StorageHandler::UpdateDownloadsSize() { return; updating_downloads_size_ = true; - Profile* const profile = Profile::FromWebUI(web_ui()); const base::FilePath downloads_path = - file_manager::util::GetDownloadsFolderForProfile(profile); + file_manager::util::GetDownloadsFolderForProfile(profile_); base::PostTaskWithTraitsAndReplyWithResult( FROM_HERE, {base::MayBlock(), base::TaskPriority::BACKGROUND}, @@ -197,17 +200,17 @@ void StorageHandler::OnGetDownloadsSize(int64_t size) { } void StorageHandler::UpdateDriveCacheSize() { - if (updating_drive_cache_size_) - return; - drive::FileSystemInterface* const file_system = - drive::util::GetFileSystemByProfile(Profile::FromWebUI(web_ui())); + drive::util::GetFileSystemByProfile(profile_); if (!file_system) return; - // Shows the item "Offline cache" and start calculating size. - FireWebUIListener("storage-drive-enabled-changed", base::Value(true)); + if (updating_drive_cache_size_) + return; updating_drive_cache_size_ = true; + + // Shows the item "Offline cache" and starts calculating size. + FireWebUIListener("storage-drive-enabled-changed", base::Value(true)); file_system->CalculateCacheSize(base::Bind( &StorageHandler::OnGetDriveCacheSize, weak_ptr_factory_.GetWeakPtr())); } @@ -225,35 +228,33 @@ void StorageHandler::UpdateBrowsingDataSize() { has_browser_cache_size_ = false; has_browser_site_data_size_ = false; - Profile* const profile = Profile::FromWebUI(web_ui()); // Fetch the size of http cache in browsing data. - // ConditionalCacheCountingHelper deletes itself when it is done. - browsing_data::ConditionalCacheCountingHelper::CreateForRange( - content::BrowserContext::GetDefaultStoragePartition(profile), - base::Time(), base::Time::Max()) - ->CountAndDestroySelfWhenFinished(base::Bind( - &StorageHandler::OnGetCacheSize, weak_ptr_factory_.GetWeakPtr())); + browsing_data::ConditionalCacheCountingHelper::Count( + content::BrowserContext::GetDefaultStoragePartition(profile_), + base::Time(), base::Time::Max(), + base::BindOnce(&StorageHandler::OnGetCacheSize, + weak_ptr_factory_.GetWeakPtr())); // Fetch the size of site data in browsing data. if (!site_data_size_collector_.get()) { content::StoragePartition* storage_partition = - content::BrowserContext::GetDefaultStoragePartition(profile); + content::BrowserContext::GetDefaultStoragePartition(profile_); site_data_size_collector_.reset(new SiteDataSizeCollector( storage_partition->GetPath(), - new BrowsingDataCookieHelper(profile->GetRequestContext()), - new BrowsingDataDatabaseHelper(profile), - new BrowsingDataLocalStorageHelper(profile), - new BrowsingDataAppCacheHelper(profile), + new BrowsingDataCookieHelper(storage_partition), + new BrowsingDataDatabaseHelper(profile_), + new BrowsingDataLocalStorageHelper(profile_), + new BrowsingDataAppCacheHelper(profile_), new BrowsingDataIndexedDBHelper( storage_partition->GetIndexedDBContext()), BrowsingDataFileSystemHelper::Create( storage_partition->GetFileSystemContext()), - BrowsingDataChannelIDHelper::Create(profile->GetRequestContext()), + BrowsingDataChannelIDHelper::Create(profile_->GetRequestContext()), new BrowsingDataServiceWorkerHelper( storage_partition->GetServiceWorkerContext()), new BrowsingDataCacheStorageHelper( storage_partition->GetCacheStorageContext()), - BrowsingDataFlashLSOHelper::Create(profile))); + BrowsingDataFlashLSOHelper::Create(profile_))); } site_data_size_collector_->Fetch( base::Bind(&StorageHandler::OnGetBrowsingDataSize, @@ -288,6 +289,66 @@ void StorageHandler::OnGetBrowsingDataSize(bool is_site_data, int64_t size) { } } +void StorageHandler::UpdateAndroidSize() { + if (!arc::IsArcPlayStoreEnabledForProfile(profile_) || + arc::IsArcOptInVerificationDisabled()) { + return; + } + + if (updating_android_size_) + return; + updating_android_size_ = true; + + // Shows the item "Android apps and cache" and starts calculating size. + FireWebUIListener("storage-android-enabled-changed", base::Value(true)); + + bool success = false; + auto* arc_storage_manager = + arc::ArcStorageManager::GetForBrowserContext(profile_); + if (arc_storage_manager) { + success = arc_storage_manager->GetApplicationsSize(base::BindOnce( + &StorageHandler::OnGetAndroidSize, weak_ptr_factory_.GetWeakPtr())); + } + if (!success) + updating_android_size_ = false; +} + +void StorageHandler::OnGetAndroidSize(bool succeeded, + arc::mojom::ApplicationsSizePtr size) { + base::string16 size_string; + if (succeeded) { + uint64_t total_bytes = size->total_code_bytes + size->total_data_bytes + + size->total_cache_bytes; + size_string = ui::FormatBytes(total_bytes); + } else { + size_string = l10n_util::GetStringUTF16(IDS_SETTINGS_STORAGE_SIZE_UNKNOWN); + } + updating_android_size_ = false; + FireWebUIListener("storage-android-size-changed", base::Value(size_string)); +} + +void StorageHandler::UpdateCrostiniSize() { + if (!IsCrostiniEnabled(profile_)) { + return; + } + + if (updating_crostini_size_) + return; + updating_crostini_size_ = true; + + crostini::CrostiniManager::GetInstance()->ListVmDisks( + CryptohomeIdForProfile(profile_), + base::BindOnce(&StorageHandler::OnGetCrostiniSize, + weak_ptr_factory_.GetWeakPtr())); +} + +void StorageHandler::OnGetCrostiniSize(crostini::ConciergeClientResult result, + int64_t size) { + updating_crostini_size_ = false; + FireWebUIListener("storage-crostini-size-changed", + base::Value(ui::FormatBytes(size))); +} + void StorageHandler::UpdateOtherUsersSize() { if (updating_other_users_size_) return; @@ -333,48 +394,5 @@ void StorageHandler::OnGetOtherUserSize( } } -void StorageHandler::UpdateAndroidSize() { - if (updating_android_size_) - return; - updating_android_size_ = true; - - Profile* const profile = Profile::FromWebUI(web_ui()); - if (!arc::IsArcPlayStoreEnabledForProfile(profile) || - arc::IsArcOptInVerificationDisabled()) { - return; - } - - // Shows the item "Android apps and cache" and start calculating size. - FireWebUIListener("storage-android-enabled-changed", base::Value(true)); - bool success = false; - auto* arc_storage_manager = - arc::ArcStorageManager::GetForBrowserContext(profile); - if (arc_storage_manager) { - success = arc_storage_manager->GetApplicationsSize(base::BindOnce( - &StorageHandler::OnGetAndroidSize, weak_ptr_factory_.GetWeakPtr())); - } - if (!success) - updating_android_size_ = false; -} - -void StorageHandler::OnGetAndroidSize(bool succeeded, - arc::mojom::ApplicationsSizePtr size) { - base::string16 size_string; - if (succeeded) { - uint64_t total_bytes = size->total_code_bytes + - size->total_data_bytes + - size->total_cache_bytes; - size_string = ui::FormatBytes(total_bytes); - } else { - size_string = l10n_util::GetStringUTF16(IDS_SETTINGS_STORAGE_SIZE_UNKNOWN); - } - updating_android_size_ = false; - FireWebUIListener("storage-android-size-changed", base::Value(size_string)); -} - -void StorageHandler::OnClearDriveCacheDone(bool success) { - UpdateDriveCacheSize(); -} - } // namespace settings } // namespace chromeos diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.h index 48f3d5b5875..8d5f7b04ceb 100644 --- a/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.h @@ -19,6 +19,12 @@ #include "components/arc/storage_manager/arc_storage_manager.h" #include "components/user_manager/user.h" +class Profile; + +namespace crostini { +enum class ConciergeClientResult; +} // namespace crostini + namespace chromeos { namespace settings { @@ -32,7 +38,7 @@ class StorageHandler : public ::settings::SettingsPageUIHandler { STORAGE_SPACE_CRITICALLY_LOW = 2, }; - StorageHandler(); + explicit StorageHandler(Profile* profile); ~StorageHandler() override; // SettingsPageUIHandler implementation. @@ -47,6 +53,9 @@ class StorageHandler : public ::settings::SettingsPageUIHandler { void HandleOpenArcStorage(const base::ListValue* unused_args); void HandleClearDriveCache(const base::ListValue* unused_args); + // Callback called when clearing Drive cache is done. + void OnClearDriveCacheDone(bool success); + // Requests updating disk space information. void UpdateSizeStat(); @@ -74,20 +83,24 @@ class StorageHandler : public ::settings::SettingsPageUIHandler { // Callback to update the UI about the size of browsing data. void OnGetBrowsingDataSize(bool is_site_data, int64_t size); - // Requests updating the total size of other users' data. - void UpdateOtherUsersSize(); - - // Callback to save the fetched user sizes and update the UI. - void OnGetOtherUserSize(base::Optional<cryptohome::BaseReply> reply); - // Requests updating the space size used by Android apps and cache. void UpdateAndroidSize(); // Callback to update the UI about Android apps and cache. void OnGetAndroidSize(bool succeeded, arc::mojom::ApplicationsSizePtr size); - // Callback called when clearing Drive cache is done. - void OnClearDriveCacheDone(bool success); + // Requests updating the space size used by Crostini VMs and their apps and + // cache. + void UpdateCrostiniSize(); + + // Callback to update the UI about Crostini VMs and their apps and cache. + void OnGetCrostiniSize(crostini::ConciergeClientResult result, int64_t size); + + // Requests updating the total size of other users' data. + void UpdateOtherUsersSize(); + + // Callback to save the fetched user sizes and update the UI. + void OnGetOtherUserSize(base::Optional<cryptohome::BaseReply> reply); // Total size of cache data in browsing data. int64_t browser_cache_size_; @@ -101,6 +114,9 @@ class StorageHandler : public ::settings::SettingsPageUIHandler { // True if we have already received the size of site data. bool has_browser_site_data_size_; + // Helper to compute the total size of all types of site date. + std::unique_ptr<SiteDataSizeCollector> site_data_size_collector_; + // The list of other users whose directory sizes will be accumulated as the // size of "Other users". user_manager::UserList other_users_; @@ -108,16 +124,15 @@ class StorageHandler : public ::settings::SettingsPageUIHandler { // Fetched sizes of user directories. std::vector<int64_t> user_sizes_; - // Helper to compute the total size of all types of site date. - std::unique_ptr<SiteDataSizeCollector> site_data_size_collector_; - // Flags indicating fetch operations for storage sizes are ongoing. bool updating_downloads_size_; bool updating_drive_cache_size_; bool updating_browsing_data_size_; bool updating_android_size_; + bool updating_crostini_size_; bool updating_other_users_size_; + Profile* const profile_; base::WeakPtrFactory<StorageHandler> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(StorageHandler); diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler_unittest.cc index 287e99313d6..f30ce4ca6d8 100644 --- a/chromium/chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler_unittest.cc +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler_unittest.cc @@ -22,7 +22,7 @@ namespace { class FakeEasyUnlockService : public EasyUnlockService { public: explicit FakeEasyUnlockService(Profile* profile) - : EasyUnlockService(profile), + : EasyUnlockService(profile, nullptr /* secure_channel_client */), turn_off_status_(IDLE), is_allowed_(true), is_enabled_(false) {} diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/internet_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/internet_handler.cc index 8367559e562..8dc3a46c55f 100644 --- a/chromium/chrome/browser/ui/webui/settings/chromeos/internet_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/internet_handler.cc @@ -9,12 +9,12 @@ #include "base/bind.h" #include "base/values.h" -#include "chrome/browser/chromeos/options/network_config_view.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/chromeos/tether/tether_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" #include "chrome/browser/ui/app_list/arc/arc_app_utils.h" +#include "chromeos/network/network_event_log.h" #include "chromeos/network/network_state.h" #include "chromeos/network/network_state_handler.h" #include "components/arc/arc_bridge_service.h" @@ -33,8 +33,8 @@ namespace chromeos { namespace { -const char kAddNetworkMessage[] = "addNetwork"; -const char kConfigureNetworkMessage[] = "configureNetwork"; +const char kAddThirdPartyVpnMessage[] = "addThirdPartyVpn"; +const char kConfigureThirdPartyVpnMessage[] = "configureThirdPartyVpn"; const char kRequestArcVpnProviders[] = "requestArcVpnProviders"; const char kSendArcVpnProviders[] = "sendArcVpnProviders"; const char kRequestGmsCoreNotificationsDisabledDeviceNames[] = @@ -42,13 +42,6 @@ const char kRequestGmsCoreNotificationsDisabledDeviceNames[] = const char kSendGmsCoreNotificationsDisabledDeviceNames[] = "sendGmsCoreNotificationsDisabledDeviceNames"; -std::string ServicePathFromGuid(const std::string& guid) { - const NetworkState* network = - NetworkHandler::Get()->network_state_handler()->GetNetworkStateFromGuid( - guid); - return network ? network->path() : ""; -} - Profile* GetProfileForPrimaryUser() { return ProfileHelper::Get()->GetProfileByUser( user_manager::UserManager::Get()->GetPrimaryUser()); @@ -93,14 +86,13 @@ InternetHandler::~InternetHandler() { } void InternetHandler::RegisterMessages() { - // TODO(stevenjb): Eliminate once network configuration UI is integrated - // into settings. web_ui()->RegisterMessageCallback( - kAddNetworkMessage, base::BindRepeating(&InternetHandler::AddNetwork, - base::Unretained(this))); + kAddThirdPartyVpnMessage, + base::BindRepeating(&InternetHandler::AddThirdPartyVpn, + base::Unretained(this))); web_ui()->RegisterMessageCallback( - kConfigureNetworkMessage, - base::BindRepeating(&InternetHandler::ConfigureNetwork, + kConfigureThirdPartyVpnMessage, + base::BindRepeating(&InternetHandler::ConfigureThirdPartyVpn, base::Unretained(this))); web_ui()->RegisterMessageCallback( kRequestArcVpnProviders, @@ -142,85 +134,81 @@ void InternetHandler::OnGmsCoreNotificationStateChanged() { SetGmsCoreNotificationsDisabledDeviceNames(); } -void InternetHandler::AddNetwork(const base::ListValue* args) { - std::string onc_type; - if (args->GetSize() < 1 || !args->GetString(0, &onc_type)) { - NOTREACHED() << "Invalid args for: " << kAddNetworkMessage; +void InternetHandler::AddThirdPartyVpn(const base::ListValue* args) { + std::string app_id; + if (args->GetSize() < 1 || !args->GetString(0, &app_id)) { + NOTREACHED() << "Invalid args for: " << kAddThirdPartyVpnMessage; + return; + } + if (app_id.empty()) { + NET_LOG(ERROR) << "Empty app id for " << kAddThirdPartyVpnMessage; + return; + } + if (profile_ != GetProfileForPrimaryUser()) { + NET_LOG(ERROR) << "Only the primary user can add VPNs"; return; } - if (onc_type == ::onc::network_type::kVPN) { - std::string app_id; - if (args->GetSize() >= 2) - args->GetString(1, &app_id); - if (app_id.empty()) { - // Show the "add network" dialog for the built-in OpenVPN/L2TP provider. - NetworkConfigView::ShowForType(shill::kTypeVPN); - return; - } - // Request to launch Arc VPN provider. - const auto* arc_app_list_prefs = ArcAppListPrefs::Get(profile_); - if (arc_app_list_prefs && arc_app_list_prefs->GetApp(app_id)) { - arc::LaunchApp(profile_, app_id, ui::EF_NONE); - return; - } - // Request that the third-party VPN provider identified by |provider_id| - // show its "add network" dialog. - VpnServiceFactory::GetForBrowserContext(GetProfileForPrimaryUser()) - ->SendShowAddDialogToExtension(app_id); - } else if (onc_type == ::onc::network_type::kWiFi) { - NetworkConfigView::ShowForType(shill::kTypeWifi); - } else { - LOG(ERROR) << "Unsupported type for: " << kAddNetworkMessage; + // Request to launch Arc VPN provider. + const auto* arc_app_list_prefs = ArcAppListPrefs::Get(profile_); + if (arc_app_list_prefs && arc_app_list_prefs->GetApp(app_id)) { + arc::LaunchApp(profile_, app_id, ui::EF_NONE, + arc::UserInteractionType::APP_STARTED_FROM_SETTINGS); + return; } + + // Request that the third-party VPN provider identified by |provider_id| + // show its "add network" dialog. + VpnServiceFactory::GetForBrowserContext(GetProfileForPrimaryUser()) + ->SendShowAddDialogToExtension(app_id); } -void InternetHandler::ConfigureNetwork(const base::ListValue* args) { +void InternetHandler::ConfigureThirdPartyVpn(const base::ListValue* args) { std::string guid; if (args->GetSize() < 1 || !args->GetString(0, &guid)) { - NOTREACHED() << "Invalid args for: " << kConfigureNetworkMessage; + NOTREACHED() << "Invalid args for: " << kConfigureThirdPartyVpnMessage; return; } - - const std::string service_path = ServicePathFromGuid(guid); - if (service_path.empty()) { - LOG(ERROR) << "Network not found: " << guid; + if (profile_ != GetProfileForPrimaryUser()) { + NET_LOG(ERROR) << "Only the primary user can configure VPNs"; return; } const NetworkState* network = - NetworkHandler::Get()->network_state_handler()->GetNetworkState( - service_path); + NetworkHandler::Get()->network_state_handler()->GetNetworkStateFromGuid( + guid); if (!network) { - LOG(ERROR) << "Network not found with service_path: " << service_path; + NET_LOG(ERROR) << "ConfigureThirdPartyVpn: Network not found: " << guid; + return; + } + if (network->type() != shill::kTypeVPN) { + NET_LOG(ERROR) << "ConfigureThirdPartyVpn: Network is not a VPN: " << guid; return; } - if (network->type() == shill::kTypeVPN) { - if (profile_ != GetProfileForPrimaryUser()) - return; + if (network->vpn_provider_type() == shill::kProviderThirdPartyVpn) { + // Request that the third-party VPN provider used by the |network| show a + // configuration dialog for it. + VpnServiceFactory::GetForBrowserContext(profile_) + ->SendShowConfigureDialogToExtension(network->vpn_provider_id(), + network->name()); + return; + } - if (network->vpn_provider_type() == shill::kProviderThirdPartyVpn) { - // Request that the third-party VPN provider used by the |network| show a - // configuration dialog for it. - VpnServiceFactory::GetForBrowserContext(profile_) - ->SendShowConfigureDialogToExtension(network->vpn_provider_id(), - network->name()); - return; - } else if (network->vpn_provider_type() == shill::kProviderArcVpn) { - auto* net_instance = ARC_GET_INSTANCE_FOR_METHOD( - arc::ArcServiceManager::Get()->arc_bridge_service()->net(), - ConfigureAndroidVpn); - if (!net_instance) { - LOG(ERROR) << "User requested VPN configuration but API is unavailable"; - return; - } - net_instance->ConfigureAndroidVpn(); + if (network->vpn_provider_type() == shill::kProviderArcVpn) { + auto* net_instance = ARC_GET_INSTANCE_FOR_METHOD( + arc::ArcServiceManager::Get()->arc_bridge_service()->net(), + ConfigureAndroidVpn); + if (!net_instance) { + NET_LOG(ERROR) << "ConfigureThirdPartyVpn: API is unavailable"; return; } + net_instance->ConfigureAndroidVpn(); + return; } - NetworkConfigView::ShowForNetworkId(network->guid()); + NET_LOG(ERROR) << "ConfigureThirdPartyVpn: Unsupported VPN type: " + << network->vpn_provider_type() << " For: " << guid; } void InternetHandler::RequestArcVpnProviders(const base::ListValue* args) { diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/internet_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/internet_handler.h index 332d5dd8a5e..31ed7c90e43 100644 --- a/chromium/chrome/browser/ui/webui/settings/chromeos/internet_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/internet_handler.h @@ -24,8 +24,6 @@ class GmsCoreNotificationsStateTracker; namespace settings { // Chrome OS Internet settings page UI handler. -// TODO(lgcheng/stevenjb): Rename this ThirdPartyVpnHandler once configuration -// is handled in the Settings UI (crbug.com/380937 class InternetHandler : public app_list::ArcVpnProviderManager::Observer, public chromeos::tether::GmsCoreNotificationsStateTracker::Observer, @@ -55,8 +53,8 @@ class InternetHandler friend class InternetHandlerTest; // Settings JS handlers. - void AddNetwork(const base::ListValue* args); - void ConfigureNetwork(const base::ListValue* args); + void AddThirdPartyVpn(const base::ListValue* args); + void ConfigureThirdPartyVpn(const base::ListValue* args); void RequestArcVpnProviders(const base::ListValue* args); void RequestGmsCoreNotificationsDisabledDeviceNames( const base::ListValue* args); diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc new file mode 100644 index 00000000000..ca84973cd35 --- /dev/null +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc @@ -0,0 +1,38 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/settings/chromeos/multidevice_handler.h" + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/logging.h" +#include "chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h" +#include "content/public/browser/web_ui.h" + +namespace chromeos { + +namespace settings { + +MultideviceHandler::MultideviceHandler() = default; +MultideviceHandler::~MultideviceHandler() = default; + +void MultideviceHandler::OnJavascriptAllowed() {} +void MultideviceHandler::OnJavascriptDisallowed() {} + +void MultideviceHandler::RegisterMessages() { + web_ui()->RegisterMessageCallback( + "showMultiDeviceSetupDialog", + base::BindRepeating(&MultideviceHandler::HandleShowMultiDeviceSetupDialog, + base::Unretained(this))); +} + +void MultideviceHandler::HandleShowMultiDeviceSetupDialog( + const base::ListValue* args) { + DCHECK(args->empty()); + multidevice_setup::MultiDeviceSetupDialog::Show(); +} + +} // namespace settings + +} // namespace chromeos diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.h new file mode 100644 index 00000000000..3ab88522348 --- /dev/null +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.h @@ -0,0 +1,38 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_MULTIDEVICE_HANDLER_H_ +#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_MULTIDEVICE_HANDLER_H_ + +#include "base/macros.h" +#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" + +namespace chromeos { + +namespace settings { + +// Chrome "Multidevice" (a.k.a. "Connected Devices") settings page UI handler. +class MultideviceHandler : public ::settings::SettingsPageUIHandler { + public: + MultideviceHandler(); + ~MultideviceHandler() override; + + // content::WebUIMessageHandler: + void RegisterMessages() override; + + // ::settings::SettingsPageUIHandler: + void OnJavascriptAllowed() override; + void OnJavascriptDisallowed() override; + + private: + void HandleShowMultiDeviceSetupDialog(const base::ListValue* args); + + DISALLOW_COPY_AND_ASSIGN(MultideviceHandler); +}; + +} // namespace settings + +} // namespace chromeos + +#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_MULTIDEVICE_HANDLER_H_ diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/smb_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/smb_handler.cc index 2b3ef9136d0..8a5af4ee012 100644 --- a/chromium/chrome/browser/ui/webui/settings/chromeos/smb_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/smb_handler.cc @@ -16,6 +16,17 @@ namespace chromeos { namespace settings { +namespace { + +smb_client::SmbService* GetSmbService(Profile* profile) { + smb_client::SmbService* const service = smb_client::SmbService::Get(profile); + DCHECK(service); + + return service; +} + +} // namespace + SmbHandler::SmbHandler(Profile* profile) : profile_(profile), weak_ptr_factory_(this) {} @@ -25,32 +36,63 @@ void SmbHandler::RegisterMessages() { web_ui()->RegisterMessageCallback( "smbMount", base::BindRepeating(&SmbHandler::HandleSmbMount, base::Unretained(this))); + + web_ui()->RegisterMessageCallback( + "startDiscovery", base::BindRepeating(&SmbHandler::HandleStartDiscovery, + base::Unretained(this))); } void SmbHandler::HandleSmbMount(const base::ListValue* args) { - CHECK_EQ(3U, args->GetSize()); - std::string mountUrl; + CHECK_EQ(4U, args->GetSize()); + std::string mount_url; + std::string mount_name; std::string username; std::string password; - CHECK(args->GetString(0, &mountUrl)); - CHECK(args->GetString(1, &username)); - CHECK(args->GetString(2, &password)); + CHECK(args->GetString(0, &mount_url)); + CHECK(args->GetString(1, &mount_name)); + CHECK(args->GetString(2, &username)); + CHECK(args->GetString(3, &password)); - chromeos::smb_client::SmbService* const service = - chromeos::smb_client::SmbService::Get(profile_); + smb_client::SmbService* const service = GetSmbService(profile_); chromeos::file_system_provider::MountOptions mo; - mo.display_name = mountUrl; + mo.display_name = mount_name.empty() ? mount_url : mount_name; mo.writable = true; - service->Mount(mo, base::FilePath(mountUrl), username, password, - base::BindOnce(&SmbHandler::HandleSmbMountResponse, - weak_ptr_factory_.GetWeakPtr())); + auto mount_response = base::BindOnce(&SmbHandler::HandleSmbMountResponse, + weak_ptr_factory_.GetWeakPtr()); + auto mount_call = base::BindOnce( + &smb_client::SmbService::Mount, base::Unretained(service), mo, + base::FilePath(mount_url), username, password, std::move(mount_response)); + + if (host_discovery_done_) { + std::move(mount_call).Run(); + } else { + stored_mount_call_ = std::move(mount_call); + } } void SmbHandler::HandleSmbMountResponse(SmbMountResult result) { AllowJavascript(); - FireWebUIListener("on-add-smb-share", base::Value(result)); + FireWebUIListener("on-add-smb-share", base::Value(static_cast<int>(result))); +} + +void SmbHandler::HandleStartDiscovery(const base::ListValue* args) { + smb_client::SmbService* const service = GetSmbService(profile_); + + service->GatherSharesInNetwork(base::BindRepeating( + &SmbHandler::HandleGatherSharesResponse, weak_ptr_factory_.GetWeakPtr())); +} + +void SmbHandler::HandleGatherSharesResponse( + const std::vector<smb_client::SmbUrl>& shares_gathered) { + host_discovery_done_ = true; + if (!stored_mount_call_.is_null()) { + std::move(stored_mount_call_).Run(); + } + + // TODO(zentaro): Pass the shares discovered back to the UI. + // https://crbug.com/852199. } } // namespace settings diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/smb_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/smb_handler.h index 315a302f144..fe6c85db64f 100644 --- a/chromium/chrome/browser/ui/webui/settings/chromeos/smb_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/smb_handler.h @@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SMB_HANDLER_H_ #define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SMB_HANDLER_H_ +#include "base/callback_forward.h" #include "base/files/file.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" @@ -31,9 +32,18 @@ class SmbHandler : public ::settings::SettingsPageUIHandler { // WebUI call to mount an Smb Filesystem. void HandleSmbMount(const base::ListValue* args); + // WebUI call to start file share discovery on the network. + void HandleStartDiscovery(const base::ListValue* args); + // Callback handler for SmbMount. void HandleSmbMountResponse(SmbMountResult result); + // Callback handler for StartDiscovery. + void HandleGatherSharesResponse( + const std::vector<smb_client::SmbUrl>& shares_gathered); + + bool host_discovery_done_ = false; + base::OnceClosure stored_mount_call_; Profile* const profile_; base::WeakPtrFactory<SmbHandler> weak_ptr_factory_; diff --git a/chromium/chrome/browser/ui/webui/settings/extension_control_handler.cc b/chromium/chrome/browser/ui/webui/settings/extension_control_handler.cc index 7f5a1b27042..ad36ee33086 100644 --- a/chromium/chrome/browser/ui/webui/settings/extension_control_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/extension_control_handler.cc @@ -29,8 +29,9 @@ void ExtensionControlHandler::HandleDisableExtension( const base::ListValue* args) { std::string extension_id; CHECK(args->GetString(0, &extension_id)); - ExtensionService* extension_service = extensions::ExtensionSystem::Get( - Profile::FromWebUI(web_ui()))->extension_service(); + extensions::ExtensionService* extension_service = + extensions::ExtensionSystem::Get(Profile::FromWebUI(web_ui())) + ->extension_service(); DCHECK(extension_service); extension_service->DisableExtension( extension_id, extensions::disable_reason::DISABLE_USER_ACTION); diff --git a/chromium/chrome/browser/ui/webui/settings/font_handler.cc b/chromium/chrome/browser/ui/webui/settings/font_handler.cc index 037d0a5b3a4..ffb8f495ab7 100644 --- a/chromium/chrome/browser/ui/webui/settings/font_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/font_handler.cc @@ -100,7 +100,7 @@ void FontHandler::HandleOpenAdvancedFontSettings( } const extensions::Extension* FontHandler::GetAdvancedFontSettingsExtension() { - ExtensionService* service = + extensions::ExtensionService* service = extensions::ExtensionSystem::Get(profile_)->extension_service(); if (!service->IsExtensionEnabled(kAdvancedFontSettingsExtensionId)) return nullptr; diff --git a/chromium/chrome/browser/ui/webui/settings/languages_handler.cc b/chromium/chrome/browser/ui/webui/settings/languages_handler.cc index 6ec6856e4d2..0346fa16e01 100644 --- a/chromium/chrome/browser/ui/webui/settings/languages_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/languages_handler.cc @@ -10,6 +10,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/pref_names.h" +#include "components/language/core/browser/pref_names.h" #include "components/prefs/pref_service.h" #include "content/public/browser/web_ui.h" @@ -50,12 +51,12 @@ void LanguagesHandler::HandleGetProspectiveUILanguage( std::string locale; #if defined(OS_CHROMEOS) // On Chrome OS, an individual profile may have a preferred locale. - locale = profile_->GetPrefs()->GetString(prefs::kApplicationLocale); + locale = profile_->GetPrefs()->GetString(language::prefs::kApplicationLocale); #endif // defined(OS_CHROMEOS) if (locale.empty()) { - locale = - g_browser_process->local_state()->GetString(prefs::kApplicationLocale); + locale = g_browser_process->local_state()->GetString( + language::prefs::kApplicationLocale); } ResolveJavascriptCallback(*callback_id, base::Value(locale)); @@ -70,16 +71,16 @@ void LanguagesHandler::HandleSetProspectiveUILanguage( CHECK(args->GetString(0, &language_code)); #if defined(OS_CHROMEOS) - // check if prospectiveUILanguage is allowed by policy (AllowedLocales) - if (!chromeos::locale_util::IsAllowedLocale(language_code, - profile_->GetPrefs())) { + // check if prospectiveUILanguage is allowed by policy (AllowedUILocales) + if (!chromeos::locale_util::IsAllowedUILocale(language_code, + profile_->GetPrefs())) { return; } #endif #if defined(OS_WIN) PrefService* prefs = g_browser_process->local_state(); - prefs->SetString(prefs::kApplicationLocale, language_code); + prefs->SetString(language::prefs::kApplicationLocale, language_code); #elif defined(OS_CHROMEOS) // Secondary users and public session users cannot change the locale. user_manager::UserManager* user_manager = user_manager::UserManager::Get(); diff --git a/chromium/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chromium/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc index 77f1c6afba4..65230a3aea7 100644 --- a/chromium/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc +++ b/chromium/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc @@ -7,6 +7,7 @@ #include <string> #include "base/command_line.h" +#include "base/feature_list.h" #include "base/i18n/number_formatting.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" @@ -28,8 +29,10 @@ #include "chrome/grit/locale_settings.h" #include "components/autofill/core/browser/payments/payments_service_url.h" #include "components/autofill/core/common/autofill_constants.h" +#include "components/content_settings/core/common/features.h" #include "components/google/core/browser/google_util.h" -#include "components/password_manager/core/browser/password_manager_constants.h" +#include "components/omnibox/browser/omnibox_field_trial.h" +#include "components/password_manager/core/common/password_manager_features.h" #include "components/safe_browsing/common/safe_browsing_prefs.h" #include "components/signin/core/browser/signin_buildflags.h" #include "components/strings/grit/components_strings.h" @@ -52,6 +55,7 @@ #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/ui/webui/chromeos/bluetooth_dialog_localized_strings_provider.h" #include "chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.h" +#include "chromeos/chromeos_features.h" #include "chromeos/chromeos_switches.h" #include "components/arc/arc_util.h" #include "components/user_manager/user_manager.h" @@ -195,6 +199,7 @@ void AddA11yStrings(content::WebUIDataSource* html_source) { {"delayBeforeClickShort", IDS_SETTINGS_DELAY_BEFORE_CLICK_SHORT}, {"delayBeforeClickLong", IDS_SETTINGS_DELAY_BEFORE_CLICK_LONG}, {"delayBeforeClickVeryLong", IDS_SETTINGS_DELAY_BEFORE_CLICK_VERY_LONG}, + {"dictationDescription", IDS_SETTINGS_ACCESSIBILITY_DICTATION_DESCRIPTION}, {"dictationLabel", IDS_SETTINGS_ACCESSIBILITY_DICTATION_LABEL}, {"onScreenKeyboardLabel", IDS_SETTINGS_ON_SCREEN_KEYBOARD_LABEL}, {"monoAudioLabel", IDS_SETTINGS_MONO_AUDIO_LABEL}, @@ -228,7 +233,6 @@ void AddA11yStrings(content::WebUIDataSource* html_source) { IDS_SETTINGS_ACCESSIBILITY_APPEARANCE_SETTINGS_TITLE}, {"appearanceSettingsDescription", IDS_SETTINGS_ACCESSIBILITY_APPEARANCE_SETTINGS_DESCRIPTION}, - {"keyboardHeading", IDS_SETTINGS_ACCESSIBILITY_KEYBOARD_HEADING}, {"keyboardAndTextInputHeading", IDS_SETTINGS_ACCESSIBILITY_KEYBOARD_AND_TEXT_INPUT_HEADING}, {"keyboardSettingsTitle", @@ -248,6 +252,7 @@ void AddA11yStrings(content::WebUIDataSource* html_source) { {"textToSpeechVoices", IDS_SETTINGS_TEXT_TO_SPEECH_VOICES}, {"textToSpeechNoVoicesMessage", IDS_SETTINGS_TEXT_TO_SPEECH_NO_VOICES_MESSAGE}, + {"textToSpeechMoreLanguages", IDS_SETTINGS_TEXT_TO_SPEECH_MORE_LANGUAGES}, {"textToSpeechProperties", IDS_SETTINGS_TEXT_TO_SPEECH_PROPERTIES}, {"textToSpeechRate", IDS_SETTINGS_TEXT_TO_SPEECH_RATE}, {"textToSpeechRateMinimumLabel", @@ -273,7 +278,6 @@ void AddA11yStrings(content::WebUIDataSource* html_source) { {"textToSpeechPreviewVoice", IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_VOICE}, {"textToSpeechPreviewPlay", IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_PLAY}, {"textToSpeechEngines", IDS_SETTINGS_TEXT_TO_SPEECH_ENGINES}, - {"textToSpeechInstallEngines", IDS_SETTINGS_TEXT_TO_SPEECH_INSTALL_ENGINES}, #endif }; AddLocalizedStringsBulk(html_source, localized_strings, @@ -330,6 +334,8 @@ void AddAboutStrings(content::WebUIDataSource* html_source) { {"aboutPlatformLabel", IDS_SETTINGS_ABOUT_PAGE_PLATFORM}, {"aboutRelaunchAndPowerwash", IDS_SETTINGS_ABOUT_PAGE_RELAUNCH_AND_POWERWASH}, + {"aboutRollbackInProgress", IDS_SETTINGS_UPGRADE_ROLLBACK_IN_PROGRESS}, + {"aboutRollbackSuccess", IDS_SETTINGS_UPGRADE_ROLLBACK_SUCCESS}, {"aboutUpgradeUpdatingChannelSwitch", IDS_SETTINGS_UPGRADE_UPDATING_CHANNEL_SWITCH}, {"aboutUpgradeSuccessChannelSwitch", @@ -388,13 +394,17 @@ void AddAboutStrings(content::WebUIDataSource* html_source) { void AddCrostiniStrings(content::WebUIDataSource* html_source) { LocalizedString localized_strings[] = { {"crostiniPageTitle", IDS_SETTINGS_CROSTINI_TITLE}, - {"crostiniSubtext", IDS_SETTINGS_CROSTINI_SUBTEXT}, {"crostiniPageLabel", IDS_SETTINGS_CROSTINI_LABEL}, {"crostiniEnable", IDS_SETTINGS_TURN_ON}, {"crostiniRemove", IDS_SETTINGS_CROSTINI_REMOVE}, }; AddLocalizedStringsBulk(html_source, localized_strings, arraysize(localized_strings)); + html_source->AddString( + "crostiniSubtext", + l10n_util::GetStringFUTF16( + IDS_SETTINGS_CROSTINI_SUBTEXT, + GetHelpUrlWithBoard(chrome::kLinuxAppsLearnMoreURL))); } void AddAndroidAppStrings(content::WebUIDataSource* html_source) { @@ -501,21 +511,6 @@ void AddChangePasswordStrings(content::WebUIDataSource* html_source) { void AddClearBrowsingDataStrings(content::WebUIDataSource* html_source, Profile* profile) { - int clear_cookies_summary_msg_id = - IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC; - -#if defined(OS_CHROMEOS) - if (AccountConsistencyModeManager::IsMirrorEnabledForProfile(profile)) { - clear_cookies_summary_msg_id = - IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC_WITH_EXCEPTION; - } -#else // !defined(OS_CHROMEOS) - if (AccountConsistencyModeManager::IsDiceEnabledForProfile(profile)) { - clear_cookies_summary_msg_id = - IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC_WITH_EXCEPTION; - } -#endif - LocalizedString localized_strings[] = { {"clearTimeRange", IDS_SETTINGS_CLEAR_PERIOD_TITLE}, {"clearBrowsingHistory", IDS_SETTINGS_CLEAR_BROWSING_HISTORY}, @@ -524,7 +519,10 @@ void AddClearBrowsingDataStrings(content::WebUIDataSource* html_source, {"clearDownloadHistory", IDS_SETTINGS_CLEAR_DOWNLOAD_HISTORY}, {"clearCache", IDS_SETTINGS_CLEAR_CACHE}, {"clearCookies", IDS_SETTINGS_CLEAR_COOKIES}, - {"clearCookiesSummary", clear_cookies_summary_msg_id}, + {"clearCookiesSummary", + IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC}, + {"clearCookiesSummarySignedIn", + IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC_WITH_EXCEPTION}, {"clearCookiesCounter", IDS_DEL_COOKIES_COUNTER}, {"clearCookiesFlash", IDS_SETTINGS_CLEAR_COOKIES_FLASH}, {"clearPasswords", IDS_SETTINGS_CLEAR_PASSWORDS}, @@ -539,11 +537,6 @@ void AddClearBrowsingDataStrings(content::WebUIDataSource* html_source, {"historyDeletionDialogTitle", IDS_CLEAR_BROWSING_DATA_HISTORY_NOTICE_TITLE}, {"historyDeletionDialogOK", IDS_CLEAR_BROWSING_DATA_HISTORY_NOTICE_OK}, - {"importantSitesSubtitleCookies", - IDS_SETTINGS_IMPORTANT_SITES_SUBTITLE_COOKIES}, - {"importantSitesSubtitleCookiesAndCache", - IDS_SETTINGS_IMPORTANT_SITES_SUBTITLE_COOKIES_AND_CACHE}, - {"importantSitesConfirm", IDS_SETTINGS_IMPORTANT_SITES_CONFIRM}, {"notificationWarning", IDS_SETTINGS_NOTIFICATION_WARNING}, }; @@ -751,7 +744,7 @@ void AddDeviceStrings(content::WebUIDataSource* html_source) { display::HasExternalTouchscreenDevice()); html_source->AddBoolean("nightLightFeatureEnabled", - ash::switches::IsNightLightEnabled()); + ash::features::IsNightLightEnabled()); LocalizedString storage_strings[] = { {"storageTitle", IDS_SETTINGS_STORAGE_TITLE}, @@ -761,6 +754,7 @@ void AddDeviceStrings(content::WebUIDataSource* html_source) { {"storageItemDriveCache", IDS_SETTINGS_STORAGE_ITEM_DRIVE_CACHE}, {"storageItemBrowsingData", IDS_SETTINGS_STORAGE_ITEM_BROWSING_DATA}, {"storageItemAndroid", IDS_SETTINGS_STORAGE_ITEM_ANDROID}, + {"storageItemCrostini", IDS_SETTINGS_STORAGE_ITEM_CROSTINI}, {"storageItemOtherUsers", IDS_SETTINGS_STORAGE_ITEM_OTHER_USERS}, {"storageSizeComputing", IDS_SETTINGS_STORAGE_SIZE_CALCULATING}, {"storageSizeUnknown", IDS_SETTINGS_STORAGE_SIZE_UNKNOWN}, @@ -823,6 +817,7 @@ void AddDownloadsStrings(content::WebUIDataSource* html_source) { IDS_SETTINGS_DOWNLOADS_SMB_SHARES_LEARN_MORE_LABEL}, {"addSmbShare", IDS_SETTINGS_DOWNLOADS_SMB_SHARES_ADD_SHARE}, {"smbShareUrl", IDS_SETTINGS_DOWNLOADS_ADD_SHARE_URL}, + {"smbShareName", IDS_SETTINGS_DOWNLOADS_ADD_SHARE_NAME}, {"smbShareUsername", IDS_SETTINGS_DOWNLOADS_ADD_SHARE_USERNAME}, {"smbSharePassword", IDS_SETTINGS_DOWNLOADS_ADD_SHARE_PASSWORD}, {"smbShareAddedSuccessfulMessage", @@ -857,6 +852,8 @@ void AddChromeCleanupStrings(content::WebUIDataSource* html_source) { LocalizedString localized_strings[] = { {"chromeCleanupPageTitle", IDS_SETTINGS_RESET_CLEAN_UP_COMPUTER_PAGE_TITLE}, + {"chromeCleanupDetailsExtensions", + IDS_SETTINGS_RESET_CLEANUP_DETAILS_EXTENSIONS}, {"chromeCleanupDetailsFilesAndPrograms", IDS_SETTINGS_RESET_CLEANUP_DETAILS_FILES_AND_PROGRAMS}, {"chromeCleanupDetailsRegistryEntries", @@ -1242,8 +1239,6 @@ void AddInternetStrings(content::WebUIDataSource* html_source) { AddLocalizedStringsBulk(html_source, localized_strings, arraysize(localized_strings)); - html_source->AddBoolean("networkSettingsConfig", - chromeos::switches::IsNetworkSettingsConfigEnabled()); html_source->AddString("networkGoogleNameserversLearnMoreUrl", chrome::kGoogleNameserversLearnMoreURL); html_source->AddString( @@ -1273,6 +1268,8 @@ void AddLanguagesStrings(content::WebUIDataSource* html_source) { {"inputMethodEnabled", IDS_SETTINGS_LANGUAGES_INPUT_METHOD_ENABLED}, {"inputMethodsExpandA11yLabel", IDS_SETTINGS_LANGUAGES_INPUT_METHODS_EXPAND_ACCESSIBILITY_LABEL}, + {"inputMethodsManagedbyPolicy", + IDS_SETTINGS_LANGUAGES_INPUT_METHODS_MANAGED_BY_POLICY}, {"manageInputMethods", IDS_SETTINGS_LANGUAGES_INPUT_METHODS_MANAGE}, {"manageInputMethodsPageTitle", IDS_SETTINGS_LANGUAGES_MANAGE_INPUT_METHODS_TITLE}, @@ -1381,10 +1378,13 @@ void AddPasswordsAndFormsStrings(content::WebUIDataSource* html_source) { LocalizedString localized_strings[] = { {"passwordsAndAutofillPageTitle", IDS_SETTINGS_PASSWORDS_AND_AUTOFILL_PAGE_TITLE}, - {"autofill", IDS_SETTINGS_AUTOFILL}, {"googlePayments", IDS_SETTINGS_GOOGLE_PAYMENTS}, {"googlePaymentsCached", IDS_SETTINGS_GOOGLE_PAYMENTS_CACHED}, {"autofillFormsLabel", IDS_SETTINGS_AUTOFILL_TOGGLE_LABEL}, + {"enableProfilesLabel", + IDS_SETTINGS_AUTOFILL_ENABLE_PROFILES_TOGGLE_LABEL}, + {"enableCreditCardsLabel", + IDS_SETTINGS_AUTOFILL_ENABLE_CREDIT_CARDS_TOGGLE_LABEL}, {"addresses", IDS_SETTINGS_AUTOFILL_ADDRESSES_HEADING}, {"addAddressTitle", IDS_SETTINGS_AUTOFILL_ADDRESSES_ADD_TITLE}, {"editAddressTitle", IDS_SETTINGS_AUTOFILL_ADDRESSES_EDIT_TITLE}, @@ -1392,7 +1392,6 @@ void AddPasswordsAndFormsStrings(content::WebUIDataSource* html_source) { {"addressPhone", IDS_SETTINGS_AUTOFILL_ADDRESSES_PHONE}, {"addressEmail", IDS_SETTINGS_AUTOFILL_ADDRESSES_EMAIL}, {"removeAddress", IDS_SETTINGS_ADDRESS_REMOVE}, - {"creditCards", IDS_SETTINGS_AUTOFILL_CREDIT_CARD_HEADING}, {"removeCreditCard", IDS_SETTINGS_CREDIT_CARD_REMOVE}, {"clearCreditCard", IDS_SETTINGS_CREDIT_CARD_CLEAR}, {"creditCardType", IDS_SETTINGS_AUTOFILL_CREDIT_CARD_TYPE_COLUMN_LABEL}, @@ -1406,7 +1405,6 @@ void AddPasswordsAndFormsStrings(content::WebUIDataSource* html_source) { {"addCreditCardTitle", IDS_SETTINGS_ADD_CREDIT_CARD_TITLE}, {"canMakePaymentToggleLabel", IDS_SETTINGS_CAN_MAKE_PAYMENT_TOGGLE_LABEL}, {"autofillDetail", IDS_SETTINGS_AUTOFILL_DETAIL}, - {"passwords", IDS_SETTINGS_PASSWORDS}, {"passwordsSavePasswordsLabel", IDS_SETTINGS_PASSWORDS_SAVE_PASSWORDS_TOGGLE_LABEL}, {"passwordsAutosigninLabel", @@ -1427,8 +1425,6 @@ void AddPasswordsAndFormsStrings(content::WebUIDataSource* html_source) { {"editPasswordUsernameLabel", IDS_SETTINGS_PASSWORDS_USERNAME}, {"editPasswordPasswordLabel", IDS_SETTINGS_PASSWORDS_PASSWORD}, {"noAddressesFound", IDS_SETTINGS_ADDRESS_NONE}, - {"noCreditCardsFound", IDS_SETTINGS_CREDIT_CARD_NONE}, - {"noCreditCardsPolicy", IDS_SETTINGS_CREDIT_CARD_DISABLED}, {"noPasswordsFound", IDS_SETTINGS_PASSWORDS_NONE}, {"noExceptionsFound", IDS_SETTINGS_PASSWORDS_EXCEPTIONS_NONE}, {"import", IDS_PASSWORD_MANAGER_IMPORT_BUTTON}, @@ -1452,12 +1448,31 @@ void AddPasswordsAndFormsStrings(content::WebUIDataSource* html_source) { {"exportPasswordsFailTipsAnotherFolder", IDS_SETTINGS_PASSWORDS_EXPORTING_FAILURE_TIP_ANOTHER_FOLDER}}; + // TODO(https://crbug.com/854562): Integrate these strings into the + // |localized_strings| array once Autofill Home is fully launched. + if (base::FeatureList::IsEnabled(password_manager::features::kAutofillHome)) { + html_source->AddLocalizedString("autofill", + IDS_SETTINGS_AUTOFILL_AUTOFILL_HOME); + html_source->AddLocalizedString("passwords", + IDS_SETTINGS_PASSWORDS_AUTOFILL_HOME); + html_source->AddLocalizedString("creditCards", + IDS_SETTINGS_AUTOFILL_PAYMENT_METHODS); + html_source->AddLocalizedString("noCreditCardsFound", + IDS_SETTINGS_PAYMENT_METHODS_NONE); + } else { + html_source->AddLocalizedString("autofill", IDS_SETTINGS_AUTOFILL); + html_source->AddLocalizedString("passwords", IDS_SETTINGS_PASSWORDS); + html_source->AddLocalizedString("creditCards", + IDS_SETTINGS_AUTOFILL_CREDIT_CARD_HEADING); + html_source->AddLocalizedString("noCreditCardsFound", + IDS_SETTINGS_CREDIT_CARD_NONE); + } + html_source->AddString( "managePasswordsLabel", l10n_util::GetStringFUTF16( IDS_SETTINGS_PASSWORDS_MANAGE_PASSWORDS, - base::ASCIIToUTF16( - password_manager::kPasswordManagerAccountDashboardURL))); + l10n_util::GetStringUTF16(IDS_PASSWORDS_WEB_LINK))); html_source->AddString("passwordManagerLearnMoreURL", chrome::kPasswordManagerLearnMoreURL); html_source->AddString("manageAddressesUrl", @@ -1477,6 +1492,7 @@ void AddPeopleStrings(content::WebUIDataSource* html_source, Profile* profile) { {"accountManagerPageTitle", IDS_SETTINGS_ACCOUNT_MANAGER_PAGE_TITLE}, {"accountManagerDescription", IDS_SETTINGS_ACCOUNT_MANAGER_DESCRIPTION}, {"accountListHeader", IDS_SETTINGS_ACCOUNT_MANAGER_LIST_HEADER}, + {"addAccountLabel", IDS_SETTINGS_ACCOUNT_MANAGER_ADD_ACCOUNT_LABEL}, {"configureFingerprintTitle", IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_TITLE}, {"configureFingerprintInstructionLocateScannerStep", IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER}, @@ -1586,6 +1602,7 @@ void AddPeopleStrings(content::WebUIDataSource* html_source, Profile* profile) { #endif // defined(OS_CHROMEOS) #if BUILDFLAG(ENABLE_DICE_SUPPORT) {"peopleSignIn", IDS_SETTINGS_PEOPLE_SIGN_IN}, + {"peopleSignOut", IDS_SETTINGS_PEOPLE_SIGN_OUT}, {"peopleSignInPrompt", IDS_SETTINGS_PEOPLE_SIGN_IN_PROMPT}, {"peopleSignInPromptSecondaryWithNoAccount", IDS_SETTINGS_PEOPLE_SIGN_IN_PROMPT_SECONDARY_WITH_NO_ACCOUNT}, @@ -1595,23 +1612,22 @@ void AddPeopleStrings(content::WebUIDataSource* html_source, Profile* profile) { {"syncAsName", IDS_SETTINGS_PEOPLE_SYNC_AS_NAME}, {"syncingTo", IDS_SETTINGS_PEOPLE_SYNCING_TO_ACCOUNT}, {"turnOffSync", IDS_SETTINGS_PEOPLE_SYNC_TURN_OFF}, + {"signInAgain", IDS_SYNC_ERROR_USER_MENU_SIGNIN_AGAIN_BUTTON}, {"syncNotWorking", IDS_SETTINGS_PEOPLE_SYNC_NOT_WORKING}, {"syncPaused", IDS_SETTINGS_PEOPLE_SYNC_PAUSED}, {"syncSignInPromptWithAccount", IDS_SETTINGS_SYNC_SIGN_IN_PROMPT_WITH_ACCOUNT}, {"syncSignInPromptWithNoAccount", IDS_SETTINGS_SYNC_SIGN_IN_PROMPT_WITH_NO_ACCOUNT}, - {"syncSignInPromptSecondary", IDS_SETTINGS_SYNC_SIGN_IN_PROMPT_SECONDARY}, #endif {"syncUnifiedConsentToggleTitle", IDS_SETTINGS_PEOPLE_SYNC_UNIFIED_CONSENT_TOGGLE_TITLE}, - {"syncUnifiedConsentToggleSubtitle", - IDS_SETTINGS_PEOPLE_SYNC_UNIFIED_CONSENT_TOGGLE_SUBTITLE}, {"syncOverview", IDS_SETTINGS_SYNC_OVERVIEW}, + {"syncDisabled", IDS_PROFILES_DICE_SYNC_DISABLED_TITLE}, {"syncDisabledByAdministrator", IDS_SETTINGS_SYNC_DISABLED_BY_ADMINISTRATOR}, {"syncSignin", IDS_SETTINGS_SYNC_SIGNIN}, - {"syncDisconnect", IDS_SETTINGS_SYNC_DISCONNECT}, + {"syncDisconnect", IDS_SETTINGS_PEOPLE_SIGN_OUT}, {"syncDisconnectTitle", IDS_SETTINGS_SYNC_DISCONNECT_TITLE}, {"syncDisconnectDeleteProfile", IDS_SETTINGS_SYNC_DISCONNECT_DELETE_PROFILE}, @@ -1623,18 +1639,24 @@ void AddPeopleStrings(content::WebUIDataSource* html_source, Profile* profile) { IDS_SETTINGS_SYNC_DISCONNECT_DELETE_PROFILE_WARNING_WITH_COUNTS_PLURAL}, {"deleteProfileWarningWithoutCounts", IDS_SETTINGS_SYNC_DISCONNECT_DELETE_PROFILE_WARNING_WITHOUT_COUNTS}, - {"syncDisconnectExplanation", IDS_SETTINGS_SYNC_DISCONNECT_EXPLANATION}, {"syncDisconnectConfirm", IDS_SETTINGS_SYNC_DISCONNECT_CONFIRM}, - {"sync", IDS_SETTINGS_SYNC}, - {"syncDescription", IDS_SETTINGS_SYNC_DESCRIPTION}, - {"personalizationSectionLabel", IDS_SETTINGS_PERSONALIZATION_SECTION_LABEL}, - {"personalizationSectionDesc", IDS_SETTINGS_PERSONALIZATION_SECTION_DESC}, - {"personalizationExpandA11yLabel", - IDS_SETTINGS_PERSONALIZATION_SECTION_ACCESSIBILITY_LABEL}, + {"sync", IsUnifiedConsentEnabled(profile) + ? IDS_SETTINGS_SYNC_UNIFIED_CONSENT + : IDS_SETTINGS_SYNC}, + {"syncDescription", IsUnifiedConsentEnabled(profile) + ? IDS_SETTINGS_SYNC_DESCRIPTION_UNIFIED_CONSENT + : IDS_SETTINGS_SYNC_DESCRIPTION}, + {"nonPersonalizedServicesSectionLabel", + IDS_SETTINGS_NON_PERSONALIZED_SERVICES_SECTION_LABEL}, + {"nonPersonalizedServicesSectionDesc", + IDS_SETTINGS_NON_PERSONALIZED_SERVICES_SECTION_DESC}, + {"nonPersonalizedServicesExpandA11yLabel", + IDS_SETTINGS_NON_PERSONALIZED_SERVICES_SECTION_ACCESSIBILITY_LABEL}, {"syncExpandA11yLabel", IDS_SETTINGS_SYNC_SECTION_ACCESSIBILITY_LABEL}, - {"syncAndPersonalization", IDS_SETTINGS_SYNC_SYNC_AND_PERSONALIZATION}, + {"syncAndNonPersonalizedServices", + IDS_SETTINGS_SYNC_SYNC_AND_NON_PERSONALIZED_SERVICES}, {"syncPageTitle", IsUnifiedConsentEnabled(profile) - ? IDS_SETTINGS_SYNC_SYNC_AND_PERSONALIZATION + ? IDS_SETTINGS_SYNC_SYNC_AND_NON_PERSONALIZED_SERVICES : IDS_SETTINGS_SYNC_PAGE_TITLE}, {"syncLoading", IDS_SETTINGS_SYNC_LOADING}, {"syncTimeout", IDS_SETTINGS_SYNC_TIMEOUT}, @@ -1650,8 +1672,10 @@ void AddPeopleStrings(content::WebUIDataSource* html_source, Profile* profile) { {"bookmarksCheckboxLabel", IDS_SETTINGS_BOOKMARKS_CHECKBOX_LABEL}, {"passwordsCheckboxLabel", IDS_SETTINGS_PASSWORDS_CHECKBOX_LABEL}, {"openTabsCheckboxLabel", IDS_SETTINGS_OPEN_TABS_CHECKBOX_LABEL}, - {"enablePaymentsIntegrationCheckboxLabel", - IDS_SETTINGS_ENABLE_PAYMENTS_INTEGRATION_CHECKBOX_LABEL}, + {"userEventsCheckboxLabel", IDS_SETTINGS_USER_EVENTS_CHECKBOX_LABEL}, + {"userEventsCheckboxText", IDS_SETTINGS_USER_EVENTS_CHECKBOX_TEXT}, + {"driveSuggestPref", IDS_DRIVE_SUGGEST_PREF}, + {"driveSuggestPrefDesc", IDS_DRIVE_SUGGEST_PREF_DESC}, {"manageSyncedDataTitle", IDS_SETTINGS_MANAGE_SYNCED_DATA_TITLE}, {"encryptionOptionsTitle", IDS_SETTINGS_ENCRYPTION_OPTIONS}, {"syncDataEncryptedText", IDS_SETTINGS_SYNC_DATA_ENCRYPTED_TEXT}, @@ -1667,12 +1691,23 @@ void AddPeopleStrings(content::WebUIDataSource* html_source, Profile* profile) { {"submitPassphraseButton", IDS_SETTINGS_SUBMIT_PASSPHRASE}, {"personalizeGoogleServicesTitle", IDS_SETTINGS_PERSONALIZE_GOOGLE_SERVICES_TITLE}, - {"personalizeGoogleServicesText", - IDS_SETTINGS_PERSONALIZE_GOOGLE_SERVICES_TEXT}, + {"existingPassphraseTitle", IDS_SETTINGS_EXISTING_PASSPHRASE_TITLE}, }; AddLocalizedStringsBulk(html_source, localized_strings, arraysize(localized_strings)); + // TODO(https://crbug.com/854562): Integrate these strings into the + // |localized_strings| array once Autofill Home is fully launched. + if (base::FeatureList::IsEnabled(password_manager::features::kAutofillHome)) { + html_source->AddLocalizedString( + "enablePaymentsIntegrationCheckboxLabel", + IDS_SETTINGS_ENABLE_PAYMENTS_INTEGRATION_CHECKBOX_LABEL_AUTOFILL_HOME); + } else { + html_source->AddLocalizedString( + "enablePaymentsIntegrationCheckboxLabel", + IDS_SETTINGS_ENABLE_PAYMENTS_INTEGRATION_CHECKBOX_LABEL); + } + // Format numbers to be used on the pin keyboard. for (int j = 0; j <= 9; j++) { html_source->AddString("pinKeyboard" + base::IntToString(j), @@ -1712,8 +1747,11 @@ void AddPeopleStrings(content::WebUIDataSource* html_source, Profile* profile) { base::ASCIIToUTF16(sync_dashboard_url))); html_source->AddString( "passphraseResetHint", - l10n_util::GetStringFUTF8(IDS_SETTINGS_PASSPHRASE_RESET_HINT, - base::ASCIIToUTF16(sync_dashboard_url))); + l10n_util::GetStringFUTF8( + IsUnifiedConsentEnabled(profile) + ? IDS_SETTINGS_PASSPHRASE_RESET_HINT_UNIFIED_CONSENT + : IDS_SETTINGS_PASSPHRASE_RESET_HINT, + base::ASCIIToUTF16(sync_dashboard_url))); html_source->AddString( "passphraseRecover", l10n_util::GetStringFUTF8(IDS_SETTINGS_PASSPHRASE_RECOVER, @@ -1733,8 +1771,11 @@ void AddPeopleStrings(content::WebUIDataSource* html_source, Profile* profile) { // The syncDisconnect text differs depending on Dice-enabledness. if (AccountConsistencyModeManager::IsDiceEnabledForProfile(profile)) { LocalizedString sync_disconnect_strings[] = { - {"syncDisconnect", IDS_SETTINGS_TURN_OFF_SYNC_DIALOG_CONFIRM}, - {"syncDisconnectTitle", IDS_SETTINGS_TURN_OFF_SYNC_DIALOG_TITLE}, + {"syncDisconnect", IDS_SETTINGS_PEOPLE_SYNC_TURN_OFF}, + {"syncDisconnectTitle", + IsUnifiedConsentEnabled(profile) + ? IDS_SETTINGS_TURN_OFF_SYNC_AND_SIGN_OUT_DIALOG_TITLE_UNIFIED_CONSENT + : IDS_SETTINGS_TURN_OFF_SYNC_AND_SIGN_OUT_DIALOG_TITLE}, {"syncDisconnectDeleteProfile", IDS_SETTINGS_TURN_OFF_SYNC_DIALOG_CHECKBOX}, {"syncDisconnectConfirm", @@ -1742,6 +1783,18 @@ void AddPeopleStrings(content::WebUIDataSource* html_source, Profile* profile) { }; AddLocalizedStringsBulk(html_source, sync_disconnect_strings, arraysize(sync_disconnect_strings)); + + if (IsUnifiedConsentEnabled(profile)) { + html_source->AddLocalizedString( + "syncDisconnectExplanation", + IDS_SETTINGS_SYNC_DISCONNECT_AND_SIGN_OUT_EXPLANATION_UNIFIED_CONSENT); + } else { + html_source->AddString( + "syncDisconnectExplanation", + l10n_util::GetStringFUTF8( + IDS_SETTINGS_SYNC_DISCONNECT_AND_SIGN_OUT_EXPLANATION, + base::ASCIIToUTF16(sync_dashboard_url))); + } } #endif @@ -1756,6 +1809,10 @@ void AddPeopleStrings(content::WebUIDataSource* html_source, Profile* profile) { html_source->AddBoolean( "changePictureVideoModeEnabled", base::FeatureList::IsEnabled(features::kChangePictureVideoMode)); + + html_source->AddBoolean( + "driveSuggestAvailable", + base::FeatureList::IsEnabled(omnibox::kDocumentProvider)); } void AddPrintingStrings(content::WebUIDataSource* html_source) { @@ -1882,7 +1939,18 @@ void AddPrivacyStrings(content::WebUIDataSource* html_source, {"clearBrowsingData", IDS_SETTINGS_CLEAR_BROWSING_DATA}, {"clearBrowsingDataDescription", IDS_SETTINGS_CLEAR_DATA_DESCRIPTION}, {"titleAndCount", IDS_SETTINGS_TITLE_AND_COUNT}, - {"syncAndPersonalizationLink", IDS_SETTINGS_PRIVACY_MORE_SETTINGS}, + {"safeBrowsingEnableExtendedReporting", + IDS_SETTINGS_SAFEBROWSING_ENABLE_REPORTING}, + {"safeBrowsingEnableExtendedReportingDesc", + IDS_SETTINGS_SAFEBROWSING_ENABLE_REPORTING_DESC}, + {"safeBrowsingEnableProtection", + IDS_SETTINGS_SAFEBROWSING_ENABLEPROTECTION}, + {"safeBrowsingEnableProtectionDesc", + IDS_SETTINGS_SAFEBROWSING_ENABLEPROTECTION_DESC}, + {"urlKeyedAnonymizedDataCollection", + IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION}, + {"urlKeyedAnonymizedDataCollectionDesc", + IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION_DESC}, }; AddLocalizedStringsBulk(html_source, localized_strings, arraysize(localized_strings)); @@ -1894,10 +1962,6 @@ void AddPrivacyStrings(content::WebUIDataSource* html_source, {"searchSuggestPref", IDS_SETTINGS_SUGGEST_PREF_UNIFIED_CONSENT}, {"searchSuggestPrefDesc", IDS_SETTINGS_SUGGEST_PREF_DESC_UNIFIED_CONSENT}, - {"safeBrowsingEnableExtendedReporting", - IDS_SETTINGS_SAFEBROWSING_ENABLE_REPORTING_UNIFIED_CONSENT}, - {"safeBrowsingEnableExtendedReportingDesc", - IDS_SETTINGS_SAFEBROWSING_ENABLE_REPORTING_DESC_UNIFIED_CONSENT}, {"networkPredictionEnabled", IDS_SETTINGS_NETWORK_PREDICTION_ENABLED_LABEL_UNIFIED_CONSENT}, {"networkPredictionEnabledDesc", @@ -1905,13 +1969,11 @@ void AddPrivacyStrings(content::WebUIDataSource* html_source, {"linkDoctorPref", IDS_SETTINGS_LINKDOCTOR_PREF_UNIFIED_CONSENT}, {"linkDoctorPrefDesc", IDS_SETTINGS_LINKDOCTOR_PREF_DESC_UNIFIED_CONSENT}, - {"safeBrowsingEnableProtection", - IDS_SETTINGS_SAFEBROWSING_ENABLEPROTECTION_UNIFIED_CONSENT}, - {"safeBrowsingEnableProtectionDesc", - IDS_SETTINGS_SAFEBROWSING_ENABLEPROTECTION_DESC_UNIFIED_CONSENT}, {"spellingPref", IDS_SETTINGS_SPELLING_PREF_UNIFIED_CONSENT}, {"spellingDescription", IDS_SETTINGS_SPELLING_DESCRIPTION_UNIFIED_CONSENT}, + {"syncAndPersonalizationLink", + IDS_SETTINGS_PRIVACY_MORE_SETTINGS_UNIFIED_CONSENT}, {"enableLogging", IDS_SETTINGS_ENABLE_LOGGING_UNIFIED_CONSENT}, {"enableLoggingDesc", IDS_SETTINGS_ENABLE_LOGGING_DESC_UNIFIED_CONSENT}, }; @@ -1921,17 +1983,14 @@ void AddPrivacyStrings(content::WebUIDataSource* html_source, LocalizedString conditional_localized_strings[] = { {"searchSuggestPref", IDS_SETTINGS_SUGGEST_PREF}, {"searchSuggestPrefDesc", IDS_SETTINGS_EMPTY_STRING}, - {"safeBrowsingEnableExtendedReportingDesc", IDS_SETTINGS_EMPTY_STRING}, {"networkPredictionEnabled", IDS_SETTINGS_NETWORK_PREDICTION_ENABLED_LABEL}, {"networkPredictionEnabledDesc", IDS_SETTINGS_EMPTY_STRING}, {"linkDoctorPref", IDS_SETTINGS_LINKDOCTOR_PREF}, {"linkDoctorPrefDesc", IDS_SETTINGS_EMPTY_STRING}, - {"safeBrowsingEnableProtection", - IDS_SETTINGS_SAFEBROWSING_ENABLEPROTECTION}, - {"safeBrowsingEnableProtectionDesc", IDS_SETTINGS_EMPTY_STRING}, {"spellingPref", IDS_SETTINGS_SPELLING_PREF}, {"spellingDescription", IDS_SETTINGS_SPELLING_DESCRIPTION}, + {"syncAndPersonalizationLink", IDS_SETTINGS_PRIVACY_MORE_SETTINGS}, #if defined(OS_CHROMEOS) {"enableLogging", IDS_SETTINGS_ENABLE_LOGGING_DIAGNOSTIC_AND_USAGE_DATA}, #else @@ -1941,19 +2000,12 @@ void AddPrivacyStrings(content::WebUIDataSource* html_source, }; AddLocalizedStringsBulk(html_source, conditional_localized_strings, arraysize(conditional_localized_strings)); - - html_source->AddLocalizedString( - "safeBrowsingEnableExtendedReporting", - safe_browsing::ChooseOptInTextResource( - *profile->GetPrefs(), - IDS_SETTINGS_SAFEBROWSING_ENABLE_EXTENDED_REPORTING, - IDS_SETTINGS_SAFEBROWSING_ENABLE_SCOUT_REPORTING)); } - html_source->AddBoolean( - "importantSitesInCbd", - base::FeatureList::IsEnabled(features::kImportantSitesInCbd)); - + html_source->AddString("syncAndGoogleServicesLearnMoreURL", + IsUnifiedConsentEnabled(profile) + ? chrome::kSyncAndGoogleServicesLearnMoreURL + : ""); html_source->AddString( "improveBrowsingExperience", l10n_util::GetStringFUTF16( @@ -2027,6 +2079,8 @@ void AddSearchStrings(content::WebUIDataSource* html_source, Profile* profile) { html_source->AddString("searchExplanation", search_explanation_text); #if defined(OS_CHROMEOS) html_source->AddBoolean("enableVoiceInteraction", is_assistant_allowed); + html_source->AddBoolean("enableAssistant", + chromeos::switches::IsAssistantEnabled()); #endif } @@ -2067,6 +2121,10 @@ void AddGoogleAssistantStrings(content::WebUIDataSource* html_source) { IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_CONTEXT}, {"googleAssistantEnableContextDescription", IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_CONTEXT_DESCRIPTION}, + {"googleAssistantEnableHotword", + IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD}, + {"googleAssistantEnableHotwordDescription", + IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_DESCRIPTION}, {"googleAssistantSettings", IDS_SETTINGS_GOOGLE_ASSISTANT_SETTINGS}, }; AddLocalizedStringsBulk(html_source, localized_strings, @@ -2089,7 +2147,6 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source, {"cookieFlashLso", IDS_SETTINGS_COOKIES_FLASH_LSO}, {"cookieLocalStorage", IDS_SETTINGS_COOKIES_LOCAL_STORAGE}, {"cookieMediaLicense", IDS_SETTINGS_COOKIES_MEDIA_LICENSE}, - {"cookiePlural", IDS_SETTINGS_COOKIES_PLURAL_COOKIES}, {"cookieServiceWorker", IDS_SETTINGS_COOKIES_SERVICE_WORKER}, {"cookieSharedWorker", IDS_SETTINGS_COOKIES_SHARED_WORKER}, {"embeddedOnAnyHost", IDS_SETTINGS_EXCEPTIONS_EMBEDDED_ON_ANY_HOST}, @@ -2156,6 +2213,12 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source, {"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}, + {"siteSettingsAllSitesSortMethodName", + IDS_SETTINGS_SITE_SETTINGS_ALL_SITES_SORT_METHOD_NAME}, + {"siteSettingsSiteRepresentationSeparator", + IDS_SETTINGS_SITE_SETTINGS_SITE_REPRESENTATION_SEPARATOR}, {"siteSettingsAutomaticDownloads", IDS_SETTINGS_SITE_SETTINGS_AUTOMATIC_DOWNLOADS}, {"siteSettingsBackgroundSync", IDS_SETTINGS_SITE_SETTINGS_BACKGROUND_SYNC}, @@ -2326,11 +2389,19 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source, {"siteSettingsCookieSearch", IDS_SETTINGS_SITE_SETTINGS_COOKIE_SEARCH}, {"siteSettingsCookieSubpage", IDS_SETTINGS_SITE_SETTINGS_COOKIE_SUBPAGE}, {"siteSettingsDelete", IDS_SETTINGS_SITE_SETTINGS_DELETE}, + {"siteSettingsSiteClearStorage", + IDS_SETTINGS_SITE_SETTINGS_SITE_CLEAR_STORAGE}, + {"siteSettingsSiteClearStorageConfirmation", + IDS_SETTINGS_SITE_SETTINGS_SITE_CLEAR_STORAGE_CONFIRMATION}, + {"siteSettingsSiteClearStorageDialogTitle", + IDS_SETTINGS_SITE_SETTINGS_SITE_CLEAR_STORAGE_DIALOG_TITLE}, + {"siteSettingsSiteGroupResetDialogTitle", + IDS_SETTINGS_SITE_SETTINGS_SITE_GROUP_RESET_DIALOG_TITLE}, + {"siteSettingsSiteGroupResetConfirmation", + IDS_SETTINGS_SITE_SETTINGS_SITE_GROUP_RESET_CONFIRMATION}, {"siteSettingsSiteResetAll", IDS_SETTINGS_SITE_SETTINGS_SITE_RESET_ALL}, {"siteSettingsSiteResetConfirmation", IDS_SETTINGS_SITE_SETTINGS_SITE_RESET_CONFIRMATION}, - {"siteSettingsSiteResetDialogTitle", - IDS_SETTINGS_SITE_SETTINGS_SITE_RESET_DIALOG_TITLE}, {"thirdPartyCookie", IDS_SETTINGS_SITE_SETTINGS_THIRD_PARTY_COOKIE}, {"thirdPartyCookieSublabel", IDS_SETTINGS_SITE_SETTINGS_THIRD_PARTY_COOKIE_SUBLABEL}, @@ -2365,7 +2436,7 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source, html_source->AddBoolean( "enableSafeBrowsingSubresourceFilter", base::FeatureList::IsEnabled( - subresource_filter::kSafeBrowsingSubresourceFilterExperimentalUI)); + subresource_filter::kSafeBrowsingSubresourceFilter)); html_source->AddBoolean( "enableSoundContentSetting", @@ -2383,12 +2454,20 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source, "enablePaymentHandlerContentSetting", base::FeatureList::IsEnabled(features::kServiceWorkerPaymentApps)); + html_source->AddBoolean( + "enableEphemeralFlashPermission", + base::FeatureList::IsEnabled( + content_settings::features::kEnableEphemeralFlashPermission)); + if (PluginUtils::ShouldPreferHtmlOverPlugins( HostContentSettingsMapFactory::GetForProfile(profile))) { LocalizedString flash_strings[] = { {"siteSettingsFlashAskFirst", IDS_SETTINGS_SITE_SETTINGS_ASK_FIRST}, {"siteSettingsFlashAskFirstRecommended", IDS_SETTINGS_SITE_SETTINGS_ASK_FIRST_RECOMMENDED}, + {"siteSettingsFlashPermissionsEphemeral", + IDS_SETTINGS_SITE_SETTINGS_FLASH_PERMISSIONS_ARE_EPHEMERAL}, + }; AddLocalizedStringsBulk(html_source, flash_strings, arraysize(flash_strings)); @@ -2398,6 +2477,8 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source, IDS_SETTINGS_SITE_SETTINGS_FLASH_DETECT_IMPORTANT}, {"siteSettingsFlashAskFirstRecommended", IDS_SETTINGS_SITE_SETTINGS_FLASH_DETECT_IMPORTANT_RECOMMENDED}, + {"siteSettingsFlashPermissionsEphemeral", + IDS_SETTINGS_SITE_SETTINGS_FLASH_PERMISSIONS_ARE_EPHEMERAL}, }; AddLocalizedStringsBulk(html_source, flash_strings, arraysize(flash_strings)); @@ -2476,14 +2557,50 @@ void AddWebContentStrings(content::WebUIDataSource* html_source) { void AddMultideviceStrings(content::WebUIDataSource* html_source) { LocalizedString localized_strings[] = { {"multidevicePageTitle", IDS_SETTINGS_MULTIDEVICE}, - {"smsConnect", IDS_SETTINGS_MULTIDEVICE_SMS_CONNECT}, - {"smsConnectSummary", IDS_SETTINGS_MULTIDEVICE_SMS_CONNECT_SUMMARY}, + {"multideviceSetupButton", IDS_SETTINGS_MULTIDEVICE_SETUP_BUTTON}, + {"multideviceVerifyButton", IDS_SETTINGS_MULTIDEVICE_VERIFY_BUTTON}, + {"multideviceSetupItemHeading", + IDS_SETTINGS_MULTIDEVICE_SETUP_ITEM_HEADING}, + {"multideviceEnabled", IDS_SETTINGS_MULTIDEVICE_ENABLED}, + {"multideviceDisabled", IDS_SETTINGS_MULTIDEVICE_DISABLED}, + {"multideviceSmartLockItemTitle", IDS_SETTINGS_EASY_UNLOCK_SECTION_TITLE}, + {"multideviceInstantTetheringItemTitle", + IDS_SETTINGS_MULTIDEVICE_INSTANT_TETHERING}, + {"multideviceAndroidMessagesItemTitle", + IDS_SETTINGS_MULTIDEVICE_ANDROID_MESSAGES}, + {"multideviceAndroidMessagesItemSummary", + IDS_SETTINGS_MULTIDEVICE_ANDROID_MESSAGES_SUMMARY}, + {"multideviceForgetDevice", IDS_SETTINGS_MULTIDEVICE_FORGET_THIS_DEVICE}, + {"multideviceForgetDeviceSummary", + IDS_SETTINGS_MULTIDEVICE_FORGET_THIS_DEVICE_EXPLANATION}, }; AddLocalizedStringsBulk(html_source, localized_strings, arraysize(localized_strings)); - html_source->AddBoolean("enableMultideviceSettings", - base::FeatureList::IsEnabled(features::kMultidevice)); + html_source->AddBoolean( + "enableMultideviceSettings", + base::FeatureList::IsEnabled( + chromeos::features::kEnableUnifiedMultiDeviceSettings)); + html_source->AddString( + "multideviceVerificationText", + l10n_util::GetStringFUTF16( + IDS_SETTINGS_MULTIDEVICE_VERIFICATION_TEXT, + GetHelpUrlWithBoard(chrome::kMultiDeviceLearnMoreURL))); + html_source->AddString( + "multideviceCouldNotConnect", + l10n_util::GetStringFUTF16( + IDS_SETTINGS_MULTIDEVICE_COULD_NOT_CONNECT, + GetHelpUrlWithBoard(chrome::kMultiDeviceLearnMoreURL))); + html_source->AddString( + "multideviceSetupSummary", + l10n_util::GetStringFUTF16( + IDS_SETTINGS_MULTIDEVICE_SETUP_SUMMARY, + GetHelpUrlWithBoard(chrome::kMultiDeviceLearnMoreURL))); + html_source->AddString( + "multideviceSmartLockItemSummary", + l10n_util::GetStringFUTF16( + IDS_SETTINGS_MULTIDEVICE_SMART_LOCK_SUMMARY, + GetHelpUrlWithBoard(chrome::kEasyUnlockLearnMoreUrl))); } #endif diff --git a/chromium/chrome/browser/ui/webui/settings/md_settings_ui.cc b/chromium/chrome/browser/ui/webui/settings/md_settings_ui.cc index c7ca00e9642..e2feea6212e 100644 --- a/chromium/chrome/browser/ui/webui/settings/md_settings_ui.cc +++ b/chromium/chrome/browser/ui/webui/settings/md_settings_ui.cc @@ -75,7 +75,6 @@ #include "chrome/browser/chromeos/crostini/crostini_util.h" #include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.h" #include "chrome/browser/signin/account_tracker_service_factory.h" -#include "chrome/browser/ui/ash/ash_util.h" #include "chrome/browser/ui/webui/settings/chromeos/accessibility_handler.h" #include "chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h" #include "chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h" @@ -92,17 +91,19 @@ #include "chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.h" #include "chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.h" #include "chrome/browser/ui/webui/settings/chromeos/internet_handler.h" +#include "chrome/browser/ui/webui/settings/chromeos/multidevice_handler.h" #include "chrome/browser/ui/webui/settings/chromeos/smb_handler.h" #include "chrome/common/chrome_switches.h" #include "chromeos/account_manager/account_manager.h" #include "chromeos/account_manager/account_manager_factory.h" #include "chromeos/chromeos_switches.h" #include "components/arc/arc_util.h" +#include "ui/base/ui_base_features.h" #else // !defined(OS_CHROMEOS) +#include "chrome/browser/signin/account_consistency_mode_manager.h" #include "chrome/browser/ui/webui/settings/settings_default_browser_handler.h" #include "chrome/browser/ui/webui/settings/settings_manage_profile_handler.h" #include "chrome/browser/ui/webui/settings/system_handler.h" -#include "components/signin/core/browser/profile_management_switches.h" #endif // defined(OS_CHROMEOS) #if defined(USE_NSS_CERTS) @@ -182,15 +183,19 @@ MdSettingsUI::MdSettingsUI(content::WebUI* web_ui) AddSettingsPageUIHandler( std::make_unique<chromeos::settings::AndroidAppsHandler>(profile)); - chromeos::AccountManagerFactory* factory = - g_browser_process->platform_part()->GetAccountManagerFactory(); - chromeos::AccountManager* account_manager = - factory->GetAccountManager(profile->GetPath().value()); - DCHECK(account_manager); - AddSettingsPageUIHandler( - std::make_unique<chromeos::settings::AccountManagerUIHandler>( - account_manager, - AccountTrackerServiceFactory::GetInstance()->GetForProfile(profile))); + if (!profile->IsGuestSession()) { + chromeos::AccountManagerFactory* factory = + g_browser_process->platform_part()->GetAccountManagerFactory(); + chromeos::AccountManager* account_manager = + factory->GetAccountManager(profile->GetPath().value()); + DCHECK(account_manager); + + AddSettingsPageUIHandler( + std::make_unique<chromeos::settings::AccountManagerUIHandler>( + account_manager, + AccountTrackerServiceFactory::GetInstance()->GetForProfile( + profile))); + } AddSettingsPageUIHandler( std::make_unique<chromeos::settings::ChangePictureHandler>()); if (IsCrostiniUIAllowedForProfile(profile)) { @@ -201,18 +206,21 @@ MdSettingsUI::MdSettingsUI(content::WebUI* web_ui) std::make_unique<chromeos::settings::CupsPrintersHandler>(web_ui)); AddSettingsPageUIHandler( std::make_unique<chromeos::settings::FingerprintHandler>(profile)); - if (chromeos::switches::IsVoiceInteractionEnabled()) { + if (chromeos::switches::IsVoiceInteractionEnabled() || + chromeos::switches::IsAssistantEnabled()) { AddSettingsPageUIHandler( std::make_unique<chromeos::settings::GoogleAssistantHandler>(profile)); } AddSettingsPageUIHandler( std::make_unique<chromeos::settings::KeyboardHandler>()); AddSettingsPageUIHandler( + std::make_unique<chromeos::settings::MultideviceHandler>()); + AddSettingsPageUIHandler( std::make_unique<chromeos::settings::PointerHandler>()); AddSettingsPageUIHandler( std::make_unique<chromeos::settings::SmbHandler>(profile)); AddSettingsPageUIHandler( - std::make_unique<chromeos::settings::StorageHandler>()); + std::make_unique<chromeos::settings::StorageHandler>(profile)); AddSettingsPageUIHandler( std::make_unique<chromeos::settings::StylusHandler>()); AddSettingsPageUIHandler( @@ -230,8 +238,6 @@ MdSettingsUI::MdSettingsUI(content::WebUI* web_ui) content::WebUIDataSource* html_source = content::WebUIDataSource::Create(chrome::kChromeUISettingsHost); - html_source->OverrideContentSecurityPolicyScriptSrc( - "script-src chrome://resources 'self';"); #if defined(OS_WIN) AddSettingsPageUIHandler(std::make_unique<ChromeCleanupHandler>(profile)); @@ -310,20 +316,27 @@ MdSettingsUI::MdSettingsUI(content::WebUI* web_ui) html_source->AddBoolean("havePlayStoreApp", arc::IsPlayStoreAvailable()); // TODO(mash): Support Chrome power settings in Mash. crbug.com/644348 - bool enable_power_settings = !ash_util::IsRunningInMash(); + bool enable_power_settings = features::IsAshInBrowserProcess(); html_source->AddBoolean("enablePowerSettings", enable_power_settings); if (enable_power_settings) { AddSettingsPageUIHandler(std::make_unique<chromeos::settings::PowerHandler>( profile->GetPrefs())); } #else // !defined(OS_CHROMEOS) - html_source->AddBoolean("diceEnabled", - signin::IsDiceEnabledForProfile(profile->GetPrefs())); + html_source->AddBoolean( + "diceEnabled", + AccountConsistencyModeManager::IsDiceEnabledForProfile(profile)); #endif // defined(OS_CHROMEOS) html_source->AddBoolean("unifiedConsentEnabled", IsUnifiedConsentEnabled(profile)); + // TODO(jdoerrie): https://crbug.com/854562. + // Remove once Autofill Home is launched. + html_source->AddBoolean( + "autofillHomeEnabled", + base::FeatureList::IsEnabled(password_manager::features::kAutofillHome)); + html_source->AddBoolean("showImportPasswords", base::FeatureList::IsEnabled( password_manager::features::kPasswordImport)); diff --git a/chromium/chrome/browser/ui/webui/settings/people_handler.cc b/chromium/chrome/browser/ui/webui/settings/people_handler.cc index 75d91f07c7c..d33f651f224 100644 --- a/chromium/chrome/browser/ui/webui/settings/people_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/people_handler.cc @@ -21,6 +21,7 @@ #include "chrome/browser/profiles/profile_metrics.h" #include "chrome/browser/profiles/profile_window.h" #include "chrome/browser/signin/chrome_signin_helper.h" +#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" #include "chrome/browser/signin/signin_error_controller_factory.h" #include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/browser/signin/signin_promo.h" @@ -42,6 +43,7 @@ #include "components/browser_sync/profile_sync_service.h" #include "components/prefs/pref_service.h" #include "components/signin/core/browser/profile_management_switches.h" +#include "components/signin/core/browser/profile_oauth2_token_service.h" #include "components/signin/core/browser/signin_error_controller.h" #include "components/signin/core/browser/signin_header_helper.h" #include "components/signin/core/browser/signin_metrics.h" @@ -251,9 +253,8 @@ void PeopleHandler::RegisterMessages() { base::Unretained(this))); #else web_ui()->RegisterMessageCallback( - "SyncSetupStopSyncing", - base::BindRepeating(&PeopleHandler::HandleStopSyncing, - base::Unretained(this))); + "SyncSetupSignout", base::BindRepeating(&PeopleHandler::HandleSignout, + base::Unretained(this))); web_ui()->RegisterMessageCallback( "SyncSetupStartSignIn", base::BindRepeating(&PeopleHandler::HandleStartSignin, @@ -614,10 +615,12 @@ void PeopleHandler::HandleShowSetupUI(const base::ListValue* args) { ProfileSyncService* service = GetSyncService(); - // Just let the page open for now, even when the user's not signed in. + // Just let the page open for now, even when the user's not signed in or sync + // is disabled. // TODO(scottchen): finish the UI for signed-out users // (https://crbug.com/800972). - if (IsUnifiedConsentEnabled(profile_) && IsProfileAuthNeededOrHasErrors()) { + if (IsUnifiedConsentEnabled(profile_) && + (IsProfileAuthNeededOrHasErrors() || !service)) { if (service && !sync_blocker_) sync_blocker_ = service->GetSetupInProgressHandle(); @@ -708,19 +711,30 @@ void PeopleHandler::HandleStartSignin(const base::ListValue* args) { DisplayGaiaLogin(signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS); } -void PeopleHandler::HandleStopSyncing(const base::ListValue* args) { +void PeopleHandler::HandleSignout(const base::ListValue* args) { bool delete_profile = false; args->GetBoolean(0, &delete_profile); - if (!SigninManagerFactory::GetForProfile(profile_)->IsSignoutProhibited()) { - if (GetSyncService()) - ProfileSyncService::SyncEvent(ProfileSyncService::STOP_FROM_OPTIONS); - - signin_metrics::SignoutDelete delete_metric = - delete_profile ? signin_metrics::SignoutDelete::DELETED - : signin_metrics::SignoutDelete::KEEPING; - SigninManagerFactory::GetForProfile(profile_) - ->SignOut(signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS, delete_metric); + SigninManager* signin_manager = SigninManagerFactory::GetForProfile(profile_); + if (signin_manager->IsSignoutProhibited()) { + // If the user cannot signout, the profile must be destroyed. + DCHECK(delete_profile); + } else { + if (signin_manager->IsAuthenticated()) { + if (GetSyncService()) + ProfileSyncService::SyncEvent(ProfileSyncService::STOP_FROM_OPTIONS); + + signin_metrics::SignoutDelete delete_metric = + delete_profile ? signin_metrics::SignoutDelete::DELETED + : signin_metrics::SignoutDelete::KEEPING; + signin_manager->SignOutAndRemoveAllAccounts( + signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS, delete_metric); + } else { + DCHECK(!delete_profile) + << "Deleting the profile should only be offered the user is syncing."; + ProfileOAuth2TokenServiceFactory::GetForProfile(profile_) + ->RevokeAllCredentials(); + } } if (delete_profile) { @@ -877,10 +891,13 @@ PeopleHandler::GetSyncStatusDictionary() { // makes Profile::IsSyncAllowed() false. ProfileSyncService* service = ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile_); + bool disallowed_by_policy = + service && service->HasDisableReason( + syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY); sync_status->SetBoolean("signinAllowed", signin->IsSigninAllowed()); sync_status->SetBoolean("syncSystemEnabled", (service != nullptr)); sync_status->SetBoolean("setupInProgress", - service && !service->IsManaged() && + service && !disallowed_by_policy && service->IsFirstSetupInProgress() && signin->IsAuthenticated()); @@ -896,7 +913,12 @@ PeopleHandler::GetSyncStatusDictionary() { sync_status->SetBoolean("hasError", status_has_error); sync_status->SetString("statusAction", GetSyncErrorAction(action_type)); - sync_status->SetBoolean("managed", service && service->IsManaged()); + sync_status->SetBoolean("managed", disallowed_by_policy); + sync_status->SetBoolean( + "disabled", + !service || disallowed_by_policy || + service->HasDisableReason( + syncer::SyncService::DISABLE_REASON_PLATFORM_OVERRIDE)); sync_status->SetBoolean("signedIn", signin->IsAuthenticated()); sync_status->SetString("signedInUsername", signin_ui_util::GetAuthenticatedUsername(signin)); diff --git a/chromium/chrome/browser/ui/webui/settings/people_handler.h b/chromium/chrome/browser/ui/webui/settings/people_handler.h index b39378b9726..bfedcdc900e 100644 --- a/chromium/chrome/browser/ui/webui/settings/people_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/people_handler.h @@ -174,7 +174,7 @@ class PeopleHandler : public SettingsPageUIHandler, void HandleRequestPinLoginState(const base::ListValue* args); #endif void HandleStartSignin(const base::ListValue* args); - void HandleStopSyncing(const base::ListValue* args); + void HandleSignout(const base::ListValue* args); void HandleGetSyncStatus(const base::ListValue* args); void HandleManageOtherPeople(const base::ListValue* args); 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 8964c907cb6..58a9f2b000a 100644 --- a/chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc +++ b/chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc @@ -106,6 +106,7 @@ std::string GetConfiguration(const base::DictionaryValue* extra_values, result.SetBoolean("tabsSynced", types.Has(syncer::PROXY_TABS)); result.SetBoolean("themesSynced", types.Has(syncer::THEMES)); result.SetBoolean("typedUrlsSynced", types.Has(syncer::TYPED_URLS)); + result.SetBoolean("userEventsSynced", types.Has(syncer::USER_EVENTS)); result.SetBoolean("paymentsIntegrationEnabled", false); std::string args; base::JSONWriter::Write(result, &args); @@ -153,6 +154,7 @@ void CheckConfigDataTypeArguments(const base::DictionaryValue* dictionary, CheckBool(dictionary, "tabsSynced", types.Has(syncer::PROXY_TABS)); CheckBool(dictionary, "themesSynced", types.Has(syncer::THEMES)); CheckBool(dictionary, "typedUrlsSynced", types.Has(syncer::TYPED_URLS)); + CheckBool(dictionary, "userEventsSynced", types.Has(syncer::USER_EVENTS)); } } // namespace @@ -233,7 +235,8 @@ class PeopleHandlerTest : public ChromeRenderViewHostTestHarness { // Setup the expectations for calls made when displaying the config page. void SetDefaultExpectationsForConfigPage() { - EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(true)); + EXPECT_CALL(*mock_pss_, GetDisableReasons()) + .WillRepeatedly(Return(syncer::SyncService::DISABLE_REASON_NONE)); EXPECT_CALL(*mock_pss_, GetRegisteredDataTypes()) .WillRepeatedly(Return(GetAllTypes())); EXPECT_CALL(*mock_pss_, GetPreferredDataTypes()) @@ -333,7 +336,9 @@ TEST_F(PeopleHandlerFirstSigninTest, DisplayBasicLogin) { // Test that the HandleStartSignin call enables JavaScript. handler_->DisallowJavascript(); - EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(false)); + EXPECT_CALL(*mock_pss_, GetDisableReasons()) + .WillRepeatedly( + Return(syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN)); EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); // Ensure that the user is not signed in before calling |HandleStartSignin()|. SigninManager* manager = SigninManager::FromSigninManagerBase(mock_signin_); @@ -356,7 +361,9 @@ TEST_F(PeopleHandlerFirstSigninTest, DisplayBasicLogin) { } TEST_F(PeopleHandlerTest, ShowSyncSetupWhenNotSignedIn) { - EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(false)); + EXPECT_CALL(*mock_pss_, GetDisableReasons()) + .WillRepeatedly( + Return(syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN)); EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); handler_->HandleShowSetupUI(nullptr); @@ -372,7 +379,9 @@ TEST_F(PeopleHandlerTest, ShowSyncSetupWhenNotSignedIn) { // Verifies that the sync setup is terminated correctly when the // sync is disabled. TEST_F(PeopleHandlerTest, HandleSetupUIWhenSyncDisabled) { - EXPECT_CALL(*mock_pss_, IsManaged()).WillRepeatedly(Return(true)); + EXPECT_CALL(*mock_pss_, GetDisableReasons()) + .WillRepeatedly( + Return(syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY)); handler_->HandleShowSetupUI(nullptr); // Sync setup is closed when sync is disabled. @@ -385,7 +394,8 @@ TEST_F(PeopleHandlerTest, HandleSetupUIWhenSyncDisabled) { // Verifies that the handler correctly handles a cancellation when // it is displaying the spinner to the user. TEST_F(PeopleHandlerTest, DisplayConfigureWithEngineDisabledAndCancel) { - EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(true)); + EXPECT_CALL(*mock_pss_, GetDisableReasons()) + .WillRepeatedly(Return(syncer::SyncService::DISABLE_REASON_NONE)); EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); error_ = GoogleServiceAuthError::AuthErrorNone(); EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false)); @@ -409,8 +419,9 @@ TEST_F(PeopleHandlerTest, DisplayConfigureWithEngineDisabledAndCancel) { // to showing a configuration page when sync setup completes successfully. TEST_F(PeopleHandlerTest, DisplayConfigureWithEngineDisabledAndSyncStartupCompleted) { - EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(true)); EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); + EXPECT_CALL(*mock_pss_, GetDisableReasons()) + .WillRepeatedly(Return(syncer::SyncService::DISABLE_REASON_NONE)); error_ = GoogleServiceAuthError::AuthErrorNone(); // Sync engine is stopped initially, and will start up. EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false)); @@ -446,7 +457,8 @@ TEST_F(PeopleHandlerTest, // user has continued on. TEST_F(PeopleHandlerTest, DisplayConfigureWithEngineDisabledAndCancelAfterSigninSuccess) { - EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(true)); + EXPECT_CALL(*mock_pss_, GetDisableReasons()) + .WillRepeatedly(Return(syncer::SyncService::DISABLE_REASON_NONE)); EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); error_ = GoogleServiceAuthError::AuthErrorNone(); EXPECT_CALL(*mock_pss_, IsEngineInitialized()) @@ -469,7 +481,8 @@ TEST_F(PeopleHandlerTest, } TEST_F(PeopleHandlerTest, DisplayConfigureWithEngineDisabledAndSigninFailed) { - EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(true)); + EXPECT_CALL(*mock_pss_, GetDisableReasons()) + .WillRepeatedly(Return(syncer::SyncService::DISABLE_REASON_NONE)); EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); error_ = GoogleServiceAuthError::AuthErrorNone(); EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false)); @@ -526,20 +539,11 @@ class PeopleHandlerNonCrosTest : public PeopleHandlerTest { PeopleHandlerNonCrosTest() {} }; -TEST_F(PeopleHandlerNonCrosTest, HandleGaiaAuthFailure) { - EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(false)); - EXPECT_CALL(*mock_pss_, HasUnrecoverableError()) - .WillRepeatedly(Return(false)); - EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); - // Open the web UI. - handler_->HandleShowSetupUI(nullptr); - - ASSERT_FALSE(handler_->is_configuring_sync()); -} - // TODO(kochi): We need equivalent tests for ChromeOS. TEST_F(PeopleHandlerNonCrosTest, UnrecoverableErrorInitializingSync) { - EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(false)); + EXPECT_CALL(*mock_pss_, GetDisableReasons()) + .WillRepeatedly( + Return(syncer::SyncService::DISABLE_REASON_UNRECOVERABLE_ERROR)); EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); // Open the web UI. handler_->HandleShowSetupUI(nullptr); @@ -548,7 +552,9 @@ TEST_F(PeopleHandlerNonCrosTest, UnrecoverableErrorInitializingSync) { } TEST_F(PeopleHandlerNonCrosTest, GaiaErrorInitializingSync) { - EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(false)); + EXPECT_CALL(*mock_pss_, GetDisableReasons()) + .WillRepeatedly( + Return(syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN)); EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); // Open the web UI. handler_->HandleShowSetupUI(nullptr); @@ -767,7 +773,8 @@ TEST_F(PeopleHandlerTest, ShowSigninOnAuthError) { FakeAuthStatusProvider provider( SigninErrorControllerFactory::GetForProfile(profile())); provider.SetAuthError(kTestUser, error_); - EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(true)); + EXPECT_CALL(*mock_pss_, GetDisableReasons()) + .WillRepeatedly(Return(syncer::SyncService::DISABLE_REASON_NONE)); EXPECT_CALL(*mock_pss_, IsPassphraseRequired()) .WillRepeatedly(Return(false)); EXPECT_CALL(*mock_pss_, IsUsingSecondaryPassphrase()) @@ -819,6 +826,7 @@ TEST_F(PeopleHandlerTest, ShowSetupSyncEverything) { CheckBool(dictionary, "tabsRegistered", true); CheckBool(dictionary, "themesRegistered", true); CheckBool(dictionary, "typedUrlsRegistered", true); + CheckBool(dictionary, "userEventsRegistered", true); CheckBool(dictionary, "paymentsIntegrationEnabled", true); CheckBool(dictionary, "passphraseRequired", false); CheckBool(dictionary, "passphraseTypeIsCustom", false); diff --git a/chromium/chrome/browser/ui/webui/settings/safe_browsing_handler.cc b/chromium/chrome/browser/ui/webui/settings/safe_browsing_handler.cc index d43930fb1e8..56b43446319 100644 --- a/chromium/chrome/browser/ui/webui/settings/safe_browsing_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/safe_browsing_handler.cc @@ -47,9 +47,6 @@ void SafeBrowsingHandler::RegisterMessages() { void SafeBrowsingHandler::OnJavascriptAllowed() { profile_pref_registrar_.Init(prefs_); profile_pref_registrar_.Add( - prefs::kSafeBrowsingExtendedReportingEnabled, - base::Bind(&SafeBrowsingHandler::OnPrefChanged, base::Unretained(this))); - profile_pref_registrar_.Add( prefs::kSafeBrowsingScoutReportingEnabled, base::Bind(&SafeBrowsingHandler::OnPrefChanged, base::Unretained(this))); } @@ -76,8 +73,7 @@ void SafeBrowsingHandler::HandleSetSafeBrowsingExtendedReportingEnabled( } void SafeBrowsingHandler::OnPrefChanged(const std::string& pref_name) { - DCHECK(pref_name == prefs::kSafeBrowsingExtendedReportingEnabled || - pref_name == prefs::kSafeBrowsingScoutReportingEnabled); + DCHECK(pref_name == prefs::kSafeBrowsingScoutReportingEnabled); FireWebUIListener("safe-browsing-extended-reporting-change", GetSberStateDictionaryValue(*prefs_)); 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 878159e995c..be2b79caa67 100644 --- a/chromium/chrome/browser/ui/webui/settings/search_engines_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/search_engines_handler.cc @@ -18,7 +18,6 @@ #include "chrome/browser/profiles/profile.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/signin/signin_manager_factory.h" #include "chrome/browser/ui/search_engines/template_url_table_model.h" #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" @@ -26,7 +25,6 @@ #include "components/prefs/pref_service.h" #include "components/search_engines/template_url.h" #include "components/search_engines/template_url_service.h" -#include "components/signin/core/browser/signin_manager.h" #include "content/public/browser/web_ui.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" @@ -34,8 +32,8 @@ #include "extensions/common/extension.h" namespace { -// The following strings need to match with the IDs of the paper-input elements -// at settings/search_engines_page/add_search_engine_dialog.html. +// The following strings need to match with the IDs of the text input elements +// at settings/search_engines_page/search_engine_dialog.html. const char kSearchEngineField[] = "searchEngine"; const char kKeywordField[] = "keyword"; const char kQueryUrlField[] = "queryUrl"; 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 c1442684021..871a956100d 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 @@ -17,8 +17,6 @@ #include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h" #include "chrome/browser/browsing_data/counters/browsing_data_counter_factory.h" #include "chrome/browser/browsing_data/counters/browsing_data_counter_utils.h" -#include "chrome/browser/engagement/important_sites_usage_counter.h" -#include "chrome/browser/engagement/important_sites_util.h" #include "chrome/browser/history/web_history_service_factory.h" #include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/browser/sync/profile_sync_service_factory.h" @@ -42,7 +40,6 @@ #include "chrome/browser/feature_engagement/incognito_window/incognito_window_tracker_factory.h" #endif -using ImportantReason = ImportantSitesUtil::ImportantReason; using BrowsingDataType = browsing_data::BrowsingDataType; namespace { @@ -67,13 +64,6 @@ const char* kCounterPrefsBasic[] = { browsing_data::prefs::kDeleteCacheBasic, }; -const char kRegisterableDomainField[] = "registerableDomain"; -const char kReasonBitField[] = "reasonBitfield"; -const char kExampleOriginField[] = "exampleOrigin"; -const char kIsCheckedField[] = "isChecked"; -const char kStorageSizeField[] = "storageSize"; -const char kHasNotificationsField[] = "hasNotifications"; - } // namespace namespace settings { @@ -97,11 +87,6 @@ void ClearBrowsingDataHandler::RegisterMessages() { base::Unretained(this))); web_ui()->RegisterMessageCallback( - "getImportantSites", - base::BindRepeating(&ClearBrowsingDataHandler::HandleGetImportantSites, - base::Unretained(this))); - - web_ui()->RegisterMessageCallback( "initializeClearBrowsingData", base::BindRepeating(&ClearBrowsingDataHandler::HandleInitialize, base::Unretained(this))); @@ -144,27 +129,23 @@ void ClearBrowsingDataHandler::OnJavascriptDisallowed() { void ClearBrowsingDataHandler::HandleClearBrowsingDataForTest() { // HandleClearBrowsingData takes in a ListValue as its only parameter. The // ListValue must contain four values: web_ui callback ID, a list of data - // types that the user cleared from the clear browsing data UI, time period of - // the data to be cleared, and important sites to remove. + // types that the user cleared from the clear browsing data UI and time period + // of the data to be cleared. std::unique_ptr<base::ListValue> data_types = std::make_unique<base::ListValue>(); data_types->AppendString("browser.clear_data.browsing_history"); - std::unique_ptr<base::ListValue> important_sites = - std::make_unique<base::ListValue>(); - base::ListValue list_args; list_args.AppendString("webui_callback_id"); list_args.Append(std::move(data_types)); list_args.AppendInteger(1u); - list_args.Append(std::move(important_sites)); HandleClearBrowsingData(&list_args); } void ClearBrowsingDataHandler::HandleClearBrowsingData( const base::ListValue* args) { - CHECK_EQ(4U, args->GetSize()); + CHECK_EQ(3U, args->GetSize()); std::string webui_callback_id; CHECK(args->GetString(0, &webui_callback_id)); @@ -270,11 +251,6 @@ void ClearBrowsingDataHandler::HandleClearBrowsingData( int period_selected; CHECK(args->GetInteger(2, &period_selected)); - const base::ListValue* important_sites = nullptr; - CHECK(args->GetList(3, &important_sites)); - std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder = - ProcessImportantSites(important_sites); - content::BrowsingDataRemover* remover = content::BrowserContext::GetBrowsingDataRemover(profile_); @@ -285,8 +261,11 @@ void ClearBrowsingDataHandler::HandleClearBrowsingData( static_cast<browsing_data::TimePeriod>(period_selected); browsing_data_important_sites_util::Remove( - remove_mask, origin_mask, time_period, std::move(filter_builder), remover, - std::move(callback)); + remove_mask, origin_mask, time_period, + content::BrowsingDataFilterBuilder::Create( + content::BrowsingDataFilterBuilder::BLACKLIST), + remover, std::move(callback)); + #if BUILDFLAG(ENABLE_DESKTOP_IN_PRODUCT_HELP) feature_engagement::IncognitoWindowTrackerFactory::GetInstance() ->GetForProfile(profile_) @@ -294,46 +273,6 @@ void ClearBrowsingDataHandler::HandleClearBrowsingData( #endif } -std::unique_ptr<content::BrowsingDataFilterBuilder> -ClearBrowsingDataHandler::ProcessImportantSites( - const base::ListValue* important_sites) { - std::vector<std::string> excluding_domains; - std::vector<int32_t> excluding_domain_reasons; - std::vector<std::string> ignoring_domains; - std::vector<int32_t> ignoring_domain_reasons; - for (const auto& item : *important_sites) { - const base::DictionaryValue* site = nullptr; - CHECK(item.GetAsDictionary(&site)); - bool is_checked = false; - CHECK(site->GetBoolean(kIsCheckedField, &is_checked)); - std::string domain; - CHECK(site->GetString(kRegisterableDomainField, &domain)); - int domain_reason = -1; - CHECK(site->GetInteger(kReasonBitField, &domain_reason)); - if (is_checked) { // Selected important sites should be deleted. - ignoring_domains.push_back(domain); - ignoring_domain_reasons.push_back(domain_reason); - } else { // Unselected sites should be kept. - excluding_domains.push_back(domain); - excluding_domain_reasons.push_back(domain_reason); - } - } - - if (!excluding_domains.empty() || !ignoring_domains.empty()) { - ImportantSitesUtil::RecordBlacklistedAndIgnoredImportantSites( - profile_->GetOriginalProfile(), excluding_domains, - excluding_domain_reasons, ignoring_domains, ignoring_domain_reasons); - } - - std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder( - content::BrowsingDataFilterBuilder::Create( - content::BrowsingDataFilterBuilder::BLACKLIST)); - for (const std::string& domain : excluding_domains) { - filter_builder->AddRegisterableDomain(domain); - } - return filter_builder; -} - void ClearBrowsingDataHandler::OnClearingTaskFinished( const std::string& webui_callback_id, const base::flat_set<BrowsingDataType>& data_types) { @@ -365,59 +304,6 @@ void ClearBrowsingDataHandler::OnClearingTaskFinished( base::Value(show_notice)); } -void ClearBrowsingDataHandler::HandleGetImportantSites( - const base::ListValue* args) { - AllowJavascript(); - std::string callback_id; - CHECK(args->GetString(0, &callback_id)); - DCHECK(base::FeatureList::IsEnabled(features::kImportantSitesInCbd)); - - Profile* profile = profile_->GetOriginalProfile(); - bool important_sites_dialog_disabled = - ImportantSitesUtil::IsDialogDisabled(profile); - - if (important_sites_dialog_disabled) { - ResolveJavascriptCallback(base::Value(callback_id), base::ListValue()); - return; - } - - std::vector<ImportantSitesUtil::ImportantDomainInfo> important_sites = - ImportantSitesUtil::GetImportantRegisterableDomains( - profile, ImportantSitesUtil::kMaxImportantSites); - content::StoragePartition* partition = - content::BrowserContext::GetDefaultStoragePartition(profile); - storage::QuotaManager* quota_manager = partition->GetQuotaManager(); - content::DOMStorageContext* dom_storage = partition->GetDOMStorageContext(); - - ImportantSitesUsageCounter::GetUsage( - std::move(important_sites), quota_manager, dom_storage, - base::BindOnce(&ClearBrowsingDataHandler::OnFetchImportantSitesFinished, - weak_ptr_factory_.GetWeakPtr(), callback_id)); -} - -void ClearBrowsingDataHandler::OnFetchImportantSitesFinished( - const std::string& callback_id, - std::vector<ImportantSitesUtil::ImportantDomainInfo> important_sites) { - base::ListValue important_sites_list; - - for (const auto& info : important_sites) { - auto entry = std::make_unique<base::DictionaryValue>(); - entry->SetString(kRegisterableDomainField, info.registerable_domain); - // The |reason_bitfield| is only passed to Javascript to be logged - // from |HandleClearBrowsingData|. - entry->SetInteger(kReasonBitField, info.reason_bitfield); - entry->SetString(kExampleOriginField, info.example_origin.spec()); - // Initially all sites are selected for deletion. - entry->SetBoolean(kIsCheckedField, true); - entry->SetString(kStorageSizeField, ui::FormatBytes(info.usage)); - bool has_notifications = - (info.reason_bitfield & (1 << ImportantReason::NOTIFICATIONS)) != 0; - entry->SetBoolean(kHasNotificationsField, has_notifications); - important_sites_list.Append(std::move(entry)); - } - ResolveJavascriptCallback(base::Value(callback_id), important_sites_list); -} - void ClearBrowsingDataHandler::HandleInitialize(const base::ListValue* args) { AllowJavascript(); const base::Value* callback_id; @@ -447,7 +333,8 @@ void ClearBrowsingDataHandler::UpdateSyncState() { base::Value(signin_manager && signin_manager->IsAuthenticated()), base::Value(sync_service_ && sync_service_->IsSyncActive() && sync_service_->GetActiveDataTypes().Has( - syncer::HISTORY_DELETE_DIRECTIVES))); + syncer::HISTORY_DELETE_DIRECTIVES)), + base::Value(ShouldShowCookieException(profile_))); } void ClearBrowsingDataHandler::RefreshHistoryNotice() { diff --git a/chromium/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h b/chromium/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h index f135b0172af..40fcfa0b06f 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h @@ -12,7 +12,6 @@ #include "base/containers/flat_set.h" #include "base/macros.h" #include "base/scoped_observer.h" -#include "chrome/browser/engagement/important_sites_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" #include "components/browser_sync/profile_sync_service.h" @@ -24,7 +23,6 @@ class ListValue; } namespace content { -class BrowsingDataFilterBuilder; class WebUI; } @@ -49,10 +47,6 @@ class ClearBrowsingDataHandler : public SettingsPageUIHandler, // Clears browsing data, called by Javascript. void HandleClearBrowsingData(const base::ListValue* value); - // Parses a ListValue with important site information and creates a - // BrowsingDataFilterBuilder. - std::unique_ptr<content::BrowsingDataFilterBuilder> ProcessImportantSites( - const base::ListValue* important_sites); // Called when a clearing task finished. |webui_callback_id| is provided // by the WebUI action that initiated it. @@ -60,13 +54,6 @@ class ClearBrowsingDataHandler : public SettingsPageUIHandler, const std::string& webui_callback_id, const base::flat_set<browsing_data::BrowsingDataType>& data_types); - // Get important sites, called by Javascript. - void HandleGetImportantSites(const base::ListValue* value); - - void OnFetchImportantSitesFinished( - const std::string& callback_id, - std::vector<ImportantSitesUtil::ImportantDomainInfo> sites); - // Initializes the dialog UI. Called by JavaScript when the DOM is ready. void HandleInitialize(const base::ListValue* args); diff --git a/chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.cc b/chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.cc index 2017d6c1fee..9150748cdba 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.cc @@ -52,11 +52,6 @@ int GetCategoryLabelID(CookieTreeNode::DetailedInfo::NodeType node_type) { } kCategoryLabels[] = { // Multiple keys (node_type) may have the same value (id). - {CookieTreeNode::DetailedInfo::TYPE_COOKIES, - IDS_SETTINGS_COOKIES_SINGLE_COOKIE}, - {CookieTreeNode::DetailedInfo::TYPE_COOKIE, - IDS_SETTINGS_COOKIES_SINGLE_COOKIE}, - {CookieTreeNode::DetailedInfo::TYPE_DATABASES, IDS_SETTINGS_COOKIES_DATABASE_STORAGE}, {CookieTreeNode::DetailedInfo::TYPE_DATABASE, @@ -179,6 +174,10 @@ void CookiesViewHandler::RegisterMessages() { base::BindRepeating(&CookiesViewHandler::HandleGetCookieDetails, base::Unretained(this))); web_ui()->RegisterMessageCallback( + "localData.getNumCookiesString", + base::BindRepeating(&CookiesViewHandler::HandleGetNumCookiesString, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( "localData.removeCookie", base::BindRepeating(&CookiesViewHandler::HandleRemove, base::Unretained(this))); @@ -268,8 +267,8 @@ void CookiesViewHandler::EnsureCookiesTreeModelCreated() { storage_partition->GetCacheStorageContext(); storage::FileSystemContext* file_system_context = storage_partition->GetFileSystemContext(); - LocalDataContainer* container = new LocalDataContainer( - new BrowsingDataCookieHelper(profile->GetRequestContext()), + auto container = std::make_unique<LocalDataContainer>( + new BrowsingDataCookieHelper(storage_partition), new BrowsingDataDatabaseHelper(profile), new BrowsingDataLocalStorageHelper(profile), /*session_storage_helper=*/nullptr, @@ -284,9 +283,8 @@ void CookiesViewHandler::EnsureCookiesTreeModelCreated() { new BrowsingDataCacheStorageHelper(cache_storage_context), BrowsingDataFlashLSOHelper::Create(profile), BrowsingDataMediaLicenseHelper::Create(file_system_context)); - cookies_tree_model_.reset( - new CookiesTreeModel(container, - profile->GetExtensionSpecialStoragePolicy())); + cookies_tree_model_ = std::make_unique<CookiesTreeModel>( + std::move(container), profile->GetExtensionSpecialStoragePolicy()); cookies_tree_model_->AddCookiesTreeObserver(this); } } @@ -311,6 +309,61 @@ void CookiesViewHandler::HandleGetCookieDetails(const base::ListValue* args) { SendCookieDetails(node); } +void CookiesViewHandler::HandleGetNumCookiesString( + const base::ListValue* args) { + CHECK_EQ(2U, args->GetSize()); + std::string callback_id; + CHECK(args->GetString(0, &callback_id)); + base::string16 etld_plus1; + CHECK(args->GetString(1, &etld_plus1)); + + AllowJavascript(); + CHECK(cookies_tree_model_.get()); + // This method is only interested in the number of cookies, so don't save the + // filter and keep the existing |sorted_sites_| list. + if (etld_plus1 != filter_) + cookies_tree_model_->UpdateSearchResults(etld_plus1); + + int num_cookies = 0; + const CookieTreeNode* root = cookies_tree_model_->GetRoot(); + for (int i = 0; i < root->child_count(); ++i) { + const CookieTreeNode* site = root->GetChild(i); + const base::string16& title = site->GetTitle(); + if (!base::EndsWith(title, etld_plus1, + base::CompareCase::INSENSITIVE_ASCII)) { + continue; + } + + for (int j = 0; j < site->child_count(); ++j) { + const CookieTreeNode* category = site->GetChild(j); + if (category->GetDetailedInfo().node_type != + CookieTreeNode::DetailedInfo::TYPE_COOKIES) { + continue; + } + + for (int k = 0; k < category->child_count(); ++k) { + if (category->GetChild(k)->GetDetailedInfo().node_type != + CookieTreeNode::DetailedInfo::TYPE_COOKIE) { + continue; + } + + ++num_cookies; + } + } + } + + if (etld_plus1 != filter_) { + // Restore the original |filter_|. + cookies_tree_model_->UpdateSearchResults(filter_); + } + const base::string16 string = + num_cookies > 0 ? l10n_util::GetPluralStringFUTF16( + IDS_SETTINGS_SITE_SETTINGS_NUM_COOKIES, num_cookies) + : base::string16(); + + ResolveJavascriptCallback(base::Value(callback_id), base::Value(string)); +} + void CookiesViewHandler::HandleGetDisplayList(const base::ListValue* args) { CHECK(request_.callback_id_.empty()); CHECK_EQ(2U, args->GetSize()); @@ -418,32 +471,35 @@ void CookiesViewHandler::SendLocalDataList(const CookieTreeNode* parent) { std::unique_ptr<base::ListValue> site_list(new base::ListValue); for (int i = 0; i < list_item_count; ++i) { const CookieTreeNode* site = parent->GetChild(sorted_sites_[i].second); - std::string description; + base::string16 description; for (int k = 0; k < site->child_count(); ++k) { - const CookieTreeNode* category = site->GetChild(k); - const auto node_type = category->GetDetailedInfo().node_type; - if (node_type == CookieTreeNode::DetailedInfo::TYPE_QUOTA) { - // TODO(crbug.com/642955): Omit quota values until bug is addressed. - continue; - } - int ids_value = GetCategoryLabelID(node_type); - if (!ids_value) { - // If we don't have a label to call it by, don't show it. Please add - // a label ID if an expected category is not appearing in the UI. - continue; - } if (description.size()) { - description += ", "; + description += base::ASCIIToUTF16(", "); } + const CookieTreeNode* category = site->GetChild(k); + const auto node_type = category->GetDetailedInfo().node_type; int item_count = category->child_count(); - if (category->GetDetailedInfo().node_type == - CookieTreeNode::DetailedInfo::TYPE_COOKIES && - item_count > 1) { - description += - l10n_util::GetStringFUTF8(IDS_SETTINGS_COOKIES_PLURAL_COOKIES, - base::FormatNumber(item_count)); - } else { - description += l10n_util::GetStringUTF8(ids_value); + switch (node_type) { + case CookieTreeNode::DetailedInfo::TYPE_QUOTA: + // TODO(crbug.com/642955): Omit quota values until bug is addressed. + continue; + case CookieTreeNode::DetailedInfo::TYPE_COOKIE: + DCHECK_EQ(0, item_count); + item_count = 1; + FALLTHROUGH; + case CookieTreeNode::DetailedInfo::TYPE_COOKIES: + description += l10n_util::GetPluralStringFUTF16( + IDS_SETTINGS_SITE_SETTINGS_NUM_COOKIES, item_count); + break; + default: + int ids_value = GetCategoryLabelID(node_type); + if (!ids_value) { + // If we don't have a label to call it by, don't show it. Please add + // a label ID if an expected category is not appearing in the UI. + continue; + } + description += l10n_util::GetStringUTF16(ids_value); + break; } } std::unique_ptr<base::DictionaryValue> list_info(new base::DictionaryValue); diff --git a/chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.h b/chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.h index 6cc8458645a..0b742577c16 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/settings_cookies_view_handler.h @@ -61,6 +61,9 @@ class CookiesViewHandler : public SettingsPageUIHandler, // Retrieve cookie details for a specific site. void HandleGetCookieDetails(const base::ListValue* args); + // Gets the number of cookies formatted in a plural string, given a site. + void HandleGetNumCookiesString(const base::ListValue* args); + // Remove all sites data. void HandleRemoveAll(const base::ListValue* args); diff --git a/chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc b/chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc index 5a68d2419c3..721518a1f17 100644 --- a/chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc @@ -24,7 +24,6 @@ #include "chrome/browser/profiles/profile_shortcut_manager.h" #include "chrome/browser/profiles/profile_window.h" #include "chrome/browser/profiles/profiles_state.h" -#include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" @@ -32,7 +31,6 @@ #include "components/prefs/pref_service.h" #include "components/prefs/scoped_user_pref_update.h" #include "components/signin/core/browser/profile_management_switches.h" -#include "components/signin/core/browser/signin_manager.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/web_ui.h" 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 10862aa2adc..fa89523712c 100644 --- a/chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc @@ -5,7 +5,9 @@ #include "chrome/browser/ui/webui/settings/site_settings_handler.h" #include <algorithm> +#include <map> #include <memory> +#include <set> #include <string> #include <utility> @@ -22,6 +24,7 @@ #include "chrome/browser/infobars/infobar_service.h" #include "chrome/browser/permissions/chooser_context_base.h" #include "chrome/browser/permissions/permission_decision_auto_blocker.h" +#include "chrome/browser/permissions/permission_manager.h" #include "chrome/browser/permissions/permission_uma_util.h" #include "chrome/browser/permissions/permission_util.h" #include "chrome/browser/profiles/profile.h" @@ -61,6 +64,8 @@ namespace settings { namespace { +constexpr char kEffectiveTopLevelDomainPlus1Name[] = "etldPlus1"; +constexpr char kOriginList[] = "origins"; constexpr char kZoom[] = "zoom"; // Return an appropriate API Permission ID for the given string name. @@ -112,6 +117,38 @@ void AddExceptionsGrantedByHostedApps(content::BrowserContext* context, } } +// Whether |pattern| applies to a single origin. +bool PatternAppliesToSingleOrigin(const ContentSettingPatternSource& pattern) { + const GURL url(pattern.primary_pattern.ToString()); + // Default settings and other patterns apply to multiple origins. + if (url::Origin::Create(url).unique()) + return false; + // Embedded content settings only when |url| is embedded in another origin, so + // ignore non-wildcard secondary patterns that are different to the primary. + if (pattern.primary_pattern != pattern.secondary_pattern && + pattern.secondary_pattern != ContentSettingsPattern::Wildcard()) { + return false; + } + return true; +} + +// Groups |url| into sets of eTLD+1s in |site_group_map|, assuming |url| is an +// origin. +void CreateOrAppendSiteGroupEntry( + std::map<std::string, std::set<std::string>>* site_group_map, + const GURL& url) { + std::string etld_plus1_string = + net::registry_controlled_domains::GetDomainAndRegistry( + url, net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); + auto entry = site_group_map->find(etld_plus1_string); + if (entry == site_group_map->end()) { + site_group_map->emplace(etld_plus1_string, + std::set<std::string>({url.spec()})); + } else { + entry->second.insert(url.spec()); + } +} + } // namespace @@ -149,6 +186,10 @@ void SiteSettingsHandler::RegisterMessages() { &SiteSettingsHandler::HandleGetDefaultValueForContentType, base::Unretained(this))); web_ui()->RegisterMessageCallback( + "getAllSites", + base::BindRepeating(&SiteSettingsHandler::HandleGetAllSites, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( "getExceptionList", base::BindRepeating(&SiteSettingsHandler::HandleGetExceptionList, base::Unretained(this))); @@ -280,7 +321,7 @@ void SiteSettingsHandler::OnContentSettingChanged( const ContentSettingsPattern& primary_pattern, const ContentSettingsPattern& secondary_pattern, ContentSettingsType content_type, - std::string resource_identifier) { + const std::string& resource_identifier) { if (!site_settings::HasRegisteredGroupName(content_type)) return; @@ -486,6 +527,92 @@ void SiteSettingsHandler::HandleGetDefaultValueForContentType( ResolveJavascriptCallback(*callback_id, category); } +void SiteSettingsHandler::HandleGetAllSites(const base::ListValue* args) { + AllowJavascript(); + + CHECK_EQ(2U, args->GetSize()); + const base::Value* callback_id; + CHECK(args->Get(0, &callback_id)); + const base::ListValue* types; + CHECK(args->GetList(1, &types)); + + // Convert |types| to a list of ContentSettingsTypes. + std::vector<ContentSettingsType> content_types; + for (size_t i = 0; i < types->GetSize(); ++i) { + std::string type; + types->GetString(i, &type); + content_types.push_back( + site_settings::ContentSettingsTypeFromGroupName(type)); + } + + // Incognito contains incognito content settings plus non-incognito content + // settings. Thus if it exists, just get exceptions for the incognito profile. + Profile* profile = profile_; + if (profile_->HasOffTheRecordProfile() && + profile_->GetOffTheRecordProfile() != profile_) { + profile = profile_->GetOffTheRecordProfile(); + } + DCHECK(profile); + HostContentSettingsMap* map = + HostContentSettingsMapFactory::GetForProfile(profile); + std::map<std::string, std::set<std::string>> all_sites_map; + + // TODO(https://crbug.com/835712): Assess performance of this method for + // unusually large numbers of stored content settings. + + // Retrieve a list of embargoed settings to check separately. This ensures + // that only settings included in |content_types| will be listed in all sites. + ContentSettingsForOneType embargo_settings; + map->GetSettingsForOneType(CONTENT_SETTINGS_TYPE_PERMISSION_AUTOBLOCKER_DATA, + std::string(), &embargo_settings); + PermissionManager* permission_manager = PermissionManager::Get(profile); + for (const ContentSettingPatternSource& e : embargo_settings) { + for (ContentSettingsType content_type : content_types) { + if (PermissionUtil::IsPermission(content_type)) { + const GURL url(e.primary_pattern.ToString()); + // Add |url| to the set if there are any embargo settings. + PermissionResult result = + permission_manager->GetPermissionStatus(content_type, url, url); + if (result.source == PermissionStatusSource::MULTIPLE_DISMISSALS || + result.source == PermissionStatusSource::MULTIPLE_IGNORES) { + CreateOrAppendSiteGroupEntry(&all_sites_map, url); + break; + } + } + } + } + + // Convert |types| to a list of ContentSettingsTypes. + for (ContentSettingsType content_type : content_types) { + // TODO(https://crbug.com/835712): Add extension content settings, plus + // sites that use any non-zero amount of storage. + + ContentSettingsForOneType entries; + map->GetSettingsForOneType(content_type, std::string(), &entries); + for (const ContentSettingPatternSource& e : entries) { + if (PatternAppliesToSingleOrigin(e)) + CreateOrAppendSiteGroupEntry(&all_sites_map, + GURL(e.primary_pattern.ToString())); + } + } + + // Convert |all_sites_map| to a list of base::DictionaryValues. + base::Value result(base::Value::Type::LIST); + for (const auto& entry : all_sites_map) { + // eTLD+1 is the effective top level domain + 1. + base::Value site_group(base::Value::Type::DICTIONARY); + site_group.SetKey(kEffectiveTopLevelDomainPlus1Name, + base::Value(entry.first)); + base::Value origin_list(base::Value::Type::LIST); + for (const std::string& origin : entry.second) { + origin_list.GetList().emplace_back(origin); + } + site_group.SetKey(kOriginList, std::move(origin_list)); + result.GetList().push_back(std::move(site_group)); + } + ResolveJavascriptCallback(*callback_id, result); +} + void SiteSettingsHandler::HandleGetExceptionList(const base::ListValue* args) { AllowJavascript(); 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 9c78d451b85..3f5b4a470ad 100644 --- a/chromium/chrome/browser/ui/webui/settings/site_settings_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/site_settings_handler.h @@ -60,7 +60,7 @@ class SiteSettingsHandler : public SettingsPageUIHandler, void OnContentSettingChanged(const ContentSettingsPattern& primary_pattern, const ContentSettingsPattern& secondary_pattern, ContentSettingsType content_type, - std::string resource_identifier) override; + const std::string& resource_identifier) override; // content::NotificationObserver: void Observe(int type, @@ -84,6 +84,7 @@ class SiteSettingsHandler : public SettingsPageUIHandler, FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, GetAndSetOriginPermissions); FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, GetAndSetForInvalidURLs); FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, Incognito); + FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, GetAllSites); FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, Origins); FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, Patterns); FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, ZoomLevels); @@ -108,6 +109,10 @@ class SiteSettingsHandler : public SettingsPageUIHandler, void HandleSetDefaultValueForContentType(const base::ListValue* args); void HandleGetDefaultValueForContentType(const base::ListValue* args); + // Returns a list of sites, grouped by their effective top level domain plus + // 1, affected by any of the content settings specified in |args|. + void HandleGetAllSites(const base::ListValue* args); + // Returns the list of site exceptions for a given content settings type. void HandleGetExceptionList(const base::ListValue* args); 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 6efafe49981..2b1e3700934 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 @@ -7,12 +7,14 @@ #include <memory> #include <string> -#include "base/test/histogram_tester.h" +#include "base/test/metrics/histogram_tester.h" +#include "base/test/simple_test_clock.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/test_extension_system.h" #include "chrome/browser/infobars/infobar_service.h" +#include "chrome/browser/permissions/permission_decision_auto_blocker.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/webui/site_settings_helper.h" @@ -64,10 +66,11 @@ class FlashContentSettingsChangeWaiter : public content_settings::Observer { } // content_settings::Observer: - void OnContentSettingChanged(const ContentSettingsPattern& primary_pattern, - const ContentSettingsPattern& secondary_pattern, - ContentSettingsType content_type, - std::string resource_identifier) override { + void OnContentSettingChanged( + const ContentSettingsPattern& primary_pattern, + const ContentSettingsPattern& secondary_pattern, + ContentSettingsType content_type, + const std::string& resource_identifier) override { if (content_type == CONTENT_SETTINGS_TYPE_PLUGINS) Proceed(); } @@ -355,6 +358,169 @@ TEST_F(SiteSettingsHandlerTest, GetAndSetDefault) { site_settings::SiteSettingSource::kDefault, 3U); } +TEST_F(SiteSettingsHandlerTest, GetAllSites) { + base::ListValue get_all_sites_args; + get_all_sites_args.AppendString(kCallbackId); + base::Value category_list(base::Value::Type::LIST); + category_list.GetList().emplace_back(kNotifications); + category_list.GetList().emplace_back(kFlash); + get_all_sites_args.GetList().push_back(std::move(category_list)); + + // Test all sites is empty when there are no preferences. + handler()->HandleGetAllSites(&get_all_sites_args); + EXPECT_EQ(1U, web_ui()->call_data().size()); + + { + 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()); + + const base::Value::ListStorage& site_groups = data.arg3()->GetList(); + EXPECT_EQ(0UL, site_groups.size()); + } + + // Add a couple of exceptions and check they appear in all sites. + HostContentSettingsMap* map = + HostContentSettingsMapFactory::GetForProfile(profile()); + const GURL url1("http://example.com"); + const GURL url2("https://other.example.com"); + map->SetContentSettingDefaultScope(url1, url1, + CONTENT_SETTINGS_TYPE_NOTIFICATIONS, + std::string(), CONTENT_SETTING_BLOCK); + map->SetContentSettingDefaultScope(url2, url2, CONTENT_SETTINGS_TYPE_PLUGINS, + std::string(), CONTENT_SETTING_ALLOW); + handler()->HandleGetAllSites(&get_all_sites_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()); + + const base::Value::ListStorage& site_groups = data.arg3()->GetList(); + EXPECT_EQ(1UL, site_groups.size()); + for (const base::Value& site_group : site_groups) { + const std::string& etld_plus1_string = + site_group.FindKey("etldPlus1")->GetString(); + const base::Value::ListStorage& origin_list = + site_group.FindKey("origins")->GetList(); + EXPECT_EQ("example.com", etld_plus1_string); + EXPECT_EQ(2UL, origin_list.size()); + EXPECT_EQ(url1.spec(), origin_list[0].GetString()); + EXPECT_EQ(url2.spec(), origin_list[1].GetString()); + } + } + + // Add an additional exception belonging to a different eTLD+1. + const GURL url3("https://example2.net"); + map->SetContentSettingDefaultScope(url3, url3, CONTENT_SETTINGS_TYPE_PLUGINS, + std::string(), CONTENT_SETTING_BLOCK); + handler()->HandleGetAllSites(&get_all_sites_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()); + + const base::Value::ListStorage& site_groups = data.arg3()->GetList(); + EXPECT_EQ(2UL, site_groups.size()); + for (const base::Value& site_group : site_groups) { + const std::string& etld_plus1_string = + site_group.FindKey("etldPlus1")->GetString(); + const base::Value::ListStorage& origin_list = + site_group.FindKey("origins")->GetList(); + if (etld_plus1_string == "example2.net") { + EXPECT_EQ(1UL, origin_list.size()); + EXPECT_EQ(url3.spec(), origin_list[0].GetString()); + } else { + EXPECT_EQ("example.com", etld_plus1_string); + } + } + } + + // Test embargoed settings also appear. + PermissionDecisionAutoBlocker* auto_blocker = + PermissionDecisionAutoBlocker::GetForProfile(profile()); + const GURL url4("https://example2.co.uk"); + for (int i = 0; i < 3; ++i) { + auto_blocker->RecordDismissAndEmbargo(url4, + CONTENT_SETTINGS_TYPE_NOTIFICATIONS); + } + EXPECT_EQ( + CONTENT_SETTING_BLOCK, + auto_blocker->GetEmbargoResult(url4, CONTENT_SETTINGS_TYPE_NOTIFICATIONS) + .content_setting); + handler()->HandleGetAllSites(&get_all_sites_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()); + + const base::Value::ListStorage& site_groups = data.arg3()->GetList(); + EXPECT_EQ(3UL, site_groups.size()); + } + + // Add an expired embargo setting to a) an existing eTLD+1 group and b) a new + // eTLD+1 group. + base::SimpleTestClock clock; + clock.SetNow(base::Time::Now()); + auto_blocker->SetClockForTesting(&clock); + for (int i = 0; i < 3; ++i) { + auto_blocker->RecordDismissAndEmbargo(url3, + CONTENT_SETTINGS_TYPE_NOTIFICATIONS); + } + EXPECT_EQ( + CONTENT_SETTING_BLOCK, + auto_blocker->GetEmbargoResult(url3, CONTENT_SETTINGS_TYPE_NOTIFICATIONS) + .content_setting); + clock.Advance(base::TimeDelta::FromDays(8)); + EXPECT_EQ( + CONTENT_SETTING_ASK, + auto_blocker->GetEmbargoResult(url3, CONTENT_SETTINGS_TYPE_NOTIFICATIONS) + .content_setting); + + { + 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()); + + const base::Value::ListStorage& site_groups = data.arg3()->GetList(); + EXPECT_EQ(3UL, site_groups.size()); + } + + clock.SetNow(base::Time::Now()); + const GURL url5("http://test.example5.com"); + for (int i = 0; i < 3; ++i) { + auto_blocker->RecordDismissAndEmbargo(url5, + CONTENT_SETTINGS_TYPE_NOTIFICATIONS); + } + EXPECT_EQ( + CONTENT_SETTING_BLOCK, + auto_blocker->GetEmbargoResult(url5, CONTENT_SETTINGS_TYPE_NOTIFICATIONS) + .content_setting); + clock.Advance(base::TimeDelta::FromDays(8)); + EXPECT_EQ( + CONTENT_SETTING_ASK, + auto_blocker->GetEmbargoResult(url5, CONTENT_SETTINGS_TYPE_NOTIFICATIONS) + .content_setting); + + { + 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()); + + const base::Value::ListStorage& site_groups = data.arg3()->GetList(); + EXPECT_EQ(3UL, site_groups.size()); + } +} + TEST_F(SiteSettingsHandlerTest, Origins) { const std::string google("https://www.google.com:443"); const std::string uma_base("WebsiteSettings.Menu.PermissionChanged"); diff --git a/chromium/chrome/browser/ui/webui/settings/tts_handler.cc b/chromium/chrome/browser/ui/webui/settings/tts_handler.cc index 44cfc2fa7f9..0984278d7eb 100644 --- a/chromium/chrome/browser/ui/webui/settings/tts_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/tts_handler.cc @@ -14,6 +14,7 @@ #include "chrome/browser/speech/tts_controller.h" #include "chrome/browser/speech/tts_controller_impl.h" #include "chrome/common/extensions/extension_constants.h" +#include "chrome/grit/generated_resources.h" #include "content/public/browser/web_ui.h" #include "extensions/browser/event_router.h" #include "extensions/browser/extension_registry.h" @@ -29,6 +30,9 @@ void TtsHandler::HandleGetAllTtsVoiceData(const base::ListValue* args) { } void TtsHandler::HandleGetTtsExtensions(const base::ListValue* args) { + // Ensure the built in tts engine is loaded to be able to respond to messages. + TtsExtensionEngine::GetInstance()->LoadBuiltInTtsExtension( + Profile::FromWebUI(web_ui())); base::ListValue responses; Profile* profile = Profile::FromWebUI(web_ui()); extensions::ExtensionRegistry* registry = @@ -48,19 +52,18 @@ void TtsHandler::HandleGetTtsExtensions(const base::ListValue* args) { continue; } base::DictionaryValue response; - response.SetPath({"name"}, base::Value(extension->name())); - response.SetPath({"extensionId"}, base::Value(extension_id)); + response.SetString("name", extension->name()); + response.SetString("extensionId", extension_id); if (extensions::OptionsPageInfo::HasOptionsPage(extension)) { - response.SetPath( - {"optionsPage"}, - base::Value( - extensions::OptionsPageInfo::GetOptionsPage(extension).spec())); + response.SetString( + "optionsPage", + + extensions::OptionsPageInfo::GetOptionsPage(extension).spec()); } responses.GetList().push_back(std::move(response)); } - CallJavascriptFunction("cr.webUIListenerCallback", - base::Value("tts-extensions-updated"), responses); + FireWebUIListener("tts-extensions-updated", responses); } void TtsHandler::OnVoicesChanged() { @@ -72,21 +75,28 @@ void TtsHandler::OnVoicesChanged() { for (const auto& voice : voices) { base::DictionaryValue response; int language_score = GetVoiceLangMatchScore(&voice, app_locale); - std::string language_code = l10n_util::GetLanguage(voice.lang); - response.SetPath({"name"}, base::Value(voice.name)); - response.SetPath({"languageCode"}, base::Value(language_code)); - response.SetPath({"fullLanguageCode"}, base::Value(voice.lang)); - response.SetPath({"languageScore"}, base::Value(language_score)); - response.SetPath({"extensionId"}, base::Value(voice.extension_id)); - response.SetPath( - {"displayLanguage"}, - base::Value(l10n_util::GetDisplayNameForLocale( - language_code, g_browser_process->GetApplicationLocale(), true))); + std::string language_code; + if (voice.lang.empty()) { + language_code = "noLanguageCode"; + response.SetString( + "displayLanguage", + l10n_util::GetStringUTF8(IDS_TEXT_TO_SPEECH_SETTINGS_NO_LANGUAGE)); + } else { + language_code = l10n_util::GetLanguage(voice.lang); + response.SetString( + "displayLanguage", + l10n_util::GetDisplayNameForLocale( + language_code, g_browser_process->GetApplicationLocale(), true)); + } + response.SetString("name", voice.name); + response.SetString("languageCode", language_code); + response.SetString("fullLanguageCode", voice.lang); + response.SetInteger("languageScore", language_score); + response.SetString("extensionId", voice.extension_id); responses.GetList().push_back(std::move(response)); } AllowJavascript(); - CallJavascriptFunction("cr.webUIListenerCallback", - base::Value("all-voice-data-updated"), responses); + FireWebUIListener("all-voice-data-updated", responses); // Also refresh the TTS extensions in case they have changed. HandleGetTtsExtensions(nullptr); |