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/views/passwords/manage_passwords_bubble_view.h" | 5 #include "chrome/browser/ui/views/passwords/manage_passwords_bubble_view.h" |
6 | 6 |
| 7 #include "base/timer/timer.h" |
7 #include "chrome/browser/profiles/profile.h" | 8 #include "chrome/browser/profiles/profile.h" |
8 #include "chrome/browser/ui/browser.h" | 9 #include "chrome/browser/ui/browser.h" |
9 #include "chrome/browser/ui/browser_finder.h" | 10 #include "chrome/browser/ui/browser_finder.h" |
10 #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h" | 11 #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h" |
11 #include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h" | 12 #include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h" |
12 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h" | 13 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h" |
13 #include "chrome/browser/ui/passwords/save_password_refusal_combobox_model.h" | 14 #include "chrome/browser/ui/passwords/save_password_refusal_combobox_model.h" |
14 #include "chrome/browser/ui/views/frame/browser_view.h" | 15 #include "chrome/browser/ui/views/frame/browser_view.h" |
15 #include "chrome/browser/ui/views/passwords/credentials_item_view.h" | 16 #include "chrome/browser/ui/views/passwords/credentials_item_view.h" |
16 #include "chrome/browser/ui/views/passwords/manage_password_items_view.h" | 17 #include "chrome/browser/ui/views/passwords/manage_password_items_view.h" |
(...skipping 15 matching lines...) Expand all Loading... |
32 #include "ui/views/layout/fill_layout.h" | 33 #include "ui/views/layout/fill_layout.h" |
33 #include "ui/views/layout/grid_layout.h" | 34 #include "ui/views/layout/grid_layout.h" |
34 #include "ui/views/layout/layout_constants.h" | 35 #include "ui/views/layout/layout_constants.h" |
35 #include "ui/views/widget/widget.h" | 36 #include "ui/views/widget/widget.h" |
36 | 37 |
37 | 38 |
38 // Helpers -------------------------------------------------------------------- | 39 // Helpers -------------------------------------------------------------------- |
39 | 40 |
40 namespace { | 41 namespace { |
41 | 42 |
| 43 const int kAutoSigninToastTimeout = 5; |
42 const int kDesiredBubbleWidth = 370; | 44 const int kDesiredBubbleWidth = 370; |
43 | 45 |
44 enum ColumnSetType { | 46 enum ColumnSetType { |
45 // | | (FILL, FILL) | | | 47 // | | (FILL, FILL) | | |
46 // Used for the bubble's header, the credentials list, and for simple | 48 // Used for the bubble's header, the credentials list, and for simple |
47 // messages like "No passwords". | 49 // messages like "No passwords". |
48 SINGLE_VIEW_COLUMN_SET = 0, | 50 SINGLE_VIEW_COLUMN_SET = 0, |
49 | 51 |
50 // | | (TRAILING, CENTER) | | (TRAILING, CENTER) | | | 52 // | | (TRAILING, CENTER) | | (TRAILING, CENTER) | | |
51 // Used for buttons at the bottom of the bubble which should nest at the | 53 // Used for buttons at the bottom of the bubble which should nest at the |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
239 | 241 |
240 void ManagePasswordsBubbleView::AccountChooserView::AddCredentialItemsWithType( | 242 void ManagePasswordsBubbleView::AccountChooserView::AddCredentialItemsWithType( |
241 views::GridLayout* layout, | 243 views::GridLayout* layout, |
242 const ScopedVector<autofill::PasswordForm>& password_forms, | 244 const ScopedVector<autofill::PasswordForm>& password_forms, |
243 password_manager::CredentialType type) { | 245 password_manager::CredentialType type) { |
244 net::URLRequestContextGetter* request_context = | 246 net::URLRequestContextGetter* request_context = |
245 parent_->model()->GetProfile()->GetRequestContext(); | 247 parent_->model()->GetProfile()->GetRequestContext(); |
246 for (autofill::PasswordForm* form : password_forms) { | 248 for (autofill::PasswordForm* form : password_forms) { |
247 // Add the title to the layout with appropriate padding. | 249 // Add the title to the layout with appropriate padding. |
248 layout->StartRow(0, SINGLE_VIEW_COLUMN_SET); | 250 layout->StartRow(0, SINGLE_VIEW_COLUMN_SET); |
249 layout->AddView( | 251 layout->AddView(new CredentialsItemView( |
250 new CredentialsItemView(this, *form, type, request_context)); | 252 this, *form, type, CredentialsItemView::ACCOUNT_CHOOSER, |
| 253 request_context)); |
251 } | 254 } |
252 } | 255 } |
253 | 256 |
254 void ManagePasswordsBubbleView::AccountChooserView::ButtonPressed( | 257 void ManagePasswordsBubbleView::AccountChooserView::ButtonPressed( |
255 views::Button* sender, const ui::Event& event) { | 258 views::Button* sender, const ui::Event& event) { |
256 if (sender != cancel_button_) { | 259 if (sender != cancel_button_) { |
257 // ManagePasswordsBubbleModel should care about calling a callback in case | 260 // ManagePasswordsBubbleModel should care about calling a callback in case |
258 // the bubble is dismissed by any other means. | 261 // the bubble is dismissed by any other means. |
259 CredentialsItemView* view = static_cast<CredentialsItemView*>(sender); | 262 CredentialsItemView* view = static_cast<CredentialsItemView*>(sender); |
260 parent_->model()->OnChooseCredentials(view->form(), | 263 parent_->model()->OnChooseCredentials(view->form(), |
261 view->credential_type()); | 264 view->credential_type()); |
262 } else { | 265 } else { |
263 parent_->model()->OnNopeClicked(); | 266 parent_->model()->OnNopeClicked(); |
264 } | 267 } |
265 parent_->Close(); | 268 parent_->Close(); |
266 } | 269 } |
267 | 270 |
| 271 // ManagePasswordsBubbleView::AutoSigninView ---------------------------------- |
| 272 |
| 273 // A view containing just one credential that was used for for automatic signing |
| 274 // in. |
| 275 class ManagePasswordsBubbleView::AutoSigninView |
| 276 : public views::View, |
| 277 public views::ButtonListener { |
| 278 public: |
| 279 explicit AutoSigninView(ManagePasswordsBubbleView* parent); |
| 280 |
| 281 private: |
| 282 // views::ButtonListener: |
| 283 void ButtonPressed(views::Button* sender, const ui::Event& event) override; |
| 284 |
| 285 void OnTimer(); |
| 286 |
| 287 base::OneShotTimer<AutoSigninView> timer_; |
| 288 ManagePasswordsBubbleView* parent_; |
| 289 }; |
| 290 |
| 291 ManagePasswordsBubbleView::AutoSigninView::AutoSigninView( |
| 292 ManagePasswordsBubbleView* parent) |
| 293 : parent_(parent) { |
| 294 SetLayoutManager(new views::FillLayout); |
| 295 CredentialsItemView* credential = new CredentialsItemView( |
| 296 this, |
| 297 parent_->model()->pending_password(), |
| 298 password_manager::CredentialType::CREDENTIAL_TYPE_LOCAL, |
| 299 CredentialsItemView::AUTO_SIGNIN, |
| 300 parent_->model()->GetProfile()->GetRequestContext()); |
| 301 AddChildView(credential); |
| 302 // TODO(vasilii): enable the button to switch to the "Managed" state. |
| 303 credential->SetEnabled(false); |
| 304 parent_->set_initially_focused_view(credential); |
| 305 |
| 306 timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(kAutoSigninToastTimeout), |
| 307 this, &AutoSigninView::OnTimer); |
| 308 } |
| 309 |
| 310 void ManagePasswordsBubbleView::AutoSigninView::ButtonPressed( |
| 311 views::Button* sender, const ui::Event& event) { |
| 312 // TODO(vasilii): close the toast and switch to the "Managed" state. |
| 313 } |
| 314 |
| 315 void ManagePasswordsBubbleView::AutoSigninView::OnTimer() { |
| 316 parent_->model()->OnAutoSignInToastTimeout(); |
| 317 parent_->Close(); |
| 318 } |
| 319 |
268 // ManagePasswordsBubbleView::AskUserToSubmitURLView ------------------------- | 320 // ManagePasswordsBubbleView::AskUserToSubmitURLView ------------------------- |
269 | 321 |
270 // Asks users if they want to report the URL when the password manager failed | 322 // Asks users if they want to report the URL when the password manager failed |
271 // to detect the form. View has following structure: | 323 // to detect the form. View has following structure: |
272 // We detected that Chrome password manager failed to handle this URL. | 324 // We detected that Chrome password manager failed to handle this URL. |
273 // Do you want to send this URL to Google to improve Chrome? | 325 // Do you want to send this URL to Google to improve Chrome? |
274 // ------------------------------------------------------------- | 326 // ------------------------------------------------------------- |
275 // https://strangesite.com/ | 327 // https://strangesite.com/ |
276 // ------------------------------------------------------------- | 328 // ------------------------------------------------------------- |
277 // [Send URL] [Nope] | 329 // [Send URL] [Nope] |
(...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
967 AddChildView(new PendingView(this)); | 1019 AddChildView(new PendingView(this)); |
968 } else if (IsAskSubmitURLState(model()->state())) { | 1020 } else if (IsAskSubmitURLState(model()->state())) { |
969 AddChildView(new AskUserToSubmitURLView(this)); | 1021 AddChildView(new AskUserToSubmitURLView(this)); |
970 } else if (model()->state() == password_manager::ui::BLACKLIST_STATE) { | 1022 } else if (model()->state() == password_manager::ui::BLACKLIST_STATE) { |
971 AddChildView(new BlacklistedView(this)); | 1023 AddChildView(new BlacklistedView(this)); |
972 } else if (model()->state() == password_manager::ui::CONFIRMATION_STATE) { | 1024 } else if (model()->state() == password_manager::ui::CONFIRMATION_STATE) { |
973 AddChildView(new SaveConfirmationView(this)); | 1025 AddChildView(new SaveConfirmationView(this)); |
974 } else if (model()->state() == | 1026 } else if (model()->state() == |
975 password_manager::ui::CREDENTIAL_REQUEST_STATE) { | 1027 password_manager::ui::CREDENTIAL_REQUEST_STATE) { |
976 AddChildView(new AccountChooserView(this)); | 1028 AddChildView(new AccountChooserView(this)); |
| 1029 } else if (model()->state() == password_manager::ui::AUTO_SIGNIN_STATE) { |
| 1030 AddChildView(new AutoSigninView(this)); |
977 } else { | 1031 } else { |
978 AddChildView(new ManageView(this)); | 1032 AddChildView(new ManageView(this)); |
979 } | 1033 } |
980 GetLayoutManager()->Layout(this); | 1034 GetLayoutManager()->Layout(this); |
981 } | 1035 } |
982 | 1036 |
983 void ManagePasswordsBubbleView::NotifyConfirmedNeverForThisSite() { | 1037 void ManagePasswordsBubbleView::NotifyConfirmedNeverForThisSite() { |
984 model()->OnNeverForThisSiteClicked(); | 1038 model()->OnNeverForThisSiteClicked(); |
985 Close(); | 1039 Close(); |
986 } | 1040 } |
987 | 1041 |
988 void ManagePasswordsBubbleView::NotifyUndoNeverForThisSite() { | 1042 void ManagePasswordsBubbleView::NotifyUndoNeverForThisSite() { |
989 model()->OnUndoNeverForThisSite(); | 1043 model()->OnUndoNeverForThisSite(); |
990 Refresh(); | 1044 Refresh(); |
991 } | 1045 } |
992 | 1046 |
993 void ManagePasswordsBubbleView::NotifyNeverForThisSiteClicked() { | 1047 void ManagePasswordsBubbleView::NotifyNeverForThisSiteClicked() { |
994 if (model()->best_matches().empty()) { | 1048 if (model()->best_matches().empty()) { |
995 // Skip confirmation if there are no existing passwords for this site. | 1049 // Skip confirmation if there are no existing passwords for this site. |
996 NotifyConfirmedNeverForThisSite(); | 1050 NotifyConfirmedNeverForThisSite(); |
997 } else { | 1051 } else { |
998 model()->OnConfirmationForNeverForThisSite(); | 1052 model()->OnConfirmationForNeverForThisSite(); |
999 Refresh(); | 1053 Refresh(); |
1000 } | 1054 } |
1001 } | 1055 } |
OLD | NEW |