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

Unified Diff: chrome/browser/ui/views/certificate_selector.cc

Issue 932553002: Refactor SSLClientCertificateSelector for reuse with platformKeys API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@cert_perms
Patch Set: Fixed comments. Created 5 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/certificate_selector.cc
diff --git a/chrome/browser/ui/views/certificate_selector.cc b/chrome/browser/ui/views/certificate_selector.cc
new file mode 100644
index 0000000000000000000000000000000000000000..42ef555f9bc61cff14c30bb6cd7bd31275b27cd6
--- /dev/null
+++ b/chrome/browser/ui/views/certificate_selector.cc
@@ -0,0 +1,188 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/certificate_selector.h"
+
+#include <stddef.h> // For size_t.
+#include <vector>
+
+#include "base/logging.h"
+#include "base/memory/ref_counted.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/certificate_viewer.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/constrained_window/constrained_window_views.h"
+#include "content/public/browser/web_contents.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/models/table_model.h"
+#include "ui/base/models/table_model_observer.h"
+#include "ui/views/controls/button/label_button.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/controls/table/table_view.h"
+#include "ui/views/layout/grid_layout.h"
+#include "ui/views/layout/layout_constants.h"
+#include "ui/views/widget/widget.h"
+#include "ui/views/window/dialog_client_view.h"
+
+namespace chrome {
+
+class CertificateSelector::CertificateTableModel : public ui::TableModel {
+ public:
+ explicit CertificateTableModel(const net::CertificateList& certificates);
+
+ // ui::TableModel:
+ int RowCount() override;
+ base::string16 GetText(int index, int column_id) override;
+ void SetObserver(ui::TableModelObserver* observer) override;
+
+ private:
+ std::vector<base::string16> items_;
+
+ DISALLOW_COPY_AND_ASSIGN(CertificateTableModel);
+};
+
+CertificateSelector::CertificateTableModel::CertificateTableModel(
+ const net::CertificateList& certificates) {
+ for (const scoped_refptr<net::X509Certificate>& cert : certificates) {
+ items_.push_back(l10n_util::GetStringFUTF16(
+ IDS_CERT_SELECTOR_TABLE_CERT_FORMAT,
+ base::UTF8ToUTF16(cert->subject().GetDisplayName()),
+ base::UTF8ToUTF16(cert->issuer().GetDisplayName())));
+ }
+}
+
+int CertificateSelector::CertificateTableModel::RowCount() {
+ return items_.size();
+}
+
+base::string16 CertificateSelector::CertificateTableModel::GetText(
+ int index,
+ int column_id) {
+ DCHECK_EQ(column_id, 0);
+ DCHECK_GE(index, 0);
+ DCHECK_LT(static_cast<size_t>(index), items_.size());
+
+ return items_[index];
+}
+
+void CertificateSelector::CertificateTableModel::SetObserver(
+ ui::TableModelObserver* observer) {
+}
+
+CertificateSelector::CertificateSelector(
+ const net::CertificateList& certificates,
+ content::WebContents* web_contents)
+ : certificates_(certificates),
+ model_(new CertificateTableModel(certificates)),
+ web_contents_(web_contents),
+ table_(nullptr),
+ view_cert_button_(nullptr) {
+ CHECK(web_contents_);
+}
+
+CertificateSelector::~CertificateSelector() {
+ table_->SetModel(nullptr);
+}
+
+void CertificateSelector::Show() {
+ constrained_window::ShowWebModalDialogViews(this, web_contents_);
+
+ // Select the first row automatically. This must be done after the dialog has
+ // been created.
+ table_->Select(0);
+}
+
+void CertificateSelector::InitWithText(const base::string16& text) {
+ views::GridLayout* const layout = views::GridLayout::CreatePanel(this);
+ SetLayoutManager(layout);
+
+ const int kColumnSetId = 0;
+ views::ColumnSet* const column_set = layout->AddColumnSet(kColumnSetId);
+ column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1,
+ views::GridLayout::USE_PREF, 0, 0);
+
+ layout->StartRow(0, kColumnSetId);
+ scoped_ptr<views::Label> label(new views::Label(text));
+ label->SetMultiLine(true);
+ label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+ label->SetAllowCharacterBreak(true);
+ layout->AddView(label.release());
+
+ layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
+
+ // The dimensions of the certificate selector table view, in pixels.
+ const int kTableViewWidth = 400;
+ const int kTableViewHeight = 100;
+
+ std::vector<ui::TableColumn> columns;
+ columns.push_back(ui::TableColumn());
+ table_ = new views::TableView(model_.get(), columns, views::TEXT_ONLY,
+ true /* single_selection */);
+ table_->SetObserver(this);
+ layout->StartRow(1, kColumnSetId);
+ layout->AddView(table_->CreateParentIfNecessary(), 1, 1,
+ views::GridLayout::FILL, views::GridLayout::FILL,
+ kTableViewWidth, kTableViewHeight);
+
+ layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
+}
+
+net::X509Certificate* CertificateSelector::GetSelectedCert() const {
+ const int selected = table_->FirstSelectedRow();
+ if (selected < 0) // Nothing is selected in |table_|.
+ return nullptr;
+ CHECK_LT(static_cast<size_t>(selected), certificates_.size());
+ return certificates_[selected].get();
+}
+
+bool CertificateSelector::CanResize() const {
+ return true;
+}
+
+base::string16 CertificateSelector::GetWindowTitle() const {
+ return l10n_util::GetStringUTF16(IDS_CLIENT_CERT_DIALOG_TITLE);
+}
+
+bool CertificateSelector::IsDialogButtonEnabled(ui::DialogButton button) const {
+ return button != ui::DIALOG_BUTTON_OK || GetSelectedCert() != nullptr;
+}
+
+views::View* CertificateSelector::GetInitiallyFocusedView() {
+ DCHECK(table_);
+ return table_;
+}
+
+views::View* CertificateSelector::CreateExtraView() {
+ DCHECK(!view_cert_button_);
+ scoped_ptr<views::LabelButton> button(new views::LabelButton(
+ this, l10n_util::GetStringUTF16(IDS_PAGEINFO_CERT_INFO_BUTTON)));
+ button->SetStyle(views::Button::STYLE_BUTTON);
+ view_cert_button_ = button.get();
+ return button.release();
+}
+
+ui::ModalType CertificateSelector::GetModalType() const {
+ return ui::MODAL_TYPE_CHILD;
+}
+
+void CertificateSelector::ButtonPressed(views::Button* sender,
+ const ui::Event& event) {
+ if (sender == view_cert_button_) {
+ net::X509Certificate* const cert = GetSelectedCert();
+ if (cert)
+ ShowCertificateViewer(web_contents_,
+ web_contents_->GetTopLevelNativeWindow(), cert);
+ }
+}
+
+void CertificateSelector::OnSelectionChanged() {
+ GetDialogClientView()->ok_button()->SetEnabled(GetSelectedCert() != nullptr);
+}
+
+void CertificateSelector::OnDoubleClick() {
+ if (Accept())
+ GetWidget()->Close();
+}
+
+} // namespace chrome
« 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