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

Side by Side Diff: chrome/browser/ui/views/passwords/credentials_selection_view.cc

Issue 2808823002: MacViews: Allows the toolkit-views Manage Passwords Dialog to be used (Closed)
Patch Set: MacViews: Allows the toolkit-views Manage Passwords Dialog to be used Created 3 years, 8 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
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/views/passwords/credentials_selection_view.h"
6
7 #include <stddef.h>
8
9 #include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h"
10 #include "components/password_manager/core/browser/password_manager_metrics_util .h"
11 #include "ui/base/models/simple_combobox_model.h"
12 #include "ui/base/resource/resource_bundle.h"
13 #include "ui/views/controls/button/button.h"
14 #include "ui/views/controls/combobox/combobox.h"
15 #include "ui/views/controls/label.h"
16 #include "ui/views/layout/grid_layout.h"
17 #include "ui/views/layout/layout_constants.h"
18
19 namespace {
20
21 views::Label* GeneratePasswordLabel(const autofill::PasswordForm& form) {
22 views::Label* label = new views::Label(form.password_value);
23 label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
24 ui::ResourceBundle::SmallFont));
25 label->SetHorizontalAlignment(gfx::ALIGN_CENTER);
26 label->SetObscured(true);
27 return label;
28 }
29
30 } // namespace
31
32 CredentialsSelectionView::CredentialsSelectionView(
33 ManagePasswordsBubbleModel* manage_passwords_bubble_model)
34 : password_forms_(&manage_passwords_bubble_model->local_credentials()),
35 default_index_(0),
36 is_default_best_match_(false),
37 is_default_preferred_(false),
38 action_reported_(false) {
39 DCHECK(!password_forms_->empty());
40
41 // Layout.
42 views::GridLayout* layout = new views::GridLayout(this);
43 SetLayoutManager(layout);
44
45 // ColumnSet.
46 int column_set_id = 0;
47 views::ColumnSet* column_set = layout->AddColumnSet(column_set_id);
48 column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1,
49 views::GridLayout::FIXED, 0, 0);
50 column_set->AddPaddingColumn(0, views::kItemLabelSpacing);
51 column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1,
52 views::GridLayout::FIXED, 0, 0);
53 column_set->AddPaddingColumn(0, views::kItemLabelSpacing);
54
55 // The username combobox and password label.
56 layout->StartRowWithPadding(0, column_set_id, 0,
57 views::kRelatedControlVerticalSpacing);
58 GenerateUsernameCombobox(
59 manage_passwords_bubble_model->pending_password().username_value);
60 layout->AddView(combobox_.get());
61 views::Label* label =
62 GeneratePasswordLabel(manage_passwords_bubble_model->pending_password());
63 layout->AddView(label);
64
65 GetLayoutManager()->Layout(this);
66 }
67
68 CredentialsSelectionView::~CredentialsSelectionView() {
69 ReportUserActionOnce(true, -1);
70 // |combobox_| has a pointer to |combobox_model_|, so |combobox_| should be
71 // deleted before deleting of |combobox_model_|. To ensure this, let's delete
72 // it now.
73 combobox_.reset();
74 }
75
76 const autofill::PasswordForm*
77 CredentialsSelectionView::GetSelectedCredentials() {
78 DCHECK_EQ(password_forms_->size(),
79 static_cast<size_t>(combobox_->model()->GetItemCount()));
80 ReportUserActionOnce(false, combobox_->selected_index());
81 return &password_forms_->at(combobox_->selected_index());
82 }
83
84 void CredentialsSelectionView::GenerateUsernameCombobox(
85 const base::string16& best_matched_username) {
86 std::vector<base::string16> usernames;
87 size_t best_matched_username_index = password_forms_->size();
88 size_t preferred_form_index = password_forms_->size();
89 for (size_t index = 0; index < password_forms_->size(); ++index) {
90 usernames.push_back(password_forms_->at(index).username_value);
91 if (password_forms_->at(index).username_value == best_matched_username) {
92 best_matched_username_index = index;
93 }
94 if (password_forms_->at(index).preferred) {
95 preferred_form_index = index;
96 }
97 }
98
99 combobox_model_.reset(new ui::SimpleComboboxModel(usernames));
100 combobox_.reset(new views::Combobox(combobox_model_.get()));
101
102 if (best_matched_username_index < password_forms_->size()) {
103 is_default_best_match_ = true;
104 default_index_ = best_matched_username_index;
105 combobox_->SetSelectedIndex(best_matched_username_index);
106 } else if (preferred_form_index < password_forms_->size()) {
107 is_default_preferred_ = true;
108 default_index_ = preferred_form_index;
109 combobox_->SetSelectedIndex(preferred_form_index);
110 }
111 }
112
113 void CredentialsSelectionView::ReportUserActionOnce(bool was_update_rejected,
114 int selected_index) {
115 if (action_reported_)
116 return;
117 password_manager::metrics_util::MultiAccountUpdateBubbleUserAction action;
118 if (was_update_rejected) {
119 if (is_default_best_match_) {
120 action = password_manager::metrics_util::
121 DEFAULT_ACCOUNT_MATCHED_BY_PASSWORD_USER_REJECTED_UPDATE;
122 } else if (is_default_preferred_) {
123 action = password_manager::metrics_util::
124 DEFAULT_ACCOUNT_PREFERRED_USER_REJECTED_UPDATE;
125 } else {
126 action = password_manager::metrics_util::
127 DEFAULT_ACCOUNT_FIRST_USER_REJECTED_UPDATE;
128 }
129 } else if (selected_index == default_index_) {
130 if (is_default_best_match_) {
131 action = password_manager::metrics_util::
132 DEFAULT_ACCOUNT_MATCHED_BY_PASSWORD_USER_NOT_CHANGED;
133 } else if (is_default_preferred_) {
134 action = password_manager::metrics_util::
135 DEFAULT_ACCOUNT_PREFERRED_USER_NOT_CHANGED;
136 } else {
137 action = password_manager::metrics_util::
138 DEFAULT_ACCOUNT_FIRST_USER_NOT_CHANGED;
139 }
140 } else {
141 if (is_default_best_match_) {
142 action = password_manager::metrics_util::
143 DEFAULT_ACCOUNT_MATCHED_BY_PASSWORD_USER_CHANGED;
144 } else if (is_default_preferred_) {
145 action = password_manager::metrics_util::
146 DEFAULT_ACCOUNT_PREFERRED_USER_CHANGED;
147 } else {
148 action =
149 password_manager::metrics_util::DEFAULT_ACCOUNT_FIRST_USER_CHANGED;
150 }
151 }
152
153 password_manager::metrics_util::LogMultiAccountUpdateBubbleUserAction(action);
154 action_reported_ = true;
155 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698