Index: content/network/url_loader_unittest.cc |
diff --git a/content/network/url_loader_unittest.cc b/content/network/url_loader_unittest.cc |
index b2021eb0e58547c50756b8f3732f031417fc469c..0612ee3dec792cc83387523318b440a24f60a885 100644 |
--- a/content/network/url_loader_unittest.cc |
+++ b/content/network/url_loader_unittest.cc |
@@ -70,7 +70,7 @@ class URLLoaderImplTest : public testing::Test { |
~URLLoaderImplTest() override {} |
void SetUp() override { |
- test_server_.ServeFilesFromSourceDirectory( |
+ test_server_.AddDefaultHandlers( |
base::FilePath(FILE_PATH_LITERAL("content/test/data"))); |
ASSERT_TRUE(test_server_.Start()); |
} |
@@ -112,6 +112,7 @@ class URLLoaderImplTest : public testing::Test { |
net::EmbeddedTestServer* test_server() { return &test_server_; } |
NetworkContext* context() { return context_.get(); } |
+ void DestroyContext() { context_.reset(); } |
private: |
base::MessageLoopForIO message_loop_; |
@@ -155,4 +156,36 @@ TEST_F(URLLoaderImplTest, SSLSentOnlyWhenRequested) { |
ASSERT_FALSE(!!client.ssl_info()); |
} |
+TEST_F(URLLoaderImplTest, DestroyContextWithLiveRequest) { |
+ TestURLLoaderClient client; |
+ GURL url = test_server()->GetURL("/hung-after-headers"); |
+ ResourceRequest request = |
+ CreateResourceRequest("GET", RESOURCE_TYPE_MAIN_FRAME, url); |
+ |
+ mojom::URLLoaderAssociatedPtr loader; |
+ // The loader is implicitly owned by the client and the NetworkContext, so |
+ // don't hold on to a pointer to it. |
+ base::WeakPtr<URLLoaderImpl> loader_impl = |
+ (new URLLoaderImpl(context(), mojo::MakeIsolatedRequest(&loader), 0, |
+ request, client.CreateInterfacePtr(), |
+ TRAFFIC_ANNOTATION_FOR_TESTS)) |
+ ->GetWeakPtrForTests(); |
+ |
+ client.RunUntilResponseReceived(); |
+ EXPECT_TRUE(client.has_received_response()); |
+ EXPECT_FALSE(client.has_received_completion()); |
+ |
+ // Request hasn't completed, so the loader should not have been destroyed. |
+ EXPECT_TRUE(loader_impl); |
+ |
+ // Destroying the context should result in destroying the loader and the |
+ // client receiving a connection error. |
+ DestroyContext(); |
+ EXPECT_FALSE(loader_impl); |
+ |
+ client.RunUntilConnectionError(); |
+ EXPECT_FALSE(client.has_received_completion()); |
+ EXPECT_EQ(0u, client.download_data_length()); |
+} |
+ |
} // namespace content |