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

Side by Side Diff: chrome/browser/ui/views/certificate_selector.cc

Issue 1918143005: Add a serial number column to the certificate selector dialog and fix its size. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove extra var Created 4 years, 7 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 2015 The Chromium Authors. All rights reserved. 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 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/certificate_selector.h" 5 #include "chrome/browser/ui/views/certificate_selector.h"
6 6
7 #include <stddef.h> // For size_t. 7 #include <stddef.h> // For size_t.
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "base/memory/ref_counted.h" 13 #include "base/memory/ref_counted.h"
14 #include "base/strings/utf_string_conversions.h" 14 #include "base/strings/utf_string_conversions.h"
15 #include "build/build_config.h" 15 #include "build/build_config.h"
16 #include "chrome/browser/certificate_viewer.h" 16 #include "chrome/browser/certificate_viewer.h"
17 #include "chrome/grit/generated_resources.h" 17 #include "chrome/grit/generated_resources.h"
18 #include "components/constrained_window/constrained_window_views.h" 18 #include "components/constrained_window/constrained_window_views.h"
19 #include "components/guest_view/browser/guest_view_base.h" 19 #include "components/guest_view/browser/guest_view_base.h"
20 #include "components/web_modal/web_contents_modal_dialog_manager.h" 20 #include "components/web_modal/web_contents_modal_dialog_manager.h"
21 #include "content/public/browser/web_contents.h" 21 #include "content/public/browser/web_contents.h"
22 #include "grit/components_strings.h" 22 #include "grit/components_strings.h"
23 #include "ui/base/l10n/l10n_util.h" 23 #include "ui/base/l10n/l10n_util.h"
24
24 #include "ui/base/models/table_model.h" 25 #include "ui/base/models/table_model.h"
25 #include "ui/base/models/table_model_observer.h" 26 #include "ui/base/models/table_model_observer.h"
26 #include "ui/views/controls/button/label_button.h" 27 #include "ui/views/controls/button/label_button.h"
27 #include "ui/views/controls/table/table_view.h" 28 #include "ui/views/controls/table/table_view.h"
28 #include "ui/views/layout/grid_layout.h" 29 #include "ui/views/layout/grid_layout.h"
29 #include "ui/views/layout/layout_constants.h" 30 #include "ui/views/layout/layout_constants.h"
30 #include "ui/views/widget/widget.h" 31 #include "ui/views/widget/widget.h"
31 #include "ui/views/window/dialog_client_view.h" 32 #include "ui/views/window/dialog_client_view.h"
32 33
33 #if defined(OS_CHROMEOS) 34 #if defined(OS_CHROMEOS)
34 #include "chrome/browser/chromeos/certificate_provider/certificate_provider_serv ice.h" 35 #include "chrome/browser/chromeos/certificate_provider/certificate_provider_serv ice.h"
35 #include "chrome/browser/chromeos/certificate_provider/certificate_provider_serv ice_factory.h" 36 #include "chrome/browser/chromeos/certificate_provider/certificate_provider_serv ice_factory.h"
36 #include "extensions/browser/extension_registry.h" 37 #include "extensions/browser/extension_registry.h"
37 #include "extensions/browser/extension_registry_factory.h" 38 #include "extensions/browser/extension_registry_factory.h"
38 #endif 39 #endif
39 40
40 namespace chrome { 41 namespace chrome {
41 42
42 const int CertificateSelector::kTableViewWidth = 400; 43 const int CertificateSelector::kTableViewWidth = 500;
43 const int CertificateSelector::kTableViewHeight = 100; 44 const int CertificateSelector::kTableViewHeight = 150;
44 45
45 class CertificateSelector::CertificateTableModel : public ui::TableModel { 46 class CertificateSelector::CertificateTableModel : public ui::TableModel {
46 public: 47 public:
47 // |certs| and |provider_names| must have the same size. 48 // |certs| and |provider_names| must have the same size.
48 CertificateTableModel(const net::CertificateList& certs, 49 CertificateTableModel(const net::CertificateList& certs,
49 const std::vector<std::string>& provider_names); 50 const std::vector<std::string>& provider_names);
50 51
51 // ui::TableModel: 52 // ui::TableModel:
52 int RowCount() override; 53 int RowCount() override;
53 base::string16 GetText(int index, int column_id) override; 54 base::string16 GetText(int index, int column_id) override;
54 void SetObserver(ui::TableModelObserver* observer) override; 55 void SetObserver(ui::TableModelObserver* observer) override;
55 56
56 private: 57 private:
57 struct Row { 58 struct Row {
58 base::string16 subject; 59 base::string16 subject;
59 base::string16 issuer; 60 base::string16 issuer;
60 base::string16 provider; 61 base::string16 provider;
62 base::string16 serial;
61 }; 63 };
62 std::vector<Row> rows_; 64 std::vector<Row> rows_;
63 65
64 DISALLOW_COPY_AND_ASSIGN(CertificateTableModel); 66 DISALLOW_COPY_AND_ASSIGN(CertificateTableModel);
65 }; 67 };
66 68
69 const char kHexCharLookup[0x10] = {
70 '0', '1', '2', '3', '4', '5', '6', '7',
71 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
72 };
73
74 std::string BytesToHexString(const std::string& bytes) {
75 std::string result;
Ryan Sleevi 2016/04/29 00:30:29 pedantry: std::string result(bytes.size() * 3, '0'
meacer 2016/04/29 17:39:42 Removed in favor of HexEncode.
76 for (size_t i = 0; i < bytes.size(); ++i) {
77 result.push_back(kHexCharLookup[(bytes[i] >> 4) & 0xf]);
78 result.push_back(kHexCharLookup[bytes[i] & 0xf]);
79 if (i != bytes.size() - 1)
80 result.push_back(':');
81 }
82 return result;
83 }
84
67 CertificateSelector::CertificateTableModel::CertificateTableModel( 85 CertificateSelector::CertificateTableModel::CertificateTableModel(
68 const net::CertificateList& certs, 86 const net::CertificateList& certs,
69 const std::vector<std::string>& provider_names) { 87 const std::vector<std::string>& provider_names) {
70 DCHECK_EQ(certs.size(), provider_names.size()); 88 DCHECK_EQ(certs.size(), provider_names.size());
71 for (size_t i = 0; i < certs.size(); i++) { 89 for (size_t i = 0; i < certs.size(); i++) {
72 net::X509Certificate* cert = certs[i].get(); 90 net::X509Certificate* cert = certs[i].get();
73 Row row; 91 Row row;
74 row.subject = base::UTF8ToUTF16(cert->subject().GetDisplayName()); 92 row.subject = base::UTF8ToUTF16(cert->subject().GetDisplayName());
75 row.issuer = base::UTF8ToUTF16(cert->issuer().GetDisplayName()); 93 row.issuer = base::UTF8ToUTF16(cert->issuer().GetDisplayName());
76 row.provider = base::UTF8ToUTF16(provider_names[i]); 94 row.provider = base::UTF8ToUTF16(provider_names[i]);
95 row.serial = base::UTF8ToUTF16(BytesToHexString(cert->serial_number()));
Ryan Sleevi 2016/04/29 00:30:29 I leave the UI in your fully capable hands, but th
meacer 2016/04/29 17:39:42 I searched for combinations of (Binary,Hex,String)
77 rows_.push_back(row); 96 rows_.push_back(row);
78 } 97 }
79 } 98 }
80 99
81 int CertificateSelector::CertificateTableModel::RowCount() { 100 int CertificateSelector::CertificateTableModel::RowCount() {
82 return rows_.size(); 101 return rows_.size();
83 } 102 }
84 103
85 base::string16 CertificateSelector::CertificateTableModel::GetText( 104 base::string16 CertificateSelector::CertificateTableModel::GetText(
86 int index, 105 int index,
87 int column_id) { 106 int column_id) {
88 DCHECK_GE(index, 0); 107 DCHECK_GE(index, 0);
89 DCHECK_LT(static_cast<size_t>(index), rows_.size()); 108 DCHECK_LT(static_cast<size_t>(index), rows_.size());
90 109
91 const Row& row = rows_[index]; 110 const Row& row = rows_[index];
92 switch (column_id) { 111 switch (column_id) {
93 case IDS_CERT_SELECTOR_SUBJECT_COLUMN: 112 case IDS_CERT_SELECTOR_SUBJECT_COLUMN:
94 return row.subject; 113 return row.subject;
95 case IDS_CERT_SELECTOR_ISSUER_COLUMN: 114 case IDS_CERT_SELECTOR_ISSUER_COLUMN:
96 return row.issuer; 115 return row.issuer;
97 case IDS_CERT_SELECTOR_PROVIDER_COLUMN: 116 case IDS_CERT_SELECTOR_PROVIDER_COLUMN:
98 return row.provider; 117 return row.provider;
118 case IDS_CERT_SELECTOR_SERIAL_COLUMN:
119 return row.serial;
99 default: 120 default:
100 NOTREACHED(); 121 NOTREACHED();
101 } 122 }
102 return base::string16(); 123 return base::string16();
103 } 124 }
104 125
105 void CertificateSelector::CertificateTableModel::SetObserver( 126 void CertificateSelector::CertificateTableModel::SetObserver(
106 ui::TableModelObserver* observer) {} 127 ui::TableModelObserver* observer) {}
107 128
108 CertificateSelector::CertificateSelector( 129 CertificateSelector::CertificateSelector(
(...skipping 26 matching lines...) Expand all
135 const auto extension = extension_registry->GetExtensionById( 156 const auto extension = extension_registry->GetExtensionById(
136 extension_id, extensions::ExtensionRegistry::ENABLED); 157 extension_id, extensions::ExtensionRegistry::ENABLED);
137 if (!extension) { 158 if (!extension) {
138 // This extension was unloaded in the meantime. Don't show the 159 // This extension was unloaded in the meantime. Don't show the
139 // certificate. 160 // certificate.
140 continue; 161 continue;
141 } 162 }
142 provider_name = extension->short_name(); 163 provider_name = extension->short_name();
143 show_provider_column_ = true; 164 show_provider_column_ = true;
144 } // Otherwise the certificate is provided by the platform. 165 } // Otherwise the certificate is provided by the platform.
145
146 certificates_.push_back(cert); 166 certificates_.push_back(cert);
147 provider_names.push_back(provider_name); 167 provider_names.push_back(provider_name);
148 } 168 }
149 #else 169 #else
150 provider_names.assign(certificates.size(), std::string()); 170 provider_names.assign(certificates.size(), std::string());
151 certificates_ = certificates; 171 certificates_ = certificates;
152 #endif 172 #endif
153
Ryan Sleevi 2016/04/29 00:30:29 Eh, I thought this helped readability, but *shrug*
meacer 2016/04/29 17:39:42 Not intentional, fixed locally but added back when
154 model_.reset(new CertificateTableModel(certificates_, provider_names)); 173 model_.reset(new CertificateTableModel(certificates_, provider_names));
155 } 174 }
156 175
157 CertificateSelector::~CertificateSelector() { 176 CertificateSelector::~CertificateSelector() {
158 table_->SetModel(nullptr); 177 table_->SetModel(nullptr);
159 } 178 }
160 179
161 // static 180 // static
162 bool CertificateSelector::CanShow(content::WebContents* web_contents) { 181 bool CertificateSelector::CanShow(content::WebContents* web_contents) {
163 // GetTopLevelWebContents returns |web_contents| if it is not a guest. 182 // GetTopLevelWebContents returns |web_contents| if it is not a guest.
(...skipping 28 matching lines...) Expand all
192 211
193 std::vector<ui::TableColumn> columns; 212 std::vector<ui::TableColumn> columns;
194 columns.push_back(ui::TableColumn(IDS_CERT_SELECTOR_SUBJECT_COLUMN, 213 columns.push_back(ui::TableColumn(IDS_CERT_SELECTOR_SUBJECT_COLUMN,
195 ui::TableColumn::LEFT, -1, 0.4f)); 214 ui::TableColumn::LEFT, -1, 0.4f));
196 columns.push_back(ui::TableColumn(IDS_CERT_SELECTOR_ISSUER_COLUMN, 215 columns.push_back(ui::TableColumn(IDS_CERT_SELECTOR_ISSUER_COLUMN,
197 ui::TableColumn::LEFT, -1, 0.2f)); 216 ui::TableColumn::LEFT, -1, 0.2f));
198 if (show_provider_column_) { 217 if (show_provider_column_) {
199 columns.push_back(ui::TableColumn(IDS_CERT_SELECTOR_PROVIDER_COLUMN, 218 columns.push_back(ui::TableColumn(IDS_CERT_SELECTOR_PROVIDER_COLUMN,
200 ui::TableColumn::LEFT, -1, 0.4f)); 219 ui::TableColumn::LEFT, -1, 0.4f));
201 } 220 }
221 columns.push_back(ui::TableColumn(IDS_CERT_SELECTOR_SERIAL_COLUMN,
222 ui::TableColumn::LEFT, -1, 0.2f));
202 table_ = new views::TableView(model_.get(), columns, views::TEXT_ONLY, 223 table_ = new views::TableView(model_.get(), columns, views::TEXT_ONLY,
203 true /* single_selection */); 224 true /* single_selection */);
204 table_->SetObserver(this); 225 table_->SetObserver(this);
205 layout->StartRow(1, kColumnSetId); 226 layout->StartRow(1, kColumnSetId);
206 layout->AddView(table_->CreateParentIfNecessary(), 1, 1, 227 layout->AddView(table_->CreateParentIfNecessary(), 1, 1,
207 views::GridLayout::FILL, views::GridLayout::FILL, 228 views::GridLayout::FILL, views::GridLayout::FILL,
208 kTableViewWidth, kTableViewHeight); 229 kTableViewWidth, kTableViewHeight);
209 230
210 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 231 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
211 } 232 }
212 233
234 ui::TableModel* CertificateSelector::table_model_for_testing() const {
235 return model_.get();
236 }
237
213 net::X509Certificate* CertificateSelector::GetSelectedCert() const { 238 net::X509Certificate* CertificateSelector::GetSelectedCert() const {
214 const int selected = table_->FirstSelectedRow(); 239 const int selected = table_->FirstSelectedRow();
215 if (selected < 0) // Nothing is selected in |table_|. 240 if (selected < 0) // Nothing is selected in |table_|.
216 return nullptr; 241 return nullptr;
217 CHECK_LT(static_cast<size_t>(selected), certificates_.size()); 242 CHECK_LT(static_cast<size_t>(selected), certificates_.size());
218 return certificates_[selected].get(); 243 return certificates_[selected].get();
219 } 244 }
220 245
221 bool CertificateSelector::CanResize() const { 246 bool CertificateSelector::CanResize() const {
222 return true; 247 return true;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 void CertificateSelector::OnSelectionChanged() { 286 void CertificateSelector::OnSelectionChanged() {
262 GetDialogClientView()->ok_button()->SetEnabled(GetSelectedCert() != nullptr); 287 GetDialogClientView()->ok_button()->SetEnabled(GetSelectedCert() != nullptr);
263 } 288 }
264 289
265 void CertificateSelector::OnDoubleClick() { 290 void CertificateSelector::OnDoubleClick() {
266 if (GetSelectedCert()) 291 if (GetSelectedCert())
267 GetDialogClientView()->AcceptWindow(); 292 GetDialogClientView()->AcceptWindow();
268 } 293 }
269 294
270 } // namespace chrome 295 } // namespace chrome
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/certificate_selector.h ('k') | chrome/browser/ui/views/certificate_selector_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698