throttling_resource_handler.h revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
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
14namespace net {
15class URLRequest;
16}
17
18namespace content {
19
20class ResourceThrottle;
21struct ResourceResponse;
22
23// Used to apply a list of ResourceThrottle instances to an URLRequest.
24class 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  // ResourceThrottleController 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  enum DeferredStage {
55    DEFERRED_NONE,
56    DEFERRED_START,
57    DEFERRED_REDIRECT,
58    DEFERRED_RESPONSE
59  };
60  DeferredStage deferred_stage_;
61
62  net::URLRequest* request_;
63
64  ScopedVector<ResourceThrottle> throttles_;
65  size_t index_;
66
67  GURL deferred_url_;
68  scoped_refptr<ResourceResponse> deferred_response_;
69
70  bool cancelled_by_resource_throttle_;
71};
72
73}  // namespace content
74
75#endif  // CONTENT_BROWSER_LOADER_THROTTLING_RESOURCE_HANDLER_H_
76