Home | History | Annotate | Download | only in loader
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CONTENT_BROWSER_LOADER_THROTTLING_RESOURCE_HANDLER_H_
      6 #define CONTENT_BROWSER_LOADER_THROTTLING_RESOURCE_HANDLER_H_
      7 
      8 #include "base/memory/ref_counted.h"
      9 #include "base/memory/scoped_vector.h"
     10 #include "content/browser/loader/layered_resource_handler.h"
     11 #include "content/public/browser/resource_controller.h"
     12 #include "url/gurl.h"
     13 
     14 namespace net {
     15 class URLRequest;
     16 }
     17 
     18 namespace content {
     19 
     20 class ResourceThrottle;
     21 struct ResourceResponse;
     22 
     23 // Used to apply a list of ResourceThrottle instances to an URLRequest.
     24 class ThrottlingResourceHandler : public LayeredResourceHandler,
     25                                   public ResourceController {
     26  public:
     27   // Takes ownership of the ResourceThrottle instances.
     28   ThrottlingResourceHandler(scoped_ptr<ResourceHandler> next_handler,
     29                             net::URLRequest* request,
     30                             ScopedVector<ResourceThrottle> throttles);
     31   virtual ~ThrottlingResourceHandler();
     32 
     33   // LayeredResourceHandler overrides:
     34   virtual bool OnRequestRedirected(const GURL& url,
     35                                    ResourceResponse* response,
     36                                    bool* defer) OVERRIDE;
     37   virtual bool OnResponseStarted(ResourceResponse* response,
     38                                  bool* defer) OVERRIDE;
     39   virtual bool OnWillStart(const GURL& url, bool* defer) OVERRIDE;
     40   virtual bool OnBeforeNetworkStart(const GURL& url, bool* defer) OVERRIDE;
     41 
     42   // ResourceController implementation:
     43   virtual void Cancel() OVERRIDE;
     44   virtual void CancelAndIgnore() OVERRIDE;
     45   virtual void CancelWithError(int error_code) OVERRIDE;
     46   virtual void Resume() OVERRIDE;
     47 
     48  private:
     49   void ResumeStart();
     50   void ResumeNetworkStart();
     51   void ResumeRedirect();
     52   void ResumeResponse();
     53 
     54   // Called when the throttle at |throttle_index| defers a request.  Logs the
     55   // name of the throttle that delayed the request.
     56   void OnRequestDefered(int throttle_index);
     57 
     58   enum DeferredStage {
     59     DEFERRED_NONE,
     60     DEFERRED_START,
     61     DEFERRED_NETWORK_START,
     62     DEFERRED_REDIRECT,
     63     DEFERRED_RESPONSE
     64   };
     65   DeferredStage deferred_stage_;
     66 
     67   ScopedVector<ResourceThrottle> throttles_;
     68   size_t next_index_;
     69 
     70   GURL deferred_url_;
     71   scoped_refptr<ResourceResponse> deferred_response_;
     72 
     73   bool cancelled_by_resource_throttle_;
     74 };
     75 
     76 }  // namespace content
     77 
     78 #endif  // CONTENT_BROWSER_LOADER_THROTTLING_RESOURCE_HANDLER_H_
     79