summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/renderer/extensions/extension_localization_peer.cc33
-rw-r--r--chrome/renderer/extensions/extension_localization_peer.h8
-rw-r--r--chrome/renderer/extensions/extension_localization_peer_unittest.cc79
-rw-r--r--chrome/renderer/security_filter_peer.cc65
-rw-r--r--chrome/renderer/security_filter_peer.h17
-rw-r--r--content/child/resource_dispatcher_unittest.cc180
-rw-r--r--content/child/web_url_loader_impl.cc51
-rw-r--r--content/child/web_url_loader_impl_unittest.cc24
-rw-r--r--content/public/child/request_peer.h20
9 files changed, 223 insertions, 254 deletions
diff --git a/chrome/renderer/extensions/extension_localization_peer.cc b/chrome/renderer/extensions/extension_localization_peer.cc
index cafbf58..779fcba 100644
--- a/chrome/renderer/extensions/extension_localization_peer.cc
+++ b/chrome/renderer/extensions/extension_localization_peer.cc
@@ -95,34 +95,21 @@ void ExtensionLocalizationPeer::OnCompletedRequest(
// Give sub-classes a chance at altering the data.
if (error_code != net::OK) {
// We failed to load the resource.
- original_peer_->OnReceivedCompletedResponse(
- response_info_, nullptr, net::ERR_ABORTED, false, stale_copy_in_cache,
- security_info, completion_time, total_transfer_size);
+ original_peer_->OnReceivedResponse(response_info_);
+ original_peer_->OnCompletedRequest(net::ERR_ABORTED, false,
+ stale_copy_in_cache, security_info,
+ completion_time, total_transfer_size);
return;
}
ReplaceMessages();
- scoped_ptr<StringData> data_to_pass(data_.empty() ? nullptr
- : new StringData(data_));
- original_peer_->OnReceivedCompletedResponse(
- response_info_, std::move(data_to_pass), error_code,
- was_ignored_by_handler, stale_copy_in_cache, security_info,
- completion_time, total_transfer_size);
-}
-
-void ExtensionLocalizationPeer::OnReceivedCompletedResponse(
- const content::ResourceResponseInfo& info,
- scoped_ptr<ReceivedData> data,
- int error_code,
- bool was_ignored_by_handler,
- bool stale_copy_in_cache,
- const std::string& security_info,
- const base::TimeTicks& completion_time,
- int64_t total_transfer_size) {
- original_peer_->OnReceivedCompletedResponse(
- info, std::move(data), error_code, was_ignored_by_handler,
- stale_copy_in_cache, security_info, completion_time, total_transfer_size);
+ original_peer_->OnReceivedResponse(response_info_);
+ if (!data_.empty())
+ original_peer_->OnReceivedData(make_scoped_ptr(new StringData(data_)));
+ original_peer_->OnCompletedRequest(error_code, was_ignored_by_handler,
+ stale_copy_in_cache, security_info,
+ completion_time, total_transfer_size);
}
void ExtensionLocalizationPeer::ReplaceMessages() {
diff --git a/chrome/renderer/extensions/extension_localization_peer.h b/chrome/renderer/extensions/extension_localization_peer.h
index e45413e..5ac7f7e 100644
--- a/chrome/renderer/extensions/extension_localization_peer.h
+++ b/chrome/renderer/extensions/extension_localization_peer.h
@@ -47,14 +47,6 @@ class ExtensionLocalizationPeer : public content::RequestPeer {
const std::string& security_info,
const base::TimeTicks& completion_time,
int64_t total_transfer_size) override;
- void OnReceivedCompletedResponse(const content::ResourceResponseInfo& info,
- scoped_ptr<ReceivedData> data,
- int error_code,
- bool was_ignored_by_handler,
- bool stale_copy_in_cache,
- const std::string& security_info,
- const base::TimeTicks& completion_time,
- int64_t total_transfer_size) override;
private:
friend class ExtensionLocalizationPeerTest;
diff --git a/chrome/renderer/extensions/extension_localization_peer_unittest.cc b/chrome/renderer/extensions/extension_localization_peer_unittest.cc
index 67b1104..f0587a0 100644
--- a/chrome/renderer/extensions/extension_localization_peer_unittest.cc
+++ b/chrome/renderer/extensions/extension_localization_peer_unittest.cc
@@ -83,37 +83,6 @@ class MockRequestPeer : public content::RequestPeer {
const std::string& security_info,
const base::TimeTicks& completion_time,
int64_t total_transfer_size));
- void OnReceivedCompletedResponse(const content::ResourceResponseInfo& info,
- scoped_ptr<RequestPeer::ReceivedData> data,
- int error_code,
- bool was_ignored_by_handler,
- bool stale_copy_in_cache,
- const std::string& security_info,
- const base::TimeTicks& completion_time,
- int64_t total_transfer_size) override {
- if (data) {
- OnReceivedCompletedResponseInternal(
- info, data->payload(), data->length(), data->encoded_length(),
- error_code, was_ignored_by_handler, stale_copy_in_cache,
- security_info, completion_time, total_transfer_size);
- } else {
- OnReceivedCompletedResponseInternal(info, nullptr, 0, 0, error_code,
- was_ignored_by_handler,
- stale_copy_in_cache, security_info,
- completion_time, total_transfer_size);
- }
- }
- MOCK_METHOD10(OnReceivedCompletedResponseInternal,
- void(const content::ResourceResponseInfo& info,
- const char* data,
- int data_length,
- int encoded_data_length,
- int error_code,
- bool was_ignored_by_handler,
- bool stale_copy_in_cache,
- const std::string& security_info,
- const base::TimeTicks& completion_time,
- int64_t total_transfer_size));
private:
DISALLOW_COPY_AND_ASSIGN(MockRequestPeer);
@@ -181,9 +150,10 @@ MATCHER_P(IsURLRequestEqual, status, "") { return arg.status() == status; }
TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestBadURLRequestStatus) {
SetUpExtensionLocalizationPeer("text/css", GURL(kExtensionUrl_1));
- EXPECT_CALL(*original_peer_, OnReceivedCompletedResponseInternal(
- _, nullptr, 0, 0, net::ERR_ABORTED, false,
- false, "", base::TimeTicks(), -1));
+ EXPECT_CALL(*original_peer_, OnReceivedResponse(_));
+ EXPECT_CALL(*original_peer_,
+ OnCompletedRequest(net::ERR_ABORTED, false, false, "",
+ base::TimeTicks(), -1));
filter_peer_->OnCompletedRequest(net::ERR_FAILED, false, false, std::string(),
base::TimeTicks(), -1);
@@ -195,9 +165,9 @@ TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestEmptyData) {
EXPECT_CALL(*original_peer_, OnReceivedDataInternal(_, _, _)).Times(0);
EXPECT_CALL(*sender_, Send(_)).Times(0);
- EXPECT_CALL(*original_peer_, OnReceivedCompletedResponseInternal(
- _, nullptr, 0, 0, net::OK, false, false, "",
- base::TimeTicks(), -1));
+ EXPECT_CALL(*original_peer_, OnReceivedResponse(_));
+ EXPECT_CALL(*original_peer_, OnCompletedRequest(net::OK, false, false, "",
+ base::TimeTicks(), -1));
filter_peer_->OnCompletedRequest(net::OK, false, false, std::string(),
base::TimeTicks(), -1);
@@ -211,10 +181,12 @@ TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestNoCatalogs) {
EXPECT_CALL(*sender_, Send(_));
std::string data = GetData();
+ EXPECT_CALL(*original_peer_, OnReceivedResponse(_)).Times(1);
EXPECT_CALL(*original_peer_,
- OnReceivedCompletedResponseInternal(
- _, StrEq(data.c_str()), data.size(), -1, net::OK, false,
- false, "", base::TimeTicks(), -1))
+ OnReceivedDataInternal(StrEq(data.c_str()), data.length(), -1))
+ .Times(1);
+ EXPECT_CALL(*original_peer_, OnCompletedRequest(net::OK, false, false, "",
+ base::TimeTicks(), -1))
.Times(1);
filter_peer_->OnCompletedRequest(net::OK, false, false, std::string(),
@@ -223,10 +195,12 @@ TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestNoCatalogs) {
// Test if Send gets called again (it shouldn't be) when first call returned
// an empty dictionary.
SetUpExtensionLocalizationPeer("text/css", GURL(kExtensionUrl_1));
+ EXPECT_CALL(*original_peer_, OnReceivedResponse(_)).Times(1);
EXPECT_CALL(*original_peer_,
- OnReceivedCompletedResponseInternal(
- _, StrEq(data.c_str()), data.size(), -1, net::OK, false,
- false, "", base::TimeTicks(), -1))
+ OnReceivedDataInternal(StrEq(data.c_str()), data.length(), -1))
+ .Times(1);
+ EXPECT_CALL(*original_peer_, OnCompletedRequest(net::OK, false, false, "",
+ base::TimeTicks(), -1))
.Times(1);
SetData("some text");
filter_peer_->OnCompletedRequest(net::OK, false, false, std::string(),
@@ -249,10 +223,12 @@ TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestWithCatalogs) {
// __MSG_text__ gets replaced with "new text".
std::string data("some new text");
+ EXPECT_CALL(*original_peer_, OnReceivedResponse(_));
EXPECT_CALL(*original_peer_,
- OnReceivedCompletedResponseInternal(
- _, StrEq(data.c_str()), data.size(), -1, net::OK, false,
- false, std::string(), base::TimeTicks(), -1));
+ OnReceivedDataInternal(StrEq(data.c_str()), data.length(), -1));
+
+ EXPECT_CALL(*original_peer_, OnCompletedRequest(net::OK, false, false, "",
+ base::TimeTicks(), -1));
filter_peer_->OnCompletedRequest(net::OK, false, false, std::string(),
base::TimeTicks(), -1);
@@ -273,10 +249,13 @@ TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestReplaceMessagesFails) {
// We already have messages in memory, Send will be skipped.
EXPECT_CALL(*sender_, Send(_)).Times(0);
- EXPECT_CALL(*original_peer_,
- OnReceivedCompletedResponseInternal(
- _, StrEq(message.c_str()), message.size(), -1, net::OK, false,
- false, "", base::TimeTicks(), -1));
+ // __MSG_missing_message__ is missing, so message stays the same.
+ EXPECT_CALL(*original_peer_, OnReceivedResponse(_));
+ EXPECT_CALL(*original_peer_, OnReceivedDataInternal(StrEq(message.c_str()),
+ message.length(), -1));
+
+ EXPECT_CALL(*original_peer_, OnCompletedRequest(net::OK, false, false, "",
+ base::TimeTicks(), -1));
filter_peer_->OnCompletedRequest(net::OK, false, false, std::string(),
base::TimeTicks(), -1);
diff --git a/chrome/renderer/security_filter_peer.cc b/chrome/renderer/security_filter_peer.cc
index 8a5b3d8..a161dcb 100644
--- a/chrome/renderer/security_filter_peer.cc
+++ b/chrome/renderer/security_filter_peer.cc
@@ -137,33 +137,21 @@ void BufferedPeer::OnCompletedRequest(int error_code,
// Give sub-classes a chance at altering the data.
if (error_code != net::OK || !DataReady()) {
// Pretend we failed to load the resource.
- original_peer_->OnReceivedCompletedResponse(
- response_info_, nullptr, net::ERR_ABORTED, false, stale_copy_in_cache,
- security_info, completion_time, total_transfer_size);
+ original_peer_->OnReceivedResponse(response_info_);
+ original_peer_->OnCompletedRequest(net::ERR_ABORTED, false,
+ stale_copy_in_cache, security_info,
+ completion_time, total_transfer_size);
return;
}
- scoped_ptr<content::FixedReceivedData> data_to_pass(
- data_.empty() ? nullptr : new content::FixedReceivedData(
- data_.data(), data_.size(), -1));
- original_peer_->OnReceivedCompletedResponse(
- response_info_, std::move(data_to_pass), error_code,
- was_ignored_by_handler, stale_copy_in_cache, security_info,
- completion_time, total_transfer_size);
-}
-
-void BufferedPeer::OnReceivedCompletedResponse(
- const content::ResourceResponseInfo& info,
- scoped_ptr<ReceivedData> data,
- int error_code,
- bool was_ignored_by_handler,
- bool stale_copy_in_cache,
- const std::string& security_info,
- const base::TimeTicks& completion_time,
- int64_t total_transfer_size) {
- original_peer_->OnReceivedCompletedResponse(
- info, std::move(data), error_code, was_ignored_by_handler,
- stale_copy_in_cache, security_info, completion_time, total_transfer_size);
+ original_peer_->OnReceivedResponse(response_info_);
+ if (!data_.empty()) {
+ original_peer_->OnReceivedData(make_scoped_ptr(
+ new content::FixedReceivedData(data_.data(), data_.size(), -1)));
+ }
+ original_peer_->OnCompletedRequest(error_code, was_ignored_by_handler,
+ stale_copy_in_cache, security_info,
+ completion_time, total_transfer_size);
}
////////////////////////////////////////////////////////////////////////////////
@@ -197,25 +185,12 @@ void ReplaceContentPeer::OnCompletedRequest(
ProcessResponseInfo(info, &info, mime_type_);
info.security_info = security_info;
info.content_length = static_cast<int>(data_.size());
-
- scoped_ptr<content::FixedReceivedData> data_to_pass(
- data_.empty() ? nullptr : new content::FixedReceivedData(
- data_.data(), data_.size(), -1));
- original_peer_->OnReceivedCompletedResponse(
- response_info_, std::move(data_to_pass), net::OK, false,
- stale_copy_in_cache, security_info, completion_time, total_transfer_size);
-}
-
-void ReplaceContentPeer::OnReceivedCompletedResponse(
- const content::ResourceResponseInfo& info,
- scoped_ptr<ReceivedData> data,
- int error_code,
- bool was_ignored_by_handler,
- bool stale_copy_in_cache,
- const std::string& security_info,
- const base::TimeTicks& completion_time,
- int64_t total_transfer_size) {
- original_peer_->OnReceivedCompletedResponse(
- info, std::move(data), error_code, was_ignored_by_handler,
- stale_copy_in_cache, security_info, completion_time, total_transfer_size);
+ original_peer_->OnReceivedResponse(info);
+ if (!data_.empty()) {
+ original_peer_->OnReceivedData(make_scoped_ptr(
+ new content::FixedReceivedData(data_.data(), data_.size(), -1)));
+ }
+ original_peer_->OnCompletedRequest(net::OK, false, stale_copy_in_cache,
+ security_info, completion_time,
+ total_transfer_size);
}
diff --git a/chrome/renderer/security_filter_peer.h b/chrome/renderer/security_filter_peer.h
index e566b94..5eaacaf9 100644
--- a/chrome/renderer/security_filter_peer.h
+++ b/chrome/renderer/security_filter_peer.h
@@ -39,6 +39,7 @@ class SecurityFilterPeer : public content::RequestPeer {
bool OnReceivedRedirect(const net::RedirectInfo& redirect_info,
const content::ResourceResponseInfo& info) override;
void OnDownloadedData(int len, int encoded_data_length) override {}
+
protected:
explicit SecurityFilterPeer(scoped_ptr<content::RequestPeer> peer);
@@ -65,14 +66,6 @@ class BufferedPeer : public SecurityFilterPeer {
const std::string& security_info,
const base::TimeTicks& completion_time,
int64_t total_transfer_size) override;
- void OnReceivedCompletedResponse(const content::ResourceResponseInfo& info,
- scoped_ptr<ReceivedData> data,
- int error_code,
- bool was_ignored_by_handler,
- bool stale_copy_in_cache,
- const std::string& security_info,
- const base::TimeTicks& completion_time,
- int64_t total_transfer_size) override;
protected:
// Invoked when the entire request has been processed before the data is sent
@@ -112,14 +105,6 @@ class ReplaceContentPeer : public SecurityFilterPeer {
const std::string& security_info,
const base::TimeTicks& completion_time,
int64_t total_transfer_size) override;
- void OnReceivedCompletedResponse(const content::ResourceResponseInfo& info,
- scoped_ptr<ReceivedData> data,
- int error_code,
- bool was_ignored_by_handler,
- bool stale_copy_in_cache,
- const std::string& security_info,
- const base::TimeTicks& completion_time,
- int64_t total_transfer_size) override;
private:
content::ResourceResponseInfo response_info_;
diff --git a/content/child/resource_dispatcher_unittest.cc b/content/child/resource_dispatcher_unittest.cc
index c026295..c599773 100644
--- a/content/child/resource_dispatcher_unittest.cc
+++ b/content/child/resource_dispatcher_unittest.cc
@@ -22,7 +22,9 @@
#include "content/common/appcache_interfaces.h"
#include "content/common/resource_messages.h"
#include "content/common/service_worker/service_worker_types.h"
+#include "content/public/child/fixed_received_data.h"
#include "content/public/child/request_peer.h"
+#include "content/public/child/resource_dispatcher_delegate.h"
#include "content/public/common/resource_response.h"
#include "net/base/net_errors.h"
#include "net/http/http_response_headers.h"
@@ -52,6 +54,7 @@ class TestRequestPeer : public RequestPeer {
bool OnReceivedRedirect(const net::RedirectInfo& redirect_info,
const ResourceResponseInfo& info) override {
+ EXPECT_FALSE(context_->cancelled);
++context_->seen_redirects;
if (context_->defer_on_redirect)
dispatcher_->SetDefersLoading(context_->request_id, true);
@@ -59,18 +62,24 @@ class TestRequestPeer : public RequestPeer {
}
void OnReceivedResponse(const ResourceResponseInfo& info) override {
+ EXPECT_FALSE(context_->cancelled);
EXPECT_FALSE(context_->received_response);
context_->received_response = true;
- if (context_->cancel_on_receive_response)
+ if (context_->cancel_on_receive_response) {
dispatcher_->Cancel(context_->request_id);
+ context_->cancelled = true;
+ }
}
void OnDownloadedData(int len, int encoded_data_length) override {
+ EXPECT_FALSE(context_->cancelled);
context_->total_downloaded_data_length += len;
context_->total_encoded_data_length += encoded_data_length;
}
void OnReceivedData(scoped_ptr<ReceivedData> data) override {
+ if (context_->cancelled)
+ return;
EXPECT_TRUE(context_->received_response);
EXPECT_FALSE(context_->complete);
context_->data.append(data->payload(), data->length());
@@ -83,28 +92,13 @@ class TestRequestPeer : public RequestPeer {
const std::string& security_info,
const base::TimeTicks& completion_time,
int64_t total_transfer_size) override {
+ if (context_->cancelled)
+ return;
EXPECT_TRUE(context_->received_response);
EXPECT_FALSE(context_->complete);
context_->complete = true;
}
- void OnReceivedCompletedResponse(const ResourceResponseInfo& info,
- scoped_ptr<ReceivedData> data,
- int error_code,
- bool was_ignored_by_handler,
- bool stale_copy_in_cache,
- const std::string& security_info,
- const base::TimeTicks& completion_time,
- int64_t total_transfer_size) override {
- OnReceivedResponse(info);
- if (context_->cancel_on_receive_response)
- return;
- if (data)
- OnReceivedData(std::move(data));
- OnCompletedRequest(error_code, was_ignored_by_handler, stale_copy_in_cache,
- security_info, completion_time, total_transfer_size);
- }
-
struct Context {
// True if should follow redirects, false if should cancel them.
bool follow_redirects = true;
@@ -127,6 +121,7 @@ class TestRequestPeer : public RequestPeer {
int total_downloaded_data_length = 0;
bool complete = false;
+ bool cancelled = false;
int request_id = -1;
};
@@ -467,6 +462,155 @@ TEST_F(ResourceDispatcherTest, CancelDuringCallback) {
EXPECT_FALSE(peer_context.complete);
}
+class TestResourceDispatcherDelegate : public ResourceDispatcherDelegate {
+ public:
+ TestResourceDispatcherDelegate() {}
+ ~TestResourceDispatcherDelegate() override {}
+
+ scoped_ptr<RequestPeer> OnRequestComplete(
+ scoped_ptr<RequestPeer> current_peer,
+ ResourceType resource_type,
+ int error_code) override {
+ return current_peer;
+ }
+
+ scoped_ptr<RequestPeer> OnReceivedResponse(
+ scoped_ptr<RequestPeer> current_peer,
+ const std::string& mime_type,
+ const GURL& url) override {
+ return make_scoped_ptr(new WrapperPeer(std::move(current_peer)));
+ }
+
+ class WrapperPeer : public RequestPeer {
+ public:
+ explicit WrapperPeer(scoped_ptr<RequestPeer> original_peer)
+ : original_peer_(std::move(original_peer)) {}
+
+ void OnUploadProgress(uint64_t position, uint64_t size) override {}
+
+ bool OnReceivedRedirect(const net::RedirectInfo& redirect_info,
+ const ResourceResponseInfo& info) override {
+ return false;
+ }
+
+ void OnReceivedResponse(const ResourceResponseInfo& info) override {
+ response_info_ = info;
+ }
+
+ void OnDownloadedData(int len, int encoded_data_length) override {}
+
+ void OnReceivedData(scoped_ptr<ReceivedData> data) override {
+ data_.append(data->payload(), data->length());
+ }
+
+ void OnCompletedRequest(int error_code,
+ bool was_ignored_by_handler,
+ bool stale_copy_in_cache,
+ const std::string& security_info,
+ const base::TimeTicks& completion_time,
+ int64_t total_transfer_size) override {
+ original_peer_->OnReceivedResponse(response_info_);
+ if (!data_.empty()) {
+ original_peer_->OnReceivedData(make_scoped_ptr(
+ new FixedReceivedData(data_.data(), data_.size(), -1)));
+ }
+ original_peer_->OnCompletedRequest(error_code, was_ignored_by_handler,
+ stale_copy_in_cache, security_info,
+ completion_time, total_transfer_size);
+ }
+
+ private:
+ scoped_ptr<RequestPeer> original_peer_;
+ ResourceResponseInfo response_info_;
+ std::string data_;
+
+ DISALLOW_COPY_AND_ASSIGN(WrapperPeer);
+ };
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(TestResourceDispatcherDelegate);
+};
+
+TEST_F(ResourceDispatcherTest, DelegateTest) {
+ scoped_ptr<RequestInfo> request_info(CreateRequestInfo(false));
+ TestRequestPeer::Context peer_context;
+ StartAsync(*request_info.get(), nullptr, &peer_context);
+
+ // Set the delegate that inserts a new peer in OnReceivedResponse.
+ TestResourceDispatcherDelegate delegate;
+ dispatcher()->set_delegate(&delegate);
+
+ // Run a simple round-trip.
+ const size_t kFirstReceiveSize = 2;
+ ASSERT_LT(kFirstReceiveSize, strlen(kTestPageContents));
+
+ int id = ConsumeRequestResource();
+ EXPECT_EQ(0u, queued_messages());
+
+ // The wrapper eats all messages until RequestComplete message is sent.
+ NotifyReceivedResponse(id);
+ NotifySetDataBuffer(id, strlen(kTestPageContents));
+ NotifyDataReceived(id, std::string(kTestPageContents, kFirstReceiveSize));
+ ConsumeDataReceived_ACK(id);
+ NotifyDataReceived(id, kTestPageContents + kFirstReceiveSize);
+ ConsumeDataReceived_ACK(id);
+
+ EXPECT_FALSE(peer_context.received_response);
+ EXPECT_EQ(0u, queued_messages());
+
+ // This lets the wrapper peer pass all the messages to the original
+ // peer at once.
+ NotifyRequestComplete(id, strlen(kTestPageContents));
+
+ EXPECT_TRUE(peer_context.received_response);
+ EXPECT_EQ(kTestPageContents, peer_context.data);
+ EXPECT_TRUE(peer_context.complete);
+ EXPECT_EQ(0u, queued_messages());
+}
+
+TEST_F(ResourceDispatcherTest, CancelDuringCallbackWithWrapperPeer) {
+ scoped_ptr<RequestInfo> request_info(CreateRequestInfo(false));
+ TestRequestPeer::Context peer_context;
+ StartAsync(*request_info.get(), nullptr, &peer_context);
+ peer_context.cancel_on_receive_response = true;
+
+ // Set the delegate that inserts a new peer in OnReceivedResponse.
+ TestResourceDispatcherDelegate delegate;
+ dispatcher()->set_delegate(&delegate);
+
+ int id = ConsumeRequestResource();
+ EXPECT_EQ(0u, queued_messages());
+
+ // The wrapper eats all messages until RequestComplete message is sent.
+ NotifyReceivedResponse(id);
+ NotifySetDataBuffer(id, strlen(kTestPageContents));
+ NotifyDataReceived(id, kTestPageContents);
+ ConsumeDataReceived_ACK(id);
+
+ EXPECT_FALSE(peer_context.received_response);
+ EXPECT_EQ(0u, queued_messages());
+
+ // This lets the wrapper peer pass all the messages to the original
+ // peer at once, but the original peer cancels right after it receives
+ // the response. (This will remove pending request info from
+ // ResourceDispatcher while the wrapper peer is still running
+ // OnCompletedRequest, but it should not lead to crashes.)
+ NotifyRequestComplete(id, strlen(kTestPageContents));
+
+ EXPECT_TRUE(peer_context.received_response);
+ // Request should have been cancelled.
+ ConsumeCancelRequest(id);
+ EXPECT_TRUE(peer_context.cancelled);
+
+ // Any future messages related to the request should be ignored.
+ NotifyDataReceived(id, kTestPageContents);
+ NotifyRequestComplete(id, strlen(kTestPageContents));
+
+ EXPECT_EQ(0u, queued_messages());
+ EXPECT_EQ("", peer_context.data);
+ EXPECT_FALSE(peer_context.complete);
+}
+
// Checks that redirects work as expected.
TEST_F(ResourceDispatcherTest, Redirect) {
scoped_ptr<RequestInfo> request_info(CreateRequestInfo(false));
diff --git a/content/child/web_url_loader_impl.cc b/content/child/web_url_loader_impl.cc
index 8665166..d380c1f 100644
--- a/content/child/web_url_loader_impl.cc
+++ b/content/child/web_url_loader_impl.cc
@@ -316,14 +316,6 @@ class WebURLLoaderImpl::Context : public base::RefCounted<Context> {
const std::string& security_info,
const base::TimeTicks& completion_time,
int64_t total_transfer_size);
- void OnReceivedCompletedResponse(const ResourceResponseInfo& info,
- scoped_ptr<ReceivedData> data,
- int error_code,
- bool was_ignored_by_handler,
- bool stale_copy_in_cache,
- const std::string& security_info,
- const base::TimeTicks& completion_time,
- int64_t total_transfer_size);
private:
friend class base::RefCounted<Context>;
@@ -385,16 +377,6 @@ class WebURLLoaderImpl::RequestPeerImpl : public RequestPeer {
const base::TimeTicks& completion_time,
int64_t total_transfer_size) override;
- // TODO(kinuko): Deprecate this method. (crbug.com/507170)
- void OnReceivedCompletedResponse(const ResourceResponseInfo& info,
- scoped_ptr<ReceivedData> data,
- int error_code,
- bool was_ignored_by_handler,
- bool stale_copy_in_cache,
- const std::string& security_info,
- const base::TimeTicks& completion_time,
- int64_t total_transfer_size) override;
-
private:
scoped_refptr<Context> context_;
DISALLOW_COPY_AND_ASSIGN(RequestPeerImpl);
@@ -798,26 +780,9 @@ void WebURLLoaderImpl::Context::OnCompletedRequest(
}
}
-void WebURLLoaderImpl::Context::OnReceivedCompletedResponse(
- const ResourceResponseInfo& info,
- scoped_ptr<ReceivedData> data,
- int error_code,
- bool was_ignored_by_handler,
- bool stale_copy_in_cache,
- const std::string& security_info,
- const base::TimeTicks& completion_time,
- int64_t total_transfer_size) {
- OnReceivedResponse(info);
- if (data)
- OnReceivedData(std::move(data));
- OnCompletedRequest(error_code, was_ignored_by_handler, stale_copy_in_cache,
- security_info, completion_time, total_transfer_size);
-}
-
WebURLLoaderImpl::Context::~Context() {
// We must be already cancelled at this point.
- // TODO(kinuko): Replace this with DCHECK once we make sure this is safe.
- CHECK_LT(request_id_, 0);
+ DCHECK_LT(request_id_, 0);
}
void WebURLLoaderImpl::Context::CancelBodyStreaming() {
@@ -962,20 +927,6 @@ void WebURLLoaderImpl::RequestPeerImpl::OnCompletedRequest(
completion_time, total_transfer_size);
}
-void WebURLLoaderImpl::RequestPeerImpl::OnReceivedCompletedResponse(
- const ResourceResponseInfo& info,
- scoped_ptr<ReceivedData> data,
- int error_code,
- bool was_ignored_by_handler,
- bool stale_copy_in_cache,
- const std::string& security_info,
- const base::TimeTicks& completion_time,
- int64_t total_transfer_size) {
- context_->OnReceivedCompletedResponse(
- info, std::move(data), error_code, was_ignored_by_handler,
- stale_copy_in_cache, security_info, completion_time, total_transfer_size);
-}
-
// WebURLLoaderImpl -----------------------------------------------------------
WebURLLoaderImpl::WebURLLoaderImpl(
diff --git a/content/child/web_url_loader_impl_unittest.cc b/content/child/web_url_loader_impl_unittest.cc
index 242017c..da22c38 100644
--- a/content/child/web_url_loader_impl_unittest.cc
+++ b/content/child/web_url_loader_impl_unittest.cc
@@ -316,23 +316,6 @@ class WebURLLoaderImplTest : public testing::Test {
EXPECT_EQ("", client()->error().domain.utf8());
}
- void DoReceiveCompletedResponse() {
- EXPECT_FALSE(client()->did_receive_response());
- EXPECT_EQ("", client()->received_data());
- EXPECT_FALSE(client()->did_finish());
-
- peer()->OnReceivedCompletedResponse(
- content::ResourceResponseInfo(),
- make_scoped_ptr(new FixedReceivedData(kTestData, strlen(kTestData),
- strlen(kTestData))),
- net::OK, false, false, "", base::TimeTicks(), strlen(kTestData));
-
- EXPECT_TRUE(client()->did_receive_response());
- EXPECT_EQ(kTestData, client()->received_data());
- EXPECT_EQ(net::OK, client()->error().reason);
- EXPECT_EQ("", client()->error().domain.utf8());
- }
-
void DoFailRequest() {
EXPECT_FALSE(client()->did_finish());
peer()->OnCompletedRequest(net::ERR_FAILED, false, false, "",
@@ -417,13 +400,6 @@ TEST_F(WebURLLoaderImplTest, Failure) {
EXPECT_FALSE(dispatcher()->canceled());
}
-TEST_F(WebURLLoaderImplTest, ReceiveCompletedResponse) {
- DoStartAsyncRequest();
- DoReceiveCompletedResponse();
- EXPECT_FALSE(dispatcher()->canceled());
- EXPECT_EQ(kTestData, client()->received_data());
-}
-
// The client may delete the WebURLLoader during any callback from the loader.
// These tests make sure that doesn't result in a crash.
TEST_F(WebURLLoaderImplTest, DeleteOnReceiveRedirect) {
diff --git a/content/public/child/request_peer.h b/content/public/child/request_peer.h
index 7ca6649..cda0c71 100644
--- a/content/public/child/request_peer.h
+++ b/content/public/child/request_peer.h
@@ -97,26 +97,6 @@ class CONTENT_EXPORT RequestPeer {
const base::TimeTicks& completion_time,
int64_t total_transfer_size) = 0;
- // This is a combined notification of
- // - OnReceivedResponse,
- // - OnReceivedData and
- // - OnCompletedRequest.
- // Unlike OnReceivedData, |data| can be null.
- // This method is introduced to avoid repetitive method calls which might
- // lead to use-after-free issues. See https://crbug.com/485413,
- // https://crbug.com/507170.
- // TODO(yhirano): Fix the RequestPeer lifecycle problem and remove this
- // function.
- virtual void OnReceivedCompletedResponse(
- const ResourceResponseInfo& info,
- scoped_ptr<ReceivedData> data,
- int error_code,
- bool was_ignored_by_handler,
- bool stale_copy_in_cache,
- const std::string& security_info,
- const base::TimeTicks& completion_time,
- int64_t total_transfer_size) = 0;
-
virtual ~RequestPeer() {}
};