From 8ae178b1da02c2ab5104060a711c305cb826221d Mon Sep 17 00:00:00 2001
From: "davidben@chromium.org"
 <davidben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>
Date: Wed, 7 Jul 2010 22:55:27 +0000
Subject: Refactor certificate viewer code behind ShowCertificateViewer

This abstracts away the platform-specific certificate viewer behind a common
function call.

R=wtc,mattm
BUG=none
TEST=Viewing the certificate information on an SSL session continues to work

Review URL: http://codereview.chromium.org/2815024

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@51793 0039d316-1c4b-4281-b951-d872f2087c98
---
 chrome/browser/cocoa/certificate_viewer.mm   | 45 ++++++++++++++++++++++++++++
 chrome/browser/cocoa/page_info_window_mac.mm | 39 ++----------------------
 2 files changed, 47 insertions(+), 37 deletions(-)
 create mode 100644 chrome/browser/cocoa/certificate_viewer.mm

(limited to 'chrome/browser/cocoa')

diff --git a/chrome/browser/cocoa/certificate_viewer.mm b/chrome/browser/cocoa/certificate_viewer.mm
new file mode 100644
index 0000000..ed29ef4
--- /dev/null
+++ b/chrome/browser/cocoa/certificate_viewer.mm
@@ -0,0 +1,45 @@
+// Copyright (c) 2010 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/certificate_viewer.h"
+
+#include <Security/Security.h>
+#include <SecurityInterface/SFCertificatePanel.h>
+
+#include <vector>
+
+#include "base/logging.h"
+#include "base/scoped_cftyperef.h"
+#include "net/base/x509_certificate.h"
+
+void ShowCertificateViewer(gfx::NativeWindow parent,
+                           net::X509Certificate* cert) {
+  SecCertificateRef cert_mac = cert->os_cert_handle();
+  if (!cert_mac)
+    return;
+
+  scoped_cftyperef<CFMutableArrayRef> certificates(
+      CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks));
+  if (!certificates.get()) {
+    NOTREACHED();
+    return;
+  }
+  CFArrayAppendValue(certificates, cert_mac);
+
+  // Server certificate must be first in the array; subsequent certificates
+  // in the chain can be in any order.
+  const std::vector<SecCertificateRef>& ca_certs =
+      cert->GetIntermediateCertificates();
+  for (size_t i = 0; i < ca_certs.size(); ++i)
+    CFArrayAppendValue(certificates, ca_certs[i]);
+
+  [[[SFCertificatePanel alloc] init]
+      beginSheetForWindow:parent
+            modalDelegate:nil
+           didEndSelector:NULL
+              contextInfo:NULL
+             certificates:reinterpret_cast<NSArray*>(certificates.get())
+                showGroup:YES];
+  // The SFCertificatePanel releases itself when the sheet is dismissed.
+}
diff --git a/chrome/browser/cocoa/page_info_window_mac.mm b/chrome/browser/cocoa/page_info_window_mac.mm
index 5a4bddf..cc40b2e 100644
--- a/chrome/browser/cocoa/page_info_window_mac.mm
+++ b/chrome/browser/cocoa/page_info_window_mac.mm
@@ -5,8 +5,6 @@
 #include "chrome/browser/cocoa/page_info_window_mac.h"
 
 #include <algorithm>
-#include <Security/Security.h>
-#include <SecurityInterface/SFCertificatePanel.h>
 
 #include "app/l10n_util.h"
 #include "base/scoped_cftyperef.h"
@@ -16,6 +14,7 @@
 #include "base/sys_string_conversions.h"
 #import "chrome/browser/cocoa/page_info_window_controller.h"
 #include "chrome/browser/cert_store.h"
+#include "chrome/browser/certificate_viewer.h"
 #include "chrome/browser/profile.h"
 #include "grit/generated_resources.h"
 #include "grit/theme_resources.h"
@@ -105,41 +104,7 @@ void PageInfoWindowMac::Show() {
 
 void PageInfoWindowMac::ShowCertDialog(int) {
   DCHECK(cert_id_ != 0);
-  scoped_refptr<net::X509Certificate> cert;
-  CertStore::GetSharedInstance()->RetrieveCert(cert_id_, &cert);
-  if (!cert.get()) {
-    // The certificate was not found. Could be that the renderer crashed before
-    // we displayed the page info.
-    return;
-  }
-
-  SecCertificateRef cert_mac = cert->os_cert_handle();
-  if (!cert_mac)
-    return;
-
-  scoped_cftyperef<CFMutableArrayRef> certificates(
-      CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks));
-  if (!certificates.get()) {
-    NOTREACHED();
-    return;
-  }
-  CFArrayAppendValue(certificates, cert_mac);
-
-  // Server certificate must be first in the array; subsequent certificates
-  // in the chain can be in any order.
-  const std::vector<SecCertificateRef>& ca_certs =
-      cert->GetIntermediateCertificates();
-  for (size_t i = 0; i < ca_certs.size(); ++i)
-    CFArrayAppendValue(certificates, ca_certs[i]);
-
-  [[[SFCertificatePanel alloc] init]
-      beginSheetForWindow:[controller_ window]
-            modalDelegate:nil
-           didEndSelector:NULL
-              contextInfo:NULL
-             certificates:reinterpret_cast<NSArray*>(certificates.get())
-                showGroup:YES];
-  // The SFCertificatePanel releases itself when the sheet is dismissed.
+  ShowCertificateViewerByID([controller_ window], cert_id_);
 }
 
 // This will create the subviews for the page info window. The general layout
-- 
cgit v1.1