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/macros.h" | 7 #include "base/macros.h" |
8 #include "base/metrics/user_metrics.h" | 8 #include "base/metrics/user_metrics.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "base/timer/timer.h" | 10 #include "base/timer/timer.h" |
11 #include "chrome/browser/platform_util.h" | 11 #include "chrome/browser/platform_util.h" |
12 #include "chrome/browser/profiles/profile.h" | 12 #include "chrome/browser/profiles/profile.h" |
13 #include "chrome/browser/ui/browser.h" | 13 #include "chrome/browser/ui/browser.h" |
14 #include "chrome/browser/ui/browser_dialogs.h" | 14 #include "chrome/browser/ui/browser_dialogs.h" |
15 #include "chrome/browser/ui/browser_finder.h" | 15 #include "chrome/browser/ui/browser_finder.h" |
16 #include "chrome/browser/ui/browser_window.h" | 16 #include "chrome/browser/ui/browser_window.h" |
17 #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h" | 17 #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h" |
18 #include "chrome/browser/ui/passwords/password_dialog_prompts.h" | 18 #include "chrome/browser/ui/passwords/password_dialog_prompts.h" |
19 #include "chrome/browser/ui/passwords/passwords_model_delegate.h" | 19 #include "chrome/browser/ui/passwords/passwords_model_delegate.h" |
20 #include "chrome/browser/ui/views/harmony/chrome_layout_provider.h" | 20 #include "chrome/browser/ui/views/harmony/chrome_layout_provider.h" |
21 #include "chrome/browser/ui/views/harmony/chrome_typography.h" | 21 #include "chrome/browser/ui/views/harmony/chrome_typography.h" |
22 #include "chrome/browser/ui/views/passwords/credentials_item_view.h" | 22 #include "chrome/browser/ui/views/passwords/credentials_item_view.h" |
23 #include "chrome/browser/ui/views/passwords/credentials_selection_view.h" | 23 #include "chrome/browser/ui/views/passwords/credentials_selection_view.h" |
24 #include "chrome/browser/ui/views/passwords/manage_password_items_view.h" | 24 #include "chrome/browser/ui/views/passwords/manage_password_items_view.h" |
25 #include "chrome/browser/ui/views/passwords/manage_passwords_icon_views.h" | 25 #include "chrome/browser/ui/views/passwords/manage_passwords_icon_views.h" |
26 #include "chrome/grit/generated_resources.h" | 26 #include "chrome/grit/generated_resources.h" |
| 27 #include "components/password_manager/core/common/password_manager_features.h" |
27 #include "components/strings/grit/components_strings.h" | 28 #include "components/strings/grit/components_strings.h" |
28 #include "ui/base/l10n/l10n_util.h" | 29 #include "ui/base/l10n/l10n_util.h" |
29 #include "ui/base/material_design/material_design_controller.h" | 30 #include "ui/base/material_design/material_design_controller.h" |
30 #include "ui/base/resource/resource_bundle.h" | 31 #include "ui/base/resource/resource_bundle.h" |
31 #include "ui/base/ui_features.h" | 32 #include "ui/base/ui_features.h" |
32 #include "ui/gfx/color_palette.h" | 33 #include "ui/gfx/color_palette.h" |
33 #include "ui/gfx/image/image_skia.h" | 34 #include "ui/gfx/image/image_skia.h" |
34 #include "ui/native_theme/native_theme.h" | 35 #include "ui/native_theme/native_theme.h" |
35 #include "ui/views/controls/button/blue_button.h" | 36 #include "ui/views/controls/button/blue_button.h" |
36 #include "ui/views/controls/button/md_text_button.h" | 37 #include "ui/views/controls/button/md_text_button.h" |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 } | 282 } |
282 | 283 |
283 void ManagePasswordsBubbleView::AutoSigninView::OnTimer() { | 284 void ManagePasswordsBubbleView::AutoSigninView::OnTimer() { |
284 parent_->model()->OnAutoSignInToastTimeout(); | 285 parent_->model()->OnAutoSignInToastTimeout(); |
285 parent_->CloseBubble(); | 286 parent_->CloseBubble(); |
286 } | 287 } |
287 | 288 |
288 // ManagePasswordsBubbleView::PendingView ------------------------------------- | 289 // ManagePasswordsBubbleView::PendingView ------------------------------------- |
289 | 290 |
290 // A view offering the user the ability to save credentials. Contains a | 291 // A view offering the user the ability to save credentials. Contains a |
291 // single ManagePasswordItemsView, along with a "Save Passwords" button | 292 // single ManagePasswordItemsView, along with a "Save Passwords" button, |
292 // and a "Never" button. | 293 // a "Never" button and an "Edit" button to edit username field. |
293 class ManagePasswordsBubbleView::PendingView | 294 class ManagePasswordsBubbleView::PendingView |
294 : public views::View, | 295 : public views::View, |
295 public views::ButtonListener, | 296 public views::ButtonListener, |
296 public views::StyledLabelListener { | 297 public views::StyledLabelListener { |
297 public: | 298 public: |
298 explicit PendingView(ManagePasswordsBubbleView* parent); | 299 explicit PendingView(ManagePasswordsBubbleView* parent); |
299 ~PendingView() override; | 300 ~PendingView() override; |
300 | 301 |
301 private: | 302 private: |
302 // views::ButtonListener: | 303 // views::ButtonListener: |
303 void ButtonPressed(views::Button* sender, const ui::Event& event) override; | 304 void ButtonPressed(views::Button* sender, const ui::Event& event) override; |
304 | 305 |
305 // views::StyledLabelListener: | 306 // views::StyledLabelListener: |
306 void StyledLabelLinkClicked(views::StyledLabel* label, | 307 void StyledLabelLinkClicked(views::StyledLabel* label, |
307 const gfx::Range& range, | 308 const gfx::Range& range, |
308 int event_flags) override; | 309 int event_flags) override; |
309 | 310 |
310 ManagePasswordsBubbleView* parent_; | 311 ManagePasswordsBubbleView* parent_; |
311 | 312 |
| 313 views::Button* edit_button_; |
312 views::Button* save_button_; | 314 views::Button* save_button_; |
313 views::Button* never_button_; | 315 views::Button* never_button_; |
314 | 316 |
315 DISALLOW_COPY_AND_ASSIGN(PendingView); | 317 DISALLOW_COPY_AND_ASSIGN(PendingView); |
316 }; | 318 }; |
317 | 319 |
318 ManagePasswordsBubbleView::PendingView::PendingView( | 320 ManagePasswordsBubbleView::PendingView::PendingView( |
319 ManagePasswordsBubbleView* parent) | 321 ManagePasswordsBubbleView* parent) |
320 : parent_(parent) { | 322 : parent_(parent), edit_button_(nullptr) { |
321 views::GridLayout* layout = new views::GridLayout(this); | 323 views::GridLayout* layout = new views::GridLayout(this); |
322 layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0)); | 324 layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0)); |
323 SetLayoutManager(layout); | 325 SetLayoutManager(layout); |
324 | 326 |
325 // Create the pending credential item, save button and refusal combobox. | 327 // Create the pending credential item, save button and refusal combobox. |
326 ManagePasswordItemsView* item = nullptr; | 328 ManagePasswordItemsView* item = nullptr; |
327 if (!parent->model()->pending_password().username_value.empty()) { | 329 if (!parent->model()->pending_password().username_value.empty()) { |
328 item = new ManagePasswordItemsView(parent_->model(), | 330 item = new ManagePasswordItemsView(parent_->model(), |
329 &parent->model()->pending_password()); | 331 &parent->model()->pending_password()); |
330 } | 332 } |
| 333 if (base::FeatureList::IsEnabled( |
| 334 password_manager::features::kEnableUsernameCorrection)) { |
| 335 edit_button_ = views::MdTextButton::CreateSecondaryUiButton( |
| 336 this, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_EDIT_BUTTON)); |
| 337 } |
331 save_button_ = views::MdTextButton::CreateSecondaryUiBlueButton( | 338 save_button_ = views::MdTextButton::CreateSecondaryUiBlueButton( |
332 this, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SAVE_BUTTON)); | 339 this, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SAVE_BUTTON)); |
333 never_button_ = views::MdTextButton::CreateSecondaryUiButton( | 340 never_button_ = views::MdTextButton::CreateSecondaryUiButton( |
334 this, | 341 this, |
335 l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_BUBBLE_BLACKLIST_BUTTON)); | 342 l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_BUBBLE_BLACKLIST_BUTTON)); |
336 | 343 |
337 // Title row. | 344 // Title row. |
338 BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET); | 345 BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET); |
339 AddTitleRowWithLink(layout, parent_->model(), this); | 346 AddTitleRowWithLink(layout, parent_->model(), this); |
340 | 347 |
341 // Credential row. | 348 // Credential row. |
342 if (item) { | 349 if (item) { |
343 layout->StartRow(0, SINGLE_VIEW_COLUMN_SET); | 350 layout->StartRow(0, SINGLE_VIEW_COLUMN_SET); |
344 layout->AddView(item); | 351 layout->AddView(item); |
345 layout->AddPaddingRow(0, | 352 layout->AddPaddingRow(0, |
346 ChromeLayoutProvider::Get() | 353 ChromeLayoutProvider::Get() |
347 ->GetInsetsMetric(views::INSETS_DIALOG_CONTENTS) | 354 ->GetInsetsMetric(views::INSETS_DIALOG_CONTENTS) |
348 .bottom()); | 355 .bottom()); |
349 } | 356 } |
350 | 357 |
351 // Button row. | 358 // Button row. |
352 BuildColumnSet(layout, DOUBLE_BUTTON_COLUMN_SET); | 359 ColumnSetType column_set_type = |
353 layout->StartRow(0, DOUBLE_BUTTON_COLUMN_SET); | 360 edit_button_ ? TRIPLE_BUTTON_COLUMN_SET : DOUBLE_BUTTON_COLUMN_SET; |
| 361 BuildColumnSet(layout, column_set_type); |
| 362 layout->StartRow(0, column_set_type); |
| 363 if (column_set_type == TRIPLE_BUTTON_COLUMN_SET) { |
| 364 layout->AddView(edit_button_); |
| 365 } |
354 layout->AddView(save_button_); | 366 layout->AddView(save_button_); |
355 layout->AddView(never_button_); | 367 layout->AddView(never_button_); |
356 | 368 |
357 parent_->set_initially_focused_view(save_button_); | 369 parent_->set_initially_focused_view(save_button_); |
358 } | 370 } |
359 | 371 |
360 ManagePasswordsBubbleView::PendingView::~PendingView() { | 372 ManagePasswordsBubbleView::PendingView::~PendingView() { |
361 } | 373 } |
362 | 374 |
363 void ManagePasswordsBubbleView::PendingView::ButtonPressed( | 375 void ManagePasswordsBubbleView::PendingView::ButtonPressed( |
364 views::Button* sender, | 376 views::Button* sender, |
365 const ui::Event& event) { | 377 const ui::Event& event) { |
366 if (sender == save_button_) { | 378 // TODO(https://crbug.com/734965): Implement edit button logic. |
| 379 if (sender == edit_button_) { |
| 380 return; |
| 381 } else if (sender == save_button_) { |
367 parent_->model()->OnSaveClicked(); | 382 parent_->model()->OnSaveClicked(); |
368 if (parent_->model()->ReplaceToShowPromotionIfNeeded()) { | 383 if (parent_->model()->ReplaceToShowPromotionIfNeeded()) { |
369 parent_->Refresh(); | 384 parent_->Refresh(); |
370 return; | 385 return; |
371 } | 386 } |
372 } else if (sender == never_button_) { | 387 } else if (sender == never_button_) { |
373 parent_->model()->OnNeverForThisSiteClicked(); | 388 parent_->model()->OnNeverForThisSiteClicked(); |
374 } else { | 389 } else { |
375 NOTREACHED(); | 390 NOTREACHED(); |
376 } | 391 } |
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
901 } else if (model_.state() == | 916 } else if (model_.state() == |
902 password_manager::ui::CHROME_DESKTOP_IOS_PROMO_STATE) { | 917 password_manager::ui::CHROME_DESKTOP_IOS_PROMO_STATE) { |
903 AddChildView(new DesktopIOSPromotionBubbleView( | 918 AddChildView(new DesktopIOSPromotionBubbleView( |
904 model_.GetProfile(), | 919 model_.GetProfile(), |
905 desktop_ios_promotion::PromotionEntryPoint::SAVE_PASSWORD_BUBBLE)); | 920 desktop_ios_promotion::PromotionEntryPoint::SAVE_PASSWORD_BUBBLE)); |
906 #endif | 921 #endif |
907 } else { | 922 } else { |
908 AddChildView(new ManageView(this)); | 923 AddChildView(new ManageView(this)); |
909 } | 924 } |
910 } | 925 } |
OLD | NEW |