Chromium Code Reviews| 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..e56f69fb15e88b44ec39d1d8edcaf2443ef67914 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,16 @@ |
| 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) { |
| +PolicyCertVerifier::PolicyCertVerifier() |
| + : weak_ptr_factory_(this), weak_ptr_(weak_ptr_factory_.GetWeakPtr()) { |
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + anchor_used_callback_list_.reset(new base::CallbackList<void()>()); |
| } |
| PolicyCertVerifier::~PolicyCertVerifier() { |
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| + DCHECK(!anchor_used_callback_list_); |
| + DCHECK(!weak_ptr_factory_.HasWeakPtrs()); |
| } |
| void PolicyCertVerifier::InitializeOnIOThread() { |
| @@ -64,6 +39,20 @@ void PolicyCertVerifier::InitializeOnIOThread() { |
| delegate_.reset(verifier); |
| } |
| +void PolicyCertVerifier::ShutdownOnUIThread() { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + anchor_used_callback_list_.reset(); |
| + weak_ptr_factory_.InvalidateWeakPtrs(); |
| +} |
| + |
| +scoped_ptr<base::CallbackList<void()>::Subscription> |
| +PolicyCertVerifier::RegisterAnchorUsedCallback(const base::Closure& cb) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + if (anchor_used_callback_list_) |
| + return anchor_used_callback_list_->Add(cb); |
| + return scoped_ptr<base::CallbackList<void()>::Subscription>(); |
| +} |
| + |
| void PolicyCertVerifier::SetTrustAnchors( |
| const net::CertificateList& trust_anchors) { |
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| @@ -82,13 +71,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_factory_.GetWeakPtr()); |
|
Joao da Silva
2013/10/16 12:44:58
can't do, this is on IO. Use |weak_ptr_| here
pneubeck (no reviews)
2013/10/22 18:47:41
doh. Of course. That was the original intention wh
|
| 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_factory_.GetWeakPtr()); |
|
Joao da Silva
2013/10/16 12:44:58
Same here, use |weak_ptr_|
pneubeck (no reviews)
2013/10/22 18:47:41
Done.
|
| return error; |
| } |
| @@ -102,4 +91,36 @@ const net::CertificateList& PolicyCertVerifier::GetAdditionalTrustAnchors() { |
| return trust_anchors_; |
| } |
| +void PolicyCertVerifier::RunCallback() { |
|
Joao da Silva
2013/10/16 12:44:58
rename to NotifyOnUI
pneubeck (no reviews)
2013/10/22 18:47:41
Done.
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + anchor_used_callback_list_->Notify(); |
| +} |
| + |
| +// 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::RunCallback, 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 |