diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-05-03 13:42:47 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-05-15 10:27:51 +0000 |
commit | 8c5c43c7b138c9b4b0bf56d946e61d3bbc111bec (patch) | |
tree | d29d987c4d7b173cf853279b79a51598f104b403 /chromium/chrome/browser/ui/webui/settings | |
parent | 830c9e163d31a9180fadca926b3e1d7dfffb5021 (diff) |
BASELINE: Update Chromium to 66.0.3359.156
Change-Id: I0c9831ad39911a086b6377b16f995ad75a51e441
Reviewed-by: Michal Klocek <michal.klocek@qt.io>
Diffstat (limited to 'chromium/chrome/browser/ui/webui/settings')
31 files changed, 825 insertions, 436 deletions
diff --git a/chromium/chrome/browser/ui/webui/settings/about_handler.cc b/chromium/chrome/browser/ui/webui/settings/about_handler.cc index 11da4972a25..0e22bfc93e3 100644 --- a/chromium/chrome/browser/ui/webui/settings/about_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/about_handler.cc @@ -602,7 +602,8 @@ void AboutHandler::HandleRefreshTPMFirmwareUpdateStatus( const base::ListValue* args) { chromeos::tpm_firmware_update::ShouldOfferUpdateViaPowerwash( base::Bind(&AboutHandler::RefreshTPMFirmwareUpdateStatus, - weak_factory_.GetWeakPtr())); + weak_factory_.GetWeakPtr()), + base::TimeDelta()); } void AboutHandler::RefreshTPMFirmwareUpdateStatus(bool update_available) { diff --git a/chromium/chrome/browser/ui/webui/settings/appearance_handler.cc b/chromium/chrome/browser/ui/webui/settings/appearance_handler.cc index 128c7f1efd1..3e9bb1a4d96 100644 --- a/chromium/chrome/browser/ui/webui/settings/appearance_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/appearance_handler.cc @@ -13,17 +13,13 @@ #include "content/public/browser/web_ui.h" #if defined(OS_CHROMEOS) -#include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h" #include "chrome/browser/ui/ash/wallpaper_controller_client.h" -#include "chromeos/login/login_state.h" -#include "components/user_manager/user_manager.h" #endif namespace settings { AppearanceHandler::AppearanceHandler(content::WebUI* webui) - : profile_(Profile::FromWebUI(webui)) { -} + : profile_(Profile::FromWebUI(webui)), weak_ptr_factory_(this) {} AppearanceHandler::~AppearanceHandler() {} @@ -75,49 +71,28 @@ void AppearanceHandler::HandleUseSystemTheme(const base::ListValue* args) { #if defined(OS_CHROMEOS) void AppearanceHandler::IsWallpaperSettingVisible(const base::ListValue* args) { CHECK_EQ(args->GetSize(), 1U); - const base::Value* callback_id; - CHECK(args->Get(0, &callback_id)); - AllowJavascript(); - - bool is_wallpaper_visible = false; - const chromeos::LoginState* login_state = chromeos::LoginState::Get(); - const chromeos::LoginState::LoggedInUserType user_type = - login_state->GetLoggedInUserType(); - const user_manager::User* user = - user_manager::UserManager::Get()->GetActiveUser(); - - // Only login, whitelist types and active users are allowed to change - // their wallpaper. Then show the wallpaper setting row for them. - if (login_state->IsUserLoggedIn() && user && - (user_type == chromeos::LoginState::LOGGED_IN_USER_REGULAR || - user_type == chromeos::LoginState::LOGGED_IN_USER_OWNER || - user_type == chromeos::LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT || - user_type == chromeos::LoginState::LOGGED_IN_USER_SUPERVISED)) { - is_wallpaper_visible = true; - } - - ResolveJavascriptCallback(*callback_id, base::Value(is_wallpaper_visible)); + WallpaperControllerClient::Get()->ShouldShowWallpaperSetting( + base::Bind(&AppearanceHandler::ResolveCallback, + weak_ptr_factory_.GetWeakPtr(), args->GetList()[0].Clone())); } void AppearanceHandler::IsWallpaperPolicyControlled( const base::ListValue* args) { CHECK_EQ(args->GetSize(), 1U); - const base::Value* callback_id; - CHECK(args->Get(0, &callback_id)); - AllowJavascript(); - - ResolveJavascriptCallback( - *callback_id, - base::Value(chromeos::WallpaperManager::Get()->IsPolicyControlled( - user_manager::UserManager::Get()->GetActiveUser()->GetAccountId()))); + WallpaperControllerClient::Get()->IsActiveUserWallpaperControlledByPolicy( + base::Bind(&AppearanceHandler::ResolveCallback, + weak_ptr_factory_.GetWeakPtr(), args->GetList()[0].Clone())); } void AppearanceHandler::HandleOpenWallpaperManager( - const base::ListValue* /*args*/) { - if (!chromeos::WallpaperManager::Get()->IsPolicyControlled( - user_manager::UserManager::Get()->GetActiveUser()->GetAccountId())) { - WallpaperControllerClient::Get()->OpenWallpaperPicker(); - } + const base::ListValue* args) { + WallpaperControllerClient::Get()->OpenWallpaperPickerIfAllowed(); +} + +void AppearanceHandler::ResolveCallback(const base::Value& callback_id, + bool result) { + AllowJavascript(); + ResolveJavascriptCallback(callback_id, base::Value(result)); } #endif diff --git a/chromium/chrome/browser/ui/webui/settings/appearance_handler.h b/chromium/chrome/browser/ui/webui/settings/appearance_handler.h index d31af5aa186..3acb6d567f4 100644 --- a/chromium/chrome/browser/ui/webui/settings/appearance_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/appearance_handler.h @@ -6,6 +6,7 @@ #define CHROME_BROWSER_UI_WEBUI_SETTINGS_APPEARANCE_HANDLER_H_ #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" namespace base { @@ -41,7 +42,7 @@ class AppearanceHandler : public SettingsPageUIHandler { #endif #if defined(OS_CHROMEOS) - // Whether should show the wallpaper setting row. + // Whether the wallpaper setting should be shown. void IsWallpaperSettingVisible(const base::ListValue* args); // Whether the wallpaper is policy controlled. @@ -49,10 +50,15 @@ class AppearanceHandler : public SettingsPageUIHandler { // Open the wallpaper manager app. void HandleOpenWallpaperManager(const base::ListValue* args); + + // Helper function to resolve the Javascript callback. + void ResolveCallback(const base::Value& callback_id, bool result); #endif Profile* profile_; // Weak pointer. + base::WeakPtrFactory<AppearanceHandler> weak_ptr_factory_; + DISALLOW_COPY_AND_ASSIGN(AppearanceHandler); }; diff --git a/chromium/chrome/browser/ui/webui/settings/browser_lifetime_handler.cc b/chromium/chrome/browser/ui/webui/settings/browser_lifetime_handler.cc index d8fce5d42bb..551123b58ae 100644 --- a/chromium/chrome/browser/ui/webui/settings/browser_lifetime_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/browser_lifetime_handler.cc @@ -75,7 +75,7 @@ void BrowserLifetimeHandler::HandleFactoryReset( true); prefs->CommitPendingWrite(); chrome::AttemptRelaunch(); - })); + }), base::TimeDelta()); return; } 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 1590e25bf22..a077bd75bd2 100644 --- a/chromium/chrome/browser/ui/webui/settings/change_password_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/change_password_handler.cc @@ -60,7 +60,8 @@ void ChangePasswordHandler::HandleChangePassword(const base::ListValue* args) { void ChangePasswordHandler::UpdateChangePasswordCardVisibility() { FireWebUIListener( "change-password-visibility", - base::Value(safe_browsing::ChromePasswordProtectionService:: + base::Value(service_->IsWarningEnabled() && + safe_browsing::ChromePasswordProtectionService:: ShouldShowChangePasswordSettingUI(profile_))); } 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 6d0cf18456f..a535d490d14 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 @@ -8,12 +8,14 @@ #include "base/bind.h" #include "base/bind_helpers.h" +#include "base/containers/flat_map.h" #include "base/files/file_util.h" #include "base/json/json_string_value_serializer.h" #include "base/logging.h" #include "base/metrics/histogram_macros.h" #include "base/path_service.h" #include "base/strings/string_util.h" +#include "base/task_scheduler/post_task.h" #include "base/threading/sequenced_task_runner_handle.h" #include "base/values.h" #include "chrome/browser/browser_process.h" @@ -32,7 +34,11 @@ #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/debug_daemon_client.h" #include "chromeos/printing/ppd_cache.h" +#include "chromeos/printing/ppd_line_reader.h" #include "chromeos/printing/ppd_provider.h" +#include "chromeos/printing/printer_configuration.h" +#include "chromeos/printing/printing_constants.h" +#include "chromeos/printing/uri_components.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/web_ui.h" @@ -40,33 +46,17 @@ #include "net/base/filename_util.h" #include "net/url_request/url_request_context_getter.h" #include "printing/backend/print_backend.h" -#include "url/third_party/mozilla/url_parse.h" namespace chromeos { namespace settings { namespace { -constexpr char kIppScheme[] = "ipp"; -constexpr char kIppsScheme[] = "ipps"; - -constexpr int kIppPort = 631; -// IPPS commonly uses the HTTPS port despite the spec saying it should use the -// IPP port. -constexpr int kIppsPort = 443; - // These values are written to logs. New enum values can be added, but existing // enums must never be renumbered or deleted and reused. enum PpdSourceForHistogram { kUser = 0, kScs = 1, kPpdSourceMax }; -// A parsed representation of a printer uri. -struct PrinterUri { - bool encrypted = false; - std::string scheme; - std::string host; - int port = url::SpecialPort::PORT_INVALID; - std::string path; -}; +constexpr int kPpdMaxLineLength = 255; void RecordPpdSource(const PpdSourceForHistogram& source) { UMA_HISTOGRAM_ENUMERATION("Printing.CUPS.PpdSource", source, kPpdSourceMax); @@ -82,43 +72,6 @@ void RecordIppQuerySuccess(bool success) { UMA_HISTOGRAM_BOOLEAN("Printing.CUPS.IppAttributesSuccess", success); } -// Parses |printer_uri| into its components and written into |uri|. Returns -// true if the uri was parsed successfully, returns false otherwise. No changes -// are made to |uri| if this function returns false. -bool ParseUri(const std::string& printer_uri, PrinterUri* uri) { - DCHECK(uri); - const char* uri_ptr = printer_uri.c_str(); - url::Parsed parsed; - url::ParseStandardURL(uri_ptr, printer_uri.length(), &parsed); - if (!parsed.scheme.is_valid() || !parsed.host.is_valid() || - !parsed.path.is_valid()) { - return false; - } - base::StringPiece scheme(&uri_ptr[parsed.scheme.begin], parsed.scheme.len); - base::StringPiece host(&uri_ptr[parsed.host.begin], parsed.host.len); - base::StringPiece path(&uri_ptr[parsed.path.begin], parsed.path.len); - - bool encrypted = scheme != kIppScheme; - int port = ParsePort(uri_ptr, parsed.port); - // Port not specified. - if (port == url::SpecialPort::PORT_UNSPECIFIED || - port == url::SpecialPort::PORT_INVALID) { - if (scheme == kIppScheme) { - port = kIppPort; - } else if (scheme == kIppsScheme) { - port = kIppsPort; - } - } - - uri->encrypted = encrypted; - uri->scheme = scheme.as_string(); - uri->host = host.as_string(); - uri->port = port; - uri->path = path.as_string(); - - return true; -} - // Returns true if |printer_uri| is an IPP uri. bool IsIppUri(base::StringPiece printer_uri) { base::StringPiece::size_type separator_location = @@ -136,15 +89,17 @@ bool IsIppUri(base::StringPiece printer_uri) { // error to attempt this with a non-IPP printer. void QueryAutoconf(const std::string& printer_uri, const PrinterInfoCallback& callback) { - PrinterUri uri; + auto optional = ParseUri(printer_uri); // Behavior for querying a non-IPP uri is undefined and disallowed. - if (!IsIppUri(printer_uri) || !ParseUri(printer_uri, &uri)) { + if (!IsIppUri(printer_uri) || !optional.has_value()) { LOG(WARNING) << "Printer uri is invalid: " << printer_uri; callback.Run(false, "", "", "", false); return; } - QueryIppPrinter(uri.host, uri.port, uri.path, uri.encrypted, callback); + UriComponents uri = optional.value(); + QueryIppPrinter(uri.host(), uri.port(), uri.path(), uri.encrypted(), + callback); } // Create an empty CupsPrinterInfo dictionary value. It should be consistent @@ -193,8 +148,8 @@ std::unique_ptr<base::DictionaryValue> GetPrinterInfo(const Printer& printer) { printer_info->SetString("printerModel", printer.model()); printer_info->SetString("printerMakeAndModel", printer.make_and_model()); - PrinterUri uri; - if (!ParseUri(printer.uri(), &uri)) { + auto optional = printer.GetUriComponents(); + if (!optional.has_value()) { // Uri is invalid so we set default values. LOG(WARNING) << "Could not parse uri. Defaulting values"; printer_info->SetString("printerAddress", ""); @@ -204,7 +159,9 @@ std::unique_ptr<base::DictionaryValue> GetPrinterInfo(const Printer& printer) { return printer_info; } - if (base::ToLowerASCII(uri.scheme) == "usb") { + UriComponents uri = optional.value(); + + if (base::ToLowerASCII(uri.scheme()) == "usb") { // USB has URI path (and, maybe, query) components that aren't really // associated with a queue -- the mapping between printing semantics and URI // semantics breaks down a bit here. From the user's point of view, the @@ -213,12 +170,12 @@ std::unique_ptr<base::DictionaryValue> GetPrinterInfo(const Printer& printer) { printer.uri().substr(strlen("usb://"))); } else { printer_info->SetString("printerAddress", - PrinterAddress(uri.host, uri.port)); - if (!uri.path.empty()) { - printer_info->SetString("printerQueue", uri.path.substr(1)); + PrinterAddress(uri.host(), uri.port())); + if (!uri.path().empty()) { + printer_info->SetString("printerQueue", uri.path().substr(1)); } } - printer_info->SetString("printerProtocol", base::ToLowerASCII(uri.scheme)); + printer_info->SetString("printerProtocol", base::ToLowerASCII(uri.scheme())); return printer_info; } @@ -284,6 +241,16 @@ std::unique_ptr<chromeos::Printer> DictToPrinter( return printer; } +std::string ReadFileToStringWithMaxSize(const base::FilePath& path, + int max_size) { + std::string contents; + // This call can fail, but it doesn't matter for our purposes. If it fails, + // we simply return an empty string for the contents, and it will be rejected + // as an invalid PPD. + base::ReadFileToStringWithMaxSize(path, &contents, max_size); + return contents; +} + } // namespace CupsPrintersHandler::CupsPrintersHandler(content::WebUI* webui) @@ -348,7 +315,6 @@ void CupsPrintersHandler::RegisterMessages() { void CupsPrintersHandler::OnJavascriptAllowed() { printers_manager_->AddObserver(this); - printers_manager_->Start(); } void CupsPrintersHandler::OnJavascriptDisallowed() { @@ -412,9 +378,8 @@ void CupsPrintersHandler::HandleRemoveCupsPrinter(const base::ListValue* args) { printers_manager_->RemoveConfiguredPrinter(printer_id); DebugDaemonClient* client = DBusThreadManager::Get()->GetDebugDaemonClient(); - client->CupsRemovePrinter(printer_name, - base::Bind(&OnRemovedPrinter, protocol), - base::Bind(&base::DoNothing)); + client->CupsRemovePrinter( + printer_name, base::Bind(&OnRemovedPrinter, protocol), base::DoNothing()); } void CupsPrintersHandler::HandleGetPrinterInfo(const base::ListValue* args) { @@ -532,9 +497,17 @@ void CupsPrintersHandler::HandleAddCupsPrinter(const base::ListValue* args) { CHECK(args->GetDictionary(0, &printer_dict)); std::unique_ptr<Printer> printer = DictToPrinter(*printer_dict); - PrinterUri uri; - if (!printer || !ParseUri(printer->uri(), &uri)) { - LOG(ERROR) << "Failed to parse printer"; + if (!printer) { + LOG(ERROR) << "Failed to parse printer URI"; + OnAddPrinterError(PrinterSetupResult::kFatalError); + return; + } + + auto optional = printer->GetUriComponents(); + if (!optional.has_value()) { + // If the returned optional does not contain a value then it means that the + // printer's uri was not able to be parsed successfully. + LOG(ERROR) << "Failed to parse printer URI"; OnAddPrinterError(PrinterSetupResult::kFatalError); return; } @@ -761,8 +734,26 @@ void CupsPrintersHandler::FileSelected(const base::FilePath& path, int index, void* params) { DCHECK(!webui_callback_id_.empty()); + + // Load the beggining contents of the file located at |path| and callback into + // VerifyPpdContents() in order to determine whether the file appears to be a + // PPD file. The task's priority is USER_BLOCKING because the this task + // updates the UI as a result of a direct user action. + base::PostTaskWithTraitsAndReplyWithResult( + FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_BLOCKING}, + base::BindOnce(&ReadFileToStringWithMaxSize, path, kPpdMaxLineLength), + base::BindOnce(&CupsPrintersHandler::VerifyPpdContents, + weak_factory_.GetWeakPtr(), path)); +} + +void CupsPrintersHandler::VerifyPpdContents(const base::FilePath& path, + const std::string& contents) { + std::string result = ""; + if (PpdLineReader::ContainsMagicNumber(contents, kPpdMaxLineLength)) + result = path.value(); + ResolveJavascriptCallback(base::Value(webui_callback_id_), - base::Value(path.value())); + base::Value(result)); webui_callback_id_.clear(); } @@ -837,11 +828,17 @@ void CupsPrintersHandler::HandleAddDiscoveredPrinter( CHECK(args->GetString(0, &printer_id)); std::unique_ptr<Printer> printer = printers_manager_->GetPrinter(printer_id); - PrinterUri uri; - if (printer == nullptr || !ParseUri(printer->uri(), &uri)) { + if (printer == nullptr) { // Printer disappeared, so we don't have information about it anymore and - // can't really do much. Or the printer uri was not parsed successfully. - // Fail the add. + // can't really do much. Fail the add. + FireWebUIListener("on-add-cups-printer", base::Value(false), + base::Value(printer_id)); + return; + } + + auto optional = printer->GetUriComponents(); + if (!optional.has_value()) { + // The printer uri was not parsed successfully. Fail the add. FireWebUIListener("on-add-cups-printer", base::Value(false), base::Value(printer_id)); return; diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h index f3541827eed..0f9452af13e 100644 --- a/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h @@ -145,6 +145,13 @@ class CupsPrintersHandler : public ::settings::SettingsPageUIHandler, int index, void* params) override; + // Used by FileSelected() in order to verify whether the beginning contents of + // the selected file contain the magic number present in all PPD files. |path| + // is used for display in the UI as this function calls back into javascript + // with |path| as the result. + void VerifyPpdContents(const base::FilePath& path, + const std::string& contents); + Profile* profile_; // Discovery support. discovery_active_ tracks whether or not the UI 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 f4176c34c2d..4ff2b1c8713 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 @@ -29,7 +29,9 @@ #include "chrome/browser/platform_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/grit/generated_resources.h" -#include "chromeos/cryptohome/homedir_methods.h" +#include "chromeos/cryptohome/cryptohome_util.h" +#include "chromeos/dbus/cryptohome_client.h" +#include "chromeos/dbus/dbus_thread_manager.h" #include "components/arc/arc_util.h" #include "components/browsing_data/content/conditional_cache_counting_helper.h" #include "components/drive/chromeos/file_system_interface.h" @@ -300,10 +302,10 @@ void StorageHandler::UpdateOtherUsersSize() { if (user->is_active()) continue; other_users_.push_back(user); - cryptohome::HomedirMethods::GetInstance()->GetAccountDiskUsage( + DBusThreadManager::Get()->GetCryptohomeClient()->GetAccountDiskUsage( cryptohome::Identification(user->GetAccountId()), - base::Bind(&StorageHandler::OnGetOtherUserSize, - weak_ptr_factory_.GetWeakPtr())); + base::BindOnce(&StorageHandler::OnGetOtherUserSize, + weak_ptr_factory_.GetWeakPtr())); } // We should show "0 B" if there is no other user. if (other_users_.empty()) { @@ -313,8 +315,9 @@ void StorageHandler::UpdateOtherUsersSize() { } } -void StorageHandler::OnGetOtherUserSize(bool success, int64_t size) { - user_sizes_.push_back(success ? size : -1); +void StorageHandler::OnGetOtherUserSize( + base::Optional<cryptohome::BaseReply> reply) { + user_sizes_.push_back(cryptohome::AccountDiskUsageReplyToUsageSize(reply)); if (user_sizes_.size() == other_users_.size()) { base::string16 size_string; // If all the requests succeed, shows the total bytes in the UI. 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 9da1d5d437b..48f3d5b5875 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 @@ -12,8 +12,10 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "base/optional.h" #include "chrome/browser/browsing_data/site_data_size_collector.h" #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" +#include "chromeos/dbus/cryptohome/rpc.pb.h" #include "components/arc/storage_manager/arc_storage_manager.h" #include "components/user_manager/user.h" @@ -76,7 +78,7 @@ class StorageHandler : public ::settings::SettingsPageUIHandler { void UpdateOtherUsersSize(); // Callback to save the fetched user sizes and update the UI. - void OnGetOtherUserSize(bool success, int64_t size); + void OnGetOtherUserSize(base::Optional<cryptohome::BaseReply> reply); // Requests updating the space size used by Android apps and cache. void UpdateAndroidSize(); diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.cc b/chromium/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.cc index 45d050cc78c..a97d004c949 100644 --- a/chromium/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.cc @@ -19,7 +19,7 @@ #include "components/prefs/pref_service.h" #include "components/session_manager/core/session_manager.h" #include "content/public/common/service_manager_connection.h" -#include "services/device/public/interfaces/constants.mojom.h" +#include "services/device/public/mojom/constants.mojom.h" #include "services/service_manager/public/cpp/connector.h" #include "ui/base/l10n/l10n_util.h" diff --git a/chromium/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.h b/chromium/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.h index 5c296d69fe7..f63ea22d163 100644 --- a/chromium/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.h @@ -10,7 +10,7 @@ #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" #include "components/session_manager/core/session_manager_observer.h" #include "mojo/public/cpp/bindings/binding.h" -#include "services/device/public/interfaces/fingerprint.mojom.h" +#include "services/device/public/mojom/fingerprint.mojom.h" class Profile; diff --git a/chromium/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc index c20ca4db582..7e7628fb021 100644 --- a/chromium/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc +++ b/chromium/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc @@ -6,6 +6,8 @@ #include "base/memory/ptr_util.h" #include "chrome/browser/download/chrome_download_manager_delegate.h" +#include "chrome/browser/download/download_core_service_factory.h" +#include "chrome/browser/download/download_core_service_impl.h" #include "chrome/browser/download/download_prefs.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/testing_profile.h" @@ -22,15 +24,17 @@ class DownloadsHandlerTest : public testing::Test { public: DownloadsHandlerTest() : download_manager_(new content::MockDownloadManager()), - chrome_download_manager_delegate_(&profile_), handler_(&profile_) { content::BrowserContext::SetDownloadManagerForTesting( &profile_, base::WrapUnique(download_manager_)); - EXPECT_EQ(download_manager_, - content::BrowserContext::GetDownloadManager(&profile_)); - - EXPECT_CALL(*download_manager_, GetDelegate()) - .WillRepeatedly(testing::Return(&chrome_download_manager_delegate_)); + std::unique_ptr<ChromeDownloadManagerDelegate> delegate = + std::make_unique<ChromeDownloadManagerDelegate>(&profile_); + chrome_download_manager_delegate_ = delegate.get(); + service_ = DownloadCoreServiceFactory::GetForBrowserContext(&profile_); + service_->SetDownloadManagerDelegateForTesting(std::move(delegate)); + + EXPECT_CALL(*download_manager_, GetBrowserContext()) + .WillRepeatedly(testing::Return(&profile_)); EXPECT_CALL(*download_manager_, Shutdown()); handler_.set_web_ui(&test_web_ui_); @@ -49,7 +53,7 @@ class DownloadsHandlerTest : public testing::Test { } void TearDown() override { - chrome_download_manager_delegate_.Shutdown(); + service_->SetDownloadManagerDelegateForTesting(nullptr); testing::Test::TearDown(); } @@ -74,8 +78,9 @@ class DownloadsHandlerTest : public testing::Test { content::TestWebUI test_web_ui_; TestingProfile profile_; + DownloadCoreService* service_; content::MockDownloadManager* download_manager_; // Owned by |profile_|. - ChromeDownloadManagerDelegate chrome_download_manager_delegate_; + ChromeDownloadManagerDelegate* chrome_download_manager_delegate_; DownloadsHandler handler_; }; diff --git a/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc b/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc new file mode 100644 index 00000000000..af1646f42db --- /dev/null +++ b/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc @@ -0,0 +1,168 @@ +// 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/incompatible_applications_handler_win.h" + +#include <string> +#include <utility> +#include <vector> + +#include "base/bind.h" +#include "base/logging.h" +#include "base/metrics/histogram_macros.h" +#include "base/metrics/user_metrics.h" +#include "base/strings/utf_string_conversions.h" +#include "base/values.h" +#include "base/win/registry.h" +#include "chrome/browser/conflicts/problematic_programs_updater_win.h" +#include "chrome/browser/conflicts/registry_key_watcher_win.h" +#include "chrome/browser/conflicts/uninstall_application_win.h" +#include "chrome/grit/generated_resources.h" +#include "ui/base/l10n/l10n_util.h" + +namespace settings { + +IncompatibleApplicationsHandler::IncompatibleApplicationsHandler() = default; + +IncompatibleApplicationsHandler::~IncompatibleApplicationsHandler() = default; + +void IncompatibleApplicationsHandler::RegisterMessages() { + web_ui()->RegisterMessageCallback( + "requestIncompatibleApplicationsList", + base::BindRepeating(&IncompatibleApplicationsHandler:: + HandleRequestIncompatibleApplicationsList, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "startProgramUninstallation", + base::BindRepeating( + &IncompatibleApplicationsHandler::HandleStartProgramUninstallation, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "getSubtitlePluralString", + base::BindRepeating( + &IncompatibleApplicationsHandler::HandleGetSubtitlePluralString, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "getSubtitleNoAdminRightsPluralString", + base::BindRepeating(&IncompatibleApplicationsHandler:: + HandleGetSubtitleNoAdminRightsPluralString, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "getListTitlePluralString", + base::BindRepeating( + &IncompatibleApplicationsHandler::HandleGetListTitlePluralString, + base::Unretained(this))); +} + +void IncompatibleApplicationsHandler::OnJavascriptAllowed() {} + +void IncompatibleApplicationsHandler::OnJavascriptDisallowed() { + registry_key_watchers_.clear(); +} + +void IncompatibleApplicationsHandler::HandleRequestIncompatibleApplicationsList( + const base::ListValue* args) { + CHECK_EQ(1u, args->GetList().size()); + + AllowJavascript(); + + // Reset the registry watchers, to correctly handle repeated calls to + // requestIncompatibleApplicationsList(). + registry_key_watchers_.clear(); + + std::vector<ProblematicProgramsUpdater::ProblematicProgram> + problematic_programs = ProblematicProgramsUpdater::GetCachedPrograms(); + + base::Value application_list(base::Value::Type::LIST); + application_list.GetList().reserve(problematic_programs.size()); + + for (const auto& program : problematic_programs) { + // Set up a registry watcher for each problem application. + // Since this instance owns the watcher, it is safe to use + // base::Unretained() because the callback won't be invoked when the watcher + // gets deleted. + auto registry_key_watcher = RegistryKeyWatcher::Create( + program.info.registry_root, program.info.registry_key_path.c_str(), + program.info.registry_wow64_access, + base::BindOnce(&IncompatibleApplicationsHandler::OnApplicationRemoved, + base::Unretained(this), program.info)); + + // Only keep the watcher if it was successfully initialized. A failure here + // is unlikely, but the worst that can happen is that the |program| will not + // get removed from the list automatically in the Incompatible Applications + // subpage. + if (registry_key_watcher) { + registry_key_watchers_.insert( + {program.info, std::move(registry_key_watcher)}); + } + + // Also add the application to the list that is passed to the javascript. + base::Value dict(base::Value::Type::DICTIONARY); + dict.SetKey("name", base::Value(program.info.name)); + dict.SetKey("type", base::Value(program.blacklist_action->message_type())); + dict.SetKey("url", base::Value(program.blacklist_action->message_url())); + application_list.GetList().push_back(std::move(dict)); + } + + UMA_HISTOGRAM_COUNTS_100("IncompatibleApplicationsPage.NumApplications", + problematic_programs.size()); + + const base::Value& callback_id = args->GetList().front(); + ResolveJavascriptCallback(callback_id, application_list); +} + +void IncompatibleApplicationsHandler::HandleStartProgramUninstallation( + const base::ListValue* args) { + CHECK_EQ(1u, args->GetList().size()); + base::RecordAction(base::UserMetricsAction( + "IncompatibleApplicationsPage.UninstallationStarted")); + + // Open the Apps & Settings page with the program name highlighted. + uninstall_application::LaunchUninstallFlow( + base::UTF8ToUTF16(args->GetList()[0].GetString())); +} + +void IncompatibleApplicationsHandler::HandleGetSubtitlePluralString( + const base::ListValue* args) { + GetPluralString(IDS_SETTINGS_INCOMPATIBLE_APPLICATIONS_SUBPAGE_SUBTITLE, + args); +} + +void IncompatibleApplicationsHandler:: + HandleGetSubtitleNoAdminRightsPluralString(const base::ListValue* args) { + GetPluralString( + IDS_SETTINGS_INCOMPATIBLE_APPLICATIONS_SUBPAGE_SUBTITLE_NO_ADMIN_RIGHTS, + args); +} + +void IncompatibleApplicationsHandler::HandleGetListTitlePluralString( + const base::ListValue* args) { + GetPluralString(IDS_SETTINGS_INCOMPATIBLE_APPLICATIONS_LIST_TITLE, args); +} + +void IncompatibleApplicationsHandler::GetPluralString( + int id, + const base::ListValue* args) { + CHECK_EQ(2U, args->GetList().size()); + + const base::Value& callback_id = args->GetList()[0]; + int num_applications = args->GetList()[1].GetInt(); + DCHECK_GT(0, num_applications); + + ResolveJavascriptCallback( + callback_id, + base::Value(l10n_util::GetPluralStringFUTF16(id, num_applications))); +} + +void IncompatibleApplicationsHandler::OnApplicationRemoved( + const InstalledPrograms::ProgramInfo& program) { + base::RecordAction(base::UserMetricsAction( + "IncompatibleApplicationsPage.ApplicationRemoved")); + + registry_key_watchers_.erase(program); + FireWebUIListener("incompatible-application-removed", + base::Value(program.name)); +} + +} // namespace settings diff --git a/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.h b/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.h new file mode 100644 index 00000000000..b7518f69a45 --- /dev/null +++ b/chromium/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.h @@ -0,0 +1,58 @@ +// 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_INCOMPATIBLE_APPLICATIONS_HANDLER_WIN_H_ +#define CHROME_BROWSER_UI_WEBUI_SETTINGS_INCOMPATIBLE_APPLICATIONS_HANDLER_WIN_H_ + +#include <map> +#include <memory> + +#include "base/macros.h" +#include "chrome/browser/conflicts/installed_programs_win.h" +#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" + +class RegistryKeyWatcher; + +namespace base { +class ListValue; +} + +namespace settings { + +// Incompatible Applications settings page UI handler. +class IncompatibleApplicationsHandler : public SettingsPageUIHandler { + public: + IncompatibleApplicationsHandler(); + ~IncompatibleApplicationsHandler() override; + + // SettingsPageUIHandler: + void RegisterMessages() override; + void OnJavascriptAllowed() override; + void OnJavascriptDisallowed() override; + + private: + // Sends the list of incompatible applications to the caller via a promise. + void HandleRequestIncompatibleApplicationsList(const base::ListValue* args); + + // Initiates the uninstallation of the program passed using |args|. + void HandleStartProgramUninstallation(const base::ListValue* args); + + void HandleGetSubtitlePluralString(const base::ListValue* args); + void HandleGetSubtitleNoAdminRightsPluralString(const base::ListValue* args); + void HandleGetListTitlePluralString(const base::ListValue* args); + void GetPluralString(int id, const base::ListValue* args); + + // Callback for the registry key watchers. + void OnApplicationRemoved(const InstalledPrograms::ProgramInfo& program); + + // Container for the watchers. + std::map<InstalledPrograms::ProgramInfo, std::unique_ptr<RegistryKeyWatcher>> + registry_key_watchers_; + + DISALLOW_COPY_AND_ASSIGN(IncompatibleApplicationsHandler); +}; + +} // namespace settings + +#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_INCOMPATIBLE_APPLICATIONS_HANDLER_WIN_H_ 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 906dbf0f698..1c76ec475ac 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 @@ -11,6 +11,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" +#include "build/buildflag.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/plugins/plugin_utils.h" @@ -28,12 +29,15 @@ #include "components/google/core/browser/google_util.h" #include "components/password_manager/core/browser/password_manager_constants.h" #include "components/safe_browsing/common/safe_browsing_prefs.h" +#include "components/signin/core/browser/signin_features.h" #include "components/strings/grit/components_strings.h" #include "components/subresource_filter/core/browser/subresource_filter_features.h" #include "content/public/browser/web_ui_data_source.h" +#include "services/device/public/cpp/device_features.h" #include "ui/base/l10n/l10n_util.h" #if defined(OS_CHROMEOS) +#include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/ash_switches.h" #include "ash/public/interfaces/voice_interaction_controller.mojom.h" #include "ash/strings/grit/ash_strings.h" @@ -43,6 +47,7 @@ #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_factory.h" #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" +#include "chrome/browser/signin/account_consistency_mode_manager.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_switches.h" @@ -54,6 +59,7 @@ #include "ui/display/manager/chromeos/touch_device_manager.h" #else #include "chrome/browser/ui/webui/settings/system_handler.h" +#include "components/signin/core/browser/profile_management_switches.h" #endif #if defined(OS_WIN) @@ -176,6 +182,19 @@ void AddA11yStrings(content::WebUIDataSource* html_source) { {"chromeVoxLabel", IDS_SETTINGS_CHROMEVOX_LABEL}, {"chromeVoxOptionsLabel", IDS_SETTINGS_CHROMEVOX_OPTIONS_LABEL}, {"screenMagnifierLabel", IDS_SETTINGS_SCREEN_MAGNIFIER_LABEL}, + {"screenMagnifierZoomLabel", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_LABEL}, + {"dockedMagnifierLabel", IDS_SETTINGS_DOCKED_MAGNIFIER_LABEL}, + {"dockedMagnifierZoomLabel", IDS_SETTINGS_DOCKED_MAGNIFIER_ZOOM_LABEL}, + {"screenMagnifierZoom2x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_2_X}, + {"screenMagnifierZoom4x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_4_X}, + {"screenMagnifierZoom6x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_6_X}, + {"screenMagnifierZoom8x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_8_X}, + {"screenMagnifierZoom10x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_10_X}, + {"screenMagnifierZoom12x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_12_X}, + {"screenMagnifierZoom14x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_14_X}, + {"screenMagnifierZoom16x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_16_X}, + {"screenMagnifierZoom18x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_18_X}, + {"screenMagnifierZoom20x", IDS_SETTINGS_SCREEN_MAGNIFIER_ZOOM_20_X}, {"tapDraggingLabel", IDS_SETTINGS_TAP_DRAGGING_LABEL}, {"clickOnStopLabel", IDS_SETTINGS_CLICK_ON_STOP_LABEL}, {"delayBeforeClickLabel", IDS_SETTINGS_DELAY_BEFORE_CLICK_LABEL}, @@ -231,13 +250,17 @@ void AddA11yStrings(content::WebUIDataSource* html_source) { arraysize(localized_strings)); #if defined(OS_CHROMEOS) - html_source->AddString("a11yLearnMoreUrl", - chrome::kChromeAccessibilityHelpURL); + html_source->AddString( + "a11yLearnMoreUrl", + GetHelpUrlWithBoard(chrome::kChromeAccessibilityHelpURL)); html_source->AddBoolean( "showExperimentalA11yFeatures", base::CommandLine::ForCurrentProcess()->HasSwitch( chromeos::switches::kEnableExperimentalAccessibilityFeatures)); + + html_source->AddBoolean("dockedMagnifierFeatureEnabled", + ash::features::IsDockedMagnifierEnabled()); #endif } @@ -448,22 +471,24 @@ void AddChangePasswordStrings(content::WebUIDataSource* html_source) { #endif } -void AddClearBrowsingDataStrings(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) - // Mirror account reconciliation behavior is turned on for child accounts on - // Chrome OS. - if (user_manager::UserManager::Get()->GetPrimaryUser()->GetType() == - user_manager::USER_TYPE_CHILD) { + 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 (signin::IsDiceEnabledForProfile(profile->GetPrefs())) { clear_cookies_summary_msg_id = - IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_MIRROR_SUMMARY_BASIC; + IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC_WITH_EXCEPTION; } #endif LocalizedString localized_strings[] = { - {"clearFollowingItemsFrom", IDS_SETTINGS_CLEAR_FOLLOWING_ITEMS_FROM}, {"clearTimeRange", IDS_SETTINGS_CLEAR_PERIOD_TITLE}, {"clearBrowsingHistory", IDS_SETTINGS_CLEAR_BROWSING_HISTORY}, {"clearBrowsingHistorySummary", @@ -478,19 +503,11 @@ void AddClearBrowsingDataStrings(content::WebUIDataSource* html_source) { {"clearFormData", IDS_SETTINGS_CLEAR_FORM_DATA}, {"clearHostedAppData", IDS_SETTINGS_CLEAR_HOSTED_APP_DATA}, {"clearMediaLicenses", IDS_SETTINGS_CLEAR_MEDIA_LICENSES}, - {"clearDataHour", IDS_SETTINGS_CLEAR_DATA_HOUR}, - {"clearDataDay", IDS_SETTINGS_CLEAR_DATA_DAY}, - {"clearDataWeek", IDS_SETTINGS_CLEAR_DATA_WEEK}, - {"clearData4Weeks", IDS_SETTINGS_CLEAR_DATA_4WEEKS}, - {"clearDataEverything", IDS_SETTINGS_CLEAR_DATA_EVERYTHING}, {"clearPeriodHour", IDS_SETTINGS_CLEAR_PERIOD_HOUR}, {"clearPeriod24Hours", IDS_SETTINGS_CLEAR_PERIOD_24_HOURS}, {"clearPeriod7Days", IDS_SETTINGS_CLEAR_PERIOD_7_DAYS}, {"clearPeriod4Weeks", IDS_SETTINGS_CLEAR_PERIOD_FOUR_WEEKS}, {"clearPeriodEverything", IDS_SETTINGS_CLEAR_PERIOD_EVERYTHING}, - {"warnAboutNonClearedData", IDS_SETTINGS_CLEAR_DATA_SOME_STUFF_REMAINS}, - {"clearsSyncedData", IDS_SETTINGS_CLEAR_DATA_CLEARS_SYNCED_DATA}, - {"clearBrowsingDataLearnMoreUrl", IDS_SETTINGS_CLEAR_DATA_LEARN_MORE_URL}, {"historyDeletionDialogTitle", IDS_CLEAR_BROWSING_DATA_HISTORY_NOTICE_TITLE}, {"historyDeletionDialogOK", IDS_CLEAR_BROWSING_DATA_HISTORY_NOTICE_OK}, @@ -513,12 +530,6 @@ void AddClearBrowsingDataStrings(content::WebUIDataSource* html_source) { IDS_SETTINGS_CLEAR_BROWSING_HISTORY_SUMMARY_SYNCED, base::ASCIIToUTF16(chrome::kMyActivityUrlInClearBrowsingData))); html_source->AddString( - "otherFormsOfBrowsingHistory", - l10n_util::GetStringFUTF16( - IDS_CLEAR_BROWSING_DATA_HISTORY_FOOTER, - l10n_util::GetStringUTF16( - IDS_SETTINGS_CLEAR_DATA_WEB_HISTORY_URL_IN_FOOTER))); - html_source->AddString( "historyDeletionDialogBody", l10n_util::GetStringFUTF16( IDS_CLEAR_BROWSING_DATA_HISTORY_NOTICE, @@ -552,7 +563,7 @@ void AddDeviceStrings(content::WebUIDataSource* html_source) { {"scrollLabel", IDS_SETTINGS_SCROLL_LABEL}, {"traditionalScrollLabel", IDS_SETTINGS_TRADITIONAL_SCROLL_LABEL}, {"naturalScrollLabel", IDS_SETTINGS_NATURAL_SCROLL_LABEL}, - {"naturalScrollLearnMore", IDS_SETTINGS_NATURAL_SCROLL_LEARN_MORE}, + {"naturalScrollLearnMore", IDS_LEARN_MORE}, }; AddLocalizedStringsBulk(html_source, device_strings, arraysize(device_strings)); @@ -785,8 +796,6 @@ void AddChromeCleanupStrings(content::WebUIDataSource* html_source) { IDS_SETTINGS_RESET_CLEANUP_DETAILS_FILES_AND_PROGRAMS}, {"chromeCleanupDetailsRegistryEntries", IDS_SETTINGS_RESET_CLEANUP_DETAILS_REGISTRY_ENTRIES}, - {"chromeCleanupDoneButtonLabel", - IDS_SETTINGS_RESET_CLEANUP_DONE_BUTTON_LABEL}, {"chromeCleanupExplanationCleanupError", IDS_SETTINGS_RESET_CLEANUP_EXPLANATION_CLEANUP_ERROR}, {"chromeCleanupExplanationFindAndRemove", @@ -858,6 +867,33 @@ void AddChromeCleanupStrings(content::WebUIDataSource* html_source) { html_source->AddString("chromeCleanupDetailsExplanation", cleanup_details_explanation); } + +void AddIncompatibleApplicationsStrings(content::WebUIDataSource* html_source) { + LocalizedString localized_strings[] = { + {"incompatibleApplicationsResetCardTitle", + IDS_SETTINGS_INCOMPATIBLE_APPLICATIONS_RESET_CARD_TITLE}, + {"incompatibleApplicationsSubpageSubtitle", + IDS_SETTINGS_INCOMPATIBLE_APPLICATIONS_SUBPAGE_SUBTITLE}, + {"incompatibleApplicationsSubpageSubtitleNoAdminRights", + IDS_SETTINGS_INCOMPATIBLE_APPLICATIONS_SUBPAGE_SUBTITLE_NO_ADMIN_RIGHTS}, + {"incompatibleApplicationsListTitle", + IDS_SETTINGS_INCOMPATIBLE_APPLICATIONS_LIST_TITLE}, + {"incompatibleApplicationsRemoveButton", + IDS_SETTINGS_INCOMPATIBLE_APPLICATIONS_REMOVE_BUTTON}, + {"incompatibleApplicationsUpdateButton", + IDS_SETTINGS_INCOMPATIBLE_APPLICATIONS_UPDATE_BUTTON}, + {"incompatibleApplicationsDone", + IDS_SETTINGS_INCOMPATIBLE_APPLICATIONS_DONE}, + }; + AddLocalizedStringsBulk(html_source, localized_strings, + arraysize(localized_strings)); + // TODO(pmonette): Add the help URL when available. + base::string16 learn_how_text = l10n_util::GetStringFUTF16( + IDS_SETTINGS_INCOMPATIBLE_APPLICATIONS_SUBPAGE_LEARN_HOW, + base::ASCIIToUTF16("chrome://placeholder")); + html_source->AddString("incompatibleApplicationsSubpageLearnHow", + learn_how_text); +} #endif // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) void AddResetStrings(content::WebUIDataSource* html_source) { @@ -892,8 +928,6 @@ void AddResetStrings(content::WebUIDataSource* html_source) { #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) {"resetCleanupComputerTrigger", IDS_SETTINGS_RESET_CLEAN_UP_COMPUTER_TRIGGER}, - {"resetCleanupComputerTriggerDescription", - IDS_SETTINGS_RESET_CLEAN_UP_COMPUTER_TRIGGER_DESCRIPTION}, #endif }; AddLocalizedStringsBulk(html_source, localized_strings, @@ -1078,8 +1112,7 @@ void AddInternetStrings(content::WebUIDataSource* html_source) { {"networkConnectNotAllowed", IDS_SETTINGS_INTERNET_CONNECT_NOT_ALLOWED}, {"networkIPAddress", IDS_SETTINGS_INTERNET_NETWORK_IP_ADDRESS}, {"networkIPConfigAuto", IDS_SETTINGS_INTERNET_NETWORK_IP_CONFIG_AUTO}, - {"networkNameserversLearnMore", - IDS_SETTINGS_INTERNET_NETWORK_NAMESERVERS_LEARN_MORE}, + {"networkNameserversLearnMore", IDS_LEARN_MORE}, {"networkPrefer", IDS_SETTINGS_INTERNET_NETWORK_PREFER}, {"networkPrimaryUserControlled", IDS_SETTINGS_INTERNET_NETWORK_PRIMARY_USER_CONTROLLED}, @@ -1112,6 +1145,8 @@ void AddInternetStrings(content::WebUIDataSource* html_source) { IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_SECOND_STEP}, {"gmscoreNotificationsThirdStep", IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_THIRD_STEP}, + {"gmscoreNotificationsFourthStep", + IDS_SETTINGS_INTERNET_GMSCORE_NOTIFICATIONS_FOURTH_STEP}, {"tetherConnectionDialogTitle", IDS_SETTINGS_INTERNET_TETHER_CONNECTION_DIALOG_TITLE}, {"tetherConnectionAvailableDeviceTitle", @@ -1276,6 +1311,7 @@ void AddPasswordsAndFormsStrings(content::WebUIDataSource* html_source) { {"autofill", IDS_SETTINGS_AUTOFILL}, {"googlePayments", IDS_SETTINGS_GOOGLE_PAYMENTS}, {"googlePaymentsCached", IDS_SETTINGS_GOOGLE_PAYMENTS_CACHED}, + {"autofillFormsLabel", IDS_SETTINGS_AUTOFILL_TOGGLE_LABEL}, {"addresses", IDS_SETTINGS_AUTOFILL_ADDRESSES_HEADING}, {"addAddressTitle", IDS_SETTINGS_AUTOFILL_ADDRESSES_ADD_TITLE}, {"editAddressTitle", IDS_SETTINGS_AUTOFILL_ADDRESSES_EDIT_TITLE}, @@ -1297,6 +1333,8 @@ void AddPasswordsAndFormsStrings(content::WebUIDataSource* html_source) { {"addCreditCardTitle", IDS_SETTINGS_ADD_CREDIT_CARD_TITLE}, {"autofillDetail", IDS_SETTINGS_AUTOFILL_DETAIL}, {"passwords", IDS_SETTINGS_PASSWORDS}, + {"passwordsSavePasswordsLabel", + IDS_SETTINGS_PASSWORDS_SAVE_PASSWORDS_TOGGLE_LABEL}, {"passwordsAutosigninLabel", IDS_SETTINGS_PASSWORDS_AUTOSIGNIN_CHECKBOX_LABEL}, {"passwordsAutosigninDescription", @@ -1305,7 +1343,6 @@ void AddPasswordsAndFormsStrings(content::WebUIDataSource* html_source) { {"savedPasswordsHeading", IDS_SETTINGS_PASSWORDS_SAVED_HEADING}, {"passwordExceptionsHeading", IDS_SETTINGS_PASSWORDS_EXCEPTIONS_HEADING}, {"deletePasswordException", IDS_SETTINGS_PASSWORDS_DELETE_EXCEPTION}, - {"passwordsDone", IDS_SETTINGS_PASSWORD_DONE}, {"removePassword", IDS_SETTINGS_PASSWORD_REMOVE}, {"searchPasswords", IDS_SETTINGS_PASSWORD_SEARCH}, {"showPassword", IDS_SETTINGS_PASSWORD_SHOW}, @@ -1321,12 +1358,22 @@ void AddPasswordsAndFormsStrings(content::WebUIDataSource* html_source) { {"noPasswordsFound", IDS_SETTINGS_PASSWORDS_NONE}, {"noExceptionsFound", IDS_SETTINGS_PASSWORDS_EXCEPTIONS_NONE}, {"import", IDS_PASSWORD_MANAGER_IMPORT_BUTTON}, - {"export", IDS_PASSWORD_MANAGER_EXPORT_BUTTON}, + {"exportMenuItem", IDS_SETTINGS_PASSWORDS_EXPORT_MENU_ITEM}, {"undoRemovePassword", IDS_SETTINGS_PASSWORD_UNDO}, {"passwordDeleted", IDS_SETTINGS_PASSWORD_DELETED_PASSWORD}, {"exportPasswordsTitle", IDS_SETTINGS_PASSWORDS_EXPORT_TITLE}, {"exportPasswordsDescription", IDS_SETTINGS_PASSWORDS_EXPORT_DESCRIPTION}, - {"exportPasswords", IDS_SETTINGS_PASSWORDS_EXPORT}}; + {"exportPasswords", IDS_SETTINGS_PASSWORDS_EXPORT}, + {"exportingPasswordsTitle", IDS_SETTINGS_PASSWORDS_EXPORTING_TITLE}, + {"exportPasswordsTryAgain", IDS_SETTINGS_PASSWORDS_EXPORT_TRY_AGAIN}, + {"exportPasswordsFailTitle", + IDS_SETTINGS_PASSWORDS_EXPORTING_FAILURE_TITLE}, + {"exportPasswordsFailTips", + IDS_SETTINGS_PASSWORDS_EXPORTING_FAILURE_TIPS}, + {"exportPasswordsFailTipsEnoughSpace", + IDS_SETTINGS_PASSWORDS_EXPORTING_FAILURE_TIP_ENOUGH_SPACE}, + {"exportPasswordsFailTipsAnotherFolder", + IDS_SETTINGS_PASSWORDS_EXPORTING_FAILURE_TIP_ANOTHER_FOLDER}}; html_source->AddString( "managePasswordsLabel", @@ -1345,11 +1392,10 @@ void AddPasswordsAndFormsStrings(content::WebUIDataSource* html_source) { arraysize(localized_strings)); } -void AddPeopleStrings(content::WebUIDataSource* html_source) { +void AddPeopleStrings(content::WebUIDataSource* html_source, Profile* profile) { LocalizedString localized_strings[] = { {"peoplePageTitle", IDS_SETTINGS_PEOPLE}, {"manageOtherPeople", IDS_SETTINGS_PEOPLE_MANAGE_OTHER_PEOPLE}, - {"manageSupervisedUsers", IDS_SETTINGS_PEOPLE_MANAGE_SUPERVISED_USERS}, #if defined(OS_CHROMEOS) {"configureFingerprintTitle", IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_TITLE}, {"configureFingerprintInstructionLocateScannerStep", @@ -1372,8 +1418,6 @@ void AddPeopleStrings(content::WebUIDataSource* html_source) { IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_FINGER_TOO_FAST}, {"configureFingerprintImmobile", IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_FINGER_IMMOBILE}, - {"configureFingerprintDoneButton", - IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_DONE_BUTTON}, {"configureFingerprintAddAnotherButton", IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_ADD_ANOTHER_BUTTON}, {"configurePinChoosePinTitle", @@ -1448,8 +1492,19 @@ void AddPeopleStrings(content::WebUIDataSource* html_source) { #else // !defined(OS_CHROMEOS) {"domainManagedProfile", IDS_SETTINGS_PEOPLE_DOMAIN_MANAGED_PROFILE}, {"editPerson", IDS_SETTINGS_EDIT_PERSON}, + {"profileNameAndPicture", IDS_SETTINGS_PROFILE_NAME_AND_PICTURE}, {"showShortcutLabel", IDS_SETTINGS_PROFILE_SHORTCUT_TOGGLE_LABEL}, #endif // defined(OS_CHROMEOS) +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + {"peopleSignIn", IDS_SETTINGS_PEOPLE_SIGN_IN}, + {"peopleSignInPrompt", IDS_SETTINGS_PEOPLE_SIGN_IN_PROMPT}, + {"peopleSignInPromptSecondary", + IDS_SETTINGS_PEOPLE_SIGN_IN_PROMPT_SECONDARY}, + {"useAnotherAccount", IDS_SETTINGS_PEOPLE_SYNC_ANOTHER_ACCOUNT}, + {"syncAsName", IDS_SETTINGS_PEOPLE_SYNC_AS_NAME}, + {"syncedToName", IDS_SETTINGS_PEOPLE_SYNCED_AS_NAME}, + {"turnOffSync", IDS_SETTINGS_PEOPLE_SYNC_TURN_OFF}, +#endif {"syncOverview", IDS_SETTINGS_SYNC_OVERVIEW}, {"syncDisabledByAdministrator", IDS_SETTINGS_SYNC_DISABLED_BY_ADMINISTRATOR}, @@ -1563,6 +1618,20 @@ void AddPeopleStrings(content::WebUIDataSource* html_source) { IDS_SETTINGS_SYNC_DISCONNECT_MANAGED_PROFILE_EXPLANATION, base::ASCIIToUTF16("$1"), base::ASCIIToUTF16(sync_dashboard_url))); + + // The syncDisconnect text differs depending on Dice-enabledness. + if (signin::IsDiceEnabledForProfile(profile->GetPrefs())) { + LocalizedString sync_disconnect_strings[] = { + {"syncDisconnect", IDS_SETTINGS_TURN_OFF_SYNC_DIALOG_CONFIRM}, + {"syncDisconnectTitle", IDS_SETTINGS_TURN_OFF_SYNC_DIALOG_TITLE}, + {"syncDisconnectDeleteProfile", + IDS_SETTINGS_TURN_OFF_SYNC_DIALOG_CHECKBOX}, + {"syncDisconnectConfirm", + IDS_SETTINGS_TURN_OFF_SYNC_DIALOG_MANAGED_CONFIRM}, + }; + AddLocalizedStringsBulk(html_source, sync_disconnect_strings, + arraysize(sync_disconnect_strings)); + } #endif html_source->AddString("syncErrorHelpUrl", chrome::kSyncErrorsHelpURL); @@ -1595,6 +1664,7 @@ void AddPrintingStrings(content::WebUIDataSource* html_source) { {"editPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_EDIT}, {"removePrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_REMOVE}, {"searchLabel", IDS_SETTINGS_PRINTING_CUPS_SEARCH_LABEL}, + {"noSearchResults", IDS_SEARCH_NO_RESULTS}, {"printerDetailsTitle", IDS_SETTINGS_PRINTING_CUPS_PRINTER_DETAILS_TITLE}, {"printerName", IDS_SETTINGS_PRINTING_CUPS_PRINTER_DETAILS_NAME}, {"printerModel", IDS_SETTINGS_PRINTING_CUPS_PRINTER_DETAILS_MODEL}, @@ -1626,13 +1696,12 @@ void AddPrintingStrings(content::WebUIDataSource* html_source) { {"printerProtocolUsb", IDS_SETTINGS_PRINTING_CUPS_PRINTER_PROTOCOL_USB}, {"printerConfiguringMessage", IDS_SETTINGS_PRINTING_CUPS_PRINTER_CONFIGURING_MESSAGE}, - {"searchingPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTER_SEARCHING_PRINTER}, - {"printerNotFound", IDS_SETTINGS_PRINTING_CUPS_PRINTER_NOT_FOUND_PRINTER}, - {"printerFound", IDS_SETTINGS_PRINTING_CUPS_PRINTER_FOUND_PRINTER}, {"printerManufacturer", IDS_SETTINGS_PRINTING_CUPS_PRINTER_MANUFACTURER}, {"selectDriver", IDS_SETTINGS_PRINTING_CUPS_PRINTER_SELECT_DRIVER}, {"selectDriverButtonText", IDS_SETTINGS_PRINTING_CUPS_PRINTER_BUTTON_SELECT_DRIVER}, + {"selectDriverErrorMessage", + IDS_SETTINGS_PRINTING_CUPS_PRINTER_INVALID_DRIVER}, {"printerAddedSuccessfulMessage", IDS_SETTINGS_PRINTING_CUPS_PRINTER_ADDED_PRINTER_DONE_MESSAGE}, {"noPrinterNearbyMessage", @@ -1711,9 +1780,6 @@ void AddPrivacyStrings(content::WebUIDataSource* html_source, AddLocalizedStringsBulk(html_source, localized_strings, arraysize(localized_strings)); - html_source->AddBoolean("tabsInCbd", - base::FeatureList::IsEnabled(features::kTabsInCbd)); - html_source->AddBoolean( "importantSitesInCbd", base::FeatureList::IsEnabled(features::kImportantSitesInCbd)); @@ -1946,6 +2012,9 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source, {"siteSettingsSoundAllowRecommended", IDS_SETTINGS_SITE_SETTINGS_SOUND_ALLOW_RECOMMENDED}, {"siteSettingsSoundBlock", IDS_SETTINGS_SITE_SETTINGS_SOUND_BLOCK}, + {"siteSettingsSensors", IDS_SETTINGS_SITE_SETTINGS_SENSORS}, + {"siteSettingsSensorsAllow", IDS_SETTINGS_SITE_SETTINGS_SENSORS_ALLOW}, + {"siteSettingsSensorsBlock", IDS_SETTINGS_SITE_SETTINGS_SENSORS_BLOCK}, {"siteSettingsFlash", IDS_SETTINGS_SITE_SETTINGS_FLASH}, {"siteSettingsPdfDocuments", IDS_SETTINGS_SITE_SETTINGS_PDF_DOCUMENTS}, {"siteSettingsPdfDownloadPdfs", @@ -2101,7 +2170,7 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source, {"handlerSetDefault", IDS_SETTINGS_SITE_SETTINGS_HANDLER_SET_DEFAULT}, {"handlerRemove", IDS_SETTINGS_SITE_SETTINGS_REMOVE}, {"adobeFlashStorage", IDS_SETTINGS_SITE_SETTINGS_ADOBE_FLASH_SETTINGS}, - {"learnMore", IDS_SETTINGS_SITE_SETTINGS_LEARN_MORE}, + {"learnMore", IDS_LEARN_MORE}, {"incognitoSite", IDS_SETTINGS_SITE_SETTINGS_INCOGNITO}, {"incognitoSiteOnly", IDS_SETTINGS_SITE_SETTINGS_INCOGNITO_ONLY}, {"embeddedIncognitoSite", IDS_SETTINGS_SITE_SETTINGS_INCOGNITO_EMBEDDED}, @@ -2130,6 +2199,10 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source, "enableClipboardContentSetting", base::FeatureList::IsEnabled(features::kClipboardContentSetting)); + html_source->AddBoolean( + "enableSensorsContentSetting", + base::FeatureList::IsEnabled(features::kGenericSensorExtraClasses)); + if (PluginUtils::ShouldPreferHtmlOverPlugins( HostContentSettingsMapFactory::GetForProfile(profile))) { LocalizedString flash_strings[] = { @@ -2157,7 +2230,6 @@ void AddUsersStrings(content::WebUIDataSource* html_source) { {"usersModifiedByOwnerLabel", IDS_SETTINGS_USERS_MODIFIED_BY_OWNER_LABEL}, {"guestBrowsingLabel", IDS_SETTINGS_USERS_GUEST_BROWSING_LABEL}, {"settingsManagedLabel", IDS_SETTINGS_USERS_MANAGED_LABEL}, - {"supervisedUsersLabel", IDS_SETTINGS_USERS_SUPERVISED_USERS_LABEL}, {"showOnSigninLabel", IDS_SETTINGS_USERS_SHOW_ON_SIGNIN_LABEL}, {"restrictSigninLabel", IDS_SETTINGS_USERS_RESTRICT_SIGNIN_LABEL}, {"deviceOwnerLabel", IDS_SETTINGS_USERS_DEVICE_OWNER_LABEL}, @@ -2245,16 +2317,17 @@ void AddLocalizedStrings(content::WebUIDataSource* html_source, #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) AddChromeCleanupStrings(html_source); + AddIncompatibleApplicationsStrings(html_source); #endif // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) AddChangePasswordStrings(html_source); - AddClearBrowsingDataStrings(html_source); + AddClearBrowsingDataStrings(html_source, profile); AddCommonStrings(html_source, profile); AddDownloadsStrings(html_source); AddLanguagesStrings(html_source); AddOnStartupStrings(html_source); AddPasswordsAndFormsStrings(html_source); - AddPeopleStrings(html_source); + AddPeopleStrings(html_source, profile); AddPrintingStrings(html_source); AddPrivacyStrings(html_source, profile); AddResetStrings(html_source); 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 30779acd938..c3d1a1d2812 100644 --- a/chromium/chrome/browser/ui/webui/settings/md_settings_ui.cc +++ b/chromium/chrome/browser/ui/webui/settings/md_settings_ui.cc @@ -54,6 +54,9 @@ #include "chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win.h" #include "chrome/browser/ui/webui/settings/chrome_cleanup_handler.h" #if defined(GOOGLE_CHROME_BUILD) +#include "chrome/browser/conflicts/problematic_programs_updater_win.h" +#include "chrome/browser/conflicts/token_util_win.h" +#include "chrome/browser/ui/webui/settings/incompatible_applications_handler_win.h" #include "chrome/grit/chrome_unscaled_resources.h" #endif #endif // defined(OS_WIN) @@ -88,6 +91,7 @@ #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) @@ -222,9 +226,21 @@ MdSettingsUI::MdSettingsUI(content::WebUI* web_ui) // should never change while Chrome is open. html_source->AddBoolean("userInitiatedCleanupsEnabled", userInitiatedCleanupsEnabled); - #endif // defined(OS_WIN) +#if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) + bool has_incompatible_applications = + ProblematicProgramsUpdater::IsIncompatibleApplicationsWarningEnabled() && + ProblematicProgramsUpdater::HasCachedPrograms(); + html_source->AddBoolean("showIncompatibleApplications", + has_incompatible_applications); + html_source->AddBoolean("hasAdminRights", HasAdminRights()); + + if (has_incompatible_applications) + AddSettingsPageUIHandler( + std::make_unique<IncompatibleApplicationsHandler>()); +#endif // OS_WIN && defined(GOOGLE_CHROME_BUILD) + bool password_protection_available = false; #if defined(SAFE_BROWSING_DB_LOCAL) safe_browsing::ChromePasswordProtectionService* password_protection = @@ -281,7 +297,10 @@ MdSettingsUI::MdSettingsUI(content::WebUI* web_ui) AddSettingsPageUIHandler(std::make_unique<chromeos::settings::PowerHandler>( profile->GetPrefs())); } -#endif +#else // !defined(OS_CHROMEOS) + html_source->AddBoolean("diceEnabled", + signin::IsDiceEnabledForProfile(profile->GetPrefs())); +#endif // defined(OS_CHROMEOS) html_source->AddBoolean("showExportPasswords", base::FeatureList::IsEnabled( diff --git a/chromium/chrome/browser/ui/webui/settings/metrics_reporting_handler.cc b/chromium/chrome/browser/ui/webui/settings/metrics_reporting_handler.cc index 60d70778592..def21ea78e0 100644 --- a/chromium/chrome/browser/ui/webui/settings/metrics_reporting_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/metrics_reporting_handler.cc @@ -63,7 +63,8 @@ std::unique_ptr<base::DictionaryValue> MetricsReportingHandler::CreateMetricsReportingDict() { std::unique_ptr<base::DictionaryValue> dict( std::make_unique<base::DictionaryValue>()); - dict->SetBoolean("enabled", + dict->SetBoolean( + "enabled", ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled()); dict->SetBoolean("managed", IsMetricsReportingPolicyManaged()); return dict; diff --git a/chromium/chrome/browser/ui/webui/settings/people_handler.cc b/chromium/chrome/browser/ui/webui/settings/people_handler.cc index 170db11ae9c..8c8cddf5897 100644 --- a/chromium/chrome/browser/ui/webui/settings/people_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/people_handler.cc @@ -31,8 +31,6 @@ #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/singleton_tabs.h" -#include "chrome/browser/ui/user_manager.h" -#include "chrome/browser/ui/webui/profile_helper.h" #include "chrome/browser/ui/webui/signin/login_ui_service.h" #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" #include "chrome/common/chrome_switches.h" @@ -62,8 +60,17 @@ #if defined(OS_CHROMEOS) #include "components/signin/core/browser/signin_manager_base.h" #else +#include "chrome/browser/ui/user_manager.h" +#include "chrome/browser/ui/webui/profile_helper.h" #include "components/signin/core/browser/signin_manager.h" #endif +#if BUILDFLAG(ENABLE_DICE_SUPPORT) +#include "chrome/browser/profiles/profile_avatar_icon_util.h" +#include "chrome/browser/signin/account_tracker_service_factory.h" +#include "components/signin/core/browser/account_tracker_service.h" +#include "third_party/skia/include/core/SkBitmap.h" +#include "ui/gfx/image/image.h" +#endif using browser_sync::ProfileSyncService; using content::WebContents; @@ -186,7 +193,14 @@ PeopleHandler::PeopleHandler(Profile* profile) : profile_(profile), configuring_sync_(false), signin_observer_(this), - sync_service_observer_(this) {} +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + sync_service_observer_(this), + account_tracker_observer_(this) { +} +#else + sync_service_observer_(this) { +} +#endif PeopleHandler::~PeopleHandler() { // Early exit if running unit tests (no actual WebUI is attached). @@ -231,6 +245,16 @@ void PeopleHandler::RegisterMessages() { "SyncSetupStartSignIn", base::Bind(&PeopleHandler::HandleStartSignin, base::Unretained(this))); #endif +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + web_ui()->RegisterMessageCallback( + "SyncSetupGetStoredAccounts", + base::BindRepeating(&PeopleHandler::HandleGetStoredAccounts, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "SyncSetupStartSyncingWithEmail", + base::BindRepeating(&PeopleHandler::HandleStartSyncingWithEmail, + base::Unretained(this))); +#endif } void PeopleHandler::OnJavascriptAllowed() { @@ -249,12 +273,22 @@ void PeopleHandler::OnJavascriptAllowed() { ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile_)); if (sync_service) sync_service_observer_.Add(sync_service); + +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + AccountTrackerService* account_tracker( + AccountTrackerServiceFactory::GetForProfile(profile_)); + if (account_tracker) + account_tracker_observer_.Add(account_tracker); +#endif } void PeopleHandler::OnJavascriptDisallowed() { profile_pref_registrar_.RemoveAll(); signin_observer_.RemoveAll(); sync_service_observer_.RemoveAll(); +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + account_tracker_observer_.RemoveAll(); +#endif } #if !defined(OS_CHROMEOS) @@ -407,6 +441,68 @@ void PeopleHandler::HandleSetDatatypes(const base::ListValue* args) { ProfileMetrics::LogProfileSyncInfo(ProfileMetrics::SYNC_CHOOSE); } +#if BUILDFLAG(ENABLE_DICE_SUPPORT) +void PeopleHandler::HandleGetStoredAccounts(const base::ListValue* args) { + CHECK_EQ(1U, args->GetSize()); + const base::Value* callback_id; + CHECK(args->Get(0, &callback_id)); + + ResolveJavascriptCallback(*callback_id, *GetStoredAccountsList()); +} + +void PeopleHandler::OnAccountUpdated(const AccountInfo& info) { + FireWebUIListener("stored-accounts-updated", *GetStoredAccountsList()); +} + +void PeopleHandler::OnAccountRemoved(const AccountInfo& info) { + FireWebUIListener("stored-accounts-updated", *GetStoredAccountsList()); +} + +std::unique_ptr<base::ListValue> PeopleHandler::GetStoredAccountsList() { + std::vector<AccountInfo> accounts = + signin_ui_util::GetAccountsForDicePromos(profile_); + + AccountTrackerService* account_tracker = + AccountTrackerServiceFactory::GetForProfile(profile_); + std::unique_ptr<base::ListValue> accounts_list(new base::ListValue); + accounts_list->Reserve(accounts.size()); + + for (auto const& account : accounts) { + accounts_list->GetList().push_back( + base::Value(base::Value::Type::DICTIONARY)); + base::Value& acc = accounts_list->GetList().back(); + acc.SetKey("email", base::Value(account.email)); + acc.SetKey("fullName", base::Value(account.full_name)); + acc.SetKey("givenName", base::Value(account.given_name)); + const gfx::Image& account_image = + account_tracker->GetAccountImage(account.account_id); + if (!account_image.IsEmpty()) { + acc.SetKey( + "avatarImage", + base::Value(webui::GetBitmapDataUrl(account_image.AsBitmap()))); + } + } + + return accounts_list; +} + +void PeopleHandler::HandleStartSyncingWithEmail(const base::ListValue* args) { + const base::Value* email; + CHECK(args->Get(0, &email)); + + Browser* browser = + chrome::FindBrowserWithWebContents(web_ui()->GetWebContents()); + + AccountTrackerService* account_tracker = + AccountTrackerServiceFactory::GetForProfile(profile_); + AccountInfo account = + account_tracker->FindAccountInfoByEmail(email->GetString()); + + signin_ui_util::EnableSync( + browser, account, signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS); +} +#endif + void PeopleHandler::HandleSetEncryption(const base::ListValue* args) { DCHECK(!sync_startup_tracker_); @@ -545,7 +641,6 @@ void PeopleHandler::HandleStopSyncing(const base::ListValue* args) { if (delete_profile) { webui::DeleteProfileAtPath(profile_->GetPath(), - web_ui(), ProfileMetrics::DELETE_PROFILE_SETTINGS); } } @@ -562,8 +657,10 @@ void PeopleHandler::HandleGetSyncStatus(const base::ListValue* args) { } void PeopleHandler::HandleManageOtherPeople(const base::ListValue* /* args */) { +#if !defined(OS_CHROMEOS) UserManager::Show(base::FilePath(), profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION); +#endif // !defined(OS_CHROMEOS) } void PeopleHandler::CloseSyncSetup() { @@ -762,8 +859,6 @@ PeopleHandler::GetSyncStatusDictionary() { ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile_); sync_status->SetBoolean("signinAllowed", signin->IsSigninAllowed()); sync_status->SetBoolean("syncSystemEnabled", (service != nullptr)); - sync_status->SetBoolean("setupCompleted", - service && service->IsFirstSetupComplete()); sync_status->SetBoolean( "setupInProgress", service && !service->IsManaged() && service->IsFirstSetupInProgress()); @@ -786,7 +881,6 @@ PeopleHandler::GetSyncStatusDictionary() { signin_ui_util::GetAuthenticatedUsername(signin)); sync_status->SetBoolean("hasUnrecoverableError", service && service->HasUnrecoverableError()); - return sync_status; } diff --git a/chromium/chrome/browser/ui/webui/settings/people_handler.h b/chromium/chrome/browser/ui/webui/settings/people_handler.h index be8ab4ea3a4..0ea976fa175 100644 --- a/chromium/chrome/browser/ui/webui/settings/people_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/people_handler.h @@ -14,13 +14,19 @@ #include "base/strings/utf_string_conversions.h" #include "base/timer/timer.h" #include "build/build_config.h" +#include "build/buildflag.h" #include "chrome/browser/sync/sync_startup_tracker.h" #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" #include "chrome/browser/ui/webui/signin/login_ui_service.h" #include "components/prefs/pref_change_registrar.h" +#include "components/signin/core/browser/signin_features.h" #include "components/signin/core/browser/signin_manager_base.h" #include "components/sync/driver/sync_service_observer.h" +#if BUILDFLAG(ENABLE_DICE_SUPPORT) +#include "components/signin/core/browser/account_tracker_service.h" +#endif + class LoginUIService; class SigninManagerBase; @@ -45,6 +51,9 @@ namespace settings { class PeopleHandler : public SettingsPageUIHandler, public SigninManagerBase::Observer, public SyncStartupTracker::Observer, +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + public AccountTrackerService::Observer, +#endif public LoginUIService::LoginUI, public syncer::SyncServiceObserver { public: @@ -122,6 +131,12 @@ class PeopleHandler : public SettingsPageUIHandler, // syncer::SyncServiceObserver implementation. void OnStateChanged(syncer::SyncService* sync) override; +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + // AccountTrackerService::Observer implementation. + void OnAccountUpdated(const AccountInfo& info) override; + void OnAccountRemoved(const AccountInfo& info) override; +#endif + // Returns a newly created dictionary with a number of properties that // correspond to the status of sync. std::unique_ptr<base::DictionaryValue> GetSyncStatusDictionary(); @@ -155,6 +170,12 @@ class PeopleHandler : public SettingsPageUIHandler, signin_metrics::AccessPoint access_point); #endif +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + void HandleGetStoredAccounts(const base::ListValue* args); + void HandleStartSyncingWithEmail(const base::ListValue* args); + std::unique_ptr<base::ListValue> GetStoredAccountsList(); +#endif + // Displays spinner-only UI indicating that something is going on in the // background. // TODO(kochi): better to show some message that the user can understand what @@ -211,6 +232,11 @@ class PeopleHandler : public SettingsPageUIHandler, ScopedObserver<browser_sync::ProfileSyncService, PeopleHandler> sync_service_observer_; +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + ScopedObserver<AccountTrackerService, PeopleHandler> + account_tracker_observer_; +#endif + DISALLOW_COPY_AND_ASSIGN(PeopleHandler); }; 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 ec5442d0d1b..13312118858 100644 --- a/chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc +++ b/chromium/chrome/browser/ui/webui/settings/people_handler_unittest.cc @@ -47,6 +47,7 @@ #include "ui/base/layout.h" using ::testing::_; +using ::testing::Invoke; using ::testing::Mock; using ::testing::Return; using ::testing::ReturnRef; @@ -197,8 +198,7 @@ class PeopleHandlerTest : public ChromeRenderViewHostTestHarness { error_ = GoogleServiceAuthError::AuthErrorNone(); // Sign in the user. - mock_signin_ = static_cast<SigninManagerBase*>( - SigninManagerFactory::GetForProfile(profile())); + mock_signin_ = SigninManagerFactory::GetForProfile(profile()); std::string username = GetTestUser(); if (!username.empty()) mock_signin_->SetAuthenticatedAccountInfo(username, username); @@ -213,6 +213,10 @@ class PeopleHandlerTest : public ChromeRenderViewHostTestHarness { Return(base::Time())); ON_CALL(*mock_pss_, GetRegisteredDataTypes()) .WillByDefault(Return(syncer::ModelTypeSet())); + ON_CALL(*mock_pss_, GetSetupInProgressHandle()) + .WillByDefault( + Invoke(mock_pss_, + &ProfileSyncServiceMock::GetSetupInProgressHandleConcrete)); mock_pss_->Initialize(); @@ -332,7 +336,7 @@ TEST_F(PeopleHandlerFirstSigninTest, DisplayBasicLogin) { EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(false)); EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); // Ensure that the user is not signed in before calling |HandleStartSignin()|. - SigninManager* manager = static_cast<SigninManager*>(mock_signin_); + SigninManager* manager = SigninManager::FromSigninManagerBase(mock_signin_); manager->SignOut(signin_metrics::SIGNOUT_TEST, signin_metrics::SignoutDelete::IGNORE_METRIC); base::ListValue list_args; diff --git a/chromium/chrome/browser/ui/webui/settings/profile_info_handler.cc b/chromium/chrome/browser/ui/webui/settings/profile_info_handler.cc index 6261f7f9c28..299d6fe9a8d 100644 --- a/chromium/chrome/browser/ui/webui/settings/profile_info_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/profile_info_handler.cc @@ -9,7 +9,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_attributes_entry.h" -#include "chrome/browser/ui/user_manager.h" +#include "chrome/browser/profiles/profile_manager.h" #include "chrome/common/pref_names.h" #include "ui/base/webui/web_ui_util.h" @@ -32,9 +32,6 @@ namespace settings { // static const char ProfileInfoHandler::kProfileInfoChangedEventName[] = "profile-info-changed"; -const char - ProfileInfoHandler::kProfileManagesSupervisedUsersChangedEventName[] = - "profile-manages-supervised-users-changed"; const char ProfileInfoHandler::kProfileStatsCountReadyEventName[] = "profile-stats-count-ready"; @@ -63,23 +60,12 @@ void ProfileInfoHandler::RegisterMessages() { base::Bind(&ProfileInfoHandler::HandleGetProfileStats, base::Unretained(this))); #endif - web_ui()->RegisterMessageCallback( - "getProfileManagesSupervisedUsers", - base::Bind(&ProfileInfoHandler::HandleGetProfileManagesSupervisedUsers, - base::Unretained(this))); } void ProfileInfoHandler::OnJavascriptAllowed() { profile_observer_.Add( &g_browser_process->profile_manager()->GetProfileAttributesStorage()); - PrefService* prefs = profile_->GetPrefs(); - profile_pref_registrar_.Init(prefs); - profile_pref_registrar_.Add( - prefs::kSupervisedUsers, - base::Bind(&ProfileInfoHandler::PushProfileManagesSupervisedUsersStatus, - base::Unretained(this))); - #if defined(OS_CHROMEOS) user_manager_observer_.Add(user_manager::UserManager::Get()); #endif @@ -91,8 +77,6 @@ void ProfileInfoHandler::OnJavascriptDisallowed() { profile_observer_.Remove( &g_browser_process->profile_manager()->GetProfileAttributesStorage()); - profile_pref_registrar_.RemoveAll(); - #if defined(OS_CHROMEOS) user_manager_observer_.Remove(user_manager::UserManager::Get()); #endif @@ -147,29 +131,10 @@ void ProfileInfoHandler::PushProfileStatsCount( } #endif -void ProfileInfoHandler::HandleGetProfileManagesSupervisedUsers( - const base::ListValue* args) { - AllowJavascript(); - - CHECK_EQ(1U, args->GetSize()); - const base::Value* callback_id; - CHECK(args->Get(0, &callback_id)); - - ResolveJavascriptCallback(*callback_id, - base::Value(IsProfileManagingSupervisedUsers())); -} - void ProfileInfoHandler::PushProfileInfo() { FireWebUIListener(kProfileInfoChangedEventName, *GetAccountNameAndIcon()); } -void ProfileInfoHandler::PushProfileManagesSupervisedUsersStatus() { - CallJavascriptFunction( - "cr.webUIListenerCallback", - base::Value(kProfileManagesSupervisedUsersChangedEventName), - base::Value(IsProfileManagingSupervisedUsers())); -} - std::unique_ptr<base::DictionaryValue> ProfileInfoHandler::GetAccountNameAndIcon() const { std::string name; @@ -208,8 +173,4 @@ ProfileInfoHandler::GetAccountNameAndIcon() const { return response; } -bool ProfileInfoHandler::IsProfileManagingSupervisedUsers() const { - return !profile_->GetPrefs()->GetDictionary(prefs::kSupervisedUsers)->empty(); -} - } // namespace settings diff --git a/chromium/chrome/browser/ui/webui/settings/profile_info_handler.h b/chromium/chrome/browser/ui/webui/settings/profile_info_handler.h index 5d8386beace..0d7d986709c 100644 --- a/chromium/chrome/browser/ui/webui/settings/profile_info_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/profile_info_handler.h @@ -32,7 +32,6 @@ class ProfileInfoHandler : public SettingsPageUIHandler, public ProfileAttributesStorage::Observer { public: static const char kProfileInfoChangedEventName[]; - static const char kProfileManagesSupervisedUsersChangedEventName[]; static const char kProfileStatsCountReadyEventName[]; explicit ProfileInfoHandler(Profile* profile); @@ -56,14 +55,9 @@ class ProfileInfoHandler : public SettingsPageUIHandler, private: FRIEND_TEST_ALL_PREFIXES(ProfileInfoHandlerTest, GetProfileInfo); FRIEND_TEST_ALL_PREFIXES(ProfileInfoHandlerTest, PushProfileInfo); - FRIEND_TEST_ALL_PREFIXES(ProfileInfoHandlerTest, - GetProfileManagesSupervisedUsers); - FRIEND_TEST_ALL_PREFIXES(ProfileInfoHandlerTest, - PushProfileManagesSupervisedUsers); // Callbacks from the page. void HandleGetProfileInfo(const base::ListValue* args); - void HandleGetProfileManagesSupervisedUsers(const base::ListValue* args); void PushProfileInfo(); #if !defined(OS_CHROMEOS) @@ -74,12 +68,6 @@ class ProfileInfoHandler : public SettingsPageUIHandler, void PushProfileStatsCount(profiles::ProfileCategoryStats stats); #endif - // Pushes whether the current profile manages supervised users to JavaScript. - void PushProfileManagesSupervisedUsersStatus(); - - // Returns true if this profile manages supervised users. - bool IsProfileManagingSupervisedUsers() const; - std::unique_ptr<base::DictionaryValue> GetAccountNameAndIcon() const; // Weak pointer. @@ -93,9 +81,6 @@ class ProfileInfoHandler : public SettingsPageUIHandler, ScopedObserver<ProfileAttributesStorage, ProfileInfoHandler> profile_observer_; - // Used to listen for changes in the list of managed supervised users. - PrefChangeRegistrar profile_pref_registrar_; - // Used to cancel callbacks when JavaScript becomes disallowed. base::WeakPtrFactory<ProfileInfoHandler> callback_weak_ptr_factory_; diff --git a/chromium/chrome/browser/ui/webui/settings/profile_info_handler_unittest.cc b/chromium/chrome/browser/ui/webui/settings/profile_info_handler_unittest.cc index 734d9b70fe2..a5229444221 100644 --- a/chromium/chrome/browser/ui/webui/settings/profile_info_handler_unittest.cc +++ b/chromium/chrome/browser/ui/webui/settings/profile_info_handler_unittest.cc @@ -151,53 +151,4 @@ TEST_F(ProfileInfoHandlerTest, PushProfileInfo) { VerifyProfileInfo(data.arg2()); } -TEST_F(ProfileInfoHandlerTest, GetProfileManagesSupervisedUsers) { - base::ListValue list_args; - list_args.AppendString("get-profile-manages-supervised-users-callback-id"); - handler()->HandleGetProfileManagesSupervisedUsers(&list_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()); - - std::string callback_id; - ASSERT_TRUE(data.arg1()->GetAsString(&callback_id)); - EXPECT_EQ("get-profile-manages-supervised-users-callback-id", callback_id); - - bool success = false; - ASSERT_TRUE(data.arg2()->GetAsBoolean(&success)); - EXPECT_TRUE(success); - - bool has_supervised_users = false; - ASSERT_TRUE(data.arg3()->GetAsBoolean(&has_supervised_users)); - EXPECT_FALSE(has_supervised_users); -} - -TEST_F(ProfileInfoHandlerTest, PushProfileManagesSupervisedUsers) { - handler()->AllowJavascript(); - - // The handler is notified of the change after |update| is destroyed. - std::unique_ptr<DictionaryPrefUpdate> update( - new DictionaryPrefUpdate(profile()->GetPrefs(), prefs::kSupervisedUsers)); - base::DictionaryValue* dict = update->Get(); - dict->SetWithoutPathExpansion("supervised-user-id", - std::make_unique<base::DictionaryValue>()); - update.reset(); - - EXPECT_EQ(1U, web_ui()->call_data().size()); - - const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); - EXPECT_EQ("cr.webUIListenerCallback", data.function_name()); - - std::string event_id; - ASSERT_TRUE(data.arg1()->GetAsString(&event_id)); - EXPECT_EQ(ProfileInfoHandler::kProfileManagesSupervisedUsersChangedEventName, - event_id); - - bool has_supervised_users = false; - ASSERT_TRUE(data.arg2()->GetAsBoolean(&has_supervised_users)); - EXPECT_TRUE(has_supervised_users); -} - } // namespace settings diff --git a/chromium/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc b/chromium/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc index 062d170c0c7..3b1453e6170 100644 --- a/chromium/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc @@ -47,9 +47,6 @@ void ProtocolHandlersHandler::RegisterMessages() { base::Bind( &ProtocolHandlersHandler::HandleObserveProtocolHandlersEnabledState, base::Unretained(this))); - web_ui()->RegisterMessageCallback("clearDefault", - base::Bind(&ProtocolHandlersHandler::HandleClearDefault, - base::Unretained(this))); web_ui()->RegisterMessageCallback("removeHandler", base::Bind(&ProtocolHandlersHandler::HandleRemoveHandler, base::Unretained(this))); @@ -59,9 +56,6 @@ void ProtocolHandlersHandler::RegisterMessages() { web_ui()->RegisterMessageCallback("setDefault", base::Bind(&ProtocolHandlersHandler::HandleSetDefault, base::Unretained(this))); - web_ui()->RegisterMessageCallback("removeIgnoredHandler", - base::Bind(&ProtocolHandlersHandler::HandleRemoveIgnoredHandler, - base::Unretained(this))); } ProtocolHandlerRegistry* ProtocolHandlersHandler::GetProtocolHandlerRegistry() { @@ -70,6 +64,7 @@ ProtocolHandlerRegistry* ProtocolHandlersHandler::GetProtocolHandlerRegistry() { } static void GetHandlersAsListValue( + const ProtocolHandlerRegistry& registry, const ProtocolHandlerRegistry::ProtocolHandlerList& handlers, base::ListValue* handler_list) { ProtocolHandlerRegistry::ProtocolHandlerList::const_iterator handler; @@ -79,6 +74,7 @@ static void GetHandlersAsListValue( handler_value->SetString("protocol", handler->protocol()); handler_value->SetString("spec", handler->url().spec()); handler_value->SetString("host", handler->url().host()); + handler_value->SetBoolean("is_default", registry.IsDefault(*handler)); handler_list->Append(std::move(handler_value)); } } @@ -88,16 +84,9 @@ void ProtocolHandlersHandler::GetHandlersForProtocol( base::DictionaryValue* handlers_value) { ProtocolHandlerRegistry* registry = GetProtocolHandlerRegistry(); handlers_value->SetString("protocol", protocol); - handlers_value->SetInteger("default_handler", - registry->GetHandlerIndex(protocol)); - handlers_value->SetBoolean( - "is_default_handler_set_by_user", - registry->IsRegisteredByUser(registry->GetHandlerFor(protocol))); - handlers_value->SetBoolean("has_policy_recommendations", - registry->HasPolicyRegisteredHandler(protocol)); auto handlers_list = std::make_unique<base::ListValue>(); - GetHandlersAsListValue(registry->GetHandlersFor(protocol), + GetHandlersAsListValue(*registry, registry->GetHandlersFor(protocol), handlers_list.get()); handlers_value->Set("handlers", std::move(handlers_list)); } @@ -106,7 +95,7 @@ void ProtocolHandlersHandler::GetIgnoredHandlers(base::ListValue* handlers) { ProtocolHandlerRegistry* registry = GetProtocolHandlerRegistry(); ProtocolHandlerRegistry::ProtocolHandlerList ignored_handlers = registry->GetIgnoredHandlers(); - return GetHandlersAsListValue(ignored_handlers, handlers); + return GetHandlersAsListValue(*registry, ignored_handlers, handlers); } void ProtocolHandlersHandler::UpdateHandlerList() { @@ -148,13 +137,8 @@ void ProtocolHandlersHandler::SendHandlersEnabledValue() { } void ProtocolHandlersHandler::HandleRemoveHandler(const base::ListValue* args) { - const base::ListValue* list; - if (!args->GetList(0, &list)) { - NOTREACHED(); - return; - } - - ProtocolHandler handler(ParseHandlerFromArgs(list)); + ProtocolHandler handler(ParseHandlerFromArgs(args)); + CHECK(!handler.IsEmpty()); GetProtocolHandlerRegistry()->RemoveHandler(handler); // No need to call UpdateHandlerList() - we should receive a notification @@ -162,18 +146,6 @@ void ProtocolHandlersHandler::HandleRemoveHandler(const base::ListValue* args) { // then. } -void ProtocolHandlersHandler::HandleRemoveIgnoredHandler( - const base::ListValue* args) { - const base::ListValue* list; - if (!args->GetList(0, &list)) { - NOTREACHED(); - return; - } - - ProtocolHandler handler(ParseHandlerFromArgs(list)); - GetProtocolHandlerRegistry()->RemoveIgnoredHandler(handler); -} - void ProtocolHandlersHandler::HandleSetHandlersEnabled( const base::ListValue* args) { bool enabled = true; @@ -184,18 +156,8 @@ void ProtocolHandlersHandler::HandleSetHandlersEnabled( GetProtocolHandlerRegistry()->Disable(); } -void ProtocolHandlersHandler::HandleClearDefault(const base::ListValue* args) { - const base::Value* value; - CHECK(args->Get(0, &value)); - std::string protocol_to_clear; - CHECK(value->GetAsString(&protocol_to_clear)); - GetProtocolHandlerRegistry()->ClearDefault(protocol_to_clear); -} - void ProtocolHandlersHandler::HandleSetDefault(const base::ListValue* args) { - const base::ListValue* list; - CHECK(args->GetList(0, &list)); - const ProtocolHandler& handler(ParseHandlerFromArgs(list)); + const ProtocolHandler& handler(ParseHandlerFromArgs(args)); CHECK(!handler.IsEmpty()); GetProtocolHandlerRegistry()->OnAcceptRegisterProtocolHandler(handler); } diff --git a/chromium/chrome/browser/ui/webui/settings/protocol_handlers_handler.h b/chromium/chrome/browser/ui/webui/settings/protocol_handlers_handler.h index 269f27f6061..cf5094ad895 100644 --- a/chromium/chrome/browser/ui/webui/settings/protocol_handlers_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/protocol_handlers_handler.h @@ -63,12 +63,8 @@ class ProtocolHandlersHandler : public SettingsPageUIHandler, // Called when the user sets a new default handler for a protocol. void HandleSetDefault(const base::ListValue* args); - // Called when the user clears the default handler for a protocol. - // |args| is the string name of the protocol to clear. - void HandleClearDefault(const base::ListValue* args); - // Parses a ProtocolHandler out of the arguments passed back from the view. - // |args| is a list of [protocol, url, title]. + // |args| is a list of [protocol, url]. ProtocolHandler ParseHandlerFromArgs(const base::ListValue* args) const; // Returns a JSON object describing the set of protocol handlers for the @@ -83,13 +79,9 @@ class ProtocolHandlersHandler : public SettingsPageUIHandler, void UpdateHandlerList(); // Remove a handler. - // |args| is a list of [protocol, url, title]. + // |args| is a list of [protocol, url]. void HandleRemoveHandler(const base::ListValue* args); - // Remove an ignored handler. - // |args| is a list of [protocol, url, title]. - void HandleRemoveIgnoredHandler(const base::ListValue* args); - ProtocolHandlerRegistry* GetProtocolHandlerRegistry(); content::NotificationRegistrar notification_registrar_; 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 e42d983ce75..f017287acdf 100644 --- a/chromium/chrome/browser/ui/webui/settings/safe_browsing_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/safe_browsing_handler.cc @@ -47,8 +47,17 @@ void SafeBrowsingHandler::HandleGetSafeBrowsingExtendedReporting( AllowJavascript(); const base::Value* callback_id; CHECK(args->Get(0, &callback_id)); - base::Value is_enabled(safe_browsing::IsExtendedReportingEnabled(*prefs_)); - ResolveJavascriptCallback(*callback_id, is_enabled); + + base::DictionaryValue dict; + dict.SetBoolean("enabled", + safe_browsing::IsExtendedReportingEnabled(*prefs_)); + // TODO(crbug.com/813107): SBEROIA policy is being deprecated, revisit this + // after it is removed. + dict.SetBoolean("managed", + !safe_browsing::IsExtendedReportingOptInAllowed(*prefs_) || + safe_browsing::IsExtendedReportingPolicyManaged(*prefs_)); + + ResolveJavascriptCallback(*callback_id, dict); } void SafeBrowsingHandler::HandleSetSafeBrowsingExtendedReportingEnabled( 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 49cd2fb9f4e..b4c04a907d9 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 @@ -27,7 +27,7 @@ #include "chrome/common/pref_names.h" #include "components/browsing_data/core/history_notice_utils.h" #include "components/browsing_data/core/pref_names.h" -#include "components/feature_engagement/features.h" +#include "components/feature_engagement/buildflags.h" #include "components/prefs/pref_member.h" #include "components/prefs/pref_service.h" #include "components/signin/core/browser/signin_manager.h" @@ -50,26 +50,23 @@ namespace { const int kMaxTimesHistoryNoticeShown = 1; // TODO(msramek): Get the list of deletion preferences from the JS side. -const char* kCounterPrefs[] = { +const char* kCounterPrefsAdvanced[] = { browsing_data::prefs::kDeleteBrowsingHistory, browsing_data::prefs::kDeleteCache, + browsing_data::prefs::kDeleteCookies, browsing_data::prefs::kDeleteDownloadHistory, browsing_data::prefs::kDeleteFormData, browsing_data::prefs::kDeleteHostedAppsData, browsing_data::prefs::kDeleteMediaLicenses, browsing_data::prefs::kDeletePasswords, + browsing_data::prefs::kDeleteSiteSettings, }; -// Additional counters for the tabbed ui. +// Additional counters for the basic tab of CBD. const char* kCounterPrefsBasic[] = { browsing_data::prefs::kDeleteCacheBasic, }; -const char* kCounterPrefsAdvanced[] = { - browsing_data::prefs::kDeleteCookies, - browsing_data::prefs::kDeleteSiteSettings, -}; - const char kRegisterableDomainField[] = "registerableDomain"; const char kReasonBitField[] = "reasonBitfield"; const char kExampleOriginField[] = "exampleOrigin"; @@ -87,13 +84,8 @@ ClearBrowsingDataHandler::ClearBrowsingDataHandler(content::WebUI* webui) : profile_(Profile::FromWebUI(webui)), sync_service_(ProfileSyncServiceFactory::GetForProfile(profile_)), sync_service_observer_(this), - show_history_footer_(false), show_history_deletion_dialog_(false), - weak_ptr_factory_(this) { - if (base::FeatureList::IsEnabled(features::kTabsInCbd)) { - browsing_data::MigratePreferencesToBasic(profile_->GetPrefs()); - } -} + weak_ptr_factory_(this) {} ClearBrowsingDataHandler::~ClearBrowsingDataHandler() { } @@ -120,32 +112,25 @@ void ClearBrowsingDataHandler::OnJavascriptAllowed() { sync_service_observer_.Add(sync_service_); DCHECK(counters_.empty()); - for (const std::string& pref : kCounterPrefs) { + for (const std::string& pref : kCounterPrefsBasic) { AddCounter(BrowsingDataCounterFactory::GetForProfileAndPref(profile_, pref), - browsing_data::ClearBrowsingDataTab::ADVANCED); + browsing_data::ClearBrowsingDataTab::BASIC); } - if (base::FeatureList::IsEnabled(features::kTabsInCbd)) { - for (const std::string& pref : kCounterPrefsBasic) { - AddCounter( - BrowsingDataCounterFactory::GetForProfileAndPref(profile_, pref), - browsing_data::ClearBrowsingDataTab::BASIC); - } - for (const std::string& pref : kCounterPrefsAdvanced) { - AddCounter( - BrowsingDataCounterFactory::GetForProfileAndPref(profile_, pref), - browsing_data::ClearBrowsingDataTab::ADVANCED); - } - PrefService* prefs = profile_->GetPrefs(); - period_ = std::make_unique<IntegerPrefMember>(); - period_->Init(browsing_data::prefs::kDeleteTimePeriod, prefs, - base::Bind(&ClearBrowsingDataHandler::HandleTimePeriodChanged, - base::Unretained(this))); - periodBasic_ = std::make_unique<IntegerPrefMember>(); - periodBasic_->Init( - browsing_data::prefs::kDeleteTimePeriodBasic, prefs, - base::Bind(&ClearBrowsingDataHandler::HandleTimePeriodChanged, - base::Unretained(this))); + for (const std::string& pref : kCounterPrefsAdvanced) { + AddCounter(BrowsingDataCounterFactory::GetForProfileAndPref(profile_, pref), + browsing_data::ClearBrowsingDataTab::ADVANCED); } + PrefService* prefs = profile_->GetPrefs(); + period_ = std::make_unique<IntegerPrefMember>(); + period_->Init( + browsing_data::prefs::kDeleteTimePeriod, prefs, + base::BindRepeating(&ClearBrowsingDataHandler::HandleTimePeriodChanged, + base::Unretained(this))); + periodBasic_ = std::make_unique<IntegerPrefMember>(); + periodBasic_->Init( + browsing_data::prefs::kDeleteTimePeriodBasic, prefs, + base::BindRepeating(&ClearBrowsingDataHandler::HandleTimePeriodChanged, + base::Unretained(this))); } void ClearBrowsingDataHandler::OnJavascriptDisallowed() { @@ -239,8 +224,10 @@ void ClearBrowsingDataHandler::HandleClearBrowsingData( case BrowsingDataType::BOOKMARKS: // Only implemented on Android. NOTREACHED(); + break; case BrowsingDataType::NUM_TYPES: NOTREACHED(); + break; } } @@ -455,25 +442,15 @@ void ClearBrowsingDataHandler::OnStateChanged(syncer::SyncService* sync) { void ClearBrowsingDataHandler::UpdateSyncState() { auto* signin_manager = SigninManagerFactory::GetForProfile(profile_); - // TODO(dullweber): Remove "show_history_footer" attribute when the new UI - // is launched as it doesn't have this footer anymore. Instead the - // myactivity.google.com link is shown when a user is signed in or syncing. CallJavascriptFunction( "cr.webUIListenerCallback", base::Value("update-sync-state"), base::Value(signin_manager && signin_manager->IsAuthenticated()), base::Value(sync_service_ && sync_service_->IsSyncActive() && sync_service_->GetActiveDataTypes().Has( - syncer::HISTORY_DELETE_DIRECTIVES)), - base::Value(show_history_footer_)); + syncer::HISTORY_DELETE_DIRECTIVES))); } void ClearBrowsingDataHandler::RefreshHistoryNotice() { - browsing_data::ShouldShowNoticeAboutOtherFormsOfBrowsingHistory( - sync_service_, - WebHistoryServiceFactory::GetForProfile(profile_), - base::Bind(&ClearBrowsingDataHandler::UpdateHistoryNotice, - weak_ptr_factory_.GetWeakPtr())); - // If the dialog with history notice has been shown less than // |kMaxTimesHistoryNoticeShown| times, we might have to show it when the // user deletes history. Find out if the conditions are met. @@ -490,15 +467,6 @@ void ClearBrowsingDataHandler::RefreshHistoryNotice() { } } -void ClearBrowsingDataHandler::UpdateHistoryNotice(bool show) { - show_history_footer_ = show; - UpdateSyncState(); - - UMA_HISTOGRAM_BOOLEAN( - "History.ClearBrowsingData.HistoryNoticeShownInFooterWhenUpdated", - show_history_footer_); -} - void ClearBrowsingDataHandler::UpdateHistoryDeletionDialog(bool show) { // This is used by OnClearingTaskFinished (when the deletion finishes). show_history_deletion_dialog_ = show; 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 1cbd4ea698a..f135b0172af 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 @@ -80,10 +80,6 @@ class ClearBrowsingDataHandler : public SettingsPageUIHandler, // in user's account. void RefreshHistoryNotice(); - // Called as an asynchronous response to |RefreshHistoryNotice()|. Shows or - // hides the footer about other forms of history stored in user's account. - void UpdateHistoryNotice(bool show); - // Called as an asynchronous response to |RefreshHistoryNotice()|. Enables or // disables the dialog about other forms of history stored in user's account // that is shown when the history deletion is finished. @@ -111,11 +107,6 @@ class ClearBrowsingDataHandler : public SettingsPageUIHandler, ScopedObserver<browser_sync::ProfileSyncService, syncer::SyncServiceObserver> sync_service_observer_; - // Whether the sentence about other forms of history stored in user's account - // should be displayed in the footer. This value is retrieved asynchronously, - // so we cache it here. - bool show_history_footer_; - // Whether we should show a dialog informing the user about other forms of // history stored in their account after the history deletion is finished. bool show_history_deletion_dialog_; 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 0a4b4442f20..c413d8569ab 100644 --- a/chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc +++ b/chromium/chrome/browser/ui/webui/settings/site_settings_handler.cc @@ -9,6 +9,7 @@ #include <string> #include <utility> +#include "base/barrier_closure.h" #include "base/bind.h" #include "base/i18n/number_formatting.h" #include "base/macros.h" @@ -45,7 +46,7 @@ #include "extensions/common/permissions/api_permission.h" #include "extensions/common/permissions/permissions_data.h" #include "storage/browser/quota/quota_manager.h" -#include "third_party/WebKit/common/quota/quota_types.mojom.h" +#include "third_party/WebKit/public/mojom/quota/quota_types.mojom.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/text/bytes_formatting.h" @@ -92,7 +93,7 @@ void AddExceptionsGrantedByHostedApps(content::BrowserContext* context, !(*extension)->permissions_data()->HasAPIPermission(permission)) continue; - extensions::URLPatternSet web_extent = (*extension)->web_extent(); + const extensions::URLPatternSet& web_extent = (*extension)->web_extent(); // Add patterns from web extent. for (extensions::URLPatternSet::const_iterator pattern = web_extent.begin(); pattern != web_extent.end(); ++pattern) { @@ -159,6 +160,9 @@ void SiteSettingsHandler::RegisterMessages() { base::Bind(&SiteSettingsHandler::HandleSetOriginPermissions, base::Unretained(this))); web_ui()->RegisterMessageCallback( + "clearFlashPref", base::Bind(&SiteSettingsHandler::HandleClearFlashPref, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( "resetCategoryPermissionForPattern", base::Bind(&SiteSettingsHandler::HandleResetCategoryPermissionForPattern, base::Unretained(this))); @@ -248,14 +252,18 @@ void SiteSettingsHandler::OnGetUsageInfo( } } -void SiteSettingsHandler::OnUsageInfoCleared( - blink::mojom::QuotaStatusCode code) { +void SiteSettingsHandler::OnStorageCleared(base::OnceClosure callback, + blink::mojom::QuotaStatusCode code) { if (code == blink::mojom::QuotaStatusCode::kOk) { - CallJavascriptFunction("settings.WebsiteUsagePrivateApi.onUsageCleared", - base::Value(clearing_origin_)); + std::move(callback).Run(); } } +void SiteSettingsHandler::OnUsageCleared() { + CallJavascriptFunction("settings.WebsiteUsagePrivateApi.onUsageCleared", + base::Value(clearing_origin_)); +} + #if defined(OS_CHROMEOS) void SiteSettingsHandler::OnPrefEnableDrmChanged() { CallJavascriptFunction("cr.webUIListenerCallback", @@ -355,19 +363,25 @@ void SiteSettingsHandler::HandleClearUsage( if (url.is_valid()) { clearing_origin_ = origin; + // Call OnUsageCleared when StorageInfoFetcher::ClearStorage and + // BrowsingDataLocalStorageHelper::DeleteOrigin are done. + base::RepeatingClosure barrier = base::BarrierClosure( + 2, base::BindOnce(&SiteSettingsHandler::OnUsageCleared, + base::Unretained(this))); + // Start by clearing the storage data asynchronously. scoped_refptr<StorageInfoFetcher> storage_info_fetcher = new StorageInfoFetcher(profile_); storage_info_fetcher->ClearStorage( url.host(), static_cast<blink::mojom::StorageType>(static_cast<int>(storage_type)), - base::Bind(&SiteSettingsHandler::OnUsageInfoCleared, - base::Unretained(this))); + base::BindRepeating(&SiteSettingsHandler::OnStorageCleared, + base::Unretained(this), barrier)); // Also clear the *local* storage data. scoped_refptr<BrowsingDataLocalStorageHelper> local_storage_helper = new BrowsingDataLocalStorageHelper(profile_); - local_storage_helper->DeleteOrigin(url); + local_storage_helper->DeleteOrigin(url, barrier); } } @@ -621,6 +635,19 @@ void SiteSettingsHandler::HandleSetOriginPermissions( } } +void SiteSettingsHandler::HandleClearFlashPref(const base::ListValue* args) { + CHECK_EQ(1U, args->GetSize()); + std::string origin_string; + CHECK(args->GetString(0, &origin_string)); + + HostContentSettingsMap* map = + HostContentSettingsMapFactory::GetForProfile(profile_); + const GURL origin(origin_string); + map->SetWebsiteSettingDefaultScope(origin, origin, + CONTENT_SETTINGS_TYPE_PLUGINS_DATA, + std::string(), nullptr); +} + void SiteSettingsHandler::HandleResetCategoryPermissionForPattern( const base::ListValue* args) { CHECK_EQ(4U, args->GetSize()); 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 63fa495c22e..01be8c4849d 100644 --- a/chromium/chrome/browser/ui/webui/settings/site_settings_handler.h +++ b/chromium/chrome/browser/ui/webui/settings/site_settings_handler.h @@ -16,7 +16,8 @@ #include "content/public/browser/host_zoom_map.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" -#include "third_party/WebKit/common/quota/quota_types.mojom.h" +#include "ppapi/features/features.h" +#include "third_party/WebKit/public/mojom/quota/quota_types.mojom.h" class HostContentSettingsMap; class Profile; @@ -46,7 +47,9 @@ class SiteSettingsHandler : public SettingsPageUIHandler, // Usage info. void OnGetUsageInfo(const storage::UsageInfoEntries& entries); - void OnUsageInfoCleared(blink::mojom::QuotaStatusCode code); + void OnStorageCleared(base::OnceClosure callback, + blink::mojom::QuotaStatusCode code); + void OnUsageCleared(); #if defined(OS_CHROMEOS) // Alert the Javascript that the |kEnableDRM| pref has changed. @@ -70,6 +73,10 @@ class SiteSettingsHandler : public SettingsPageUIHandler, private: friend class SiteSettingsHandlerTest; friend class SiteSettingsHandlerInfobarTest; +#if BUILDFLAG(ENABLE_PLUGINS) + FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, + ChangingFlashSettingForSiteIsRemembered); +#endif FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, DefaultSettingSource); FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, ExceptionHelpers); FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, ExtensionDisplayName); @@ -110,6 +117,10 @@ class SiteSettingsHandler : public SettingsPageUIHandler, void HandleGetOriginPermissions(const base::ListValue* args); void HandleSetOriginPermissions(const base::ListValue* args); + // Clears the Flash data setting used to remember if the user has changed the + // Flash permission for an origin. + void HandleClearFlashPref(const base::ListValue* args); + // Handles setting and resetting an origin permission. void HandleResetCategoryPermissionForPattern(const base::ListValue* args); void HandleSetCategoryPermissionForPattern(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 434947cf2a6..7e40e5e5081 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 @@ -31,6 +31,7 @@ #include "content/public/test/test_web_ui.h" #include "extensions/browser/extension_registry.h" #include "extensions/common/extension_builder.h" +#include "ppapi/features/features.h" #include "testing/gtest/include/gtest/gtest.h" #if defined(OS_CHROMEOS) @@ -38,6 +39,10 @@ #include "components/user_manager/scoped_user_manager.h" #endif +#if BUILDFLAG(ENABLE_PLUGINS) +#include "chrome/browser/plugins/chrome_plugin_service_filter.h" +#endif + namespace { constexpr char kCallbackId[] = "test-callback-id"; @@ -45,7 +50,41 @@ constexpr char kSetting[] = "setting"; constexpr char kSource[] = "source"; constexpr char kExtensionName[] = "Test Extension"; -} +#if BUILDFLAG(ENABLE_PLUGINS) +// Waits until a change is observed in content settings. +class FlashContentSettingsChangeWaiter : public content_settings::Observer { + public: + explicit FlashContentSettingsChangeWaiter(Profile* profile) + : profile_(profile) { + HostContentSettingsMapFactory::GetForProfile(profile)->AddObserver(this); + } + ~FlashContentSettingsChangeWaiter() override { + HostContentSettingsMapFactory::GetForProfile(profile_)->RemoveObserver( + this); + } + + // content_settings::Observer: + void OnContentSettingChanged(const ContentSettingsPattern& primary_pattern, + const ContentSettingsPattern& secondary_pattern, + ContentSettingsType content_type, + std::string resource_identifier) override { + if (content_type == CONTENT_SETTINGS_TYPE_PLUGINS) + Proceed(); + } + + void Wait() { run_loop_.Run(); } + + private: + void Proceed() { run_loop_.Quit(); } + + Profile* profile_; + base::RunLoop run_loop_; + + DISALLOW_COPY_AND_ASSIGN(FlashContentSettingsChangeWaiter); +}; +#endif + +} // namespace namespace settings { @@ -90,6 +129,8 @@ class SiteSettingsHandlerTest : public testing::Test { CONTENT_SETTINGS_TYPE_NOTIFICATIONS)), kCookies(site_settings::ContentSettingsTypeToGroupName( CONTENT_SETTINGS_TYPE_COOKIES)), + kFlash(site_settings::ContentSettingsTypeToGroupName( + CONTENT_SETTINGS_TYPE_PLUGINS)), handler_(&profile_) { #if defined(OS_CHROMEOS) user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>( @@ -277,6 +318,7 @@ class SiteSettingsHandlerTest : public testing::Test { // Content setting group name for the relevant ContentSettingsType. const std::string kNotifications; const std::string kCookies; + const std::string kFlash; private: content::TestBrowserThreadBundle thread_bundle_; @@ -476,6 +518,56 @@ TEST_F(SiteSettingsHandlerTest, GetAndSetOriginPermissions) { site_settings::SiteSettingSource::kDefault, 4U); } +#if BUILDFLAG(ENABLE_PLUGINS) +TEST_F(SiteSettingsHandlerTest, ChangingFlashSettingForSiteIsRemembered) { + ChromePluginServiceFilter::GetInstance()->RegisterResourceContext( + profile(), profile()->GetResourceContext()); + FlashContentSettingsChangeWaiter waiter(profile()); + + const std::string origin_with_port("https://www.example.com:443"); + // The display name won't show the port if it's default for that scheme. + const std::string origin("https://www.example.com"); + base::ListValue get_args; + get_args.AppendString(kCallbackId); + get_args.AppendString(origin_with_port); + const GURL url(origin_with_port); + + HostContentSettingsMap* map = + HostContentSettingsMapFactory::GetForProfile(profile()); + // Make sure the site being tested doesn't already have this marker set. + EXPECT_EQ(nullptr, + map->GetWebsiteSetting(url, url, CONTENT_SETTINGS_TYPE_PLUGINS_DATA, + std::string(), nullptr)); + + // Change the Flash setting. + base::ListValue set_args; + set_args.AppendString(origin_with_port); + { + auto category_list = std::make_unique<base::ListValue>(); + category_list->AppendString(kFlash); + set_args.Append(std::move(category_list)); + } + set_args.AppendString( + content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK)); + handler()->HandleSetOriginPermissions(&set_args); + EXPECT_EQ(1U, web_ui()->call_data().size()); + waiter.Wait(); + + // Check that this site has now been marked for displaying Flash always, then + // clear it and check this works. + EXPECT_NE(nullptr, + map->GetWebsiteSetting(url, url, CONTENT_SETTINGS_TYPE_PLUGINS_DATA, + std::string(), nullptr)); + base::ListValue clear_args; + clear_args.AppendString(origin_with_port); + handler()->HandleSetOriginPermissions(&set_args); + handler()->HandleClearFlashPref(&clear_args); + EXPECT_EQ(nullptr, + map->GetWebsiteSetting(url, url, CONTENT_SETTINGS_TYPE_PLUGINS_DATA, + std::string(), nullptr)); +} +#endif + TEST_F(SiteSettingsHandlerTest, GetAndSetForInvalidURLs) { const std::string origin("arbitrary string"); EXPECT_FALSE(GURL(origin).is_valid()); |