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 CHROME_BROWSER_DOWNLOAD_DOWNLOAD_RESOURCE_THROTTLE_H_
6#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_RESOURCE_THROTTLE_H_
7
8#include "base/memory/weak_ptr.h"
9#include "chrome/browser/download/download_request_limiter.h"
10#include "content/public/browser/resource_throttle.h"
11
12class GURL;
13
14// DownloadResourceThrottle is used to determine if a download should be
15// allowed. When a DownloadResourceThrottle is created it pauses the download
16// and asks the DownloadRequestLimiter if the download should be allowed. The
17// DownloadRequestLimiter notifies us asynchronously as to whether the download
18// is allowed or not. If the download is allowed the request is resumed.  If
19// the download is not allowed the request is canceled.
20
21class DownloadResourceThrottle
22    : public content::ResourceThrottle,
23      public base::SupportsWeakPtr<DownloadResourceThrottle> {
24 public:
25  DownloadResourceThrottle(DownloadRequestLimiter* limiter,
26                           int render_process_id,
27                           int render_view_id,
28                           const GURL& url,
29                           const std::string& request_method);
30
31  // content::ResourceThrottle implementation:
32  virtual void WillStartRequest(bool* defer) OVERRIDE;
33  virtual void WillRedirectRequest(const GURL& new_url, bool* defer) OVERRIDE;
34  virtual void WillProcessResponse(bool* defer) OVERRIDE;
35  virtual const char* GetNameForLogging() const OVERRIDE;
36
37 private:
38  virtual ~DownloadResourceThrottle();
39
40  void WillDownload(bool* defer);
41  void ContinueDownload(bool allow);
42
43  // Set to true when we are querying the DownloadRequestLimiter.
44  bool querying_limiter_;
45
46  // Set to true when we know that the request is allowed to start.
47  bool request_allowed_;
48
49  // Set to true when we have deferred the request.
50  bool request_deferred_;
51
52  DISALLOW_COPY_AND_ASSIGN(DownloadResourceThrottle);
53};
54
55#endif  // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_RESOURCE_THROTTLE_H_
56