Chromium Code Reviews| 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 7ae6b720af75f06923b83d1d3e1a3367eb1494a1..8667b19fa74f54e9c8b4d201fc3e369016baca77 100644 |
| --- a/content/browser/loader/intercepting_resource_handler.h |
| +++ b/content/browser/loader/intercepting_resource_handler.h |
| @@ -24,6 +24,8 @@ class URLRequest; |
| namespace content { |
| +class ResourceController; |
| + |
| // ResourceHandler that initiates special handling of the response if needed, |
| // based on the response's MIME type (starts downloads, sends data to some |
| // plugin types via a special channel). |
| @@ -33,28 +35,26 @@ namespace content { |
| // - OnResponseStarted on |next_handler| never sets |*defer|. |
| // - OnResponseCompleted on |next_handler| never sets |*defer|. |
| class CONTENT_EXPORT InterceptingResourceHandler |
| - : public LayeredResourceHandler, |
| - public ResourceController { |
| + : public LayeredResourceHandler { |
| public: |
| InterceptingResourceHandler(std::unique_ptr<ResourceHandler> next_handler, |
| net::URLRequest* request); |
| ~InterceptingResourceHandler() override; |
| // ResourceHandler implementation: |
| - void SetController(ResourceController* controller) override; |
| - bool OnResponseStarted(ResourceResponse* response, bool* defer) override; |
| + void OnResponseStarted( |
| + ResourceResponse* response, |
| + std::unique_ptr<ResourceController> controller) override; |
| bool OnWillRead(scoped_refptr<net::IOBuffer>* buf, |
| int* buf_size, |
| int min_size) override; |
| - bool OnReadCompleted(int bytes_read, bool* defer) override; |
| - void OnResponseCompleted(const net::URLRequestStatus& status, |
| - bool* defer) override; |
| + void OnReadCompleted(int bytes_read, |
| + std::unique_ptr<ResourceController> controller) override; |
| + void OnResponseCompleted( |
| + const net::URLRequestStatus& status, |
| + std::unique_ptr<ResourceController> controller) override; |
| - // ResourceController implementation: |
| - void Cancel() override; |
| - void CancelAndIgnore() override; |
| - void CancelWithError(int error_code) override; |
| - void Resume() override; |
| + void ResumeInternal(); |
|
Charlie Harrison
2017/01/25 20:22:59
Not part of ResourceHandler implementation, add ne
mmenke
2017/01/25 22:07:59
There is already one, actually. I went ahead and
|
| // Replaces the next handler with |new_handler|, sending |
| // |payload_for_old_handler| to the old handler. Must be called after |
| @@ -70,12 +70,20 @@ class CONTENT_EXPORT InterceptingResourceHandler |
| } |
| private: |
| + // ResourceController subclass that calls into the InterceptingResourceHandler |
| + // on cancel/resume. |
| + class Controller; |
| + |
| enum class State { |
| // The InterceptingResourceHandler is waiting for the mime type of the |
| // response to be identified, to check if the next handler should be |
| // replaced with an appropriate one. |
| STARTING, |
| + // The InterceptingResourceHandler is starting the process of swapping |
| + // handlers. |
| + SWAPPING_HANDLERS, |
| + |
| // The InterceptingResourceHandler is sending the payload given via |
| // UseNewHandler to the old handler and waiting for its completion via |
| // Resume(). |
| @@ -108,18 +116,13 @@ class CONTENT_EXPORT InterceptingResourceHandler |
| PASS_THROUGH, |
| }; |
| - // Runs necessary operations depending on |state_|. Returns false when an |
| - // error happens, and set |*defer| to true if the operation continues upon |
| - // return. |
| - bool DoLoop(bool* defer); |
| + // Runs necessary operations depending on |state_|. |
| + void DoLoop(); |
| - // The return value and |defer| has the same meaning as DoLoop. |
| - bool SendPayloadToOldHandler(bool* defer); |
| - bool SendFirstReadBufferToNewHandler(bool* defer); |
| - bool SendOnResponseStartedToNewHandler(bool* defer); |
| - |
| - // Wraps calls to DoLoop. Resumes or Cancels underlying request, if needed. |
| - void AdvanceState(); |
| + void SendOnResponseStartedToOldHandler(); |
| + void SendPayloadToOldHandler(); |
| + void SendFirstReadBufferToNewHandler(); |
| + void SendOnResponseStartedToNewHandler(); |
| State state_ = State::STARTING; |
| @@ -139,6 +142,14 @@ class CONTENT_EXPORT InterceptingResourceHandler |
| scoped_refptr<ResourceResponse> response_; |
| + // Next two values are used to handle synchronous Resume calls without a |
| + // PostTask. |
| + |
| + // True if the code is currently withing a DoLoop. |
|
Charlie Harrison
2017/01/25 20:22:59
s/withing/within
mmenke
2017/01/25 22:07:59
Done.
|
| + bool in_do_loop_ = false; |
| + // True if the request was resumed while |in_do_loop_| was true; |
| + bool advance_to_next_state_ = false; |
| + |
| base::WeakPtrFactory<InterceptingResourceHandler> weak_ptr_factory_; |
| DISALLOW_COPY_AND_ASSIGN(InterceptingResourceHandler); |