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