Commit 3528b550 authored by Clark DuVall's avatar Clark DuVall Committed by Commit Bot

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/1357405Reviewed-by: default avatarJohn Abd-El-Malek <jam@chromium.org>
Commit-Queue: Clark DuVall <cduvall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#612879}
parent 3f5f2892
...@@ -6,17 +6,52 @@ ...@@ -6,17 +6,52 @@
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "content/public/test/content_browser_test.h" #include "content/public/test/content_browser_test.h"
#include "content/public/test/content_browser_test_utils.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/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" #include "net/test/embedded_test_server/embedded_test_server.h"
namespace content { namespace content {
namespace {
typedef ContentBrowserTest WebKitBrowserTest; constexpr char kAsyncScriptThatAbortsOnEndPage[] =
const char kAsyncScriptThatAbortsOnEndPage[] =
"/webkit/async_script_abort_on_end.html"; "/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 // 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 // layout test without races. http://crbug.com/75604 deals with a request
// for an async script which gets data in the response and immediately // for an async script which gets data in the response and immediately
...@@ -25,7 +60,7 @@ const char kAsyncScriptThatAbortsOnEndPage[] = ...@@ -25,7 +60,7 @@ const char kAsyncScriptThatAbortsOnEndPage[] =
IN_PROC_BROWSER_TEST_F(WebKitBrowserTest, AbortOnEnd) { IN_PROC_BROWSER_TEST_F(WebKitBrowserTest, AbortOnEnd) {
ASSERT_TRUE(embedded_test_server()->Start()); ASSERT_TRUE(embedded_test_server()->Start());
URLRequestAbortOnEndJob::AddUrlHandler(); URLLoaderInterceptor interceptor(base::BindRepeating(&AbortOnEndInterceptor));
GURL url = embedded_test_server()->GetURL(kAsyncScriptThatAbortsOnEndPage); GURL url = embedded_test_server()->GetURL(kAsyncScriptThatAbortsOnEndPage);
NavigateToURL(shell(), url); NavigateToURL(shell(), url);
...@@ -47,7 +82,7 @@ IN_PROC_BROWSER_TEST_F(WebKitBrowserTest, AbortOnEnd) { ...@@ -47,7 +82,7 @@ IN_PROC_BROWSER_TEST_F(WebKitBrowserTest, AbortOnEnd) {
const char kXsltBadImportPage[] = "/webkit/xslt-bad-import.html"; const char kXsltBadImportPage[] = "/webkit/xslt-bad-import.html";
IN_PROC_BROWSER_TEST_F(WebKitBrowserTest, XsltBadImport) { IN_PROC_BROWSER_TEST_F(WebKitBrowserTest, XsltBadImport) {
ASSERT_TRUE(embedded_test_server()->Start()); ASSERT_TRUE(embedded_test_server()->Start());
URLRequestAbortOnEndJob::AddUrlHandler(); URLLoaderInterceptor interceptor(base::BindRepeating(&AbortOnEndInterceptor));
GURL url = embedded_test_server()->GetURL(kXsltBadImportPage); GURL url = embedded_test_server()->GetURL(kXsltBadImportPage);
NavigateToURL(shell(), url); NavigateToURL(shell(), url);
......
...@@ -247,8 +247,6 @@ jumbo_static_library("test_support") { ...@@ -247,8 +247,6 @@ jumbo_static_library("test_support") {
"mock_widget_impl.h", "mock_widget_impl.h",
"mock_widget_input_handler.cc", "mock_widget_input_handler.cc",
"mock_widget_input_handler.h", "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.cc",
"not_implemented_network_url_loader_factory.h", "not_implemented_network_url_loader_factory.h",
"ppapi_unittest.cc", "ppapi_unittest.cc",
......
// 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
// 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_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment