Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |