OLD | NEW |
---|---|
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 "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
9 #include "chrome/browser/password_manager/password_store_factory.h" | 9 #include "chrome/browser/password_manager/password_store_factory.h" |
10 #include "chrome/browser/profiles/profile.h" | 10 #include "chrome/browser/profiles/profile.h" |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
78 const ProfileSyncService* sync_service = | 78 const ProfileSyncService* sync_service = |
79 ProfileSyncServiceFactory::GetForProfile(profile); | 79 ProfileSyncServiceFactory::GetForProfile(profile); |
80 return password_bubble_experiment::IsSmartLockBrandingEnabled(sync_service); | 80 return password_bubble_experiment::IsSmartLockBrandingEnabled(sync_service); |
81 } | 81 } |
82 | 82 |
83 } // namespace | 83 } // namespace |
84 | 84 |
85 ManagePasswordsBubbleModel::ManagePasswordsBubbleModel( | 85 ManagePasswordsBubbleModel::ManagePasswordsBubbleModel( |
86 content::WebContents* web_contents) | 86 content::WebContents* web_contents) |
87 : content::WebContentsObserver(web_contents), | 87 : content::WebContentsObserver(web_contents), |
88 is_update_bubble_(false), | |
88 display_disposition_(metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING), | 89 display_disposition_(metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING), |
89 dismissal_reason_(metrics_util::NOT_DISPLAYED) { | 90 dismissal_reason_(metrics_util::NOT_DISPLAYED), |
91 update_password_submission_event_(metrics_util::NO_UPDATE_SUBMISSION) { | |
90 ManagePasswordsUIController* controller = | 92 ManagePasswordsUIController* controller = |
91 ManagePasswordsUIController::FromWebContents(web_contents); | 93 ManagePasswordsUIController::FromWebContents(web_contents); |
92 | 94 |
93 origin_ = controller->origin(); | 95 origin_ = controller->origin(); |
94 state_ = controller->state(); | 96 state_ = controller->state(); |
95 password_overridden_ = controller->PasswordOverridden(); | 97 password_overridden_ = controller->PasswordOverridden(); |
96 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE || | 98 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE || |
97 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { | 99 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { |
98 pending_password_ = controller->PendingPassword(); | 100 pending_password_ = controller->PendingPassword(); |
99 local_credentials_ = DeepCopyForms(controller->GetCurrentForms()); | 101 local_credentials_ = DeepCopyForms(controller->GetCurrentForms()); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
140 size_t offset; | 142 size_t offset; |
141 save_confirmation_text_ = | 143 save_confirmation_text_ = |
142 l10n_util::GetStringFUTF16( | 144 l10n_util::GetStringFUTF16( |
143 confirmation_text_id, save_confirmation_link, &offset); | 145 confirmation_text_id, save_confirmation_link, &offset); |
144 save_confirmation_link_range_ = | 146 save_confirmation_link_range_ = |
145 gfx::Range(offset, offset + save_confirmation_link.length()); | 147 gfx::Range(offset, offset + save_confirmation_link.length()); |
146 } | 148 } |
147 | 149 |
148 manage_link_ = | 150 manage_link_ = |
149 l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_MANAGE_PASSWORDS_LINK); | 151 l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_MANAGE_PASSWORDS_LINK); |
152 | |
153 is_update_bubble_ = | |
154 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE; | |
150 } | 155 } |
151 | 156 |
152 ManagePasswordsBubbleModel::~ManagePasswordsBubbleModel() {} | 157 ManagePasswordsBubbleModel::~ManagePasswordsBubbleModel() {} |
153 | 158 |
154 void ManagePasswordsBubbleModel::OnBubbleShown( | 159 void ManagePasswordsBubbleModel::OnBubbleShown( |
155 ManagePasswordsBubble::DisplayReason reason) { | 160 ManagePasswordsBubble::DisplayReason reason) { |
156 if (reason == ManagePasswordsBubble::USER_ACTION) { | 161 if (reason == ManagePasswordsBubble::USER_ACTION) { |
157 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE) { | 162 switch (state_) { |
158 display_disposition_ = metrics_util::MANUAL_WITH_PASSWORD_PENDING; | 163 case password_manager::ui::PENDING_PASSWORD_STATE: |
159 } else { | 164 display_disposition_ = metrics_util::MANUAL_WITH_PASSWORD_PENDING; |
160 display_disposition_ = metrics_util::MANUAL_MANAGE_PASSWORDS; | 165 break; |
166 case password_manager::ui::PENDING_PASSWORD_UPDATE_STATE: | |
167 display_disposition_ = | |
168 metrics_util::MANUAL_WITH_PASSWORD_PENDING_UPDATE; | |
169 break; | |
170 case password_manager::ui::MANAGE_STATE: | |
171 display_disposition_ = metrics_util::MANUAL_MANAGE_PASSWORDS; | |
172 break; | |
173 default: | |
174 NOTREACHED(); | |
161 } | 175 } |
162 } else { | 176 } else { |
163 if (state_ == password_manager::ui::CONFIRMATION_STATE) { | 177 switch (state_) { |
164 display_disposition_ = | 178 case password_manager::ui::PENDING_PASSWORD_STATE: |
165 metrics_util::AUTOMATIC_GENERATED_PASSWORD_CONFIRMATION; | 179 display_disposition_ = metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING; |
166 } else if (state_ == password_manager::ui::CREDENTIAL_REQUEST_STATE) { | 180 break; |
167 display_disposition_ = metrics_util::AUTOMATIC_CREDENTIAL_REQUEST; | 181 case password_manager::ui::PENDING_PASSWORD_UPDATE_STATE: |
168 } else if (state_ == password_manager::ui::AUTO_SIGNIN_STATE) { | 182 display_disposition_ = |
169 display_disposition_ = metrics_util::AUTOMATIC_SIGNIN_TOAST; | 183 metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING_UPDATE; |
170 } else { | 184 break; |
171 display_disposition_ = metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING; | 185 case password_manager::ui::CONFIRMATION_STATE: |
186 display_disposition_ = | |
187 metrics_util::AUTOMATIC_GENERATED_PASSWORD_CONFIRMATION; | |
188 break; | |
189 case password_manager::ui::CREDENTIAL_REQUEST_STATE: | |
190 display_disposition_ = metrics_util::AUTOMATIC_CREDENTIAL_REQUEST; | |
191 break; | |
192 case password_manager::ui::AUTO_SIGNIN_STATE: | |
193 display_disposition_ = metrics_util::AUTOMATIC_SIGNIN_TOAST; | |
194 break; | |
195 default: | |
196 NOTREACHED(); | |
172 } | 197 } |
173 } | 198 } |
174 metrics_util::LogUIDisplayDisposition(display_disposition_); | 199 metrics_util::LogUIDisplayDisposition(display_disposition_); |
175 | 200 |
176 // Default to a dismissal reason of "no interaction". If the user interacts | 201 // Default to a dismissal reason of "no interaction". If the user interacts |
177 // with the button in such a way that it closes, we'll reset this value | 202 // with the button in such a way that it closes, we'll reset this value |
178 // accordingly. | 203 // accordingly. |
179 dismissal_reason_ = metrics_util::NO_DIRECT_INTERACTION; | 204 dismissal_reason_ = metrics_util::NO_DIRECT_INTERACTION; |
180 | 205 |
181 ManagePasswordsUIController* controller = | 206 ManagePasswordsUIController* controller = |
182 ManagePasswordsUIController::FromWebContents(web_contents()); | 207 ManagePasswordsUIController::FromWebContents(web_contents()); |
183 controller->OnBubbleShown(); | 208 controller->OnBubbleShown(); |
184 } | 209 } |
185 | 210 |
186 void ManagePasswordsBubbleModel::OnBubbleHidden() { | 211 void ManagePasswordsBubbleModel::OnBubbleHidden() { |
187 ManagePasswordsUIController* manage_passwords_ui_controller = | 212 ManagePasswordsUIController* manage_passwords_ui_controller = |
188 web_contents() ? | 213 web_contents() ? |
189 ManagePasswordsUIController::FromWebContents(web_contents()) | 214 ManagePasswordsUIController::FromWebContents(web_contents()) |
190 : nullptr; | 215 : nullptr; |
191 if (manage_passwords_ui_controller) | 216 if (manage_passwords_ui_controller) |
192 manage_passwords_ui_controller->OnBubbleHidden(); | 217 manage_passwords_ui_controller->OnBubbleHidden(); |
193 if (dismissal_reason_ == metrics_util::NOT_DISPLAYED) | 218 if (dismissal_reason_ == metrics_util::NOT_DISPLAYED) |
194 return; | 219 return; |
195 | 220 |
196 metrics_util::LogUIDismissalReason(dismissal_reason_); | 221 if (!is_update_bubble_) { |
222 // We have separate metrics for the Update bubble so do not record dismissal | |
223 // reason for it. | |
224 metrics_util::LogUIDismissalReason(dismissal_reason_); | |
225 } | |
197 // Other use cases have been reported in the callbacks like OnSaveClicked(). | 226 // Other use cases have been reported in the callbacks like OnSaveClicked(). |
198 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE && | 227 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE && |
199 dismissal_reason_ == metrics_util::NO_DIRECT_INTERACTION) | 228 dismissal_reason_ == metrics_util::NO_DIRECT_INTERACTION) |
200 RecordExperimentStatistics(web_contents(), dismissal_reason_); | 229 RecordExperimentStatistics(web_contents(), dismissal_reason_); |
230 // Check if this was update password and record update statistics. | |
231 if (update_password_submission_event_ == metrics_util::NO_UPDATE_SUBMISSION) { | |
232 if (state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE || | |
233 state_ == password_manager::ui::PENDING_PASSWORD_STATE) | |
vasilii
2015/08/21 14:59:22
Make this 'if' the outer one.
dvadym
2015/08/21 15:31:13
Done.
| |
234 update_password_submission_event_ = | |
235 GetUpdateDismissalReason(NO_INTERACTION); | |
236 } | |
237 | |
238 if (update_password_submission_event_ != metrics_util::NO_UPDATE_SUBMISSION) | |
239 LogUpdatePasswordSubmissionEvent(update_password_submission_event_); | |
201 } | 240 } |
202 | 241 |
203 void ManagePasswordsBubbleModel::OnCancelClicked() { | 242 void ManagePasswordsBubbleModel::OnCancelClicked() { |
204 DCHECK_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE, state_); | 243 DCHECK_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE, state_); |
244 update_password_submission_event_ = GetUpdateDismissalReason(NOPE_CLICKED); | |
vasilii
2015/08/21 14:59:22
This is 100% error.
dvadym
2015/08/21 15:31:13
Thanks, moved to OnNeverForThisSiteClicked()
| |
205 dismissal_reason_ = metrics_util::CLICKED_CANCEL; | 245 dismissal_reason_ = metrics_util::CLICKED_CANCEL; |
206 } | 246 } |
207 | 247 |
208 void ManagePasswordsBubbleModel::OnNeverForThisSiteClicked() { | 248 void ManagePasswordsBubbleModel::OnNeverForThisSiteClicked() { |
209 dismissal_reason_ = metrics_util::CLICKED_NEVER; | 249 dismissal_reason_ = metrics_util::CLICKED_NEVER; |
210 RecordExperimentStatistics(web_contents(), dismissal_reason_); | 250 RecordExperimentStatistics(web_contents(), dismissal_reason_); |
211 ManagePasswordsUIController* manage_passwords_ui_controller = | 251 ManagePasswordsUIController* manage_passwords_ui_controller = |
212 ManagePasswordsUIController::FromWebContents(web_contents()); | 252 ManagePasswordsUIController::FromWebContents(web_contents()); |
213 manage_passwords_ui_controller->NeverSavePassword(); | 253 manage_passwords_ui_controller->NeverSavePassword(); |
214 } | 254 } |
215 | 255 |
216 void ManagePasswordsBubbleModel::OnSaveClicked() { | 256 void ManagePasswordsBubbleModel::OnSaveClicked() { |
217 dismissal_reason_ = metrics_util::CLICKED_SAVE; | 257 dismissal_reason_ = metrics_util::CLICKED_SAVE; |
218 RecordExperimentStatistics(web_contents(), dismissal_reason_); | 258 RecordExperimentStatistics(web_contents(), dismissal_reason_); |
259 update_password_submission_event_ = GetUpdateDismissalReason(UPDATE_CLICKED); | |
219 ManagePasswordsUIController* manage_passwords_ui_controller = | 260 ManagePasswordsUIController* manage_passwords_ui_controller = |
220 ManagePasswordsUIController::FromWebContents(web_contents()); | 261 ManagePasswordsUIController::FromWebContents(web_contents()); |
221 manage_passwords_ui_controller->SavePassword(); | 262 manage_passwords_ui_controller->SavePassword(); |
222 state_ = password_manager::ui::MANAGE_STATE; | 263 state_ = password_manager::ui::MANAGE_STATE; |
223 } | 264 } |
224 | 265 |
225 void ManagePasswordsBubbleModel::OnUpdateClicked( | 266 void ManagePasswordsBubbleModel::OnUpdateClicked( |
226 const autofill::PasswordForm& password_form) { | 267 const autofill::PasswordForm& password_form) { |
268 update_password_submission_event_ = GetUpdateDismissalReason(UPDATE_CLICKED); | |
269 | |
227 ManagePasswordsUIController* manage_passwords_ui_controller = | 270 ManagePasswordsUIController* manage_passwords_ui_controller = |
228 ManagePasswordsUIController::FromWebContents(web_contents()); | 271 ManagePasswordsUIController::FromWebContents(web_contents()); |
229 manage_passwords_ui_controller->UpdatePassword(password_form); | 272 manage_passwords_ui_controller->UpdatePassword(password_form); |
230 state_ = password_manager::ui::MANAGE_STATE; | 273 state_ = password_manager::ui::MANAGE_STATE; |
231 } | 274 } |
232 | 275 |
233 void ManagePasswordsBubbleModel::OnDoneClicked() { | 276 void ManagePasswordsBubbleModel::OnDoneClicked() { |
234 dismissal_reason_ = metrics_util::CLICKED_DONE; | 277 dismissal_reason_ = metrics_util::CLICKED_DONE; |
235 } | 278 } |
236 | 279 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
322 } | 365 } |
323 | 366 |
324 void ManagePasswordsBubbleModel::UpdatePendingStateTitle() { | 367 void ManagePasswordsBubbleModel::UpdatePendingStateTitle() { |
325 title_brand_link_range_ = gfx::Range(); | 368 title_brand_link_range_ = gfx::Range(); |
326 GetSavePasswordDialogTitleTextAndLinkRange( | 369 GetSavePasswordDialogTitleTextAndLinkRange( |
327 web_contents()->GetVisibleURL(), origin(), | 370 web_contents()->GetVisibleURL(), origin(), |
328 IsSmartLockBrandingEnabled(GetProfile()), | 371 IsSmartLockBrandingEnabled(GetProfile()), |
329 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE, &title_, | 372 state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE, &title_, |
330 &title_brand_link_range_); | 373 &title_brand_link_range_); |
331 } | 374 } |
375 | |
376 password_manager::metrics_util::UpdatePasswordSubmissionEvent | |
377 ManagePasswordsBubbleModel::GetUpdateDismissalReason( | |
378 UserBehaviorOnUpdateBubble behavior) { | |
379 using namespace password_manager::metrics_util; | |
380 static const password_manager::metrics_util::UpdatePasswordSubmissionEvent | |
381 update_events[4][3] = { | |
382 {NO_ACCOUNTS_CLICKED_UPDATE, NO_ACCOUNTS_CLICKED_NOPE, | |
383 NO_ACCOUNTS_NO_INTERACTION}, | |
384 {ONE_ACCOUNT_CLICKED_UPDATE, ONE_ACCOUNT_CLICKED_NOPE, | |
385 ONE_ACCOUNT_NO_INTERACTION}, | |
386 {MULTIPLE_ACCOUNTS_CLICKED_UPDATE, MULTIPLE_ACCOUNTS_CLICKED_NOPE, | |
387 MULTIPLE_ACCOUNTS_NO_INTERACTION}, | |
388 {PASSWORD_OVERRIDDEN_CLICKED_UPDATE, PASSWORD_OVERRIDDEN_CLICKED_NOPE, | |
389 PASSWORD_OVERRIDDEN_NO_INTERACTION}}; | |
390 | |
391 if (state_ == password_manager::ui::PENDING_PASSWORD_STATE) { | |
392 if (pending_password_.IsPossibleChangePasswordFormWithoutUsername()) | |
393 return update_events[0][behavior]; | |
394 return NO_UPDATE_SUBMISSION; | |
395 } | |
396 if (password_overridden_) | |
397 return update_events[3][behavior]; | |
398 if (ShouldShowMultipleAccountUpdateUI()) | |
399 return update_events[2][behavior]; | |
400 return update_events[1][behavior]; | |
401 } | |
OLD | NEW |