blob: b17941e5891a3abd1fe4a6577abda1a4de935b56 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_NET_CHROME_URL_REQUEST_CONTEXT_GETTER_H_
#define CHROME_BROWSER_NET_CHROME_URL_REQUEST_CONTEXT_GETTER_H_
#include <memory>
#include <string>
#include "base/macros.h"
#include "base/single_thread_task_runner.h"
#include "chrome/browser/custom_handlers/protocol_handler_registry.h"
#include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_context_getter.h"
#include "net/url_request/url_request_job_factory.h"
#include "services/network/public/mojom/network_context.mojom.h"
class ChromeURLRequestContextFactory;
class Profile;
class ProfileIOData;
struct StoragePartitionDescriptor;
// A net::URLRequestContextGetter subclass used by the browser. This returns a
// subclass of net::URLRequestContext which can be used to store extra
// information about requests.
//
// Most methods are expected to be called on the UI thread, except for
// the destructor and GetURLRequestContext().
class ChromeURLRequestContextGetter : public net::URLRequestContextGetter {
public:
// Note that GetURLRequestContext() can only be called from the IO
// thread (it will assert otherwise).
// GetIOTaskRunner however can be called from any thread.
//
// net::URLRequestContextGetter implementation.
net::URLRequestContext* GetURLRequestContext() override;
scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner()
const override;
// Create an instance for use with an 'original' (non-OTR) profile. This is
// expected to get called on the UI thread.
static scoped_refptr<ChromeURLRequestContextGetter> Create(
Profile* profile,
const ProfileIOData* profile_io_data,
content::ProtocolHandlerMap* protocol_handlers,
content::URLRequestInterceptorScopedVector request_interceptors);
// Create an instance for an original profile for media. This is expected to
// get called on UI thread. This method takes a profile and reuses the
// 'original' net::URLRequestContext for common files.
static scoped_refptr<ChromeURLRequestContextGetter> CreateForMedia(
Profile* profile,
const ProfileIOData* profile_io_data);
// Create an instance for an original profile for an app with isolated
// storage. This is expected to get called on UI thread.
static scoped_refptr<ChromeURLRequestContextGetter> CreateForIsolatedApp(
Profile* profile,
const ProfileIOData* profile_io_data,
const StoragePartitionDescriptor& partition_descriptor,
std::unique_ptr<ProtocolHandlerRegistry::JobInterceptorFactory>
protocol_handler_interceptor,
content::ProtocolHandlerMap* protocol_handlers,
content::URLRequestInterceptorScopedVector request_interceptors,
network::mojom::NetworkContextRequest network_context_request,
network::mojom::NetworkContextParamsPtr network_context_params);
// Create an instance for an original profile for media with isolated
// storage. This is expected to get called on UI thread.
static scoped_refptr<ChromeURLRequestContextGetter> CreateForIsolatedMedia(
Profile* profile,
ChromeURLRequestContextGetter* app_context,
const ProfileIOData* profile_io_data,
const StoragePartitionDescriptor& partition_descriptor);
// Discard reference to URLRequestContext and inform observers of shutdown.
// Must be called before destruction. May only be called on IO thread.
void NotifyContextShuttingDown();
private:
ChromeURLRequestContextGetter();
~ChromeURLRequestContextGetter() override;
// Called on IO thread. Calls |factory's| Create method and populates
// |url_request_context_|, which is actually owned by the ProfileIOData.
void Init(std::unique_ptr<ChromeURLRequestContextFactory> factory);
// Should be used instead of constructor. Both creates object and triggers
// initialization on the IO thread.
static scoped_refptr<ChromeURLRequestContextGetter> CreateAndInit(
std::unique_ptr<ChromeURLRequestContextFactory> factory);
// NULL before initialization and after invalidation.
// Otherwise, it is the URLRequestContext instance that was created by the
// |factory| used by Init(). The object is owned by the ProfileIOData.
// Access only from the IO thread.
net::URLRequestContext* url_request_context_;
DISALLOW_COPY_AND_ASSIGN(ChromeURLRequestContextGetter);
};
#endif // CHROME_BROWSER_NET_CHROME_URL_REQUEST_CONTEXT_GETTER_H_