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

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

Issue 2025003002: Refactor ManagePasswordsBubbleModel. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months 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 <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <string> 10 #include <string>
vabr (Chromium) 2016/05/31 18:38:22 #include <limits> for std::numeric_limits
vasilii 2016/06/01 10:21:53 Done.
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
14 #include "base/time/default_clock.h" 14 #include "base/time/default_clock.h"
15 #include "chrome/browser/password_manager/password_store_factory.h" 15 #include "chrome/browser/password_manager/password_store_factory.h"
16 #include "chrome/browser/profiles/profile.h" 16 #include "chrome/browser/profiles/profile.h"
17 #include "chrome/browser/sync/profile_sync_service_factory.h" 17 #include "chrome/browser/sync/profile_sync_service_factory.h"
18 #include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" 18 #include "chrome/browser/ui/passwords/manage_passwords_view_utils.h"
19 #include "chrome/browser/ui/passwords/passwords_model_delegate.h" 19 #include "chrome/browser/ui/passwords/passwords_model_delegate.h"
20 #include "chrome/grit/chromium_strings.h" 20 #include "chrome/grit/chromium_strings.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 64
65 password_bubble_experiment::SmartLockBranding GetSmartLockBrandingState( 65 password_bubble_experiment::SmartLockBranding GetSmartLockBrandingState(
66 Profile* profile) { 66 Profile* profile) {
67 const ProfileSyncService* sync_service = 67 const ProfileSyncService* sync_service =
68 ProfileSyncServiceFactory::GetForProfile(profile); 68 ProfileSyncServiceFactory::GetForProfile(profile);
69 return password_bubble_experiment::GetSmartLockBrandingState(sync_service); 69 return password_bubble_experiment::GetSmartLockBrandingState(sync_service);
70 } 70 }
71 71
72 } // namespace 72 } // namespace
73 73
74 // Class responsible for collecting and reporting all the runtime interactions
75 // with the bubble.
76 class ManagePasswordsBubbleModel::InteractionKeeper {
77 public:
78 InteractionKeeper(
79 password_manager::InteractionsStats stats,
80 password_manager::metrics_util::UIDisplayDisposition display_disposition);
81 ~InteractionKeeper() = default;
vabr (Chromium) 2016/05/31 18:38:22 nit: Please separate from the constructor with a b
vasilii 2016/06/01 10:21:53 Done.
82
83 // Records UMA events and updates the interaction statistics when the bubble
84 // is closed.
85 void ReportInteractions(const ManagePasswordsBubbleModel* model);
86
87 void set_dismissal_reason(
88 password_manager::metrics_util::UIDismissalReason reason) {
89 dismissal_reason_ = reason;
90 }
91
92 void set_update_password_submission_event(
93 password_manager::metrics_util::UpdatePasswordSubmissionEvent event) {
94 update_password_submission_event_ = event;
95 }
96
97 void SetClockForTesting(std::unique_ptr<base::Clock> clock) {
98 clock_ = std::move(clock);
99 }
100
101 private:
102 // The way the bubble appeared.
103 const password_manager::metrics_util::UIDisplayDisposition
104 display_disposition_;
105
106 // Dismissal reason for a bubble.
107 password_manager::metrics_util::UIDismissalReason dismissal_reason_;
108
109 // Dismissal reason for the update bubble.
110 password_manager::metrics_util::UpdatePasswordSubmissionEvent
111 update_password_submission_event_;
112
113 // Current statistics for the save password bubble;
114 password_manager::InteractionsStats interaction_stats_;
115
116 // Used to retrieve the current time, in base::Time units.
117 std::unique_ptr<base::Clock> clock_;
118
119 DISALLOW_COPY_AND_ASSIGN(InteractionKeeper);
120 };
121
122 ManagePasswordsBubbleModel::InteractionKeeper::InteractionKeeper(
123 password_manager::InteractionsStats stats,
124 password_manager::metrics_util::UIDisplayDisposition display_disposition)
125 : display_disposition_(display_disposition),
126 dismissal_reason_(metrics_util::NO_DIRECT_INTERACTION),
127 update_password_submission_event_(metrics_util::NO_UPDATE_SUBMISSION),
128 interaction_stats_(std::move(stats)),
129 clock_(new base::DefaultClock) {
130 }
131
132 void ManagePasswordsBubbleModel::InteractionKeeper::ReportInteractions(
133 const ManagePasswordsBubbleModel* model) {
134 if (model->state() == password_manager::ui::PENDING_PASSWORD_STATE) {
135 Profile* profile = model->GetProfile();
136 if (profile) {
137 if (GetSmartLockBrandingState(profile) ==
138 password_bubble_experiment::SmartLockBranding::FULL) {
139 password_bubble_experiment::RecordSavePromptFirstRunExperienceWasShown(
140 profile->GetPrefs());
141 }
142 if (dismissal_reason_ == metrics_util::NO_DIRECT_INTERACTION &&
143 display_disposition_ ==
144 metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING) {
145 if (interaction_stats_.dismissal_count <
146 std::numeric_limits<decltype(
147 interaction_stats_.dismissal_count)>::max())
148 interaction_stats_.dismissal_count++;
149 interaction_stats_.update_time = clock_->Now();
150 password_manager::PasswordStore* password_store =
151 PasswordStoreFactory::GetForProfile(
152 profile, ServiceAccessType::EXPLICIT_ACCESS).get();
vabr (Chromium) 2016/05/31 18:38:22 Should this be IMPLICIT_ACCESS? In other words, is
vasilii 2016/06/01 10:21:53 Done.
153 password_store->AddSiteStats(interaction_stats_);
154 }
155 }
156 }
157
158 if (model->state() != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) {
159 // We have separate metrics for the Update bubble so do not record dismissal
160 // reason for it.
161 metrics_util::LogUIDismissalReason(dismissal_reason_);
162 }
163
164 PasswordsModelDelegate* delegate = model->web_contents()
165 ? PasswordsModelDelegateFromWebContents(model->web_contents())
166 : nullptr;
167 // Check if this was update password and record update statistics.
168 if (update_password_submission_event_ == metrics_util::NO_UPDATE_SUBMISSION &&
169 (model->state() == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE ||
170 model->state() == password_manager::ui::PENDING_PASSWORD_STATE)) {
171 update_password_submission_event_ =
172 model->GetUpdateDismissalReason(NO_INTERACTION);
173 if (model->state() == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE &&
174 delegate)
175 delegate->OnNoInteractionOnUpdate();
176 }
177 if (update_password_submission_event_ != metrics_util::NO_UPDATE_SUBMISSION)
178 LogUpdatePasswordSubmissionEvent(update_password_submission_event_);
179 }
180
74 ManagePasswordsBubbleModel::ManagePasswordsBubbleModel( 181 ManagePasswordsBubbleModel::ManagePasswordsBubbleModel(
75 content::WebContents* web_contents, 182 content::WebContents* web_contents,
76 DisplayReason display_reason) 183 DisplayReason display_reason)
77 : content::WebContentsObserver(web_contents), 184 : content::WebContentsObserver(web_contents),
78 password_overridden_(false), 185 password_overridden_(false) {
79 display_disposition_(metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING),
80 dismissal_reason_(metrics_util::NO_DIRECT_INTERACTION),
81 update_password_submission_event_(metrics_util::NO_UPDATE_SUBMISSION),
82 clock_(new base::DefaultClock) {
83 PasswordsModelDelegate* delegate = 186 PasswordsModelDelegate* delegate =
84 PasswordsModelDelegateFromWebContents(web_contents); 187 PasswordsModelDelegateFromWebContents(web_contents);
85 188
86 origin_ = delegate->GetOrigin(); 189 origin_ = delegate->GetOrigin();
87 state_ = delegate->GetState(); 190 state_ = delegate->GetState();
88 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE || 191 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE ||
89 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { 192 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) {
90 pending_password_ = delegate->GetPendingPassword(); 193 pending_password_ = delegate->GetPendingPassword();
91 local_credentials_ = DeepCopyForms(delegate->GetCurrentForms()); 194 local_credentials_ = DeepCopyForms(delegate->GetCurrentForms());
92 } else if (state_ == password_manager::ui::CONFIRMATION_STATE) { 195 } else if (state_ == password_manager::ui::CONFIRMATION_STATE) {
93 // We don't need anything. 196 // We don't need anything.
94 } else if (state_ == password_manager::ui::AUTO_SIGNIN_STATE) { 197 } else if (state_ == password_manager::ui::AUTO_SIGNIN_STATE) {
95 pending_password_ = delegate->GetPendingPassword(); 198 pending_password_ = delegate->GetPendingPassword();
96 } else { 199 } else {
97 local_credentials_ = DeepCopyForms(delegate->GetCurrentForms()); 200 local_credentials_ = DeepCopyForms(delegate->GetCurrentForms());
98 } 201 }
99 202
100 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE || 203 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE ||
101 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { 204 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) {
102 UpdatePendingStateTitle(); 205 UpdatePendingStateTitle();
103 } else if (state_ == password_manager::ui::CONFIRMATION_STATE) { 206 } else if (state_ == password_manager::ui::CONFIRMATION_STATE) {
104 title_ = 207 title_ =
105 l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_CONFIRM_GENERATED_TITLE); 208 l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_CONFIRM_GENERATED_TITLE);
106 } else if (state_ == password_manager::ui::AUTO_SIGNIN_STATE) { 209 } else if (state_ == password_manager::ui::AUTO_SIGNIN_STATE) {
107 // There is no title. 210 // There is no title.
108 } else if (state_ == password_manager::ui::MANAGE_STATE) { 211 } else if (state_ == password_manager::ui::MANAGE_STATE) {
109 UpdateManageStateTitle(); 212 UpdateManageStateTitle();
110 } 213 }
111 214
215 password_manager::InteractionsStats interaction_stats;
112 if (state_ == password_manager::ui::CONFIRMATION_STATE) { 216 if (state_ == password_manager::ui::CONFIRMATION_STATE) {
113 base::string16 save_confirmation_link = 217 base::string16 save_confirmation_link =
114 l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_LINK); 218 l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_LINK);
115 int confirmation_text_id = IDS_MANAGE_PASSWORDS_CONFIRM_GENERATED_TEXT; 219 int confirmation_text_id = IDS_MANAGE_PASSWORDS_CONFIRM_GENERATED_TEXT;
116 if (GetSmartLockBrandingState(GetProfile()) == 220 if (GetSmartLockBrandingState(GetProfile()) ==
117 password_bubble_experiment::SmartLockBranding::FULL) { 221 password_bubble_experiment::SmartLockBranding::FULL) {
118 std::string management_hostname = 222 std::string management_hostname =
119 GURL(password_manager::kPasswordManagerAccountDashboardURL).host(); 223 GURL(password_manager::kPasswordManagerAccountDashboardURL).host();
120 save_confirmation_link = base::UTF8ToUTF16(management_hostname); 224 save_confirmation_link = base::UTF8ToUTF16(management_hostname);
121 confirmation_text_id = 225 confirmation_text_id =
122 IDS_MANAGE_PASSWORDS_CONFIRM_GENERATED_SMART_LOCK_TEXT; 226 IDS_MANAGE_PASSWORDS_CONFIRM_GENERATED_SMART_LOCK_TEXT;
123 } 227 }
124 228
125 size_t offset; 229 size_t offset;
126 save_confirmation_text_ = 230 save_confirmation_text_ =
127 l10n_util::GetStringFUTF16( 231 l10n_util::GetStringFUTF16(
128 confirmation_text_id, save_confirmation_link, &offset); 232 confirmation_text_id, save_confirmation_link, &offset);
129 save_confirmation_link_range_ = 233 save_confirmation_link_range_ =
130 gfx::Range(offset, offset + save_confirmation_link.length()); 234 gfx::Range(offset, offset + save_confirmation_link.length());
131 } else if (state_ == password_manager::ui::PENDING_PASSWORD_STATE) { 235 } else if (state_ == password_manager::ui::PENDING_PASSWORD_STATE) {
132 interaction_stats_.origin_domain = origin_.GetOrigin(); 236 interaction_stats.origin_domain = origin_.GetOrigin();
133 interaction_stats_.username_value = pending_password_.username_value; 237 interaction_stats.username_value = pending_password_.username_value;
134 password_manager::InteractionsStats* stats = 238 password_manager::InteractionsStats* stats =
135 delegate->GetCurrentInteractionStats(); 239 delegate->GetCurrentInteractionStats();
136 if (stats) { 240 if (stats) {
137 DCHECK_EQ(interaction_stats_.username_value, stats->username_value); 241 DCHECK_EQ(interaction_stats.username_value, stats->username_value);
138 DCHECK_EQ(interaction_stats_.origin_domain, stats->origin_domain); 242 DCHECK_EQ(interaction_stats.origin_domain, stats->origin_domain);
139 interaction_stats_.dismissal_count = stats->dismissal_count; 243 interaction_stats.dismissal_count = stats->dismissal_count;
140 } 244 }
141 } else if (state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { 245 } else if (state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) {
142 password_overridden_ = delegate->IsPasswordOverridden(); 246 password_overridden_ = delegate->IsPasswordOverridden();
143 } 247 }
144 248
145 manage_link_ = 249 manage_link_ =
146 l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_MANAGE_PASSWORDS_LINK); 250 l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_MANAGE_PASSWORDS_LINK);
147 251
252 password_manager::metrics_util::UIDisplayDisposition display_disposition =
253 metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING;
148 if (display_reason == USER_ACTION) { 254 if (display_reason == USER_ACTION) {
149 switch (state_) { 255 switch (state_) {
150 case password_manager::ui::PENDING_PASSWORD_STATE: 256 case password_manager::ui::PENDING_PASSWORD_STATE:
151 display_disposition_ = metrics_util::MANUAL_WITH_PASSWORD_PENDING; 257 display_disposition = metrics_util::MANUAL_WITH_PASSWORD_PENDING;
152 break; 258 break;
153 case password_manager::ui::PENDING_PASSWORD_UPDATE_STATE: 259 case password_manager::ui::PENDING_PASSWORD_UPDATE_STATE:
154 display_disposition_ = 260 display_disposition =
155 metrics_util::MANUAL_WITH_PASSWORD_PENDING_UPDATE; 261 metrics_util::MANUAL_WITH_PASSWORD_PENDING_UPDATE;
156 break; 262 break;
157 case password_manager::ui::MANAGE_STATE: 263 case password_manager::ui::MANAGE_STATE:
158 display_disposition_ = metrics_util::MANUAL_MANAGE_PASSWORDS; 264 display_disposition = metrics_util::MANUAL_MANAGE_PASSWORDS;
159 break; 265 break;
160 case password_manager::ui::CONFIRMATION_STATE: 266 case password_manager::ui::CONFIRMATION_STATE:
161 case password_manager::ui::CREDENTIAL_REQUEST_STATE: 267 case password_manager::ui::CREDENTIAL_REQUEST_STATE:
162 case password_manager::ui::AUTO_SIGNIN_STATE: 268 case password_manager::ui::AUTO_SIGNIN_STATE:
163 case password_manager::ui::INACTIVE_STATE: 269 case password_manager::ui::INACTIVE_STATE:
164 NOTREACHED(); 270 NOTREACHED();
165 break; 271 break;
166 } 272 }
167 } else { 273 } else {
168 switch (state_) { 274 switch (state_) {
169 case password_manager::ui::PENDING_PASSWORD_STATE: 275 case password_manager::ui::PENDING_PASSWORD_STATE:
170 display_disposition_ = metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING; 276 display_disposition = metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING;
171 break; 277 break;
172 case password_manager::ui::PENDING_PASSWORD_UPDATE_STATE: 278 case password_manager::ui::PENDING_PASSWORD_UPDATE_STATE:
173 display_disposition_ = 279 display_disposition =
174 metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING_UPDATE; 280 metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING_UPDATE;
175 break; 281 break;
176 case password_manager::ui::CONFIRMATION_STATE: 282 case password_manager::ui::CONFIRMATION_STATE:
177 display_disposition_ = 283 display_disposition =
178 metrics_util::AUTOMATIC_GENERATED_PASSWORD_CONFIRMATION; 284 metrics_util::AUTOMATIC_GENERATED_PASSWORD_CONFIRMATION;
179 break; 285 break;
180 case password_manager::ui::AUTO_SIGNIN_STATE: 286 case password_manager::ui::AUTO_SIGNIN_STATE:
181 display_disposition_ = metrics_util::AUTOMATIC_SIGNIN_TOAST; 287 display_disposition = metrics_util::AUTOMATIC_SIGNIN_TOAST;
182 break; 288 break;
183 case password_manager::ui::MANAGE_STATE: 289 case password_manager::ui::MANAGE_STATE:
184 case password_manager::ui::CREDENTIAL_REQUEST_STATE: 290 case password_manager::ui::CREDENTIAL_REQUEST_STATE:
185 case password_manager::ui::INACTIVE_STATE: 291 case password_manager::ui::INACTIVE_STATE:
186 NOTREACHED(); 292 NOTREACHED();
187 break; 293 break;
188 } 294 }
189 } 295 }
190 metrics_util::LogUIDisplayDisposition(display_disposition_); 296 metrics_util::LogUIDisplayDisposition(display_disposition);
297 interaction_keeper_.reset(new InteractionKeeper(std::move(interaction_stats),
298 display_disposition));
191 299
192 delegate->OnBubbleShown(); 300 delegate->OnBubbleShown();
193 } 301 }
194 302
195 ManagePasswordsBubbleModel::~ManagePasswordsBubbleModel() { 303 ManagePasswordsBubbleModel::~ManagePasswordsBubbleModel() {
196 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE) { 304 interaction_keeper_->ReportInteractions(this);
197 Profile* profile = GetProfile(); 305 // web_contents() is nullptr if the tab is closing.
198 if (profile) {
199 if (GetSmartLockBrandingState(profile) ==
200 password_bubble_experiment::SmartLockBranding::FULL) {
201 password_bubble_experiment::RecordSavePromptFirstRunExperienceWasShown(
202 profile->GetPrefs());
203 }
204 if (dismissal_reason_ == metrics_util::NO_DIRECT_INTERACTION &&
205 display_disposition_ ==
206 metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING) {
207 if (interaction_stats_.dismissal_count <
208 std::numeric_limits<decltype(
209 interaction_stats_.dismissal_count)>::max())
210 interaction_stats_.dismissal_count++;
211 interaction_stats_.update_time = clock_->Now();
212 password_manager::PasswordStore* password_store =
213 PasswordStoreFactory::GetForProfile(
214 profile, ServiceAccessType::EXPLICIT_ACCESS)
215 .get();
216 password_store->AddSiteStats(interaction_stats_);
217 }
218 }
219 }
220 PasswordsModelDelegate* delegate = 306 PasswordsModelDelegate* delegate =
221 web_contents() ? PasswordsModelDelegateFromWebContents(web_contents()) 307 web_contents() ? PasswordsModelDelegateFromWebContents(web_contents())
222 : nullptr; 308 : nullptr;
223 if (delegate) 309 if (delegate)
224 delegate->OnBubbleHidden(); 310 delegate->OnBubbleHidden();
225 if (dismissal_reason_ == metrics_util::NOT_DISPLAYED)
226 return;
227
228 if (state_ != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) {
229 // We have separate metrics for the Update bubble so do not record dismissal
230 // reason for it.
231 metrics_util::LogUIDismissalReason(dismissal_reason_);
232 }
233 // Check if this was update password and record update statistics.
234 if (update_password_submission_event_ == metrics_util::NO_UPDATE_SUBMISSION &&
235 (state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE ||
236 state_ == password_manager::ui::PENDING_PASSWORD_STATE)) {
237 update_password_submission_event_ =
238 GetUpdateDismissalReason(NO_INTERACTION);
239 if (state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE &&
240 delegate)
241 delegate->OnNoInteractionOnUpdate();
242 }
243 if (update_password_submission_event_ != metrics_util::NO_UPDATE_SUBMISSION)
244 LogUpdatePasswordSubmissionEvent(update_password_submission_event_);
245 } 311 }
246 312
247 void ManagePasswordsBubbleModel::OnNeverForThisSiteClicked() { 313 void ManagePasswordsBubbleModel::OnNeverForThisSiteClicked() {
248 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, state_); 314 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, state_);
249 dismissal_reason_ = metrics_util::CLICKED_NEVER; 315 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_NEVER);
250 update_password_submission_event_ = GetUpdateDismissalReason(NOPE_CLICKED); 316 interaction_keeper_->set_update_password_submission_event(
317 GetUpdateDismissalReason(NOPE_CLICKED));
251 CleanStatisticsForSite(web_contents(), origin_); 318 CleanStatisticsForSite(web_contents(), origin_);
252 PasswordsModelDelegateFromWebContents(web_contents())->NeverSavePassword(); 319 PasswordsModelDelegateFromWebContents(web_contents())->NeverSavePassword();
253 } 320 }
254 321
255 void ManagePasswordsBubbleModel::OnSaveClicked() { 322 void ManagePasswordsBubbleModel::OnSaveClicked() {
256 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, state_); 323 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, state_);
257 dismissal_reason_ = metrics_util::CLICKED_SAVE; 324 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_SAVE);
258 update_password_submission_event_ = GetUpdateDismissalReason(UPDATE_CLICKED); 325 interaction_keeper_->set_update_password_submission_event(
326 GetUpdateDismissalReason(UPDATE_CLICKED));
259 CleanStatisticsForSite(web_contents(), origin_); 327 CleanStatisticsForSite(web_contents(), origin_);
260 PasswordsModelDelegateFromWebContents(web_contents())->SavePassword(); 328 PasswordsModelDelegateFromWebContents(web_contents())->SavePassword();
261 } 329 }
262 330
263 void ManagePasswordsBubbleModel::OnNopeUpdateClicked() { 331 void ManagePasswordsBubbleModel::OnNopeUpdateClicked() {
264 update_password_submission_event_ = GetUpdateDismissalReason(NOPE_CLICKED); 332 interaction_keeper_->set_update_password_submission_event(
333 GetUpdateDismissalReason(NOPE_CLICKED));
265 PasswordsModelDelegateFromWebContents(web_contents())->OnNopeUpdateClicked(); 334 PasswordsModelDelegateFromWebContents(web_contents())->OnNopeUpdateClicked();
266 } 335 }
267 336
268 void ManagePasswordsBubbleModel::OnUpdateClicked( 337 void ManagePasswordsBubbleModel::OnUpdateClicked(
269 const autofill::PasswordForm& password_form) { 338 const autofill::PasswordForm& password_form) {
270 update_password_submission_event_ = GetUpdateDismissalReason(UPDATE_CLICKED); 339 interaction_keeper_->set_update_password_submission_event(
340 GetUpdateDismissalReason(UPDATE_CLICKED));
271 PasswordsModelDelegateFromWebContents(web_contents())->UpdatePassword( 341 PasswordsModelDelegateFromWebContents(web_contents())->UpdatePassword(
272 password_form); 342 password_form);
273 } 343 }
274 344
275 void ManagePasswordsBubbleModel::OnDoneClicked() { 345 void ManagePasswordsBubbleModel::OnDoneClicked() {
276 dismissal_reason_ = metrics_util::CLICKED_DONE; 346 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_DONE);
277 } 347 }
278 348
279 // TODO(gcasto): Is it worth having this be separate from OnDoneClicked()? 349 // TODO(gcasto): Is it worth having this be separate from OnDoneClicked()?
280 // User intent is pretty similar in both cases. 350 // User intent is pretty similar in both cases.
281 void ManagePasswordsBubbleModel::OnOKClicked() { 351 void ManagePasswordsBubbleModel::OnOKClicked() {
282 dismissal_reason_ = metrics_util::CLICKED_OK; 352 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_OK);
283 } 353 }
284 354
285 void ManagePasswordsBubbleModel::OnManageLinkClicked() { 355 void ManagePasswordsBubbleModel::OnManageLinkClicked() {
286 dismissal_reason_ = metrics_util::CLICKED_MANAGE; 356 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_MANAGE);
287 if (GetSmartLockBrandingState(GetProfile()) == 357 if (GetSmartLockBrandingState(GetProfile()) ==
288 password_bubble_experiment::SmartLockBranding::FULL) { 358 password_bubble_experiment::SmartLockBranding::FULL) {
289 PasswordsModelDelegateFromWebContents(web_contents()) 359 PasswordsModelDelegateFromWebContents(web_contents())
290 ->NavigateToExternalPasswordManager(); 360 ->NavigateToExternalPasswordManager();
291 } else { 361 } else {
292 PasswordsModelDelegateFromWebContents(web_contents()) 362 PasswordsModelDelegateFromWebContents(web_contents())
293 ->NavigateToPasswordManagerSettingsPage(); 363 ->NavigateToPasswordManagerSettingsPage();
294 } 364 }
295 } 365 }
296 366
297 void ManagePasswordsBubbleModel::OnBrandLinkClicked() { 367 void ManagePasswordsBubbleModel::OnBrandLinkClicked() {
298 dismissal_reason_ = metrics_util::CLICKED_BRAND_NAME; 368 interaction_keeper_->set_dismissal_reason(metrics_util::CLICKED_BRAND_NAME);
299 PasswordsModelDelegateFromWebContents(web_contents()) 369 PasswordsModelDelegateFromWebContents(web_contents())
300 ->NavigateToSmartLockHelpPage(); 370 ->NavigateToSmartLockHelpPage();
301 } 371 }
302 372
303 void ManagePasswordsBubbleModel::OnAutoSignInToastTimeout() { 373 void ManagePasswordsBubbleModel::OnAutoSignInToastTimeout() {
304 dismissal_reason_ = metrics_util::AUTO_SIGNIN_TOAST_TIMEOUT; 374 interaction_keeper_->set_dismissal_reason(
375 metrics_util::AUTO_SIGNIN_TOAST_TIMEOUT);
305 } 376 }
306 377
307 void ManagePasswordsBubbleModel::OnPasswordAction( 378 void ManagePasswordsBubbleModel::OnPasswordAction(
308 const autofill::PasswordForm& password_form, 379 const autofill::PasswordForm& password_form,
309 PasswordAction action) { 380 PasswordAction action) {
310 if (!web_contents()) 381 Profile* profile = GetProfile();
382 if (!profile)
311 return; 383 return;
312 Profile* profile =
313 Profile::FromBrowserContext(web_contents()->GetBrowserContext());
314 password_manager::PasswordStore* password_store = 384 password_manager::PasswordStore* password_store =
315 PasswordStoreFactory::GetForProfile( 385 PasswordStoreFactory::GetForProfile(
316 profile, ServiceAccessType::EXPLICIT_ACCESS).get(); 386 profile, ServiceAccessType::EXPLICIT_ACCESS).get();
317 DCHECK(password_store); 387 DCHECK(password_store);
318 if (action == REMOVE_PASSWORD) 388 if (action == REMOVE_PASSWORD)
319 password_store->RemoveLogin(password_form); 389 password_store->RemoveLogin(password_form);
320 else 390 else
321 password_store->AddLogin(password_form); 391 password_store->AddLogin(password_form);
322 } 392 }
323 393
(...skipping 10 matching lines...) Expand all
334 Profile* profile = GetProfile(); 404 Profile* profile = GetProfile();
335 if (GetSmartLockBrandingState(profile) == 405 if (GetSmartLockBrandingState(profile) ==
336 password_bubble_experiment::SmartLockBranding::FULL) { 406 password_bubble_experiment::SmartLockBranding::FULL) {
337 PrefService* prefs = profile->GetPrefs(); 407 PrefService* prefs = profile->GetPrefs();
338 return !prefs->GetBoolean( 408 return !prefs->GetBoolean(
339 password_manager::prefs::kWasSavePrompFirstRunExperienceShown); 409 password_manager::prefs::kWasSavePrompFirstRunExperienceShown);
340 } 410 }
341 return false; 411 return false;
342 } 412 }
343 413
414 void ManagePasswordsBubbleModel::SetClockForTesting(
415 std::unique_ptr<base::Clock> clock) {
416 interaction_keeper_->SetClockForTesting(std::move(clock));
417 }
418
344 void ManagePasswordsBubbleModel::UpdatePendingStateTitle() { 419 void ManagePasswordsBubbleModel::UpdatePendingStateTitle() {
345 title_brand_link_range_ = gfx::Range(); 420 title_brand_link_range_ = gfx::Range();
346 PasswordTittleType type = 421 PasswordTittleType type =
347 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE 422 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE
348 ? PasswordTittleType::UPDATE_PASSWORD 423 ? PasswordTittleType::UPDATE_PASSWORD
349 : (pending_password_.federation_origin.unique() 424 : (pending_password_.federation_origin.unique()
350 ? PasswordTittleType::SAVE_PASSWORD 425 ? PasswordTittleType::SAVE_PASSWORD
351 : PasswordTittleType::SAVE_ACCOUNT); 426 : PasswordTittleType::SAVE_ACCOUNT);
352 GetSavePasswordDialogTitleTextAndLinkRange( 427 GetSavePasswordDialogTitleTextAndLinkRange(
353 web_contents()->GetVisibleURL(), origin_, 428 web_contents()->GetVisibleURL(), origin_,
(...skipping 30 matching lines...) Expand all
384 return metrics_util::NO_UPDATE_SUBMISSION; 459 return metrics_util::NO_UPDATE_SUBMISSION;
385 } 460 }
386 if (state_ != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) 461 if (state_ != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE)
387 return metrics_util::NO_UPDATE_SUBMISSION; 462 return metrics_util::NO_UPDATE_SUBMISSION;
388 if (password_overridden_) 463 if (password_overridden_)
389 return update_events[3][behavior]; 464 return update_events[3][behavior];
390 if (ShouldShowMultipleAccountUpdateUI()) 465 if (ShouldShowMultipleAccountUpdateUI())
391 return update_events[2][behavior]; 466 return update_events[2][behavior];
392 return update_events[1][behavior]; 467 return update_events[1][behavior];
393 } 468 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698