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 ANDROID_WEBVIEW_BROWSER_NET_AW_URL_REQUEST_CONTEXT_GETTER_H_
6#define ANDROID_WEBVIEW_BROWSER_NET_AW_URL_REQUEST_CONTEXT_GETTER_H_
7
8#include "base/basictypes.h"
9#include "base/compiler_specific.h"
10#include "base/memory/scoped_ptr.h"
11#include "content/public/browser/browser_thread_delegate.h"
12#include "content/public/browser/content_browser_client.h"
13#include "net/http/http_network_session.h"
14#include "net/url_request/url_request_context_getter.h"
15#include "net/url_request/url_request_job_factory.h"
16
17namespace net {
18class HttpTransactionFactory;
19class ProxyConfigService;
20class URLRequestContext;
21class URLRequestJobFactory;
22}
23
24namespace android_webview {
25
26class AwBrowserContext;
27class AwNetworkDelegate;
28
29class AwURLRequestContextGetter : public net::URLRequestContextGetter,
30                                  public content::BrowserThreadDelegate {
31 public:
32  explicit AwURLRequestContextGetter(AwBrowserContext* browser_context);
33
34  void InitializeOnNetworkThread();
35
36  // content::BrowserThreadDelegate implementation.
37  virtual void Init() OVERRIDE;
38  virtual void InitAsync() OVERRIDE;
39  virtual void CleanUp() OVERRIDE {}
40
41  // net::URLRequestContextGetter implementation.
42  virtual net::URLRequestContext* GetURLRequestContext() OVERRIDE;
43  virtual scoped_refptr<base::SingleThreadTaskRunner>
44      GetNetworkTaskRunner() const OVERRIDE;
45
46 private:
47  friend class AwBrowserContext;
48
49  virtual ~AwURLRequestContextGetter();
50
51  // Prior to GetURLRequestContext() being called, SetProtocolHandlers() is
52  // called to hand over the ProtocolHandlers that GetURLRequestContext() will
53  // later install into |job_factory_|.  This ordering is enforced by having
54  // AwBrowserContext::CreateRequestContext() call SetProtocolHandlers().
55  // SetProtocolHandlers() is necessary because the ProtocolHandlers are created
56  // on the UI thread while |job_factory_| must be created on the IO thread.
57  void SetProtocolHandlers(content::ProtocolHandlerMap* protocol_handlers);
58
59  void PopulateNetworkSessionParams(net::HttpNetworkSession::Params* params);
60
61  AwBrowserContext* browser_context_;  // weak
62  scoped_refptr<net::CookieStore> cookie_store_;
63  scoped_ptr<net::URLRequestContext> url_request_context_;
64  scoped_ptr<net::ProxyConfigService> proxy_config_service_;
65  scoped_ptr<net::URLRequestJobFactory> job_factory_;
66  scoped_ptr<net::HttpTransactionFactory> main_http_factory_;
67
68  // ProtocolHandlers are stored here between SetProtocolHandlers() and the
69  // first GetURLRequestContext() call.
70  content::ProtocolHandlerMap protocol_handlers_;
71
72  DISALLOW_COPY_AND_ASSIGN(AwURLRequestContextGetter);
73};
74
75}  // namespace android_webview
76
77#endif  // ANDROID_WEBVIEW_BROWSER_NET_AW_URL_REQUEST_CONTEXT_GETTER_H_
78