signed_certificate_timestamps_views.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
1// Copyright 2014 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/signed_certificate_timestamps_views.h" 6 7#include "base/strings/string_number_conversions.h" 8#include "base/strings/stringprintf.h" 9#include "base/strings/utf_string_conversions.h" 10#include "chrome/browser/chrome_notification_types.h" 11#include "chrome/browser/ui/views/constrained_window_views.h" 12#include "chrome/browser/ui/views/signed_certificate_timestamp_info_view.h" 13#include "components/web_modal/web_contents_modal_dialog_host.h" 14#include "components/web_modal/web_contents_modal_dialog_manager.h" 15#include "components/web_modal/web_contents_modal_dialog_manager_delegate.h" 16#include "content/public/browser/notification_source.h" 17#include "content/public/browser/signed_certificate_timestamp_store.h" 18#include "content/public/common/signed_certificate_timestamp_id_and_status.h" 19#include "grit/generated_resources.h" 20#include "net/cert/signed_certificate_timestamp.h" 21#include "net/ssl/signed_certificate_timestamp_and_status.h" 22#include "ui/base/l10n/l10n_util.h" 23#include "ui/base/models/combobox_model.h" 24#include "ui/views/controls/combobox/combobox.h" 25#include "ui/views/layout/grid_layout.h" 26#include "ui/views/layout/layout_constants.h" 27#include "ui/views/widget/widget.h" 28 29using web_modal::WebContentsModalDialogManager; 30using web_modal::WebContentsModalDialogManagerDelegate; 31using views::GridLayout; 32 33namespace { 34 35void SignedCertificateTimestampIDsToList( 36 const content::SignedCertificateTimestampIDStatusList& sct_ids_list, 37 net::SignedCertificateTimestampAndStatusList* sct_list) { 38 for (content::SignedCertificateTimestampIDStatusList::const_iterator it = 39 sct_ids_list.begin(); 40 it != sct_ids_list.end(); 41 ++it) { 42 scoped_refptr<net::ct::SignedCertificateTimestamp> sct; 43 content::SignedCertificateTimestampStore::GetInstance()->Retrieve(it->id, 44 &sct); 45 sct_list->push_back( 46 net::SignedCertificateTimestampAndStatus(sct, it->status)); 47 } 48} 49 50} // namespace 51 52namespace chrome { 53 54void ShowSignedCertificateTimestampsViewer( 55 content::WebContents* web_contents, 56 const content::SignedCertificateTimestampIDStatusList& sct_ids_list) { 57 net::SignedCertificateTimestampAndStatusList sct_list; 58 SignedCertificateTimestampIDsToList(sct_ids_list, &sct_list); 59 new SignedCertificateTimestampsViews(web_contents, sct_list); 60} 61 62} // namespace chrome 63 64class SCTListModel : public ui::ComboboxModel { 65 public: 66 explicit SCTListModel( 67 const net::SignedCertificateTimestampAndStatusList& sct_list); 68 virtual ~SCTListModel(); 69 70 // Overridden from ui::ComboboxModel: 71 virtual int GetItemCount() const OVERRIDE; 72 virtual base::string16 GetItemAt(int index) OVERRIDE; 73 74 private: 75 net::SignedCertificateTimestampAndStatusList sct_list_; 76 77 DISALLOW_COPY_AND_ASSIGN(SCTListModel); 78}; 79 80SCTListModel::SCTListModel( 81 const net::SignedCertificateTimestampAndStatusList& sct_list) 82 : sct_list_(sct_list) {} 83 84SCTListModel::~SCTListModel() {} 85 86int SCTListModel::GetItemCount() const { return sct_list_.size(); } 87 88base::string16 SCTListModel::GetItemAt(int index) { 89 DCHECK_LT(static_cast<size_t>(index), sct_list_.size()); 90 std::string origin = l10n_util::GetStringUTF8( 91 chrome::ct::SCTOriginToResourceID(*(sct_list_[index].sct))); 92 93 std::string status = l10n_util::GetStringUTF8( 94 chrome::ct::StatusToResourceID(sct_list_[index].status)); 95 96 // This formatting string may be internationalized for RTL, etc. 97 return l10n_util::GetStringFUTF16(IDS_SCT_CHOOSER_FORMAT, 98 base::IntToString16(index + 1), 99 base::UTF8ToUTF16(origin), 100 base::UTF8ToUTF16(status)); 101} 102 103SignedCertificateTimestampsViews::SignedCertificateTimestampsViews( 104 content::WebContents* web_contents, 105 const net::SignedCertificateTimestampAndStatusList& sct_list) 106 : web_contents_(web_contents), sct_info_view_(NULL), sct_list_(sct_list) { 107 WebContentsModalDialogManager* web_contents_modal_dialog_manager = 108 WebContentsModalDialogManager::FromWebContents(web_contents); 109 WebContentsModalDialogManagerDelegate* modal_delegate = 110 web_contents_modal_dialog_manager->delegate(); 111 DCHECK(modal_delegate); 112 views::Widget* window = views::Widget::CreateWindowAsFramelessChild( 113 this, modal_delegate->GetWebContentsModalDialogHost()->GetHostView()); 114 web_contents_modal_dialog_manager->ShowModalDialog( 115 window->GetNativeView()); 116} 117 118SignedCertificateTimestampsViews::~SignedCertificateTimestampsViews() {} 119 120base::string16 SignedCertificateTimestampsViews::GetWindowTitle() const { 121 return l10n_util::GetStringUTF16(IDS_SCT_VIEWER_TITLE); 122} 123 124int SignedCertificateTimestampsViews::GetDialogButtons() const { 125 return ui::DIALOG_BUTTON_CANCEL; 126} 127 128ui::ModalType SignedCertificateTimestampsViews::GetModalType() const { 129#if defined(USE_ASH) 130 return ui::MODAL_TYPE_CHILD; 131#else 132 return views::WidgetDelegate::GetModalType(); 133#endif 134} 135 136void SignedCertificateTimestampsViews::OnPerformAction( 137 views::Combobox* combobox) { 138 DCHECK_EQ(combobox, sct_selector_box_.get()); 139 DCHECK_LT(combobox->selected_index(), sct_list_model_->GetItemCount()); 140 ShowSCTInfo(combobox->selected_index()); 141} 142 143void SignedCertificateTimestampsViews::ViewHierarchyChanged( 144 const ViewHierarchyChangedDetails& details) { 145 if (details.is_add && details.child == this) 146 Init(); 147} 148 149void SignedCertificateTimestampsViews::Init() { 150 GridLayout* layout = GridLayout::CreatePanel(this); 151 SetLayoutManager(layout); 152 153 const int kSelectorBoxLayoutId = 0; 154 views::ColumnSet* column_set = layout->AddColumnSet(kSelectorBoxLayoutId); 155 column_set->AddColumn( 156 GridLayout::FILL, GridLayout::FILL, 1, GridLayout::USE_PREF, 0, 0); 157 158 layout->StartRow(0, kSelectorBoxLayoutId); 159 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 160 161 // Add SCT selector drop-down list. 162 layout->StartRow(0, kSelectorBoxLayoutId); 163 sct_list_model_.reset(new SCTListModel(sct_list_)); 164 sct_selector_box_.reset(new views::Combobox(sct_list_model_.get())); 165 sct_selector_box_->set_listener(this); 166 sct_selector_box_->set_owned_by_client(); 167 layout->AddView(sct_selector_box_.get()); 168 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 169 170 // Add the SCT info view, displaying information about a specific SCT. 171 layout->StartRow(0, kSelectorBoxLayoutId); 172 sct_info_view_ = new SignedCertificateTimestampInfoView(); 173 layout->AddView(sct_info_view_); 174 175 sct_info_view_->SetSignedCertificateTimestamp(*(sct_list_[0].sct), 176 sct_list_[0].status); 177} 178 179void SignedCertificateTimestampsViews::ShowSCTInfo(int sct_index) { 180 if ((sct_index < 0) || (static_cast<size_t>(sct_index) > sct_list_.size())) 181 return; 182 183 sct_info_view_->SetSignedCertificateTimestamp(*(sct_list_[sct_index].sct), 184 sct_list_[sct_index].status); 185} 186 187void SignedCertificateTimestampsViews::Observe( 188 int type, 189 const content::NotificationSource& source, 190 const content::NotificationDetails& details) { 191 GetWidget()->Close(); 192} 193