Convert WebKitBrowserTest to use URLLoaderInterceptor

This test was using a net::URLRequestInterceptor so was not actually
working correctly with network service. The interceptor it was using
also assumes it is on the IO thread which was causing issues when
running NS in-process on its own thread.

Bug: 908993
Change-Id: I009ddf13b53cecac9615c4d2019405ddede57c69
Reviewed-on: https://chromium-review.googlesource.com/c/1357405
Reviewed-by: John Abd-El-Malek <jam@chromium.org>
Commit-Queue: Clark DuVall <cduvall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#612879}
diff --git a/content/browser/webkit_browsertest.cc b/content/browser/webkit_browsertest.cc
index bd67587..8b2b69a 100644
--- a/content/browser/webkit_browsertest.cc
+++ b/content/browser/webkit_browsertest.cc
@@ -6,17 +6,52 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/content_browser_test.h"
 #include "content/public/test/content_browser_test_utils.h"
+#include "content/public/test/url_loader_interceptor.h"
 #include "content/shell/browser/shell.h"
-#include "content/test/net/url_request_abort_on_end_job.h"
+#include "net/http/http_util.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 
 namespace content {
+namespace {
 
-typedef ContentBrowserTest WebKitBrowserTest;
-
-const char kAsyncScriptThatAbortsOnEndPage[] =
+constexpr char kAsyncScriptThatAbortsOnEndPage[] =
     "/webkit/async_script_abort_on_end.html";
 
+constexpr char k400AbortOnEndUrl[] = "http://url.handled.by.abort.on.end/400";
+
+bool AbortOnEndInterceptor(URLLoaderInterceptor::RequestParams* params) {
+  if (params->url_request.url.spec() != k400AbortOnEndUrl)
+    return false;
+
+  std::string headers =
+      "HTTP/1.1 400 This is not OK\n"
+      "Content-type: text/plain\n";
+  net::HttpResponseInfo info;
+  info.headers = new net::HttpResponseHeaders(
+      net::HttpUtil::AssembleRawHeaders(headers.c_str(), headers.length()));
+  network::ResourceResponseHead response;
+  response.headers = info.headers;
+  response.headers->GetMimeType(&response.mime_type);
+  params->client->OnReceiveResponse(response);
+
+  std::string body = "some data\r\n";
+  uint32_t bytes_written = body.size();
+  mojo::DataPipe data_pipe(body.size());
+  CHECK_EQ(MOJO_RESULT_OK,
+           data_pipe.producer_handle->WriteData(
+               body.data(), &bytes_written, MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
+  params->client->OnStartLoadingResponseBody(
+      std::move(data_pipe.consumer_handle));
+
+  params->client->OnComplete(
+      network::URLLoaderCompletionStatus(net::ERR_CONNECTION_ABORTED));
+  return true;
+}
+
+}  // namespace
+
+using WebKitBrowserTest = ContentBrowserTest;
+
 // This is a browser test because it is hard to reproduce reliably in a
 // layout test without races. http://crbug.com/75604 deals with a request
 // for an async script which gets data in the response and immediately
@@ -25,7 +60,7 @@
 
 IN_PROC_BROWSER_TEST_F(WebKitBrowserTest, AbortOnEnd) {
   ASSERT_TRUE(embedded_test_server()->Start());
-  URLRequestAbortOnEndJob::AddUrlHandler();
+  URLLoaderInterceptor interceptor(base::BindRepeating(&AbortOnEndInterceptor));
   GURL url = embedded_test_server()->GetURL(kAsyncScriptThatAbortsOnEndPage);
 
   NavigateToURL(shell(), url);
@@ -47,7 +82,7 @@
 const char kXsltBadImportPage[] = "/webkit/xslt-bad-import.html";
 IN_PROC_BROWSER_TEST_F(WebKitBrowserTest, XsltBadImport) {
   ASSERT_TRUE(embedded_test_server()->Start());
-  URLRequestAbortOnEndJob::AddUrlHandler();
+  URLLoaderInterceptor interceptor(base::BindRepeating(&AbortOnEndInterceptor));
   GURL url = embedded_test_server()->GetURL(kXsltBadImportPage);
 
   NavigateToURL(shell(), url);
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index a63a7c29..74c7a7b 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -247,8 +247,6 @@
     "mock_widget_impl.h",
     "mock_widget_input_handler.cc",
     "mock_widget_input_handler.h",
-    "net/url_request_abort_on_end_job.cc",
-    "net/url_request_abort_on_end_job.h",
     "not_implemented_network_url_loader_factory.cc",
     "not_implemented_network_url_loader_factory.h",
     "ppapi_unittest.cc",
diff --git a/content/test/net/url_request_abort_on_end_job.cc b/content/test/net/url_request_abort_on_end_job.cc
deleted file mode 100644
index af204050..0000000
--- a/content/test/net/url_request_abort_on_end_job.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-// This class simulates what wininet does when a dns lookup fails.
-
-#include <algorithm>
-#include <cstring>
-
-#include "base/compiler_specific.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/single_thread_task_runner.h"
-#include "base/strings/string_util.h"
-#include "base/task/post_task.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "content/public/browser/browser_task_traits.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/test/net/url_request_abort_on_end_job.h"
-#include "net/base/io_buffer.h"
-#include "net/base/net_errors.h"
-#include "net/http/http_response_headers.h"
-#include "net/url_request/url_request.h"
-#include "net/url_request/url_request_filter.h"
-#include "net/url_request/url_request_interceptor.h"
-#include "net/url_request/url_request_status.h"
-
-namespace content {
-namespace {
-
-const char kPageContent[] = "some data\r\n";
-
-class Interceptor : public net::URLRequestInterceptor {
- public:
-  Interceptor() {}
-  ~Interceptor() override {}
-
-  // URLRequestInterceptor implementation:
-  net::URLRequestJob* MaybeInterceptRequest(
-      net::URLRequest* request,
-      net::NetworkDelegate* network_delegate) const override {
-    DCHECK_CURRENTLY_ON(BrowserThread::IO);
-    return new URLRequestAbortOnEndJob(request, network_delegate);
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(Interceptor);
-};
-
-void AddUrlHandlerOnIOThread() {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  net::URLRequestFilter* filter = net::URLRequestFilter::GetInstance();
-  filter->AddUrlInterceptor(
-      GURL(URLRequestAbortOnEndJob::k400AbortOnEndUrl),
-      std::unique_ptr<net::URLRequestInterceptor>(new Interceptor()));
-}
-
-}  // anonymous namespace
-
-const char URLRequestAbortOnEndJob::k400AbortOnEndUrl[] =
-    "http://url.handled.by.abort.on.end/400";
-
-// static
-void URLRequestAbortOnEndJob::AddUrlHandler() {
-  base::PostTaskWithTraits(FROM_HERE, {BrowserThread::IO},
-                           base::BindOnce(AddUrlHandlerOnIOThread));
-}
-
-// Private const version.
-void URLRequestAbortOnEndJob::GetResponseInfoConst(
-    net::HttpResponseInfo* info) const {
-  // Send back mock headers.
-  std::string raw_headers;
-  if (base::LowerCaseEqualsASCII(k400AbortOnEndUrl,
-                                 request_->url().spec().c_str())) {
-    raw_headers.append(
-      "HTTP/1.1 400 This is not OK\n"
-      "Content-type: text/plain\n");
-  } else {
-    NOTREACHED();
-  }
-  // ParseRawHeaders expects \0 to end each header line.
-  base::ReplaceSubstringsAfterOffset(
-      &raw_headers, 0, "\n", base::StringPiece("\0", 1));
-  info->headers = new net::HttpResponseHeaders(raw_headers);
-}
-
-URLRequestAbortOnEndJob::URLRequestAbortOnEndJob(
-    net::URLRequest* request, net::NetworkDelegate* network_delegate)
-    : URLRequestJob(request, network_delegate),
-      sent_data_(false),
-      weak_factory_(this) {
-}
-
-URLRequestAbortOnEndJob::~URLRequestAbortOnEndJob() {
-}
-
-void URLRequestAbortOnEndJob::GetResponseInfo(net::HttpResponseInfo* info) {
-  GetResponseInfoConst(info);
-}
-
-bool URLRequestAbortOnEndJob::GetMimeType(std::string* mime_type) const {
-  net::HttpResponseInfo info;
-  GetResponseInfoConst(&info);
-  return info.headers.get() && info.headers->GetMimeType(mime_type);
-}
-
-void URLRequestAbortOnEndJob::StartAsync() {
-  NotifyHeadersComplete();
-}
-
-void URLRequestAbortOnEndJob::Start() {
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&URLRequestAbortOnEndJob::StartAsync,
-                                weak_factory_.GetWeakPtr()));
-}
-
-int URLRequestAbortOnEndJob::ReadRawData(net::IOBuffer* buf, int max_bytes) {
-  if (!sent_data_) {
-    max_bytes =
-        std::min(max_bytes, base::checked_cast<int>(sizeof(kPageContent)));
-    std::memcpy(buf->data(), kPageContent, max_bytes);
-    sent_data_ = true;
-    return max_bytes;
-  }
-
-  return net::ERR_CONNECTION_ABORTED;
-}
-
-}  // namespace content
diff --git a/content/test/net/url_request_abort_on_end_job.h b/content/test/net/url_request_abort_on_end_job.h
deleted file mode 100644
index b44a915..0000000
--- a/content/test/net/url_request_abort_on_end_job.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-// This class simulates what wininet does when a dns lookup fails.
-
-#ifndef CONTENT_TEST_NET_URL_REQUEST_ABORT_ON_END_JOB_H_
-#define CONTENT_TEST_NET_URL_REQUEST_ABORT_ON_END_JOB_H_
-
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "net/url_request/url_request_job.h"
-
-namespace content {
-
-// This url request simulates a network error which occurs immediately after
-// receiving the very first data.
-
-class URLRequestAbortOnEndJob : public net::URLRequestJob {
- public:
-  static const char k400AbortOnEndUrl[];
-
-  URLRequestAbortOnEndJob(net::URLRequest* request,
-                          net::NetworkDelegate* network_delegate);
-
-  // net::URLRequestJob
-  void Start() override;
-  bool GetMimeType(std::string* mime_type) const override;
-  void GetResponseInfo(net::HttpResponseInfo* info) override;
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override;
-
-  static void AddUrlHandler();
-
- private:
-  ~URLRequestAbortOnEndJob() override;
-
-  void GetResponseInfoConst(net::HttpResponseInfo* info) const;
-  void StartAsync();
-
-  bool sent_data_;
-
-  base::WeakPtrFactory<URLRequestAbortOnEndJob> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(URLRequestAbortOnEndJob);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_TEST_NET_URL_REQUEST_ABORT_ON_END_JOB_H_