Commit fdf9d6d3 authored by Takashi Toyoshima's avatar Takashi Toyoshima Committed by Commit Bot

OOR-CORS: Use net::ERR_ABORTED on OnConnectionError

Currently, some tests expect it does not complete, and others do
returning net::ERR_ABORTED. But it's really tough to realize the
same behavior when OutOfBlinkCORS is enabled because timing differs.

With this fix, CORSURLLoader is changed to return net::ERR_ABORTED
on OnConnectionError that happens when a client destructs a loader.

Existing tests that expect it does not complete are also modified
to check if it does not complete or it completes with the error.

This patch will make tests below pass even with OutOfBlinkCORS enabled.
- ResourceDispatcherHostTest.DataSentBeforeDetach
- ResourceDispatcherHostTest.Cancel
- ResourceDispatcherHostTest.DetachedResourceTimesOut
- ResourceDispatcherHostTest.TestBlockedRequestsProcessDies
- ResourceDispatcherHostTest.TestBlockingCancelingRequests

Bug: 872634, 870173
Cq-Include-Trybots: luci.chromium.try:linux_mojo
Change-Id: I2f7f40de49d5820413eaf4e80debf747ba66632a
Reviewed-on: https://chromium-review.googlesource.com/1230039Reviewed-by: default avatarYutaka Hirano <yhirano@chromium.org>
Commit-Queue: Takashi Toyoshima <toyoshim@chromium.org>
Cr-Commit-Position: refs/heads/master@{#593836}
parent 2ca919e5
......@@ -631,7 +631,13 @@ class ShareableFileReleaseWaiter {
DISALLOW_COPY_AND_ASSIGN(ShareableFileReleaseWaiter);
};
class ResourceDispatcherHostTest : public testing::Test {
enum class TestMode {
kOutOfBlinkCorsWithServicification,
kOutOfBlinkCorsWithoutServicification,
kWithoutOutOfBlinkCorsAndServicification,
};
class ResourceDispatcherHostTest : public testing::TestWithParam<TestMode> {
public:
typedef ResourceDispatcherHostImpl::LoadInfo LoadInfo;
typedef ResourceDispatcherHostImpl::LoadInfoList LoadInfoList;
......@@ -843,6 +849,15 @@ class ResourceDispatcherHostTest : public testing::Test {
request_info->detachable_handler()->is_detached();
}
bool IsAborted(const network::TestURLLoaderClient& client) {
// TODO(toyoshim): Once NetworkService or OutOfBlinkCORS is enabled, these
// expectations below should be receiving a completion with ERR_ABORTED.
if (!client.has_received_completion())
return client.has_received_connection_error();
return client.completion_status().error_code == net::ERR_ABORTED;
}
void SetMaxDelayableRequests(size_t max_delayable_requests) {
network::ResourceSchedulerParamsManager::ParamsForNetworkQualityContainer c;
for (int i = 0; i != net::EFFECTIVE_CONNECTION_TYPE_LAST; ++i) {
......@@ -989,7 +1004,7 @@ void CheckSuccessfulRequest(network::TestURLLoaderClient* client,
// Tests whether messages get canceled properly. We issue four requests,
// cancel two of them, and make sure that each sent the proper notifications.
TEST_F(ResourceDispatcherHostTest, Cancel) {
TEST_P(ResourceDispatcherHostTest, Cancel) {
network::mojom::URLLoaderPtr loader1, loader2, loader3, loader4;
network::TestURLLoaderClient client1, client2, client3, client4;
MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_1(),
......@@ -1039,7 +1054,7 @@ TEST_F(ResourceDispatcherHostTest, Cancel) {
// Shows that detachable requests will timeout if the request takes too long to
// complete.
TEST_F(ResourceDispatcherHostTest, DetachedResourceTimesOut) {
TEST_P(ResourceDispatcherHostTest, DetachedResourceTimesOut) {
network::mojom::URLLoaderPtr loader;
network::TestURLLoaderClient client;
MakeTestRequestWithResourceType(
......@@ -1083,7 +1098,7 @@ TEST_F(ResourceDispatcherHostTest, DetachedResourceTimesOut) {
// If the filter has disappeared then detachable resources should continue to
// load.
TEST_F(ResourceDispatcherHostTest, DeletedFilterDetached) {
TEST_P(ResourceDispatcherHostTest, DeletedFilterDetached) {
network::mojom::URLLoaderPtr loader1;
network::TestURLLoaderClient client1;
base::test::ScopedFeatureList feature_list;
......@@ -1124,7 +1139,7 @@ TEST_F(ResourceDispatcherHostTest, DeletedFilterDetached) {
// If the filter has disappeared (original process dies) then detachable
// resources should continue to load, even when redirected.
TEST_F(ResourceDispatcherHostTest, DeletedFilterDetachedRedirect) {
TEST_P(ResourceDispatcherHostTest, DeletedFilterDetachedRedirect) {
network::mojom::URLLoaderPtr loader;
network::TestURLLoaderClient client;
network::ResourceRequest request = CreateResourceRequest(
......@@ -1172,7 +1187,7 @@ TEST_F(ResourceDispatcherHostTest, DeletedFilterDetachedRedirect) {
EXPECT_EQ(0, network_delegate()->error_count());
}
TEST_F(ResourceDispatcherHostTest, CancelWhileStartIsDeferred) {
TEST_P(ResourceDispatcherHostTest, CancelWhileStartIsDeferred) {
network::mojom::URLLoaderPtr loader;
network::TestURLLoaderClient client;
bool was_deleted = false;
......@@ -1200,7 +1215,7 @@ TEST_F(ResourceDispatcherHostTest, CancelWhileStartIsDeferred) {
EXPECT_TRUE(was_deleted);
}
TEST_F(ResourceDispatcherHostTest, DetachWhileStartIsDeferred) {
TEST_P(ResourceDispatcherHostTest, DetachWhileStartIsDeferred) {
network::mojom::URLLoaderPtr loader;
network::TestURLLoaderClient client;
bool was_deleted = false;
......@@ -1245,7 +1260,7 @@ TEST_F(ResourceDispatcherHostTest, DetachWhileStartIsDeferred) {
// Tests if cancel is called in ResourceThrottle::WillStartRequest, then the
// URLRequest will not be started.
TEST_F(ResourceDispatcherHostTest, CancelInResourceThrottleWillStartRequest) {
TEST_P(ResourceDispatcherHostTest, CancelInResourceThrottleWillStartRequest) {
network::mojom::URLLoaderPtr loader;
network::TestURLLoaderClient client;
TestResourceDispatcherHostDelegate delegate;
......@@ -1267,7 +1282,7 @@ TEST_F(ResourceDispatcherHostTest, CancelInResourceThrottleWillStartRequest) {
EXPECT_EQ(0, job_factory_->url_request_jobs_created_count());
}
TEST_F(ResourceDispatcherHostTest, PausedStartError) {
TEST_P(ResourceDispatcherHostTest, PausedStartError) {
network::mojom::URLLoaderPtr loader;
network::TestURLLoaderClient client;
// Arrange to have requests deferred before processing response headers.
......@@ -1287,7 +1302,7 @@ TEST_F(ResourceDispatcherHostTest, PausedStartError) {
EXPECT_EQ(0, host_.pending_requests());
}
TEST_F(ResourceDispatcherHostTest, ThrottleAndResumeTwice) {
TEST_P(ResourceDispatcherHostTest, ThrottleAndResumeTwice) {
network::mojom::URLLoaderPtr loader;
network::TestURLLoaderClient client;
// Arrange to have requests deferred before starting.
......@@ -1324,7 +1339,7 @@ TEST_F(ResourceDispatcherHostTest, ThrottleAndResumeTwice) {
}
// Tests that the delegate can cancel a request and provide a error code.
TEST_F(ResourceDispatcherHostTest, CancelInDelegate) {
TEST_P(ResourceDispatcherHostTest, CancelInDelegate) {
network::mojom::URLLoaderPtr loader;
network::TestURLLoaderClient client;
TestResourceDispatcherHostDelegate delegate;
......@@ -1344,7 +1359,7 @@ TEST_F(ResourceDispatcherHostTest, CancelInDelegate) {
EXPECT_EQ(net::ERR_ACCESS_DENIED, client.completion_status().error_code);
}
TEST_F(ResourceDispatcherHostTest, CancelRequestsForRoute) {
TEST_P(ResourceDispatcherHostTest, CancelRequestsForRoute) {
network::mojom::URLLoaderPtr loader1, loader2, loader3, loader4;
network::TestURLLoaderClient client1, client2, client3, client4;
base::test::ScopedFeatureList feature_list;
......@@ -1398,7 +1413,7 @@ TEST_F(ResourceDispatcherHostTest, CancelRequestsForRoute) {
}
// Tests CancelRequestsForProcess
TEST_F(ResourceDispatcherHostTest, TestProcessCancel) {
TEST_P(ResourceDispatcherHostTest, TestProcessCancel) {
network::mojom::URLLoaderPtr loader1, loader2, loader3, loader4;
network::TestURLLoaderClient client1, client2, client3, client4;
scoped_refptr<TestFilter> test_filter = MakeTestFilter();
......@@ -1472,7 +1487,7 @@ TEST_F(ResourceDispatcherHostTest, TestProcessCancel) {
// Tests whether the correct requests get canceled when a RenderViewHost is
// deleted.
TEST_F(ResourceDispatcherHostTest, CancelRequestsOnRenderFrameDeleted) {
TEST_P(ResourceDispatcherHostTest, CancelRequestsOnRenderFrameDeleted) {
network::mojom::URLLoaderPtr loader1, loader2, loader3, loader4, loader5;
network::TestURLLoaderClient client1, client2, client3, client4, client5;
// Requests all hang once started. This prevents requests from being
......@@ -1530,7 +1545,7 @@ TEST_F(ResourceDispatcherHostTest, CancelRequestsOnRenderFrameDeleted) {
EXPECT_EQ(4, network_delegate_.canceled_requests());
}
TEST_F(ResourceDispatcherHostTest, TestProcessCancelDetachedTimesOut) {
TEST_P(ResourceDispatcherHostTest, TestProcessCancelDetachedTimesOut) {
network::mojom::URLLoaderPtr loader;
network::TestURLLoaderClient client;
MakeTestRequestWithResourceType(
......@@ -1576,7 +1591,7 @@ TEST_F(ResourceDispatcherHostTest, TestProcessCancelDetachedTimesOut) {
}
// Tests blocking and resuming requests.
TEST_F(ResourceDispatcherHostTest, TestBlockingResumingRequests) {
TEST_P(ResourceDispatcherHostTest, TestBlockingResumingRequests) {
network::mojom::URLLoaderPtr loader1, loader2, loader3, loader4, loader5,
loader6, loader7;
network::TestURLLoaderClient client1, client2, client3, client4, client5,
......@@ -1656,7 +1671,7 @@ TEST_F(ResourceDispatcherHostTest, TestBlockingResumingRequests) {
}
// Tests blocking and canceling requests.
TEST_F(ResourceDispatcherHostTest, TestBlockingCancelingRequests) {
TEST_P(ResourceDispatcherHostTest, TestBlockingCancelingRequests) {
network::mojom::URLLoaderPtr loader1, loader2, loader3, loader4, loader5;
network::TestURLLoaderClient client1, client2, client3, client4, client5;
......@@ -1690,9 +1705,9 @@ TEST_F(ResourceDispatcherHostTest, TestBlockingCancelingRequests) {
CheckSuccessfulRequest(&client1, net::URLRequestTestJob::test_data_1());
CheckSuccessfulRequest(&client3, net::URLRequestTestJob::test_data_3());
EXPECT_FALSE(client2.has_received_completion());
EXPECT_FALSE(client4.has_received_completion());
EXPECT_FALSE(client5.has_received_completion());
EXPECT_FALSE(IsAborted(client2));
EXPECT_FALSE(IsAborted(client4));
EXPECT_FALSE(IsAborted(client5));
// Cancel requests for RFH 11.
host_.CancelBlockedRequestsForRoute(
......@@ -1700,13 +1715,13 @@ TEST_F(ResourceDispatcherHostTest, TestBlockingCancelingRequests) {
content::RunAllTasksUntilIdle();
while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
EXPECT_FALSE(client2.has_received_completion());
EXPECT_FALSE(client4.has_received_completion());
EXPECT_FALSE(client5.has_received_completion());
EXPECT_TRUE(IsAborted(client2));
EXPECT_TRUE(IsAborted(client4));
EXPECT_TRUE(IsAborted(client5));
}
// Tests that blocked requests are canceled if their associated process dies.
TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsProcessDies) {
TEST_P(ResourceDispatcherHostTest, TestBlockedRequestsProcessDies) {
network::mojom::URLLoaderPtr loader1, loader2, loader3, loader4, loader5;
network::TestURLLoaderClient client1, client2, client3, client4, client5;
// This second filter is used to emulate a second process.
......@@ -1745,9 +1760,9 @@ TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsProcessDies) {
CheckSuccessfulRequest(&client1, net::URLRequestTestJob::test_data_1());
CheckSuccessfulRequest(&client3, net::URLRequestTestJob::test_data_3());
EXPECT_FALSE(client2.has_received_completion());
EXPECT_FALSE(client4.has_received_completion());
EXPECT_FALSE(client5.has_received_completion());
EXPECT_TRUE(IsAborted(client2));
EXPECT_TRUE(IsAborted(client4));
EXPECT_TRUE(IsAborted(client5));
EXPECT_TRUE(host_.blocked_loaders_map_.empty());
second_filter->OnChannelClosing();
......@@ -1757,7 +1772,7 @@ TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsProcessDies) {
// away. Note that we rely on Purify for finding the leaks if any.
// If this test turns the Purify bot red, check the ResourceDispatcherHost
// destructor to make sure the blocked requests are deleted.
TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsDontLeak) {
TEST_P(ResourceDispatcherHostTest, TestBlockedRequestsDontLeak) {
network::mojom::URLLoaderPtr loader1, loader2, loader3, loader4, loader5,
loader6, loader7, loader8;
network::TestURLLoaderClient client1, client2, client3, client4, client5,
......@@ -1814,7 +1829,7 @@ TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsDontLeak) {
}
// Test the private helper method "CalculateApproximateMemoryCost()".
TEST_F(ResourceDispatcherHostTest, CalculateApproximateMemoryCost) {
TEST_P(ResourceDispatcherHostTest, CalculateApproximateMemoryCost) {
net::URLRequestContext context;
std::unique_ptr<net::URLRequest> req(context.CreateRequest(
GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr,
......@@ -1844,7 +1859,7 @@ TEST_F(ResourceDispatcherHostTest, CalculateApproximateMemoryCost) {
// Test that too much memory for outstanding requests for a particular
// render_process_host_id causes requests to fail.
TEST_F(ResourceDispatcherHostTest, TooMuchOutstandingRequestsMemory) {
TEST_P(ResourceDispatcherHostTest, TooMuchOutstandingRequestsMemory) {
// Expected cost of each request as measured by
// ResourceDispatcherHost::CalculateApproximateMemoryCost().
const int kMemoryCostOfTest2Req =
......@@ -1928,7 +1943,7 @@ TEST_F(ResourceDispatcherHostTest, TooMuchOutstandingRequestsMemory) {
// Test that when too many requests are outstanding for a particular
// render_process_host_id, any subsequent request from it fails. Also verify
// that the global limit is honored.
TEST_F(ResourceDispatcherHostTest, TooManyOutstandingRequests) {
TEST_P(ResourceDispatcherHostTest, TooManyOutstandingRequests) {
// Tighten the bound on the ResourceDispatcherHost, to speed things up.
constexpr size_t kMaxRequestsPerProcess = 2;
host_.set_max_num_in_flight_requests_per_process(kMaxRequestsPerProcess);
......@@ -1996,7 +2011,7 @@ TEST_F(ResourceDispatcherHostTest, TooManyOutstandingRequests) {
}
// Tests that we sniff the mime type for a simple request.
TEST_F(ResourceDispatcherHostTest, MimeSniffed) {
TEST_P(ResourceDispatcherHostTest, MimeSniffed) {
network::mojom::URLLoaderPtr loader;
network::TestURLLoaderClient client;
std::string raw_headers("HTTP/1.1 200 OK\n\n");
......@@ -2017,7 +2032,7 @@ TEST_F(ResourceDispatcherHostTest, MimeSniffed) {
}
// Tests that we don't sniff the mime type when the server provides one.
TEST_F(ResourceDispatcherHostTest, MimeNotSniffed) {
TEST_P(ResourceDispatcherHostTest, MimeNotSniffed) {
network::mojom::URLLoaderPtr loader;
network::TestURLLoaderClient client;
std::string raw_headers("HTTP/1.1 200 OK\n"
......@@ -2039,7 +2054,7 @@ TEST_F(ResourceDispatcherHostTest, MimeNotSniffed) {
}
// Tests that we don't sniff the mime type when there is no message body.
TEST_F(ResourceDispatcherHostTest, MimeNotSniffed2) {
TEST_P(ResourceDispatcherHostTest, MimeNotSniffed2) {
network::mojom::URLLoaderPtr loader;
network::TestURLLoaderClient client;
SetResponse("HTTP/1.1 304 Not Modified\n\n");
......@@ -2056,7 +2071,7 @@ TEST_F(ResourceDispatcherHostTest, MimeNotSniffed2) {
EXPECT_EQ("", client.response_head().mime_type);
}
TEST_F(ResourceDispatcherHostTest, MimeSniff204) {
TEST_P(ResourceDispatcherHostTest, MimeSniff204) {
network::mojom::URLLoaderPtr loader;
network::TestURLLoaderClient client;
SetResponse("HTTP/1.1 204 No Content\n\n");
......@@ -2073,7 +2088,7 @@ TEST_F(ResourceDispatcherHostTest, MimeSniff204) {
EXPECT_EQ("text/plain", client.response_head().mime_type);
}
TEST_F(ResourceDispatcherHostTest, MimeSniffEmpty) {
TEST_P(ResourceDispatcherHostTest, MimeSniffEmpty) {
network::mojom::URLLoaderPtr loader;
network::TestURLLoaderClient client;
SetResponse("HTTP/1.1 200 OK\n\n");
......@@ -2091,7 +2106,7 @@ TEST_F(ResourceDispatcherHostTest, MimeSniffEmpty) {
}
// Tests for crbug.com/31266 (Non-2xx + application/octet-stream).
TEST_F(ResourceDispatcherHostTest, ForbiddenDownload) {
TEST_P(ResourceDispatcherHostTest, ForbiddenDownload) {
std::string raw_headers("HTTP/1.1 403 Forbidden\n"
"Content-disposition: attachment; filename=blah\n"
"Content-type: application/octet-stream\n\n");
......@@ -2107,7 +2122,7 @@ TEST_F(ResourceDispatcherHostTest, ForbiddenDownload) {
expected_error_code);
}
TEST_F(ResourceDispatcherHostTest, CancelRequestsForContextDetached) {
TEST_P(ResourceDispatcherHostTest, CancelRequestsForContextDetached) {
EXPECT_EQ(0, host_.pending_requests());
network::mojom::URLLoaderPtr loader;
network::TestURLLoaderClient client;
......@@ -2164,7 +2179,7 @@ class ExternalProtocolBrowserClient : public TestContentBrowserClient {
// Verifies that if the embedder says that it didn't handle an unkonown protocol
// the request is cancelled and net::ERR_ABORTED is returned. Otherwise it is
// not aborted and net/ layer cancels it with net::ERR_UNKNOWN_URL_SCHEME.
TEST_F(ResourceDispatcherHostTest, UnknownURLScheme) {
TEST_P(ResourceDispatcherHostTest, UnknownURLScheme) {
EXPECT_EQ(0, host_.pending_requests());
HandleScheme("http");
......@@ -2183,7 +2198,7 @@ TEST_F(ResourceDispatcherHostTest, UnknownURLScheme) {
// Request a very large detachable resource and cancel part way. Some of the
// data should have been sent to the renderer, but not all.
TEST_F(ResourceDispatcherHostTest, DataSentBeforeDetach) {
TEST_P(ResourceDispatcherHostTest, DataSentBeforeDetach) {
EXPECT_EQ(0, host_.pending_requests());
constexpr int render_view_id = 0;
......@@ -2232,7 +2247,7 @@ WebContents* WebContentsBinder(WebContents* rv) { return rv; }
// Tests GetLoadInfoForAllRoutes when there are 3 requests from the same
// RenderView. The second one is farthest along.
TEST_F(ResourceDispatcherHostTest, LoadInfo) {
TEST_P(ResourceDispatcherHostTest, LoadInfo) {
std::unique_ptr<LoadInfoList> infos(new LoadInfoList);
LoadInfo info;
WebContents* wc1 = reinterpret_cast<WebContents*>(0x1);
......@@ -2265,7 +2280,7 @@ TEST_F(ResourceDispatcherHostTest, LoadInfo) {
// Tests GetLoadInfoForAllRoutes when there are 2 requests with the same
// priority. The first one (Which will have the lowest ID) should be returned.
TEST_F(ResourceDispatcherHostTest, LoadInfoSamePriority) {
TEST_P(ResourceDispatcherHostTest, LoadInfoSamePriority) {
std::unique_ptr<LoadInfoList> infos(new LoadInfoList);
LoadInfo info;
WebContents* wc1 = reinterpret_cast<WebContents*>(0x1);
......@@ -2292,7 +2307,7 @@ TEST_F(ResourceDispatcherHostTest, LoadInfoSamePriority) {
}
// Tests GetLoadInfoForAllRoutes when a request is uploading a body.
TEST_F(ResourceDispatcherHostTest, LoadInfoUploadProgress) {
TEST_P(ResourceDispatcherHostTest, LoadInfoUploadProgress) {
std::unique_ptr<LoadInfoList> infos(new LoadInfoList);
LoadInfo info;
WebContents* wc1 = reinterpret_cast<WebContents*>(0x1);
......@@ -2342,7 +2357,7 @@ TEST_F(ResourceDispatcherHostTest, LoadInfoUploadProgress) {
// Tests GetLoadInfoForAllRoutes when there are 4 requests from 2 different
// RenderViews. Also tests the case where the first / last requests are the
// most interesting ones.
TEST_F(ResourceDispatcherHostTest, LoadInfoTwoRenderViews) {
TEST_P(ResourceDispatcherHostTest, LoadInfoTwoRenderViews) {
std::unique_ptr<LoadInfoList> infos(new LoadInfoList);
LoadInfo info;
WebContents* wc1 = reinterpret_cast<WebContents*>(0x1);
......@@ -2393,7 +2408,7 @@ TEST_F(ResourceDispatcherHostTest, LoadInfoTwoRenderViews) {
// Tests that a ResourceThrottle that needs to process the response before any
// part of the body is read can do so.
TEST_F(ResourceDispatcherHostTest, ThrottleMustProcessResponseBeforeRead) {
TEST_P(ResourceDispatcherHostTest, ThrottleMustProcessResponseBeforeRead) {
// Ensure all jobs will check that no read operation is called.
job_factory_->SetMustNotReadJobGeneration(true);
HandleScheme("http");
......@@ -2509,4 +2524,19 @@ net::URLRequestJob* TestURLRequestJobFactory::MaybeInterceptResponse(
return nullptr;
}
INSTANTIATE_TEST_CASE_P(
OutOfBlinkCorsWithServicification,
ResourceDispatcherHostTest,
::testing::Values(TestMode::kOutOfBlinkCorsWithServicification));
INSTANTIATE_TEST_CASE_P(
OutOfBlinkCorsWithoutServicification,
ResourceDispatcherHostTest,
::testing::Values(TestMode::kOutOfBlinkCorsWithoutServicification));
INSTANTIATE_TEST_CASE_P(
WithoutOutOfBlinkCorsAndServicification,
ResourceDispatcherHostTest,
::testing::Values(TestMode::kWithoutOutOfBlinkCorsAndServicification));
} // namespace content
......@@ -75,7 +75,11 @@ CORSURLLoader::CORSURLLoader(
SetCORSFlagIfNeeded();
}
CORSURLLoader::~CORSURLLoader() = default;
CORSURLLoader::~CORSURLLoader() {
// Close pipes first to ignore possible subsequent callback invocations
// cased by |network_loader_|
network_client_binding_.Close();
}
void CORSURLLoader::Start() {
if (fetch_cors_flag_ &&
......@@ -417,19 +421,12 @@ void CORSURLLoader::StartNetworkRequest(
void CORSURLLoader::HandleComplete(const URLLoaderCompletionStatus& status) {
forwarding_client_->OnComplete(status);
// Close pipes to ignore possible subsequent callback invocations.
network_client_binding_.Close();
forwarding_client_.reset();
network_loader_.reset();
std::move(delete_callback_).Run(this);
// |this| is deleted here.
}
void CORSURLLoader::OnConnectionError() {
HandleComplete(URLLoaderCompletionStatus(net::ERR_FAILED));
HandleComplete(URLLoaderCompletionStatus(net::ERR_ABORTED));
}
// This should be identical to CalculateCORSFlag defined in
......
......@@ -54,6 +54,9 @@ class TestURLLoaderClient final : public mojom::URLLoaderClient {
return has_received_cached_metadata_;
}
bool has_received_completion() const { return has_received_completion_; }
bool has_received_connection_error() const {
return has_received_connection_error_;
}
const ResourceResponseHead& response_head() const { return response_head_; }
const base::Optional<net::SSLInfo>& ssl_info() const {
return response_head_.ssl_info;
......
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