| Index: content/browser/loader/intercepting_resource_handler_unittest.cc
|
| diff --git a/content/browser/loader/intercepting_resource_handler_unittest.cc b/content/browser/loader/intercepting_resource_handler_unittest.cc
|
| index 867ca993a8d8b46b6c231228eae2ad972dcf3c84..7a877b673fd0dd788b2f11f047be4b761369f4f3 100644
|
| --- a/content/browser/loader/intercepting_resource_handler_unittest.cc
|
| +++ b/content/browser/loader/intercepting_resource_handler_unittest.cc
|
| @@ -58,50 +58,8 @@ class TestResourceHandler : public ResourceHandler {
|
| // the handler and |body| will be updated on each OnReadCompleted call.
|
| explicit TestResourceHandler(net::URLRequestStatus* request_status,
|
| std::string* body)
|
| - : TestResourceHandler(request_status,
|
| - body,
|
| - true /* on_response_started_result */,
|
| - true /* on_will_read_result */,
|
| - true /* on_read_completed_result */) {}
|
| -
|
| - // This constructor allows to specify return values for OnResponseStarted,
|
| - // OnWillRead and OnReadCompleted.
|
| - TestResourceHandler(net::URLRequestStatus* request_status,
|
| - std::string* body,
|
| - bool on_response_started_result,
|
| - bool on_will_read_result,
|
| - bool on_read_completed_result)
|
| - : TestResourceHandler(request_status,
|
| - body,
|
| - 2048 /* buffer_size */,
|
| - on_response_started_result,
|
| - on_will_read_result,
|
| - on_read_completed_result,
|
| - false /* defer_on_response_started */,
|
| - false /* defer_on_response_completed */,
|
| - false /* defer_on_read_completed */) {}
|
| -
|
| - TestResourceHandler(net::URLRequestStatus* request_status,
|
| - std::string* body,
|
| - size_t buffer_size,
|
| - bool on_response_started_result,
|
| - bool on_will_read_result,
|
| - bool on_read_completed_result,
|
| - bool defer_on_response_started,
|
| - bool defer_on_read_completed,
|
| - bool defer_on_response_completed)
|
| - : ResourceHandler(nullptr),
|
| - request_status_(request_status),
|
| - body_(body),
|
| - buffer_(new net::IOBuffer(buffer_size)),
|
| - buffer_size_(buffer_size),
|
| - on_response_started_result_(on_response_started_result),
|
| - on_will_read_result_(on_will_read_result),
|
| - on_read_completed_result_(on_read_completed_result),
|
| - defer_on_response_started_(defer_on_response_started),
|
| - defer_on_read_completed_(defer_on_read_completed),
|
| - defer_on_response_completed_(defer_on_response_completed) {
|
| - memset(buffer_->data(), '\0', buffer_size_);
|
| + : ResourceHandler(nullptr), request_status_(request_status), body_(body) {
|
| + SetBufferSize(2048);
|
| }
|
|
|
| ~TestResourceHandler() override {}
|
| @@ -116,7 +74,11 @@ class TestResourceHandler : public ResourceHandler {
|
| }
|
|
|
| bool OnResponseStarted(ResourceResponse* response, bool* defer) override {
|
| - EXPECT_FALSE(is_completed_);
|
| + EXPECT_TRUE(will_start_called_);
|
| + EXPECT_FALSE(response_started_called_);
|
| + EXPECT_FALSE(response_completed_called_);
|
| + response_started_called_ = true;
|
| +
|
| if (!on_response_started_result_)
|
| return false;
|
| *defer = defer_on_response_started_;
|
| @@ -125,14 +87,23 @@ class TestResourceHandler : public ResourceHandler {
|
| }
|
|
|
| bool OnWillStart(const GURL& url, bool* defer) override {
|
| - EXPECT_FALSE(is_completed_);
|
| + EXPECT_FALSE(response_started_called_);
|
| + EXPECT_FALSE(will_start_called_);
|
| + EXPECT_FALSE(response_completed_called_);
|
| + will_start_called_ = true;
|
| +
|
| + if (!on_will_start_result_)
|
| + return false;
|
| +
|
| + *defer = defer_on_will_start_;
|
| return true;
|
| }
|
|
|
| bool OnWillRead(scoped_refptr<net::IOBuffer>* buf,
|
| int* buf_size,
|
| int min_size) override {
|
| - EXPECT_FALSE(is_completed_);
|
| + EXPECT_FALSE(response_completed_called_);
|
| +
|
| *buf = buffer_;
|
| *buf_size = buffer_size_;
|
| memset(buffer_->data(), '\0', buffer_size_);
|
| @@ -140,7 +111,10 @@ class TestResourceHandler : public ResourceHandler {
|
| }
|
|
|
| bool OnReadCompleted(int bytes_read, bool* defer) override {
|
| - EXPECT_FALSE(is_completed_);
|
| + EXPECT_TRUE(will_start_called_);
|
| + EXPECT_TRUE(response_started_called_);
|
| + EXPECT_FALSE(response_completed_called_);
|
| +
|
| EXPECT_LE(static_cast<size_t>(bytes_read), buffer_size_);
|
| body_->append(buffer_->data(), bytes_read);
|
| if (!on_read_completed_result_)
|
| @@ -152,8 +126,8 @@ class TestResourceHandler : public ResourceHandler {
|
|
|
| void OnResponseCompleted(const net::URLRequestStatus& status,
|
| bool* defer) override {
|
| - EXPECT_FALSE(is_completed_);
|
| - is_completed_ = true;
|
| + EXPECT_FALSE(response_completed_called_);
|
| + response_completed_called_ = true;
|
| *request_status_ = status;
|
| *defer = defer_on_response_completed_;
|
| defer_on_response_completed_ = false;
|
| @@ -163,18 +137,59 @@ class TestResourceHandler : public ResourceHandler {
|
|
|
| scoped_refptr<net::IOBuffer> buffer() const { return buffer_; }
|
|
|
| + // Sets the size of the read buffer returned by OnWillRead. Releases reference
|
| + // to previous read buffer.
|
| + void SetBufferSize(int buffer_size) {
|
| + buffer_ = new net::IOBuffer(buffer_size);
|
| + buffer_size_ = buffer_size;
|
| + memset(buffer_->data(), '\0', buffer_size);
|
| + }
|
| +
|
| + void set_on_will_start_result(bool on_will_start_result) {
|
| + on_will_start_result_ = on_will_start_result;
|
| + }
|
| + void set_on_response_started_result(bool on_response_started_result) {
|
| + on_response_started_result_ = on_response_started_result;
|
| + }
|
| + void set_on_will_read_result(bool on_will_read_result) {
|
| + on_will_read_result_ = on_will_read_result;
|
| + }
|
| + void set_on_read_completed_result(bool on_read_completed_result) {
|
| + on_read_completed_result_ = on_read_completed_result;
|
| + }
|
| +
|
| + void set_defer_on_will_start(bool defer_on_will_start) {
|
| + defer_on_will_start_ = defer_on_will_start;
|
| + }
|
| + void set_defer_on_response_started(bool defer_on_response_started) {
|
| + defer_on_response_started_ = defer_on_response_started;
|
| + }
|
| + void set_defer_on_read_completed(bool defer_on_read_completed) {
|
| + defer_on_read_completed_ = defer_on_read_completed;
|
| + }
|
| + void set_defer_on_response_completed(bool defer_on_response_completed) {
|
| + defer_on_response_completed_ = defer_on_response_completed;
|
| + }
|
| +
|
| private:
|
| net::URLRequestStatus* request_status_;
|
| std::string* body_;
|
| scoped_refptr<net::IOBuffer> buffer_;
|
| - const size_t buffer_size_;
|
| - const bool on_response_started_result_;
|
| - const bool on_will_read_result_;
|
| - const bool on_read_completed_result_;
|
| - bool defer_on_response_started_;
|
| - bool defer_on_read_completed_;
|
| - bool defer_on_response_completed_;
|
| - bool is_completed_ = false;
|
| + size_t buffer_size_;
|
| +
|
| + bool on_will_start_result_ = true;
|
| + bool on_response_started_result_ = true;
|
| + bool on_will_read_result_ = true;
|
| + bool on_read_completed_result_ = true;
|
| +
|
| + bool defer_on_will_start_ = false;
|
| + bool defer_on_response_started_ = false;
|
| + bool defer_on_read_completed_ = false;
|
| + bool defer_on_response_completed_ = false;
|
| +
|
| + bool will_start_called_ = false;
|
| + bool response_started_called_ = false;
|
| + bool response_completed_called_ = false;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(TestResourceHandler);
|
| };
|
| @@ -453,10 +468,8 @@ TEST_F(InterceptingResourceHandlerTest, OldHandlerFailsWillRead) {
|
| net::URLRequestStatus old_handler_status;
|
| std::string old_handler_body;
|
| std::unique_ptr<TestResourceHandler> old_handler(
|
| - new TestResourceHandler(&old_handler_status, &old_handler_body,
|
| - true, // on_response_started
|
| - false, // on_will_read
|
| - true)); // on_read_completed
|
| + new TestResourceHandler(&old_handler_status, &old_handler_body));
|
| + old_handler->set_on_will_read_result(false);
|
| std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
|
| new InterceptingResourceHandler(std::move(old_handler), request.get()));
|
|
|
| @@ -472,6 +485,61 @@ TEST_F(InterceptingResourceHandlerTest, OldHandlerFailsWillRead) {
|
| EXPECT_FALSE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
|
| }
|
|
|
| +// Tests that the handler behaves properly if the new handler fails in
|
| +// OnWillStart.
|
| +TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsOnWillStart) {
|
| + net::URLRequestContext context;
|
| + std::unique_ptr<net::URLRequest> request(context.CreateRequest(
|
| + GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
|
| + ResourceRequestInfo::AllocateForTesting(request.get(),
|
| + RESOURCE_TYPE_MAIN_FRAME,
|
| + nullptr, // context
|
| + 0, // render_process_id
|
| + 0, // render_view_id
|
| + 0, // render_frame_id
|
| + true, // is_main_frame
|
| + false, // parent_is_main_frame
|
| + true, // allow_download
|
| + true, // is_async
|
| + false); // is_using_lofi
|
| +
|
| + net::URLRequestStatus old_handler_status;
|
| + std::string old_handler_body;
|
| + std::unique_ptr<TestResourceHandler> old_handler(
|
| + new TestResourceHandler(&old_handler_status, &old_handler_body));
|
| + scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
|
| + std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
|
| + new InterceptingResourceHandler(std::move(old_handler), request.get()));
|
| +
|
| + scoped_refptr<ResourceResponse> response(new ResourceResponse);
|
| +
|
| + // Simulate the MimeSniffingResourceHandler buffering the data.
|
| + scoped_refptr<net::IOBuffer> read_buffer;
|
| + int buf_size = 0;
|
| + bool defer = false;
|
| + EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
|
| + EXPECT_FALSE(defer);
|
| + EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
|
| +
|
| + const char kData[] = "The data";
|
| + ASSERT_NE(read_buffer.get(), old_buffer.get());
|
| + ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData));
|
| + memcpy(read_buffer->data(), kData, sizeof(kData));
|
| +
|
| + // Simulate the MimeSniffingResourceHandler asking the
|
| + // InterceptingResourceHandler to switch to a new handler.
|
| + net::URLRequestStatus new_handler_status;
|
| + std::string new_handler_body;
|
| + std::unique_ptr<TestResourceHandler> new_handler(
|
| + new TestResourceHandler(&new_handler_status, &new_handler_body));
|
| + new_handler->set_on_will_start_result(false);
|
| + intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
|
| +
|
| + // The response is received. The new ResourceHandler should tell us to fail.
|
| + EXPECT_FALSE(intercepting_handler->OnResponseStarted(response.get(), &defer));
|
| + EXPECT_FALSE(defer);
|
| +}
|
| +
|
| // Tests that the handler behaves properly if the new handler fails response
|
| // started.
|
| TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsResponseStarted) {
|
| @@ -518,10 +586,8 @@ TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsResponseStarted) {
|
| net::URLRequestStatus new_handler_status;
|
| std::string new_handler_body;
|
| std::unique_ptr<TestResourceHandler> new_handler(
|
| - new TestResourceHandler(&new_handler_status, &new_handler_body,
|
| - false, // on_response_started
|
| - true, // on_will_read
|
| - true)); // on_read_completed
|
| + new TestResourceHandler(&new_handler_status, &new_handler_body));
|
| + new_handler->set_on_response_started_result(false);
|
| intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
|
|
|
| // The response is received. The new ResourceHandler should tell us to fail.
|
| @@ -574,10 +640,8 @@ TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsWillRead) {
|
| net::URLRequestStatus new_handler_status;
|
| std::string new_handler_body;
|
| std::unique_ptr<TestResourceHandler> new_handler(
|
| - new TestResourceHandler(&new_handler_status, &new_handler_body,
|
| - true, // on_response_started
|
| - false, // on_will_read
|
| - true)); // on_read_completed
|
| + new TestResourceHandler(&new_handler_status, &new_handler_body));
|
| + new_handler->set_on_will_read_result(false);
|
| intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
|
|
|
| // The response is received. The new handler should not have been asked to
|
| @@ -639,10 +703,8 @@ TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsReadCompleted) {
|
| net::URLRequestStatus new_handler_status;
|
| std::string new_handler_body;
|
| std::unique_ptr<TestResourceHandler> new_handler(
|
| - new TestResourceHandler(&new_handler_status, &new_handler_body,
|
| - true, // on_response_started
|
| - true, // on_will_read
|
| - false)); // on_read_completed
|
| + new TestResourceHandler(&new_handler_status, &new_handler_body));
|
| + new_handler->set_on_read_completed_result(false);
|
| intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
|
|
|
| // The response is received.
|
| @@ -682,14 +744,10 @@ TEST_F(InterceptingResourceHandlerTest, DeferredOperations) {
|
| 0};
|
| std::string old_handler_body;
|
| std::unique_ptr<TestResourceHandler> old_handler(
|
| - new TestResourceHandler(&old_handler_status, &old_handler_body,
|
| - 10, // buffer_size
|
| - true, // on_response_started
|
| - true, // on_will_read
|
| - true, // on_read_completed
|
| - false, // defer_on_response_started
|
| - true, // defer_on_read_completed
|
| - false)); // defer_on_response_completed
|
| + new TestResourceHandler(&old_handler_status, &old_handler_body));
|
| + old_handler->SetBufferSize(10);
|
| + old_handler->set_defer_on_read_completed(true);
|
| +
|
| scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
|
| std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
|
| new InterceptingResourceHandler(std::move(old_handler), request.get()));
|
| @@ -719,16 +777,16 @@ TEST_F(InterceptingResourceHandlerTest, DeferredOperations) {
|
| const std::string kPayload = "The long long long long long payload";
|
| ASSERT_GT(kPayload.size(), static_cast<size_t>(buf_size));
|
| std::unique_ptr<TestResourceHandler> new_handler(
|
| - new TestResourceHandler(&new_handler_status, &new_handler_body,
|
| - 1, // buffer_size
|
| - true, // on_response_started
|
| - true, // on_will_read
|
| - true, // on_read_completed
|
| - true, // defer_on_response_started
|
| - true, // defer_on_read_completed
|
| - true)); // defer_on_response_completed
|
| + new TestResourceHandler(&new_handler_status, &new_handler_body));
|
| + new_handler->SetBufferSize(1);
|
| + new_handler->set_defer_on_will_start(true);
|
| + new_handler->set_defer_on_response_started(true);
|
| + new_handler->set_defer_on_read_completed(true);
|
| + new_handler->set_defer_on_response_completed(true);
|
| intercepting_handler->UseNewHandler(std::move(new_handler), kPayload);
|
| - // The response is received.
|
| +
|
| + // The response is received, and then deferred by the old handler's
|
| + // OnReadCompleted method.
|
| ASSERT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
|
| ASSERT_TRUE(defer);
|
|
|
| @@ -739,6 +797,7 @@ TEST_F(InterceptingResourceHandlerTest, DeferredOperations) {
|
| EXPECT_EQ(old_handler_status.status(), net::URLRequestStatus::IO_PENDING);
|
| EXPECT_EQ(new_handler_status.status(), net::URLRequestStatus::IO_PENDING);
|
|
|
| + // Run until the new handler's OnWillStart method defers the request.
|
| intercepting_handler->Resume();
|
| EXPECT_EQ(0, resource_controller->resume_calls());
|
| EXPECT_EQ(kPayload, old_handler_body);
|
| @@ -746,9 +805,18 @@ TEST_F(InterceptingResourceHandlerTest, DeferredOperations) {
|
| EXPECT_EQ(old_handler_status.status(), net::URLRequestStatus::SUCCESS);
|
| EXPECT_EQ(new_handler_status.status(), net::URLRequestStatus::IO_PENDING);
|
|
|
| + // Run until the new handler's OnResponseStarted method defers the request.
|
| + intercepting_handler->Resume();
|
| + EXPECT_EQ(0, resource_controller->resume_calls());
|
| + EXPECT_EQ(std::string(), new_handler_body);
|
| + EXPECT_EQ(old_handler_status.status(), net::URLRequestStatus::SUCCESS);
|
| + EXPECT_EQ(new_handler_status.status(), net::URLRequestStatus::IO_PENDING);
|
| +
|
| + // Resuming should finally call back into the ResourceController.
|
| intercepting_handler->Resume();
|
| EXPECT_EQ(1, resource_controller->resume_calls());
|
|
|
| + // Data is read, the new handler defers completion of the read.
|
| defer = false;
|
| ASSERT_TRUE(intercepting_handler->OnReadCompleted(strlen(kData), &defer));
|
| ASSERT_TRUE(defer);
|
| @@ -864,14 +932,10 @@ TEST_F(InterceptingResourceHandlerTest, CancelNewHandler) {
|
| std::string new_handler_body;
|
| const std::string kPayload = "The payload";
|
| std::unique_ptr<TestResourceHandler> new_handler(
|
| - new TestResourceHandler(&new_handler_status, &new_handler_body,
|
| - 1, // buffer_size
|
| - true, // on_response_started
|
| - true, // on_will_read
|
| - true, // on_read_completed
|
| - true, // defer_on_response_started
|
| - false, // defer_on_read_completed
|
| - true)); // defer_on_response_completed
|
| + new TestResourceHandler(&new_handler_status, &new_handler_body));
|
| + new_handler->SetBufferSize(1);
|
| + new_handler->set_defer_on_response_started(true);
|
| + new_handler->set_defer_on_response_completed(true);
|
| intercepting_handler->UseNewHandler(std::move(new_handler), kPayload);
|
|
|
| // The response is received.
|
| @@ -914,14 +978,8 @@ TEST_F(InterceptingResourceHandlerTest, CancelBothHandlers) {
|
| 0};
|
| std::string old_handler_body;
|
| std::unique_ptr<TestResourceHandler> old_handler(
|
| - new TestResourceHandler(&old_handler_status, &old_handler_body,
|
| - 2048, // buffer_size
|
| - true, // on_response_started
|
| - true, // on_will_read
|
| - true, // on_read_completed
|
| - false, // defer_on_response_started
|
| - true, // defer_on_read_completed
|
| - false)); // defer_on_response_completed
|
| + new TestResourceHandler(&old_handler_status, &old_handler_body));
|
| + old_handler->set_defer_on_read_completed(true);
|
|
|
| std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
|
| new InterceptingResourceHandler(std::move(old_handler), request.get()));
|
| @@ -949,14 +1007,9 @@ TEST_F(InterceptingResourceHandlerTest, CancelBothHandlers) {
|
| std::string new_handler_body;
|
| const std::string kPayload = "The payload";
|
| std::unique_ptr<TestResourceHandler> new_handler(
|
| - new TestResourceHandler(&new_handler_status, &new_handler_body,
|
| - 1, // buffer_size
|
| - true, // on_response_started
|
| - true, // on_will_read
|
| - true, // on_read_completed
|
| - false, // defer_on_response_started
|
| - false, // defer_on_read_completed
|
| - true)); // defer_on_response_completed
|
| + new TestResourceHandler(&new_handler_status, &new_handler_body));
|
| + new_handler->SetBufferSize(1);
|
| + new_handler->set_defer_on_response_completed(true);
|
| intercepting_handler->UseNewHandler(std::move(new_handler), kPayload);
|
|
|
| // The response is received.
|
|
|