[WebURLLoaderImpl] Reset response body synchronously on cancel

WebURLLoaderImpl is not destructed when the request is cancelled, so
it's better to destruct the response body handle in
WebURLLoaderImpl::Context::Cancel manually.

Bug: 894819, 927184, 929793
Change-Id: I12a5c916ff64ecbdeb8013cff88c95bd111c31ab
Reviewed-on: https://chromium-review.googlesource.com/c/1480308
Commit-Queue: Kinuko Yasuda <kinuko@chromium.org>
Reviewed-by: Kinuko Yasuda <kinuko@chromium.org>
Auto-Submit: Yutaka Hirano <yhirano@chromium.org>
Cr-Commit-Position: refs/heads/master@{#634112}
diff --git a/content/renderer/loader/web_url_loader_impl.cc b/content/renderer/loader/web_url_loader_impl.cc
index 08b0d6e..35b3caf1 100644
--- a/content/renderer/loader/web_url_loader_impl.cc
+++ b/content/renderer/loader/web_url_loader_impl.cc
@@ -565,6 +565,9 @@
   if (body_stream_writer_)
     body_stream_writer_->Fail();
 
+  body_handle_.reset();
+  body_watcher_.Cancel();
+
   // Do not make any further calls to the client.
   client_ = nullptr;
   loader_ = nullptr;
@@ -1044,6 +1047,10 @@
 }
 
 void WebURLLoaderImpl::Context::OnBodyHasBeenRead(uint32_t read_bytes) {
+  if (!body_handle_) {
+    // The request is cancelled.
+    return;
+  }
   MojoResult rv = body_handle_->EndReadData(read_bytes);
   DCHECK_EQ(MOJO_RESULT_OK, rv);
   if (defers_loading_ == NOT_DEFERRING)