| 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
|
|
|