Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(769)

Side by Side Diff: chrome/browser/ui/passwords/manage_passwords_bubble_model.cc

Issue 1445383003: Introduce PasswordsModelDelegate as an abstraction between ManagePasswordsBubbleModel and ManagePas… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix Mac Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h" 5 #include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/prefs/pref_service.h" 12 #include "base/prefs/pref_service.h"
13 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
14 #include "chrome/browser/password_manager/password_store_factory.h" 14 #include "chrome/browser/password_manager/password_store_factory.h"
15 #include "chrome/browser/profiles/profile.h" 15 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/browser/sync/profile_sync_service_factory.h" 16 #include "chrome/browser/sync/profile_sync_service_factory.h"
17 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h"
18 #include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" 17 #include "chrome/browser/ui/passwords/manage_passwords_view_utils.h"
18 #include "chrome/browser/ui/passwords/passwords_model_delegate.h"
19 #include "chrome/common/url_constants.h" 19 #include "chrome/common/url_constants.h"
20 #include "chrome/grit/chromium_strings.h" 20 #include "chrome/grit/chromium_strings.h"
21 #include "chrome/grit/generated_resources.h" 21 #include "chrome/grit/generated_resources.h"
22 #include "components/browser_sync/browser/profile_sync_service.h" 22 #include "components/browser_sync/browser/profile_sync_service.h"
23 #include "components/password_manager/core/browser/password_bubble_experiment.h" 23 #include "components/password_manager/core/browser/password_bubble_experiment.h"
24 #include "components/password_manager/core/browser/password_store.h" 24 #include "components/password_manager/core/browser/password_store.h"
25 #include "components/password_manager/core/common/credential_manager_types.h" 25 #include "components/password_manager/core/common/credential_manager_types.h"
26 #include "components/password_manager/core/common/password_manager_ui.h" 26 #include "components/password_manager/core/common/password_manager_ui.h"
27 #include "content/public/browser/web_contents.h"
27 #include "ui/base/l10n/l10n_util.h" 28 #include "ui/base/l10n/l10n_util.h"
28 29
29 namespace metrics_util = password_manager::metrics_util; 30 namespace metrics_util = password_manager::metrics_util;
30 31
31 namespace { 32 namespace {
32 33
33 Profile* GetProfileFromWebContents(content::WebContents* web_contents) { 34 Profile* GetProfileFromWebContents(content::WebContents* web_contents) {
34 if (!web_contents) 35 if (!web_contents)
35 return nullptr; 36 return nullptr;
36 return Profile::FromBrowserContext(web_contents->GetBrowserContext()); 37 return Profile::FromBrowserContext(web_contents->GetBrowserContext());
(...skipping 24 matching lines...) Expand all
61 62
62 } // namespace 63 } // namespace
63 64
64 ManagePasswordsBubbleModel::ManagePasswordsBubbleModel( 65 ManagePasswordsBubbleModel::ManagePasswordsBubbleModel(
65 content::WebContents* web_contents, 66 content::WebContents* web_contents,
66 DisplayReason display_reason) 67 DisplayReason display_reason)
67 : content::WebContentsObserver(web_contents), 68 : content::WebContentsObserver(web_contents),
68 display_disposition_(metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING), 69 display_disposition_(metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING),
69 dismissal_reason_(metrics_util::NO_DIRECT_INTERACTION), 70 dismissal_reason_(metrics_util::NO_DIRECT_INTERACTION),
70 update_password_submission_event_(metrics_util::NO_UPDATE_SUBMISSION) { 71 update_password_submission_event_(metrics_util::NO_UPDATE_SUBMISSION) {
71 ManagePasswordsUIController* controller = 72 PasswordsModelDelegate* delegate =
72 ManagePasswordsUIController::FromWebContents(web_contents); 73 PasswordsModelDelegateFromWebContents(web_contents);
73 74
74 origin_ = controller->origin(); 75 origin_ = delegate->GetOrigin();
75 state_ = controller->state(); 76 state_ = delegate->GetState();
76 password_overridden_ = controller->PasswordOverridden(); 77 password_overridden_ = delegate->IsPasswordOverridden();
77 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE || 78 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE ||
78 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { 79 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) {
79 pending_password_ = controller->PendingPassword(); 80 pending_password_ = delegate->GetPendingPassword();
80 local_credentials_ = DeepCopyForms(controller->GetCurrentForms()); 81 local_credentials_ = DeepCopyForms(delegate->GetCurrentForms());
81 } else if (state_ == password_manager::ui::CONFIRMATION_STATE) { 82 } else if (state_ == password_manager::ui::CONFIRMATION_STATE) {
82 // We don't need anything. 83 // We don't need anything.
83 } else if (state_ == password_manager::ui::CREDENTIAL_REQUEST_STATE) { 84 } else if (state_ == password_manager::ui::CREDENTIAL_REQUEST_STATE) {
84 local_credentials_ = DeepCopyForms(controller->GetCurrentForms()); 85 local_credentials_ = DeepCopyForms(delegate->GetCurrentForms());
85 federated_credentials_ = DeepCopyForms(controller->GetFederatedForms()); 86 federated_credentials_ = DeepCopyForms(delegate->GetFederatedForms());
86 } else if (state_ == password_manager::ui::AUTO_SIGNIN_STATE) { 87 } else if (state_ == password_manager::ui::AUTO_SIGNIN_STATE) {
87 pending_password_ = controller->PendingPassword(); 88 pending_password_ = delegate->GetPendingPassword();
88 } else { 89 } else {
89 local_credentials_ = DeepCopyForms(controller->GetCurrentForms()); 90 local_credentials_ = DeepCopyForms(delegate->GetCurrentForms());
90 } 91 }
91 92
92 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE || 93 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE ||
93 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { 94 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) {
94 UpdatePendingStateTitle(); 95 UpdatePendingStateTitle();
95 } else if (state_ == password_manager::ui::CONFIRMATION_STATE) { 96 } else if (state_ == password_manager::ui::CONFIRMATION_STATE) {
96 title_ = 97 title_ =
97 l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_CONFIRM_GENERATED_TITLE); 98 l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_CONFIRM_GENERATED_TITLE);
98 } else if (state_ == password_manager::ui::CREDENTIAL_REQUEST_STATE) { 99 } else if (state_ == password_manager::ui::CREDENTIAL_REQUEST_STATE) {
99 GetAccountChooserDialogTitleTextAndLinkRange( 100 GetAccountChooserDialogTitleTextAndLinkRange(
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 break; 171 break;
171 case password_manager::ui::AUTO_SIGNIN_STATE: 172 case password_manager::ui::AUTO_SIGNIN_STATE:
172 display_disposition_ = metrics_util::AUTOMATIC_SIGNIN_TOAST; 173 display_disposition_ = metrics_util::AUTOMATIC_SIGNIN_TOAST;
173 break; 174 break;
174 default: 175 default:
175 break; 176 break;
176 } 177 }
177 } 178 }
178 metrics_util::LogUIDisplayDisposition(display_disposition_); 179 metrics_util::LogUIDisplayDisposition(display_disposition_);
179 180
180 controller->OnBubbleShown(); 181 delegate->OnBubbleShown();
181 } 182 }
182 183
183 ManagePasswordsBubbleModel::~ManagePasswordsBubbleModel() { 184 ManagePasswordsBubbleModel::~ManagePasswordsBubbleModel() {
184 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE) { 185 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE) {
185 Profile* profile = GetProfile(); 186 Profile* profile = GetProfile();
186 if (profile && (GetSmartLockBrandingState(profile) == 187 if (profile && (GetSmartLockBrandingState(profile) ==
187 password_bubble_experiment::SmartLockBranding::FULL)) { 188 password_bubble_experiment::SmartLockBranding::FULL)) {
188 password_bubble_experiment::RecordSavePromptFirstRunExperienceWasShown( 189 password_bubble_experiment::RecordSavePromptFirstRunExperienceWasShown(
189 profile->GetPrefs()); 190 profile->GetPrefs());
190 } 191 }
191 } 192 }
192 ManagePasswordsUIController* manage_passwords_ui_controller = 193 PasswordsModelDelegate* delegate =
193 web_contents() ? 194 web_contents() ? PasswordsModelDelegateFromWebContents(web_contents())
194 ManagePasswordsUIController::FromWebContents(web_contents()) 195 : nullptr;
195 : nullptr; 196 if (delegate)
196 if (manage_passwords_ui_controller) 197 delegate->OnBubbleHidden();
197 manage_passwords_ui_controller->OnBubbleHidden();
198 if (dismissal_reason_ == metrics_util::NOT_DISPLAYED) 198 if (dismissal_reason_ == metrics_util::NOT_DISPLAYED)
199 return; 199 return;
200 200
201 if (state_ != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { 201 if (state_ != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) {
202 // We have separate metrics for the Update bubble so do not record dismissal 202 // We have separate metrics for the Update bubble so do not record dismissal
203 // reason for it. 203 // reason for it.
204 metrics_util::LogUIDismissalReason(dismissal_reason_); 204 metrics_util::LogUIDismissalReason(dismissal_reason_);
205 } 205 }
206 // Other use cases have been reported in the callbacks like OnSaveClicked(). 206 // Other use cases have been reported in the callbacks like OnSaveClicked().
207 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE && 207 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE &&
208 dismissal_reason_ == metrics_util::NO_DIRECT_INTERACTION) 208 dismissal_reason_ == metrics_util::NO_DIRECT_INTERACTION)
209 RecordExperimentStatistics(web_contents(), dismissal_reason_); 209 RecordExperimentStatistics(web_contents(), dismissal_reason_);
210 // Check if this was update password and record update statistics. 210 // Check if this was update password and record update statistics.
211 if (update_password_submission_event_ == metrics_util::NO_UPDATE_SUBMISSION && 211 if (update_password_submission_event_ == metrics_util::NO_UPDATE_SUBMISSION &&
212 (state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE || 212 (state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE ||
213 state_ == password_manager::ui::PENDING_PASSWORD_STATE)) { 213 state_ == password_manager::ui::PENDING_PASSWORD_STATE)) {
214 update_password_submission_event_ = 214 update_password_submission_event_ =
215 GetUpdateDismissalReason(NO_INTERACTION); 215 GetUpdateDismissalReason(NO_INTERACTION);
216 if (state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE && 216 if (state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE &&
217 manage_passwords_ui_controller) 217 delegate)
218 manage_passwords_ui_controller->OnNoInteractionOnUpdate(); 218 delegate->OnNoInteractionOnUpdate();
219 } 219 }
220 if (update_password_submission_event_ != metrics_util::NO_UPDATE_SUBMISSION) 220 if (update_password_submission_event_ != metrics_util::NO_UPDATE_SUBMISSION)
221 LogUpdatePasswordSubmissionEvent(update_password_submission_event_); 221 LogUpdatePasswordSubmissionEvent(update_password_submission_event_);
222 } 222 }
223 223
224 void ManagePasswordsBubbleModel::OnCancelClicked() { 224 void ManagePasswordsBubbleModel::OnCancelClicked() {
225 DCHECK_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE, state_); 225 DCHECK_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE, state_);
226 dismissal_reason_ = metrics_util::CLICKED_CANCEL; 226 dismissal_reason_ = metrics_util::CLICKED_CANCEL;
227 } 227 }
228 228
229 void ManagePasswordsBubbleModel::OnNeverForThisSiteClicked() { 229 void ManagePasswordsBubbleModel::OnNeverForThisSiteClicked() {
230 dismissal_reason_ = metrics_util::CLICKED_NEVER; 230 dismissal_reason_ = metrics_util::CLICKED_NEVER;
231 update_password_submission_event_ = GetUpdateDismissalReason(NOPE_CLICKED); 231 update_password_submission_event_ = GetUpdateDismissalReason(NOPE_CLICKED);
232 RecordExperimentStatistics(web_contents(), dismissal_reason_); 232 RecordExperimentStatistics(web_contents(), dismissal_reason_);
233 ManagePasswordsUIController* manage_passwords_ui_controller = 233 PasswordsModelDelegateFromWebContents(web_contents())->NeverSavePassword();
234 ManagePasswordsUIController::FromWebContents(web_contents());
235 manage_passwords_ui_controller->NeverSavePassword();
236 } 234 }
237 235
238 void ManagePasswordsBubbleModel::OnSaveClicked() { 236 void ManagePasswordsBubbleModel::OnSaveClicked() {
239 dismissal_reason_ = metrics_util::CLICKED_SAVE; 237 dismissal_reason_ = metrics_util::CLICKED_SAVE;
240 RecordExperimentStatistics(web_contents(), dismissal_reason_); 238 RecordExperimentStatistics(web_contents(), dismissal_reason_);
241 update_password_submission_event_ = GetUpdateDismissalReason(UPDATE_CLICKED); 239 update_password_submission_event_ = GetUpdateDismissalReason(UPDATE_CLICKED);
242 ManagePasswordsUIController* manage_passwords_ui_controller = 240 PasswordsModelDelegateFromWebContents(web_contents())->SavePassword();
243 ManagePasswordsUIController::FromWebContents(web_contents());
244 manage_passwords_ui_controller->SavePassword();
245 } 241 }
246 242
247 void ManagePasswordsBubbleModel::OnNopeUpdateClicked() { 243 void ManagePasswordsBubbleModel::OnNopeUpdateClicked() {
248 update_password_submission_event_ = GetUpdateDismissalReason(NOPE_CLICKED); 244 update_password_submission_event_ = GetUpdateDismissalReason(NOPE_CLICKED);
249 ManagePasswordsUIController* manage_passwords_ui_controller = 245 PasswordsModelDelegateFromWebContents(web_contents())->OnNopeUpdateClicked();
250 ManagePasswordsUIController::FromWebContents(web_contents());
251 manage_passwords_ui_controller->OnNopeUpdateClicked();
252 } 246 }
253 247
254 void ManagePasswordsBubbleModel::OnUpdateClicked( 248 void ManagePasswordsBubbleModel::OnUpdateClicked(
255 const autofill::PasswordForm& password_form) { 249 const autofill::PasswordForm& password_form) {
256 update_password_submission_event_ = GetUpdateDismissalReason(UPDATE_CLICKED); 250 update_password_submission_event_ = GetUpdateDismissalReason(UPDATE_CLICKED);
257 ManagePasswordsUIController* manage_passwords_ui_controller = 251 PasswordsModelDelegateFromWebContents(web_contents())->UpdatePassword(
258 ManagePasswordsUIController::FromWebContents(web_contents()); 252 password_form);
259 manage_passwords_ui_controller->UpdatePassword(password_form);
260 } 253 }
261 254
262 void ManagePasswordsBubbleModel::OnDoneClicked() { 255 void ManagePasswordsBubbleModel::OnDoneClicked() {
263 dismissal_reason_ = metrics_util::CLICKED_DONE; 256 dismissal_reason_ = metrics_util::CLICKED_DONE;
264 } 257 }
265 258
266 // TODO(gcasto): Is it worth having this be separate from OnDoneClicked()? 259 // TODO(gcasto): Is it worth having this be separate from OnDoneClicked()?
267 // User intent is pretty similar in both cases. 260 // User intent is pretty similar in both cases.
268 void ManagePasswordsBubbleModel::OnOKClicked() { 261 void ManagePasswordsBubbleModel::OnOKClicked() {
269 dismissal_reason_ = metrics_util::CLICKED_OK; 262 dismissal_reason_ = metrics_util::CLICKED_OK;
270 } 263 }
271 264
272 void ManagePasswordsBubbleModel::OnManageLinkClicked() { 265 void ManagePasswordsBubbleModel::OnManageLinkClicked() {
273 dismissal_reason_ = metrics_util::CLICKED_MANAGE; 266 dismissal_reason_ = metrics_util::CLICKED_MANAGE;
274 if (GetSmartLockBrandingState(GetProfile()) == 267 if (GetSmartLockBrandingState(GetProfile()) ==
275 password_bubble_experiment::SmartLockBranding::FULL) { 268 password_bubble_experiment::SmartLockBranding::FULL) {
276 ManagePasswordsUIController::FromWebContents(web_contents()) 269 PasswordsModelDelegateFromWebContents(web_contents())
277 ->NavigateToExternalPasswordManager(); 270 ->NavigateToExternalPasswordManager();
278 } else { 271 } else {
279 ManagePasswordsUIController::FromWebContents(web_contents()) 272 PasswordsModelDelegateFromWebContents(web_contents())
280 ->NavigateToPasswordManagerSettingsPage(); 273 ->NavigateToPasswordManagerSettingsPage();
281 } 274 }
282 } 275 }
283 276
284 void ManagePasswordsBubbleModel::OnBrandLinkClicked() { 277 void ManagePasswordsBubbleModel::OnBrandLinkClicked() {
285 dismissal_reason_ = metrics_util::CLICKED_BRAND_NAME; 278 dismissal_reason_ = metrics_util::CLICKED_BRAND_NAME;
286 switch (GetSmartLockBrandingState(GetProfile())) { 279 switch (GetSmartLockBrandingState(GetProfile())) {
287 case password_bubble_experiment::SmartLockBranding::FULL: 280 case password_bubble_experiment::SmartLockBranding::FULL:
288 ManagePasswordsUIController::FromWebContents(web_contents()) 281 PasswordsModelDelegateFromWebContents(web_contents())
289 ->NavigateToSmartLockPage(); 282 ->NavigateToSmartLockPage();
290 break; 283 break;
291 case password_bubble_experiment::SmartLockBranding::SAVE_BUBBLE_ONLY: 284 case password_bubble_experiment::SmartLockBranding::SAVE_BUBBLE_ONLY:
292 ManagePasswordsUIController::FromWebContents(web_contents()) 285 PasswordsModelDelegateFromWebContents(web_contents())
293 ->NavigateToSmartLockHelpPage(); 286 ->NavigateToSmartLockHelpPage();
294 break; 287 break;
295 case password_bubble_experiment::SmartLockBranding::NONE: 288 case password_bubble_experiment::SmartLockBranding::NONE:
296 NOTREACHED(); 289 NOTREACHED();
297 break; 290 break;
298 } 291 }
299 } 292 }
300 293
301 void ManagePasswordsBubbleModel::OnAutoSignInToastTimeout() { 294 void ManagePasswordsBubbleModel::OnAutoSignInToastTimeout() {
302 DCHECK_EQ(password_manager::ui::AUTO_SIGNIN_STATE, state_); 295 DCHECK_EQ(password_manager::ui::AUTO_SIGNIN_STATE, state_);
(...skipping 23 matching lines...) Expand all
326 if (action == REMOVE_PASSWORD) 319 if (action == REMOVE_PASSWORD)
327 password_store->RemoveLogin(password_form); 320 password_store->RemoveLogin(password_form);
328 else 321 else
329 password_store->AddLogin(password_form); 322 password_store->AddLogin(password_form);
330 } 323 }
331 324
332 void ManagePasswordsBubbleModel::OnChooseCredentials( 325 void ManagePasswordsBubbleModel::OnChooseCredentials(
333 const autofill::PasswordForm& password_form, 326 const autofill::PasswordForm& password_form,
334 password_manager::CredentialType credential_type) { 327 password_manager::CredentialType credential_type) {
335 dismissal_reason_ = metrics_util::CLICKED_CREDENTIAL; 328 dismissal_reason_ = metrics_util::CLICKED_CREDENTIAL;
336 ManagePasswordsUIController* manage_passwords_ui_controller = 329 PasswordsModelDelegateFromWebContents(web_contents())->ChooseCredential(
337 ManagePasswordsUIController::FromWebContents(web_contents()); 330 password_form, credential_type);
338 manage_passwords_ui_controller->ChooseCredential(password_form,
339 credential_type);
340 } 331 }
341 332
342 Profile* ManagePasswordsBubbleModel::GetProfile() const { 333 Profile* ManagePasswordsBubbleModel::GetProfile() const {
343 return GetProfileFromWebContents(web_contents()); 334 return GetProfileFromWebContents(web_contents());
344 } 335 }
345 336
346 bool ManagePasswordsBubbleModel::ShouldShowMultipleAccountUpdateUI() const { 337 bool ManagePasswordsBubbleModel::ShouldShowMultipleAccountUpdateUI() const {
347 return state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE && 338 return state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE &&
348 local_credentials_.size() > 1 && !password_overridden_; 339 local_credentials_.size() > 1 && !password_overridden_;
349 } 340 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 return metrics_util::NO_UPDATE_SUBMISSION; 391 return metrics_util::NO_UPDATE_SUBMISSION;
401 } 392 }
402 if (state_ != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) 393 if (state_ != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE)
403 return metrics_util::NO_UPDATE_SUBMISSION; 394 return metrics_util::NO_UPDATE_SUBMISSION;
404 if (password_overridden_) 395 if (password_overridden_)
405 return update_events[3][behavior]; 396 return update_events[3][behavior];
406 if (ShouldShowMultipleAccountUpdateUI()) 397 if (ShouldShowMultipleAccountUpdateUI())
407 return update_events[2][behavior]; 398 return update_events[2][behavior];
408 return update_events[1][behavior]; 399 return update_events[1][behavior];
409 } 400 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698