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 |