Index: chrome/browser/chromeos/policy/policy_cert_verifier.cc |
diff --git a/chrome/browser/chromeos/policy/policy_cert_verifier.cc b/chrome/browser/chromeos/policy/policy_cert_verifier.cc |
index 307cdd01bad7994d548531f6a850171a8bd808d1..8f79bec1497fb2d527107270d949e63f0917c3ef 100644 |
--- a/chrome/browser/chromeos/policy/policy_cert_verifier.cc |
+++ b/chrome/browser/chromeos/policy/policy_cert_verifier.cc |
@@ -5,7 +5,6 @@ |
#include "chrome/browser/chromeos/policy/policy_cert_verifier.h" |
#include "base/logging.h" |
-#include "base/memory/ref_counted.h" |
#include "chrome/browser/browser_process.h" |
#include "content/public/browser/browser_thread.h" |
#include "net/base/net_errors.h" |
@@ -14,40 +13,18 @@ |
namespace policy { |
-namespace { |
- |
-void MaybeSignalAnchorUse(int error, |
- const base::Closure& anchor_used_callback, |
- const net::CertVerifyResult& verify_result) { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
- if (error != net::OK || !verify_result.is_issued_by_additional_trust_anchor || |
- anchor_used_callback.is_null()) { |
- return; |
- } |
- anchor_used_callback.Run(); |
-} |
- |
-void CompleteAndSignalAnchorUse( |
- const base::Closure& anchor_used_callback, |
- const net::CompletionCallback& completion_callback, |
- const net::CertVerifyResult* verify_result, |
- int error) { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
- MaybeSignalAnchorUse(error, anchor_used_callback, *verify_result); |
- if (!completion_callback.is_null()) |
- completion_callback.Run(error); |
-} |
- |
-} // namespace |
- |
PolicyCertVerifier::PolicyCertVerifier( |
const base::Closure& anchor_used_callback) |
- : anchor_used_callback_(anchor_used_callback) { |
+ : anchor_used_callback_(anchor_used_callback), |
+ weak_ptr_factory_(this), |
+ weak_ptr_(weak_ptr_factory_.GetWeakPtr()) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
} |
PolicyCertVerifier::~PolicyCertVerifier() { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
+ DCHECK(!weak_ptr_factory_.HasWeakPtrs()) |
+ << "UnsetTrustAnchorUsedCallback must be called before d'tor. " << this; |
} |
void PolicyCertVerifier::InitializeOnIOThread() { |
@@ -56,7 +33,7 @@ void PolicyCertVerifier::InitializeOnIOThread() { |
net::CertVerifyProc::CreateDefault(); |
if (!verify_proc->SupportsAdditionalTrustAnchors()) { |
LOG(WARNING) |
- << "Additional trust anchors not supported in the current platform!"; |
+ << "Additional trust anchors not supported on the current platform!"; |
} |
net::MultiThreadedCertVerifier* verifier = |
new net::MultiThreadedCertVerifier(verify_proc.get()); |
@@ -64,6 +41,12 @@ void PolicyCertVerifier::InitializeOnIOThread() { |
delegate_.reset(verifier); |
} |
+void PolicyCertVerifier::UnsetTrustAnchorUsedCallback() { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ anchor_used_callback_.Reset(); |
+ weak_ptr_factory_.InvalidateWeakPtrs(); |
+} |
+ |
void PolicyCertVerifier::SetTrustAnchors( |
const net::CertificateList& trust_anchors) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
@@ -82,13 +65,13 @@ int PolicyCertVerifier::Verify( |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
DCHECK(delegate_); |
net::CompletionCallback wrapped_callback = |
- base::Bind(&CompleteAndSignalAnchorUse, |
- anchor_used_callback_, |
+ base::Bind(&PolicyCertVerifier::CompleteAndSignalAnchorUse, |
completion_callback, |
- verify_result); |
+ verify_result, |
+ weak_ptr_); |
int error = delegate_->Verify(cert, hostname, flags, crl_set, verify_result, |
wrapped_callback, out_req, net_log); |
- MaybeSignalAnchorUse(error, anchor_used_callback_, *verify_result); |
+ MaybeSignalAnchorUse(error, *verify_result, weak_ptr_); |
return error; |
} |
@@ -102,4 +85,37 @@ const net::CertificateList& PolicyCertVerifier::GetAdditionalTrustAnchors() { |
return trust_anchors_; |
} |
+void PolicyCertVerifier::NotifyOnUI() { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ if (!anchor_used_callback_.is_null()) |
+ anchor_used_callback_.Run(); |
+} |
+ |
+// static |
+void PolicyCertVerifier::MaybeSignalAnchorUse( |
+ int error, |
+ const net::CertVerifyResult& verify_result, |
+ const base::WeakPtr<PolicyCertVerifier>& weak_ptr) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
+ if (error != net::OK || !verify_result.is_issued_by_additional_trust_anchor) |
+ return; |
+ |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&PolicyCertVerifier::NotifyOnUI, weak_ptr)); |
+} |
+ |
+// static |
+void PolicyCertVerifier::CompleteAndSignalAnchorUse( |
+ const net::CompletionCallback& completion_callback, |
+ const net::CertVerifyResult* verify_result, |
+ const base::WeakPtr<PolicyCertVerifier>& weak_ptr, |
+ int error) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
+ MaybeSignalAnchorUse(error, *verify_result, weak_ptr); |
+ if (!completion_callback.is_null()) |
+ completion_callback.Run(error); |
+} |
+ |
} // namespace policy |