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_NET_CHROME_URL_REQUEST_CONTEXT_H_
6#define CHROME_BROWSER_NET_CHROME_URL_REQUEST_CONTEXT_H_
7
8#include <string>
9
10#include "base/memory/scoped_ptr.h"
11#include "chrome/browser/custom_handlers/protocol_handler_registry.h"
12#include "net/url_request/url_request_context.h"
13#include "net/url_request/url_request_context_getter.h"
14#include "net/url_request/url_request_job_factory.h"
15
16class ChromeURLRequestContextFactory;
17class IOThread;
18class Profile;
19class ProfileIOData;
20struct StoragePartitionDescriptor;
21
22namespace chrome_browser_net {
23class LoadTimeStats;
24}
25
26// Subclass of net::URLRequestContext which can be used to store extra
27// information for requests.
28//
29// All methods of this class must be called from the IO thread,
30// including the constructor and destructor.
31class ChromeURLRequestContext : public net::URLRequestContext {
32 public:
33  enum ContextType {
34    CONTEXT_TYPE_MAIN,
35    CONTEXT_TYPE_MEDIA,
36    CONTEXT_TYPE_EXTENSIONS,
37    CONTEXT_TYPE_APP
38  };
39  ChromeURLRequestContext(ContextType type,
40                          chrome_browser_net::LoadTimeStats* load_time_stats);
41  virtual ~ChromeURLRequestContext();
42
43  base::WeakPtr<ChromeURLRequestContext> GetWeakPtr() {
44    return weak_factory_.GetWeakPtr();
45  }
46
47  // Copies the state from |other| into this context.
48  void CopyFrom(ChromeURLRequestContext* other);
49
50 private:
51  base::WeakPtrFactory<ChromeURLRequestContext> weak_factory_;
52
53  // ---------------------------------------------------------------------------
54  // Important: When adding any new members below, consider whether they need to
55  // be added to CopyFrom.
56  // ---------------------------------------------------------------------------
57
58  chrome_browser_net::LoadTimeStats* load_time_stats_;
59
60  // ---------------------------------------------------------------------------
61  // Important: When adding any new members above, consider whether they need to
62  // be added to CopyFrom.
63  // ---------------------------------------------------------------------------
64
65  DISALLOW_COPY_AND_ASSIGN(ChromeURLRequestContext);
66};
67
68// A net::URLRequestContextGetter subclass used by the browser. This returns a
69// subclass of net::URLRequestContext which can be used to store extra
70// information about requests.
71//
72// Most methods are expected to be called on the UI thread, except for
73// the destructor and GetURLRequestContext().
74class ChromeURLRequestContextGetter : public net::URLRequestContextGetter {
75 public:
76  // Constructs a ChromeURLRequestContextGetter that will use |factory| to
77  // create the ChromeURLRequestContext.
78  explicit ChromeURLRequestContextGetter(
79      ChromeURLRequestContextFactory* factory);
80
81  // Note that GetURLRequestContext() can only be called from the IO
82  // thread (it will assert otherwise).
83  // GetIOMessageLoopProxy however can be called from any thread.
84  //
85  // net::URLRequestContextGetter implementation.
86  virtual ChromeURLRequestContext* GetURLRequestContext() OVERRIDE;
87  virtual scoped_refptr<base::SingleThreadTaskRunner>
88      GetNetworkTaskRunner() const OVERRIDE;
89
90  // Create an instance for use with an 'original' (non-OTR) profile. This is
91  // expected to get called on the UI thread.
92  static ChromeURLRequestContextGetter* Create(
93      Profile* profile,
94      const ProfileIOData* profile_io_data,
95      content::ProtocolHandlerMap* protocol_handlers);
96
97  // Create an instance for an original profile for media. This is expected to
98  // get called on UI thread. This method takes a profile and reuses the
99  // 'original' net::URLRequestContext for common files.
100  static ChromeURLRequestContextGetter* CreateForMedia(
101      Profile* profile, const ProfileIOData* profile_io_data);
102
103  // Create an instance for an original profile for extensions. This is expected
104  // to get called on UI thread.
105  static ChromeURLRequestContextGetter* CreateForExtensions(
106      Profile* profile, const ProfileIOData* profile_io_data);
107
108  // Create an instance for an original profile for an app with isolated
109  // storage. This is expected to get called on UI thread.
110  static ChromeURLRequestContextGetter* CreateForIsolatedApp(
111      Profile* profile,
112      const ProfileIOData* profile_io_data,
113      const StoragePartitionDescriptor& partition_descriptor,
114      scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory>
115          protocol_handler_interceptor,
116      content::ProtocolHandlerMap* protocol_handlers);
117
118  // Create an instance for an original profile for media with isolated
119  // storage. This is expected to get called on UI thread.
120  static ChromeURLRequestContextGetter* CreateForIsolatedMedia(
121      Profile* profile,
122      ChromeURLRequestContextGetter* app_context,
123      const ProfileIOData* profile_io_data,
124      const StoragePartitionDescriptor& partition_descriptor);
125
126 private:
127  virtual ~ChromeURLRequestContextGetter();
128
129  // Deferred logic for creating a ChromeURLRequestContext.
130  // Access only from the IO thread.
131  scoped_ptr<ChromeURLRequestContextFactory> factory_;
132
133  // NULL if not yet initialized. Otherwise, it is the ChromeURLRequestContext
134  // instance that was lazily created by GetURLRequestContext().
135  // Access only from the IO thread.
136  base::WeakPtr<ChromeURLRequestContext> url_request_context_;
137
138  DISALLOW_COPY_AND_ASSIGN(ChromeURLRequestContextGetter);
139};
140
141#endif  // CHROME_BROWSER_NET_CHROME_URL_REQUEST_CONTEXT_H_
142