Index: content/browser/loader/intercepting_resource_handler.cc |
diff --git a/content/browser/loader/intercepting_resource_handler.cc b/content/browser/loader/intercepting_resource_handler.cc |
index 7c8f4a998641b711b9f5917198011a99269cad02..733ca71d22de50ef164acb6f184dac791ae4d42a 100644 |
--- a/content/browser/loader/intercepting_resource_handler.cc |
+++ b/content/browser/loader/intercepting_resource_handler.cc |
@@ -4,8 +4,10 @@ |
#include "content/browser/loader/intercepting_resource_handler.h" |
+#include "base/location.h" |
#include "base/logging.h" |
#include "base/strings/string_util.h" |
+#include "base/threading/thread_task_runner_handle.h" |
#include "content/public/common/resource_response.h" |
#include "net/base/io_buffer.h" |
#include "net/url_request/url_request.h" |
@@ -15,7 +17,8 @@ namespace content { |
InterceptingResourceHandler::InterceptingResourceHandler( |
std::unique_ptr<ResourceHandler> next_handler, |
net::URLRequest* request) |
- : LayeredResourceHandler(request, std::move(next_handler)) { |
+ : LayeredResourceHandler(request, std::move(next_handler)), |
+ weak_ptr_factory_(this) { |
next_handler_->SetController(this); |
} |
@@ -149,14 +152,12 @@ void InterceptingResourceHandler::Resume() { |
controller()->Resume(); |
return; |
} |
- bool defer = false; |
- if (!DoLoop(&defer)) { |
- controller()->Cancel(); |
- return; |
- } |
- if (!defer) |
- controller()->Resume(); |
+ // Can't call DoLoop synchronously, as it may call into |next_handler_| |
+ // synchronously, which is what called Resume(). |
+ base::ThreadTaskRunnerHandle::Get()->PostTask( |
+ FROM_HERE, base::Bind(&InterceptingResourceHandler::AdvanceState, |
+ weak_ptr_factory_.GetWeakPtr())); |
} |
void InterceptingResourceHandler::UseNewHandler( |
@@ -279,4 +280,15 @@ bool InterceptingResourceHandler::SendFirstReadBufferToNewHandler(bool* defer) { |
return true; |
} |
+void InterceptingResourceHandler::AdvanceState() { |
+ bool defer = false; |
+ if (!DoLoop(&defer)) { |
+ controller()->Cancel(); |
+ return; |
+ } |
+ |
+ if (!defer) |
+ controller()->Resume(); |
+} |
+ |
} // namespace content |