Index: chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_controller.cc |
diff --git a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_controller.cc b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_controller.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d3f8076b8becff2a492b4b4dc7b862a3bb2ca791 |
--- /dev/null |
+++ b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_controller.cc |
@@ -0,0 +1,270 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_controller.h" |
+ |
+#include <utility> |
+ |
+#include "base/bind.h" |
+#include "base/bind_helpers.h" |
+#include "base/i18n/rtl.h" |
+#include "base/location.h" |
+#include "base/logging.h" |
+#include "base/strings/string_number_conversions.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "base/time/time.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_config.h" |
+#include "chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.h" |
+#include "chrome/browser/ui/browser.h" |
+#include "chrome/browser/ui/browser_finder.h" |
+#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" |
+#include "chrome/grit/chromium_strings.h" |
+#include "chrome/grit/generated_resources.h" |
+#include "components/url_formatter/elide_url.h" |
+#include "components/url_formatter/url_formatter.h" |
+#include "content/public/browser/browser_thread.h" |
+#include "ui/base/l10n/l10n_util.h" |
+#include "url/gurl.h" |
+ |
+namespace safe_browsing { |
+ |
+namespace { |
+ |
+base::string16 FormatUrlForDisplay(const GURL& url) { |
+ return base::i18n::GetDisplayStringInLTRDirectionality( |
+ url_formatter::FormatUrl(url)); |
+} |
+ |
+base::string16 FormatSearchEngineForDisplay(const GURL& search_url) { |
+ return url_formatter::FormatUrlForSecurityDisplay(search_url); |
+} |
+ |
+// Helper function that chooses and, if necessary, formats a message string |
+// based on the number of extensions that need to be disabled. |
+base::string16 ChooseActionMessage(size_t extensions_to_disable, |
+ int no_extensions_message, |
+ int one_extension_message, |
+ int multiple_extensions_message) { |
+ if (extensions_to_disable == 0U) |
+ return l10n_util::GetStringUTF16(no_extensions_message); |
+ if (extensions_to_disable == 1U) |
+ return l10n_util::GetStringUTF16(one_extension_message); |
+ // If extensions_to_disable > 1U. |
+ return l10n_util::GetStringFUTF16( |
+ multiple_extensions_message, |
+ base::SizeTToString16(extensions_to_disable)); |
+} |
+ |
+} // namespace. |
+ |
+SettingsResetPromptController::LabelInfo::LabelInfo(LabelType type, |
+ const base::string16& text) |
+ : type(type), text(text) {} |
+ |
+SettingsResetPromptController::LabelInfo::LabelInfo(LabelType type, |
+ int message_id) |
+ : type(type), text(l10n_util::GetStringUTF16(message_id)) {} |
+ |
+SettingsResetPromptController::LabelInfo::~LabelInfo() {} |
+ |
+SettingsResetPromptController::SettingsResetPromptController( |
+ std::unique_ptr<SettingsResetPromptModel> model) |
+ : model_(std::move(model)) { |
+ DCHECK(model_); |
+ DCHECK(model_->ShouldPromptForReset()); |
+ |
+ InitMainText(); |
+ InitDetailsText(); |
+} |
+ |
+SettingsResetPromptController::~SettingsResetPromptController() {} |
+ |
+base::string16 SettingsResetPromptController::GetWindowTitle() const { |
+ return l10n_util::GetStringUTF16(IDS_SETTINGS_RESET_PROMPT_TITLE); |
+} |
+ |
+base::string16 SettingsResetPromptController::GetButtonLabel() const { |
+ return l10n_util::GetStringUTF16( |
+ IDS_SETTINGS_RESET_PROMPT_ACCEPT_BUTTON_LABEL); |
+} |
+ |
+base::string16 SettingsResetPromptController::GetShowDetailsLabel() const { |
+ return l10n_util::GetStringUTF16( |
+ IDS_SETTINGS_RESET_PROMPT_SHOW_DETAILS_BUTTON_LABEL); |
+} |
+ |
+base::string16 SettingsResetPromptController::GetHideDetailsLabel() const { |
+ return l10n_util::GetStringUTF16( |
+ IDS_SETTINGS_RESET_PROMPT_HIDE_DETAILS_BUTTON_LABEL); |
+} |
+ |
+const std::vector<SettingsResetPromptController::LabelInfo>& |
+SettingsResetPromptController::GetMainText() const { |
+ DCHECK(!main_text_.empty()); |
+ return main_text_; |
+} |
+ |
+const std::vector<SettingsResetPromptController::LabelInfo>& |
+SettingsResetPromptController::GetDetailsText() const { |
+ DCHECK(!details_text_.empty()); |
+ return details_text_; |
+} |
+ |
+void SettingsResetPromptController::Accept() { |
+ model_->PerformReset( |
+ base::Bind(&SettingsResetPromptController::OnInteractionDone, |
+ base::Unretained(this))); |
+} |
+ |
+void SettingsResetPromptController::Cancel() { |
+ OnInteractionDone(); |
+} |
+ |
+void SettingsResetPromptController::InitMainText() { |
+ DCHECK(main_text_.empty()); |
+ |
+ const bool reset_search = model_->default_search_reset_state() == |
+ SettingsResetPromptModel::RESET_REQUIRED; |
+ const bool reset_startup_urls = model_->startup_urls_reset_state() == |
+ SettingsResetPromptModel::RESET_REQUIRED; |
+ const bool reset_homepage = model_->homepage_reset_state() == |
+ SettingsResetPromptModel::RESET_REQUIRED; |
+ DCHECK(reset_search || reset_startup_urls || reset_homepage); |
+ |
+ base::string16 action_message; |
+ if (int{reset_search} + int{reset_startup_urls} + int{reset_homepage} > 1) { |
+ // When multiple settings need to be reset, display a bulleted list of |
+ // settings with a common explanation text. |
+ main_text_.push_back( |
+ LabelInfo(LabelInfo::PARAGRAPH, |
+ IDS_SETTINGS_RESET_PROMPT_EXPLANATION_FOR_MULTIPLE_SETTINGS)); |
+ if (reset_search) { |
+ main_text_.push_back( |
+ LabelInfo(LabelInfo::BULLET_ITEM, |
+ IDS_SETTINGS_RESET_PROMPT_SEARCH_ENGINE_SETTING_NAME)); |
+ } |
+ if (reset_startup_urls) { |
+ main_text_.push_back( |
+ LabelInfo(LabelInfo::BULLET_ITEM, |
+ IDS_SETTINGS_RESET_PROMPT_STARTUP_PAGE_SETTING_NAME)); |
+ } |
+ if (reset_homepage) { |
+ main_text_.push_back( |
+ LabelInfo(LabelInfo::BULLET_ITEM, |
+ IDS_SETTINGS_RESET_PROMPT_HOMEPAGE_SETTING_NAME)); |
+ } |
+ |
+ // Use a common action message asking if user wants to reset the settings |
+ // that were displayed in the list above. |
+ main_text_.push_back(LabelInfo( |
+ LabelInfo::PARAGRAPH, |
+ ChooseActionMessage( |
+ model_->extensions_to_disable().size(), |
+ IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_MULTIPLE_SETTINGS_NO_EXTENSIONS, |
+ IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_MULTIPLE_SETTINGS_ONE_EXTENSION, |
+ IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_MULTIPLE_SETTINGS_MULTIPLE_EXTENSIONS))); |
+ } else { |
+ // When only one setting needs to be reset, display tailored explanation and |
+ // action message for each setting. |
+ if (reset_search) { |
+ main_text_.push_back( |
+ LabelInfo(LabelInfo::PARAGRAPH, |
+ IDS_SETTINGS_RESET_PROMPT_EXPLANATION_FOR_SEARCH_ENGINE)); |
+ main_text_.push_back(LabelInfo( |
+ LabelInfo::PARAGRAPH, |
+ ChooseActionMessage( |
+ model_->extensions_to_disable().size(), |
+ IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_SEARCH_ENGINE_NO_EXTENSIONS, |
+ IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_SEARCH_ENGINE_ONE_EXTENSION, |
+ IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_SEARCH_ENGINE_MULTIPLE_EXTENSIONS))); |
+ } |
+ if (reset_startup_urls) { |
+ main_text_.push_back( |
+ LabelInfo(LabelInfo::PARAGRAPH, |
+ IDS_SETTINGS_RESET_PROMPT_EXPLANATION_FOR_STARTUP_PAGE)); |
+ main_text_.push_back(LabelInfo( |
+ LabelInfo::PARAGRAPH, |
+ ChooseActionMessage( |
+ model_->extensions_to_disable().size(), |
+ IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_STARTUP_PAGE_NO_EXTENSIONS, |
+ IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_STARTUP_PAGE_ONE_EXTENSION, |
+ IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_STARTUP_PAGE_MULTIPLE_EXTENSIONS))); |
+ } |
+ if (reset_homepage) { |
+ main_text_.push_back( |
+ LabelInfo(LabelInfo::PARAGRAPH, |
+ IDS_SETTINGS_RESET_PROMPT_EXPLANATION_FOR_HOMEPAGE)); |
+ main_text_.push_back(LabelInfo( |
+ LabelInfo::PARAGRAPH, |
+ ChooseActionMessage( |
+ model_->extensions_to_disable().size(), |
+ IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_HOMEPAGE_NO_EXTENSIONS, |
+ IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_HOMEPAGE_ONE_EXTENSION, |
+ IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_HOMEPAGE_MULTIPLE_EXTENSIONS))); |
+ } |
+ } |
+} |
+ |
+void SettingsResetPromptController::InitDetailsText() { |
+ DCHECK(details_text_.empty()); |
+ |
+ // Add the text explaining which settings are going to be reset. |
+ details_text_.push_back(LabelInfo( |
+ LabelInfo::PARAGRAPH, |
+ l10n_util::GetStringUTF16( |
+ IDS_SETTINGS_RESET_PROMPT_DETAILS_SECTION_SETTINGS_EXPLANATION))); |
+ |
+ // Enumerate the settings that are going to be reset. |
+ if (model_->default_search_reset_state() == |
+ SettingsResetPromptModel::RESET_REQUIRED) { |
+ details_text_.push_back(LabelInfo( |
+ LabelInfo::PARAGRAPH, |
+ l10n_util::GetStringUTF16( |
+ IDS_SETTINGS_RESET_PROMPT_DETAILED_SEARCH_ENGINE_SETTING))); |
+ details_text_.push_back( |
+ LabelInfo(LabelInfo::BULLET_ITEM, |
+ FormatSearchEngineForDisplay(model_->default_search()))); |
+ } |
+ if (model_->homepage_reset_state() == |
+ SettingsResetPromptModel::RESET_REQUIRED) { |
+ details_text_.push_back( |
+ LabelInfo(LabelInfo::PARAGRAPH, |
+ l10n_util::GetStringUTF16( |
+ IDS_SETTINGS_RESET_PROMPT_DETAILED_HOMEPAGE_SETTING))); |
+ details_text_.push_back(LabelInfo(LabelInfo::BULLET_ITEM, |
+ FormatUrlForDisplay(model_->homepage()))); |
+ } |
+ if (model_->startup_urls_reset_state() == |
+ SettingsResetPromptModel::RESET_REQUIRED) { |
+ details_text_.push_back( |
+ LabelInfo(LabelInfo::PARAGRAPH, |
+ l10n_util::GetStringUTF16( |
+ IDS_SETTINGS_RESET_PROMPT_DETAILED_STARTUP_SETTINGS))); |
+ for (const GURL& url : model_->startup_urls()) |
+ details_text_.push_back( |
+ LabelInfo(LabelInfo::BULLET_ITEM, FormatUrlForDisplay(url))); |
+ } |
+ |
+ if (!model_->extensions_to_disable().empty()) { |
+ // Add the text explaining which extensions will be disabled. |
+ details_text_.push_back(LabelInfo( |
+ LabelInfo::PARAGRAPH, |
+ l10n_util::GetStringUTF16( |
+ IDS_SETTINGS_RESET_PROMPT_DETAILS_SECTION_EXTENSION_EXPLANATION))); |
+ |
+ for (const auto& item : model_->extensions_to_disable()) { |
+ const ExtensionInfo& extension_info = item.second; |
+ details_text_.push_back(LabelInfo( |
+ LabelInfo::BULLET_ITEM, base::UTF8ToUTF16(extension_info.name))); |
+ } |
+ } |
+} |
+ |
+void SettingsResetPromptController::OnInteractionDone() { |
+ // TODO(alito): Add metrics reporting here. |
+ delete this; |
+} |
+ |
+} // namespace safe_browsing |