Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(204)

Unified Diff: net/proxy/proxy_resolver_mojo.cc

Issue 1069483003: Handle ERR_PAC_SCRIPT_TERMINATED in ProxyService. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/proxy/proxy_resolver_mojo.cc
diff --git a/net/proxy/proxy_resolver_mojo.cc b/net/proxy/proxy_resolver_mojo.cc
index 3801d41a093cb723ab7f21b87f3326ca48ed3f0a..6e12a43d317d21629e435673100ad4a1887e81be 100644
--- a/net/proxy/proxy_resolver_mojo.cc
+++ b/net/proxy/proxy_resolver_mojo.cc
@@ -100,9 +100,10 @@ void ProxyResolverMojo::Job::ReportResult(
DVLOG(1) << "Servers: " << results_->ToPacString();
}
- callback_.Run(error);
+ CompletionCallback callback = callback_;
callback_.Reset();
resolver_->RemoveJob(this);
+ callback.Run(error);
}
void ProxyResolverMojo::Job::LoadStateChanged(int32_t load_state) {
@@ -114,7 +115,8 @@ ProxyResolverMojo::ProxyResolverMojo(
HostResolver* host_resolver)
: ProxyResolver(true /* |expects_pac_bytes| */),
mojo_proxy_resolver_factory_(mojo_proxy_resolver_factory),
- host_resolver_(host_resolver) {
+ host_resolver_(host_resolver),
+ weak_factory_(this) {
}
ProxyResolverMojo::~ProxyResolverMojo() {
@@ -163,8 +165,11 @@ void ProxyResolverMojo::OnSetPacScriptDone(
DCHECK(!set_pac_script_callback_.IsCancelled());
DVLOG(1) << "ProxyResolverMojo::OnSetPacScriptDone: " << result;
- callback.Run(result);
+ // |callback| is owned by |set_pac_script_callback_|, so make a copy before
+ // cancelling.
+ auto callback_copy = callback;
set_pac_script_callback_.Cancel();
+ callback_copy.Run(result);
}
void ProxyResolverMojo::SetUpServices() {
@@ -184,14 +189,15 @@ void ProxyResolverMojo::SetUpServices() {
void ProxyResolverMojo::AbortPendingRequests() {
DCHECK(thread_checker_.CalledOnValidThread());
- if (!set_pac_script_callback_.IsCancelled()) {
+ // |this| could be deleted as a result of one of these callbacks so use
+ // |weak_this| to check.
+ base::WeakPtr<ProxyResolverMojo> weak_this = weak_factory_.GetWeakPtr();
+ if (!set_pac_script_callback_.IsCancelled())
set_pac_script_callback_.callback().Run(ERR_PAC_SCRIPT_TERMINATED);
- set_pac_script_callback_.Cancel();
- }
// Need to use this loop because deleting a Job will cause its callback to be
// run with a failure error code, which may cause other Jobs to be deleted.
- while (!pending_jobs_.empty()) {
+ while (weak_this && !pending_jobs_.empty()) {
eroman 2015/04/15 00:56:52 What is this needed for? This doesn't seem right,
Sam McNally 2015/04/15 04:35:56 Done. GetProxyForUrl requests will no longer immed
auto it = pending_jobs_.begin();
Job* job = *it;
pending_jobs_.erase(it);

Powered by Google App Engine
This is Rietveld 408576698