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(int request_id, const GURL& url, 35 ResourceResponse* response, 36 bool* defer) OVERRIDE; 37 virtual bool OnResponseStarted(int request_id, 38 ResourceResponse* response, 39 bool* defer) OVERRIDE; 40 virtual bool OnWillStart(int request_id, const GURL& url, 41 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 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_REDIRECT, 62 DEFERRED_RESPONSE 63 }; 64 DeferredStage deferred_stage_; 65 66 ScopedVector<ResourceThrottle> throttles_; 67 size_t next_index_; 68 69 GURL deferred_url_; 70 scoped_refptr<ResourceResponse> deferred_response_; 71 72 bool cancelled_by_resource_throttle_; 73 }; 74 75 } // namespace content 76 77 #endif // CONTENT_BROWSER_LOADER_THROTTLING_RESOURCE_HANDLER_H_ 78