| Index: chrome/browser/ui/views/ssl_client_certificate_selector.cc
|
| diff --git a/chrome/browser/ui/views/ssl_client_certificate_selector.cc b/chrome/browser/ui/views/ssl_client_certificate_selector.cc
|
| index de31ce8f02a3c46810ae1a838aa29b848d1bfbf0..4ae8bfe97c8354cbabbe04a8b30a6a33f788ec1d 100644
|
| --- a/chrome/browser/ui/views/ssl_client_certificate_selector.cc
|
| +++ b/chrome/browser/ui/views/ssl_client_certificate_selector.cc
|
| @@ -10,7 +10,9 @@
|
| #include "chrome/browser/certificate_viewer.h"
|
| #include "chrome/grit/generated_resources.h"
|
| #include "components/constrained_window/constrained_window_views.h"
|
| +#include "components/web_modal/popup_manager.h"
|
| #include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/client_certificate_delegate.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "net/cert/x509_certificate.h"
|
| #include "net/ssl/ssl_cert_request_info.h"
|
| @@ -83,9 +85,10 @@ void CertificateSelectorTableModel::SetObserver(
|
| SSLClientCertificateSelector::SSLClientCertificateSelector(
|
| content::WebContents* web_contents,
|
| const scoped_refptr<net::SSLCertRequestInfo>& cert_request_info,
|
| - const chrome::SelectCertificateCallback& callback)
|
| + scoped_ptr<content::ClientCertificateDelegate> delegate)
|
| : SSLClientAuthObserver(web_contents->GetBrowserContext(),
|
| - cert_request_info, callback),
|
| + cert_request_info,
|
| + delegate.Pass()),
|
| model_(new CertificateSelectorTableModel(cert_request_info.get())),
|
| web_contents_(web_contents),
|
| table_(NULL),
|
| @@ -212,6 +215,13 @@ bool SSLClientCertificateSelector::Accept() {
|
| return false;
|
| }
|
|
|
| +bool SSLClientCertificateSelector::Close() {
|
| + DVLOG(1) << __FUNCTION__;
|
| + StopObserving();
|
| + CancelCertificateSelection();
|
| + return true;
|
| +}
|
| +
|
| views::View* SSLClientCertificateSelector::GetInitiallyFocusedView() {
|
| return table_;
|
| }
|
| @@ -275,11 +285,21 @@ namespace chrome {
|
| void ShowSSLClientCertificateSelector(
|
| content::WebContents* contents,
|
| net::SSLCertRequestInfo* cert_request_info,
|
| - const chrome::SelectCertificateCallback& callback) {
|
| + scoped_ptr<content::ClientCertificateDelegate> delegate) {
|
| DVLOG(1) << __FUNCTION__ << " " << contents;
|
| DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| - (new SSLClientCertificateSelector(
|
| - contents, cert_request_info, callback))->Init();
|
| +
|
| + // Not all WebContentses can show modal dialogs.
|
| + //
|
| + // TODO(davidben): Move this hook to the WebContentsDelegate and only try to
|
| + // show a dialog in Browser's implementation. https://crbug.com/456255
|
| + if (web_modal::PopupManager::FromWebContents(contents) == nullptr) {
|
| + delegate->CancelCertificateSelection();
|
| + return;
|
| + }
|
| +
|
| + (new SSLClientCertificateSelector(contents, cert_request_info,
|
| + delegate.Pass()))->Init();
|
| }
|
|
|
| } // namespace chrome
|
|
|