Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1237)

Unified Diff: content/browser/loader/intercepting_resource_handler.h

Issue 2668603003: Make ResourceHandler::OnWillRead able to complete asynchronously. (Closed)
Patch Set: Fix merge (x2) Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/loader/intercepting_resource_handler.h
diff --git a/content/browser/loader/intercepting_resource_handler.h b/content/browser/loader/intercepting_resource_handler.h
index 56e6e0add60dfe3baf0a7ed8e8f35a640a3652bc..cbfbba4f99cf55a3b77020416ae06499baa6bb1c 100644
--- a/content/browser/loader/intercepting_resource_handler.h
+++ b/content/browser/loader/intercepting_resource_handler.h
@@ -45,8 +45,9 @@ class CONTENT_EXPORT InterceptingResourceHandler
void OnResponseStarted(
ResourceResponse* response,
std::unique_ptr<ResourceController> controller) override;
- bool OnWillRead(scoped_refptr<net::IOBuffer>* buf,
- int* buf_size) override;
+ void OnWillRead(scoped_refptr<net::IOBuffer>* buf,
+ int* buf_size,
+ std::unique_ptr<ResourceController> controller) override;
void OnReadCompleted(int bytes_read,
std::unique_ptr<ResourceController> controller) override;
void OnResponseCompleted(
@@ -81,10 +82,18 @@ class CONTENT_EXPORT InterceptingResourceHandler
// handlers.
SWAPPING_HANDLERS,
+ // States where the InterceptingResourceHandler passes the initial
+ // OnWillRead call to the old handler, and then waits for the resulting
+ // buffer read buffer.
+ SENDING_ON_WILL_READ_TO_OLD_HANDLER,
+ WAITING_FOR_OLD_HANDLERS_BUFFER,
+
// The InterceptingResourceHandler is sending the payload given via
- // UseNewHandler to the old handler and waiting for its completion via
- // Resume().
+ // UseNewHandler to the old handler. The first state starts retrieving a
+ // buffer from the old handler, the second state copies as much of the data
+ // as possible to the received buffer and passes it to the old handler.
SENDING_PAYLOAD_TO_OLD_HANDLER,
+ RECEIVING_BUFFER_FROM_OLD_HANDLER,
// The InterceptingResourcHandler is calling the new handler's
// OnResponseStarted method and waiting for its completion via Resume().
@@ -102,9 +111,12 @@ class CONTENT_EXPORT InterceptingResourceHandler
// called.
WAITING_FOR_ON_READ_COMPLETED,
- // The InterceptingResourceHandler is sending the old handler's contents to
- // the new handler and waiting for its completion via Resume().
+ // The two phases of uploading previously received data stored in
+ // |first_read_buffer_double_| to the new handler, which is now stored in
+ // |next_handler_|. The first state gets a buffer to write to, and the next
+ // copies all the data it can to that buffer.
SENDING_BUFFER_TO_NEW_HANDLER,
+ SENDING_BUFFER_TO_NEW_HANDLER_WAITING_FOR_BUFFER,
// The InterceptingResourceHandler has replaced its next ResourceHandler if
// needed, and has ensured the buffered read data was properly transmitted
@@ -118,10 +130,14 @@ class CONTENT_EXPORT InterceptingResourceHandler
void ResumeInternal();
+ void SendOnWillReadToOldHandler();
+ void OnBufferReceived();
void SendOnResponseStartedToOldHandler();
void SendPayloadToOldHandler();
+ void ReceivedBufferFromOldHandler();
void SendFirstReadBufferToNewHandler();
void SendOnResponseStartedToNewHandler();
+ void ReceivedBufferFromNewHandler();
State state_ = State::STARTING;
@@ -135,9 +151,21 @@ class CONTENT_EXPORT InterceptingResourceHandler
// Instead of |first_read_buffer_|, this handler creates a new IOBuffer with
// the same size and return it to the client.
scoped_refptr<net::IOBuffer> first_read_buffer_double_;
- size_t first_read_buffer_size_ = 0;
- size_t first_read_buffer_bytes_read_ = 0;
- size_t first_read_buffer_bytes_written_ = 0;
+ int first_read_buffer_size_ = 0;
+ int first_read_buffer_bytes_read_ = 0;
+ int first_read_buffer_bytes_written_ = 0;
+
+ // Information about the new handler's buffer while copying data from
+ // |first_read_buffer_double_| to the new handler's buffer.
+ // Note that when these are used, the old handler has been destroyed, and
+ // |next_handler_| is now the new one.
+ scoped_refptr<net::IOBuffer> new_handler_read_buffer_;
+ int new_handler_read_buffer_size_ = 0;
+
+ // Pointers to parent-owned read buffer and its size. Only used for first
+ // OnWillRead call.
+ scoped_refptr<net::IOBuffer>* parent_read_buffer_ = nullptr;
+ int* parent_read_buffer_size_ = nullptr;
scoped_refptr<ResourceResponse> response_;

Powered by Google App Engine
This is Rietveld 408576698