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
15namespace net {
16class URLRequest;
17}
18
19namespace content {
20
21class ResourceThrottle;
22struct ResourceResponse;
23
24// Used to apply a list of ResourceThrottle instances to an URLRequest.
25class 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