| Index: content/browser/loader/mime_sniffing_resource_handler.h
|
| diff --git a/content/browser/loader/mime_sniffing_resource_handler.h b/content/browser/loader/mime_sniffing_resource_handler.h
|
| index 0effee5e386d72750f95184f66831778f4065d5a..73cef65fa44dbaccae3eb4365aa496f493650f01 100644
|
| --- a/content/browser/loader/mime_sniffing_resource_handler.h
|
| +++ b/content/browser/loader/mime_sniffing_resource_handler.h
|
| @@ -8,6 +8,7 @@
|
| #include <string>
|
| #include <vector>
|
|
|
| +#include "base/auto_reset.h"
|
| #include "base/macros.h"
|
| #include "base/memory/weak_ptr.h"
|
| #include "content/browser/loader/layered_resource_handler.h"
|
| @@ -23,6 +24,7 @@ class URLRequest;
|
| namespace content {
|
| class InterceptingResourceHandler;
|
| class PluginService;
|
| +class ResourceController;
|
| class ResourceDispatcherHostImpl;
|
| struct WebPluginInfo;
|
|
|
| @@ -39,8 +41,7 @@ struct WebPluginInfo;
|
| // Accept header on the request based on its ResourceType, if one isn't already
|
| // present.
|
| class CONTENT_EXPORT MimeSniffingResourceHandler
|
| - : public LayeredResourceHandler,
|
| - public ResourceController {
|
| + : public LayeredResourceHandler {
|
| public:
|
| MimeSniffingResourceHandler(std::unique_ptr<ResourceHandler> next_handler,
|
| ResourceDispatcherHostImpl* host,
|
| @@ -51,6 +52,8 @@ class CONTENT_EXPORT MimeSniffingResourceHandler
|
| ~MimeSniffingResourceHandler() override;
|
|
|
| private:
|
| + class Controller;
|
| +
|
| friend class MimeSniffingResourceHandlerTest;
|
| enum State {
|
| // Starting state of the MimeSniffingResourceHandler. In this state, it is
|
| @@ -80,21 +83,21 @@ class CONTENT_EXPORT MimeSniffingResourceHandler
|
| };
|
|
|
| // ResourceHandler implementation:
|
| - void SetController(ResourceController* controller) override;
|
| - bool OnWillStart(const GURL&, bool* defer) override;
|
| - bool OnResponseStarted(ResourceResponse* response, bool* defer) override;
|
| + void OnWillStart(const GURL&,
|
| + std::unique_ptr<ResourceController> controller) 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 Resume() override;
|
| - void Cancel() override;
|
| - void CancelAndIgnore() override;
|
| - void CancelWithError(int error_code) override;
|
| + void ResumeInternal();
|
|
|
| // --------------------------------------------------------------------------
|
| // The following methods replay the buffered data to the downstream
|
| @@ -104,16 +107,15 @@ class CONTENT_EXPORT MimeSniffingResourceHandler
|
|
|
| // Used to advance through the states of the state machine.
|
| void AdvanceState();
|
| - bool ProcessState(bool* defer);
|
|
|
| // Intercepts the request as a stream/download if needed.
|
| - bool MaybeIntercept(bool* defer);
|
| + void MaybeIntercept();
|
|
|
| // Replays OnResponseStarted on the downstream handlers.
|
| - bool ReplayResponseReceived(bool* defer);
|
| + void ReplayResponseReceived();
|
|
|
| // Replays OnReadCompleted on the downstreams handlers.
|
| - bool ReplayReadCompleted(bool* defer);
|
| + void ReplayReadCompleted();
|
|
|
| // --------------------------------------------------------------------------
|
|
|
| @@ -123,18 +125,20 @@ class CONTENT_EXPORT MimeSniffingResourceHandler
|
|
|
| // Checks whether this request should be intercepted as a stream or a
|
| // download. If this is the case, sets up the new ResourceHandler that will be
|
| - // used for interception. Returns false if teh request should be cancelled,
|
| - // true otherwise. |defer| is set to true if the interception check needs to
|
| - // finish asynchronously.
|
| - bool MaybeStartInterception(bool* defer);
|
| + // used for interception.
|
| + //
|
| + // Returns true on synchronous success, false if the operation will need to
|
| + // complete asynchronously or failure. On failure, also cancels the request.
|
| + bool MaybeStartInterception();
|
|
|
| // Determines whether a plugin will handle the current request. Returns false
|
| // if there is an error and the request should be cancelled and true
|
| - // otherwise. |defer| is set to true if plugin data is stale and needs to be
|
| - // refreshed before the request can be handled (in this case the function
|
| - // still returns true). If the request is directed to a plugin,
|
| - // |handled_by_plugin| is set to true.
|
| - bool CheckForPluginHandler(bool* defer, bool* handled_by_plugin);
|
| + // otherwise. If the request is directed to a plugin, |handled_by_plugin| is
|
| + // set to true.
|
| + //
|
| + // Returns true on synchronous success, false if the operation will need to
|
| + // complete asynchronously or failure. On failure, also cancels the request.
|
| + bool CheckForPluginHandler(bool* handled_by_plugin);
|
|
|
| // Whether this request is allowed to be intercepted as a download or a
|
| // stream.
|
| @@ -170,6 +174,14 @@ class CONTENT_EXPORT MimeSniffingResourceHandler
|
|
|
| RequestContextType request_context_type_;
|
|
|
| + // True if current in an AdvanceState loop. Used to prevent re-entrancy and
|
| + // avoid an extra PostTask.
|
| + bool in_state_loop_;
|
| + // Set to true if Resume() is called while |in_state_loop_| is true. When
|
| + // returning to the parent AdvanceState loop, will synchronously advance to
|
| + // the next state when control returns to the AdvanceState loop.
|
| + bool advance_state_;
|
| +
|
| base::WeakPtrFactory<MimeSniffingResourceHandler> weak_ptr_factory_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(MimeSniffingResourceHandler);
|
|
|