OLD | NEW |
(Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prom
pt_controller.h" |
| 6 |
| 7 #include <utility> |
| 8 |
| 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" |
| 11 #include "base/i18n/rtl.h" |
| 12 #include "base/location.h" |
| 13 #include "base/logging.h" |
| 14 #include "base/strings/string_number_conversions.h" |
| 15 #include "base/strings/utf_string_conversions.h" |
| 16 #include "base/time/time.h" |
| 17 #include "chrome/browser/profiles/profile.h" |
| 18 #include "chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prom
pt_config.h" |
| 19 #include "chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prom
pt_model.h" |
| 20 #include "chrome/browser/ui/browser.h" |
| 21 #include "chrome/browser/ui/browser_finder.h" |
| 22 #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" |
| 23 #include "chrome/grit/chromium_strings.h" |
| 24 #include "chrome/grit/generated_resources.h" |
| 25 #include "components/url_formatter/elide_url.h" |
| 26 #include "components/url_formatter/url_formatter.h" |
| 27 #include "content/public/browser/browser_thread.h" |
| 28 #include "ui/base/l10n/l10n_util.h" |
| 29 #include "url/gurl.h" |
| 30 |
| 31 namespace safe_browsing { |
| 32 |
| 33 namespace { |
| 34 |
| 35 base::string16 FormatUrlForDisplay(const GURL& url) { |
| 36 return base::i18n::GetDisplayStringInLTRDirectionality( |
| 37 url_formatter::FormatUrl(url)); |
| 38 } |
| 39 |
| 40 base::string16 FormatSearchEngineForDisplay(const GURL& search_url) { |
| 41 return url_formatter::FormatUrlForSecurityDisplay(search_url); |
| 42 } |
| 43 |
| 44 // Helper function that chooses and, if necessary, formats a message string |
| 45 // based on the number of extensions that need to be disabled. |
| 46 base::string16 ChooseActionMessage(size_t extensions_to_disable, |
| 47 int no_extensions_message, |
| 48 int one_extension_message, |
| 49 int multiple_extensions_message) { |
| 50 if (extensions_to_disable == 0U) |
| 51 return l10n_util::GetStringUTF16(no_extensions_message); |
| 52 if (extensions_to_disable == 1U) |
| 53 return l10n_util::GetStringUTF16(one_extension_message); |
| 54 // If extensions_to_disable > 1U. |
| 55 return l10n_util::GetStringFUTF16( |
| 56 multiple_extensions_message, |
| 57 base::SizeTToString16(extensions_to_disable)); |
| 58 } |
| 59 |
| 60 } // namespace. |
| 61 |
| 62 SettingsResetPromptController::LabelInfo::LabelInfo(LabelType type, |
| 63 const base::string16& text) |
| 64 : type(type), text(text) {} |
| 65 |
| 66 SettingsResetPromptController::LabelInfo::LabelInfo(LabelType type, |
| 67 int message_id) |
| 68 : type(type), text(l10n_util::GetStringUTF16(message_id)) {} |
| 69 |
| 70 SettingsResetPromptController::LabelInfo::~LabelInfo() {} |
| 71 |
| 72 SettingsResetPromptController::SettingsResetPromptController( |
| 73 std::unique_ptr<SettingsResetPromptModel> model) |
| 74 : model_(std::move(model)) { |
| 75 DCHECK(model_); |
| 76 DCHECK(model_->ShouldPromptForReset()); |
| 77 |
| 78 InitMainText(); |
| 79 InitDetailsText(); |
| 80 } |
| 81 |
| 82 SettingsResetPromptController::~SettingsResetPromptController() {} |
| 83 |
| 84 base::string16 SettingsResetPromptController::GetWindowTitle() const { |
| 85 return l10n_util::GetStringUTF16(IDS_SETTINGS_RESET_PROMPT_TITLE); |
| 86 } |
| 87 |
| 88 base::string16 SettingsResetPromptController::GetButtonLabel() const { |
| 89 return l10n_util::GetStringUTF16( |
| 90 IDS_SETTINGS_RESET_PROMPT_ACCEPT_BUTTON_LABEL); |
| 91 } |
| 92 |
| 93 base::string16 SettingsResetPromptController::GetShowDetailsLabel() const { |
| 94 return l10n_util::GetStringUTF16( |
| 95 IDS_SETTINGS_RESET_PROMPT_SHOW_DETAILS_BUTTON_LABEL); |
| 96 } |
| 97 |
| 98 base::string16 SettingsResetPromptController::GetHideDetailsLabel() const { |
| 99 return l10n_util::GetStringUTF16( |
| 100 IDS_SETTINGS_RESET_PROMPT_HIDE_DETAILS_BUTTON_LABEL); |
| 101 } |
| 102 |
| 103 const std::vector<SettingsResetPromptController::LabelInfo>& |
| 104 SettingsResetPromptController::GetMainText() const { |
| 105 DCHECK(!main_text_.empty()); |
| 106 return main_text_; |
| 107 } |
| 108 |
| 109 const std::vector<SettingsResetPromptController::LabelInfo>& |
| 110 SettingsResetPromptController::GetDetailsText() const { |
| 111 DCHECK(!details_text_.empty()); |
| 112 return details_text_; |
| 113 } |
| 114 |
| 115 void SettingsResetPromptController::Accept() { |
| 116 model_->PerformReset( |
| 117 base::Bind(&SettingsResetPromptController::OnInteractionDone, |
| 118 base::Unretained(this))); |
| 119 } |
| 120 |
| 121 void SettingsResetPromptController::Cancel() { |
| 122 OnInteractionDone(); |
| 123 } |
| 124 |
| 125 void SettingsResetPromptController::InitMainText() { |
| 126 DCHECK(main_text_.empty()); |
| 127 |
| 128 const bool reset_search = model_->default_search_reset_state() == |
| 129 SettingsResetPromptModel::RESET_REQUIRED; |
| 130 const bool reset_startup_urls = model_->startup_urls_reset_state() == |
| 131 SettingsResetPromptModel::RESET_REQUIRED; |
| 132 const bool reset_homepage = model_->homepage_reset_state() == |
| 133 SettingsResetPromptModel::RESET_REQUIRED; |
| 134 DCHECK(reset_search || reset_startup_urls || reset_homepage); |
| 135 |
| 136 base::string16 action_message; |
| 137 if (int{reset_search} + int{reset_startup_urls} + int{reset_homepage} > 1) { |
| 138 // When multiple settings need to be reset, display a bulleted list of |
| 139 // settings with a common explanation text. |
| 140 main_text_.push_back( |
| 141 LabelInfo(LabelInfo::PARAGRAPH, |
| 142 IDS_SETTINGS_RESET_PROMPT_EXPLANATION_FOR_MULTIPLE_SETTINGS)); |
| 143 if (reset_search) { |
| 144 main_text_.push_back( |
| 145 LabelInfo(LabelInfo::BULLET_ITEM, |
| 146 IDS_SETTINGS_RESET_PROMPT_SEARCH_ENGINE_SETTING_NAME)); |
| 147 } |
| 148 if (reset_startup_urls) { |
| 149 main_text_.push_back( |
| 150 LabelInfo(LabelInfo::BULLET_ITEM, |
| 151 IDS_SETTINGS_RESET_PROMPT_STARTUP_PAGE_SETTING_NAME)); |
| 152 } |
| 153 if (reset_homepage) { |
| 154 main_text_.push_back( |
| 155 LabelInfo(LabelInfo::BULLET_ITEM, |
| 156 IDS_SETTINGS_RESET_PROMPT_HOMEPAGE_SETTING_NAME)); |
| 157 } |
| 158 |
| 159 // Use a common action message asking if user wants to reset the settings |
| 160 // that were displayed in the list above. |
| 161 main_text_.push_back(LabelInfo( |
| 162 LabelInfo::PARAGRAPH, |
| 163 ChooseActionMessage( |
| 164 model_->extensions_to_disable().size(), |
| 165 IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_MULTIPLE_SETTINGS_N
O_EXTENSIONS, |
| 166 IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_MULTIPLE_SETTINGS_O
NE_EXTENSION, |
| 167 IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_MULTIPLE_SETTINGS_M
ULTIPLE_EXTENSIONS))); |
| 168 } else { |
| 169 // When only one setting needs to be reset, display tailored explanation and |
| 170 // action message for each setting. |
| 171 if (reset_search) { |
| 172 main_text_.push_back( |
| 173 LabelInfo(LabelInfo::PARAGRAPH, |
| 174 IDS_SETTINGS_RESET_PROMPT_EXPLANATION_FOR_SEARCH_ENGINE)); |
| 175 main_text_.push_back(LabelInfo( |
| 176 LabelInfo::PARAGRAPH, |
| 177 ChooseActionMessage( |
| 178 model_->extensions_to_disable().size(), |
| 179 IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_SEARCH_ENGINE_NO_
EXTENSIONS, |
| 180 IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_SEARCH_ENGINE_ONE
_EXTENSION, |
| 181 IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_SEARCH_ENGINE_MUL
TIPLE_EXTENSIONS))); |
| 182 } |
| 183 if (reset_startup_urls) { |
| 184 main_text_.push_back( |
| 185 LabelInfo(LabelInfo::PARAGRAPH, |
| 186 IDS_SETTINGS_RESET_PROMPT_EXPLANATION_FOR_STARTUP_PAGE)); |
| 187 main_text_.push_back(LabelInfo( |
| 188 LabelInfo::PARAGRAPH, |
| 189 ChooseActionMessage( |
| 190 model_->extensions_to_disable().size(), |
| 191 IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_STARTUP_PAGE_NO_E
XTENSIONS, |
| 192 IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_STARTUP_PAGE_ONE_
EXTENSION, |
| 193 IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_STARTUP_PAGE_MULT
IPLE_EXTENSIONS))); |
| 194 } |
| 195 if (reset_homepage) { |
| 196 main_text_.push_back( |
| 197 LabelInfo(LabelInfo::PARAGRAPH, |
| 198 IDS_SETTINGS_RESET_PROMPT_EXPLANATION_FOR_HOMEPAGE)); |
| 199 main_text_.push_back(LabelInfo( |
| 200 LabelInfo::PARAGRAPH, |
| 201 ChooseActionMessage( |
| 202 model_->extensions_to_disable().size(), |
| 203 IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_HOMEPAGE_NO_EXTEN
SIONS, |
| 204 IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_HOMEPAGE_ONE_EXTE
NSION, |
| 205 IDS_SETTINGS_RESET_PROMPT_ACTION_EXPLANATION_FOR_HOMEPAGE_MULTIPLE
_EXTENSIONS))); |
| 206 } |
| 207 } |
| 208 } |
| 209 |
| 210 void SettingsResetPromptController::InitDetailsText() { |
| 211 DCHECK(details_text_.empty()); |
| 212 |
| 213 // Add the text explaining which settings are going to be reset. |
| 214 details_text_.push_back(LabelInfo( |
| 215 LabelInfo::PARAGRAPH, |
| 216 l10n_util::GetStringUTF16( |
| 217 IDS_SETTINGS_RESET_PROMPT_DETAILS_SECTION_SETTINGS_EXPLANATION))); |
| 218 |
| 219 // Enumerate the settings that are going to be reset. |
| 220 if (model_->default_search_reset_state() == |
| 221 SettingsResetPromptModel::RESET_REQUIRED) { |
| 222 details_text_.push_back(LabelInfo( |
| 223 LabelInfo::PARAGRAPH, |
| 224 l10n_util::GetStringUTF16( |
| 225 IDS_SETTINGS_RESET_PROMPT_DETAILED_SEARCH_ENGINE_SETTING))); |
| 226 details_text_.push_back( |
| 227 LabelInfo(LabelInfo::BULLET_ITEM, |
| 228 FormatSearchEngineForDisplay(model_->default_search()))); |
| 229 } |
| 230 if (model_->homepage_reset_state() == |
| 231 SettingsResetPromptModel::RESET_REQUIRED) { |
| 232 details_text_.push_back( |
| 233 LabelInfo(LabelInfo::PARAGRAPH, |
| 234 l10n_util::GetStringUTF16( |
| 235 IDS_SETTINGS_RESET_PROMPT_DETAILED_HOMEPAGE_SETTING))); |
| 236 details_text_.push_back(LabelInfo(LabelInfo::BULLET_ITEM, |
| 237 FormatUrlForDisplay(model_->homepage()))); |
| 238 } |
| 239 if (model_->startup_urls_reset_state() == |
| 240 SettingsResetPromptModel::RESET_REQUIRED) { |
| 241 details_text_.push_back( |
| 242 LabelInfo(LabelInfo::PARAGRAPH, |
| 243 l10n_util::GetStringUTF16( |
| 244 IDS_SETTINGS_RESET_PROMPT_DETAILED_STARTUP_SETTINGS))); |
| 245 for (const GURL& url : model_->startup_urls()) |
| 246 details_text_.push_back( |
| 247 LabelInfo(LabelInfo::BULLET_ITEM, FormatUrlForDisplay(url))); |
| 248 } |
| 249 |
| 250 if (!model_->extensions_to_disable().empty()) { |
| 251 // Add the text explaining which extensions will be disabled. |
| 252 details_text_.push_back(LabelInfo( |
| 253 LabelInfo::PARAGRAPH, |
| 254 l10n_util::GetStringUTF16( |
| 255 IDS_SETTINGS_RESET_PROMPT_DETAILS_SECTION_EXTENSION_EXPLANATION))); |
| 256 |
| 257 for (const auto& item : model_->extensions_to_disable()) { |
| 258 const ExtensionInfo& extension_info = item.second; |
| 259 details_text_.push_back(LabelInfo( |
| 260 LabelInfo::BULLET_ITEM, base::UTF8ToUTF16(extension_info.name))); |
| 261 } |
| 262 } |
| 263 } |
| 264 |
| 265 void SettingsResetPromptController::OnInteractionDone() { |
| 266 // TODO(alito): Add metrics reporting here. |
| 267 delete this; |
| 268 } |
| 269 |
| 270 } // namespace safe_browsing |
OLD | NEW |