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