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 "net/url_request/redirect_info.h"
     13 #include "url/gurl.h"
     14 
     15 namespace net {
     16 class URLRequest;
     17 }
     18 
     19 namespace content {
     20 
     21 class ResourceThrottle;
     22 struct ResourceResponse;
     23 
     24 // Used to apply a list of ResourceThrottle instances to an URLRequest.
     25 class ThrottlingResourceHandler : public LayeredResourceHandler,
     26                                   public ResourceController {
     27  public:
     28   // Takes ownership of the ResourceThrottle instances.
     29   ThrottlingResourceHandler(scoped_ptr<ResourceHandler> next_handler,
     30                             net::URLRequest* request,
     31                             ScopedVector<ResourceThrottle> throttles);
     32   virtual ~ThrottlingResourceHandler();
     33 
     34   // LayeredResourceHandler overrides:
     35   virtual bool OnRequestRedirected(const net::RedirectInfo& redirect_info,
     36                                    ResourceResponse* response,
     37                                    bool* defer) OVERRIDE;
     38   virtual bool OnResponseStarted(ResourceResponse* response,
     39                                  bool* defer) OVERRIDE;
     40   virtual bool OnWillStart(const GURL& url, bool* defer) OVERRIDE;
     41   virtual bool OnBeforeNetworkStart(const GURL& url, bool* defer) OVERRIDE;
     42 
     43   // ResourceController implementation:
     44   virtual void Cancel() OVERRIDE;
     45   virtual void CancelAndIgnore() OVERRIDE;
     46   virtual void CancelWithError(int error_code) OVERRIDE;
     47   virtual void Resume() OVERRIDE;
     48 
     49  private:
     50   void ResumeStart();
     51   void ResumeNetworkStart();
     52   void ResumeRedirect();
     53   void ResumeResponse();
     54 
     55   // Called when the throttle at |throttle_index| defers a request.  Logs the
     56   // name of the throttle that delayed the request.
     57   void OnRequestDefered(int throttle_index);
     58 
     59   enum DeferredStage {
     60     DEFERRED_NONE,
     61     DEFERRED_START,
     62     DEFERRED_NETWORK_START,
     63     DEFERRED_REDIRECT,
     64     DEFERRED_RESPONSE
     65   };
     66   DeferredStage deferred_stage_;
     67 
     68   ScopedVector<ResourceThrottle> throttles_;
     69   size_t next_index_;
     70 
     71   GURL deferred_url_;
     72   net::RedirectInfo deferred_redirect_;
     73   scoped_refptr<ResourceResponse> deferred_response_;
     74 
     75   bool cancelled_by_resource_throttle_;
     76 };
     77 
     78 }  // namespace content
     79 
     80 #endif  // CONTENT_BROWSER_LOADER_THROTTLING_RESOURCE_HANDLER_H_
     81