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 NET_URL_REQUEST_URL_REQUEST_CONTEXT_GETTER_H_
6#define NET_URL_REQUEST_URL_REQUEST_CONTEXT_GETTER_H_
7
8#include "base/memory/ref_counted.h"
9#include "base/sequenced_task_runner_helpers.h"
10#include "net/base/net_export.h"
11
12namespace base {
13class SingleThreadTaskRunner;
14}  // namespace base
15
16namespace net {
17class CookieStore;
18class URLRequestContext;
19
20struct URLRequestContextGetterTraits;
21
22// Interface for retrieving an net::URLRequestContext.
23class NET_EXPORT URLRequestContextGetter
24    : public base::RefCountedThreadSafe<URLRequestContextGetter,
25                                        URLRequestContextGetterTraits> {
26 public:
27  virtual URLRequestContext* GetURLRequestContext() = 0;
28
29  // Returns a SingleThreadTaskRunner corresponding to the thread on
30  // which the network IO happens (the thread on which the returned
31  // net::URLRequestContext may be used).
32  virtual scoped_refptr<base::SingleThreadTaskRunner>
33      GetNetworkTaskRunner() const = 0;
34
35 protected:
36  friend class base::RefCountedThreadSafe<URLRequestContextGetter,
37                                          URLRequestContextGetterTraits>;
38  friend class base::DeleteHelper<URLRequestContextGetter>;
39  friend struct URLRequestContextGetterTraits;
40
41  URLRequestContextGetter();
42  virtual ~URLRequestContextGetter();
43
44 private:
45  // OnDestruct is meant to ensure deletion on the thread on which the request
46  // IO happens.
47  void OnDestruct() const;
48};
49
50struct URLRequestContextGetterTraits {
51  static void Destruct(const URLRequestContextGetter* context_getter) {
52    context_getter->OnDestruct();
53  }
54};
55
56// For use in shimming a URLRequestContext into a URLRequestContextGetter.
57class NET_EXPORT TrivialURLRequestContextGetter
58    : public URLRequestContextGetter {
59public:
60  TrivialURLRequestContextGetter(
61      net::URLRequestContext* context,
62      const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner);
63
64  // net::URLRequestContextGetter implementation:
65  virtual net::URLRequestContext* GetURLRequestContext() OVERRIDE;
66
67  virtual scoped_refptr<base::SingleThreadTaskRunner>
68      GetNetworkTaskRunner() const OVERRIDE;
69
70private:
71  virtual ~TrivialURLRequestContextGetter();
72
73  net::URLRequestContext* context_;
74  const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
75
76  DISALLOW_COPY_AND_ASSIGN(TrivialURLRequestContextGetter);
77};
78
79}  // namespace net
80
81#endif  // NET_URL_REQUEST_URL_REQUEST_CONTEXT_GETTER_H_
82