172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_contents/tab_contents_ssl_helper.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/basictypes.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/ssl/ssl_add_cert_handler.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/ssl/ssl_client_auth_handler.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/ssl_client_certificate_selector.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/tab_contents/confirm_infobar_delegate.h"
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/tab_contents/simple_alert_infobar_delegate.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/certificate_viewer.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_details.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_source.h"
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "grit/generated_resources.h"
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "grit/theme_resources.h"
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/net_errors.h"
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace {
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickSkBitmap* GetCertIcon() {
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // TODO(davidben): use a more appropriate icon.
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return ResourceBundle::GetSharedInstance().GetBitmapNamed(
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      IDR_INFOBAR_SAVE_PASSWORD);
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// SSLCertAddedInfoBarDelegate ------------------------------------------------
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass SSLCertAddedInfoBarDelegate : public ConfirmInfoBarDelegate {
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SSLCertAddedInfoBarDelegate(TabContents* tab_contents,
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              net::X509Certificate* cert);
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~SSLCertAddedInfoBarDelegate();
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // ConfirmInfoBarDelegate:
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void InfoBarClosed();
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual SkBitmap* GetIcon() const;
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual Type GetInfoBarType() const;
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual string16 GetMessageText() const;
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual int GetButtons() const;
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual string16 GetButtonLabel(InfoBarButton button) const;
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool Accept();
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContents* tab_contents_;  // The TabContents we are attached to.
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_refptr<net::X509Certificate> cert_;  // The cert we added.
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSSLCertAddedInfoBarDelegate::SSLCertAddedInfoBarDelegate(
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    TabContents* tab_contents,
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    net::X509Certificate* cert)
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : ConfirmInfoBarDelegate(tab_contents),
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      tab_contents_(tab_contents),
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      cert_(cert) {
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSSLCertAddedInfoBarDelegate::~SSLCertAddedInfoBarDelegate() {
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid SSLCertAddedInfoBarDelegate::InfoBarClosed() {
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // ConfirmInfoBarDelegate doesn't delete itself.
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delete this;
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSkBitmap* SSLCertAddedInfoBarDelegate::GetIcon() const {
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return GetCertIcon();
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenInfoBarDelegate::Type SSLCertAddedInfoBarDelegate::GetInfoBarType() const {
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return PAGE_ACTION_TYPE;
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 SSLCertAddedInfoBarDelegate::GetMessageText() const {
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TODO(evanm): GetDisplayName should return UTF-16.
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return l10n_util::GetStringFUTF16(IDS_ADD_CERT_SUCCESS_INFOBAR_LABEL,
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      UTF8ToUTF16(cert_->issuer().GetDisplayName()));
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenint SSLCertAddedInfoBarDelegate::GetButtons() const {
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return BUTTON_OK;
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 SSLCertAddedInfoBarDelegate::GetButtonLabel(
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    InfoBarButton button) const {
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK_EQ(BUTTON_OK, button);
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return l10n_util::GetStringUTF16(IDS_ADD_CERT_SUCCESS_INFOBAR_BUTTON);
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool SSLCertAddedInfoBarDelegate::Accept() {
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ShowCertificateViewer(tab_contents_->GetMessageBoxRootWindow(), cert_);
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return false;  // Hiding the infobar just as the dialog opens looks weird.
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// TabContentsSSLHelper::SSLAddCertData ---------------------------------------
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass TabContentsSSLHelper::SSLAddCertData : public NotificationObserver {
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  explicit SSLAddCertData(TabContents* tab_contents);
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~SSLAddCertData();
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Displays |delegate| as an infobar in |tab_|, replacing our current one if
1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // still active.
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void ShowInfoBar(InfoBarDelegate* delegate);
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Same as above, for the common case of wanting to show a simple alert
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // message.
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void ShowErrorInfoBar(const string16& message);
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // NotificationObserver:
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void Observe(NotificationType type,
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       const NotificationSource& source,
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const NotificationDetails& details);
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContents* tab_contents_;
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  InfoBarDelegate* infobar_delegate_;
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  NotificationRegistrar registrar_;
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DISALLOW_COPY_AND_ASSIGN(SSLAddCertData);
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTabContentsSSLHelper::SSLAddCertData::SSLAddCertData(TabContents* tab_contents)
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : tab_contents_(tab_contents),
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      infobar_delegate_(NULL) {
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Source<TabContents> source(tab_contents_);
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  registrar_.Add(this, NotificationType::TAB_CONTENTS_INFOBAR_REMOVED, source);
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  registrar_.Add(this, NotificationType::TAB_CONTENTS_INFOBAR_REPLACED, source);
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTabContentsSSLHelper::SSLAddCertData::~SSLAddCertData() {
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TabContentsSSLHelper::SSLAddCertData::ShowInfoBar(
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    InfoBarDelegate* delegate) {
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (infobar_delegate_)
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    tab_contents_->ReplaceInfoBar(infobar_delegate_, delegate);
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  else
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    tab_contents_->AddInfoBar(delegate);
15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  infobar_delegate_ = delegate;
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TabContentsSSLHelper::SSLAddCertData::ShowErrorInfoBar(
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const string16& message) {
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ShowInfoBar(new SimpleAlertInfoBarDelegate(tab_contents_, GetCertIcon(),
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                             message, true));
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TabContentsSSLHelper::SSLAddCertData::Observe(
16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    NotificationType type,
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const NotificationSource& source,
16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const NotificationDetails& details) {
16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  typedef std::pair<InfoBarDelegate*, InfoBarDelegate*> InfoBarDelegatePair;
16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (infobar_delegate_ ==
16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ((type.value == NotificationType::TAB_CONTENTS_INFOBAR_REMOVED) ?
16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          Details<InfoBarDelegate>(details).ptr() :
16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          Details<InfoBarDelegatePair>(details).ptr()->first))
16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    infobar_delegate_ = NULL;
16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// TabContentsSSLHelper -------------------------------------------------------
17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTabContentsSSLHelper::TabContentsSSLHelper(TabContents* tab_contents)
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : tab_contents_(tab_contents) {
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTabContentsSSLHelper::~TabContentsSSLHelper() {
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid TabContentsSSLHelper::ShowClientCertificateRequestDialog(
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_refptr<SSLClientAuthHandler> handler) {
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser::ShowSSLClientCertificateSelector(
1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      tab_contents_, handler->cert_request_info(), handler);
1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid TabContentsSSLHelper::OnVerifyClientCertificateError(
1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<SSLAddCertHandler> handler, int error_code) {
1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SSLAddCertData* add_cert_data = GetAddCertData(handler);
1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Display an infobar with the error message.
1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // TODO(davidben): Display a more user-friendly error string.
1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  add_cert_data->ShowErrorInfoBar(
1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringFUTF16(IDS_ADD_CERT_ERR_INVALID_CERT,
1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                 base::IntToString16(-error_code),
1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                 ASCIIToUTF16(net::ErrorToString(error_code))));
1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid TabContentsSSLHelper::AskToAddClientCertificate(
1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<SSLAddCertHandler> handler) {
2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  NOTREACHED();  // Not implemented yet.
2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid TabContentsSSLHelper::OnAddClientCertificateSuccess(
2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<SSLAddCertHandler> handler) {
2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SSLAddCertData* add_cert_data = GetAddCertData(handler);
2063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Display an infobar to inform the user.
2073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  add_cert_data->ShowInfoBar(
2083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      new SSLCertAddedInfoBarDelegate(tab_contents_, handler->cert()));
2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid TabContentsSSLHelper::OnAddClientCertificateError(
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<SSLAddCertHandler> handler, int error_code) {
2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SSLAddCertData* add_cert_data = GetAddCertData(handler);
2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Display an infobar with the error message.
2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // TODO(davidben): Display a more user-friendly error string.
2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  add_cert_data->ShowErrorInfoBar(
2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringFUTF16(IDS_ADD_CERT_ERR_FAILED,
2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                 base::IntToString16(-error_code),
2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                 ASCIIToUTF16(net::ErrorToString(error_code))));
2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid TabContentsSSLHelper::OnAddClientCertificateFinished(
2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<SSLAddCertHandler> handler) {
2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Clean up.
2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  request_id_to_add_cert_data_.erase(handler->network_request_id());
2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTabContentsSSLHelper::SSLAddCertData* TabContentsSSLHelper::GetAddCertData(
2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SSLAddCertHandler* handler) {
2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Find/create the slot.
2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  linked_ptr<SSLAddCertData>& ptr_ref =
2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      request_id_to_add_cert_data_[handler->network_request_id()];
2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Fill it if necessary.
2343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!ptr_ref.get())
23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ptr_ref.reset(new SSLAddCertData(tab_contents_));
2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return ptr_ref.get();
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
238