#ifndef IOS_COMPONENTS_IO_THREAD_IOS_IO_THREAD_H_
#define IOS_COMPONENTS_IO_THREAD_IOS_IO_THREAD_H_
#include <stddef.h>
#include <stdint.h>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <vector>
#import "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "components/prefs/pref_member.h"
#include "ios/web/public/thread/web_thread_delegate.h"
#include "net/base/network_change_notifier.h"
#include "net/http/http_network_session.h"
class PrefProxyConfigTracker;
class PrefService;
namespace net {
class HttpAuthHandlerFactory;
class HttpAuthPreferences;
class LoggingNetworkChangeObserver;
class NetLog;
class NetworkDelegate;
class ProxyConfigService;
class URLRequestContext;
class URLRequestContextGetter;
}
namespace io_thread {
class SystemURLRequestContextGetter;
class IOSIOThread : public web::WebThreadDelegate {
public:
struct Globals {
template <typename T>
class Optional {
public:
Optional() : set_(false) {}
void set(T value) {
set_ = true;
value_ = value;
}
void CopyToIfSet(T* value) const {
if (set_) {
*value = value_;
}
}
private:
bool set_;
T value_;
};
class SystemRequestContextLeakChecker {
public:
explicit SystemRequestContextLeakChecker(Globals* globals);
~SystemRequestContextLeakChecker();
private:
const raw_ptr<Globals> globals_;
};
Globals();
~Globals();
std::unique_ptr<net::HttpAuthPreferences> http_auth_preferences;
std::unique_ptr<net::URLRequestContext> system_request_context;
SystemRequestContextLeakChecker system_request_context_leak_checker;
};
IOSIOThread(PrefService* local_state, net::NetLog* net_log);
IOSIOThread(const IOSIOThread&) = delete;
IOSIOThread& operator=(const IOSIOThread&) = delete;
~IOSIOThread() override;
void InitOnIO();
Globals* globals();
net::NetLog* net_log();
void ChangedToOnTheRecord();
net::URLRequestContextGetter* system_url_request_context_getter();
void ClearHostCache();
const net::HttpNetworkSessionParams& NetworkSessionParams() const;
const net::QuicParams& quic_params() const { return quic_params_; }
std::unique_ptr<net::HttpAuthHandlerFactory> CreateHttpAuthHandlerFactory();
protected:
virtual std::string GetChannelString() const = 0;
virtual std::unique_ptr<net::NetworkDelegate>
CreateSystemNetworkDelegate() = 0;
private:
friend class SystemURLRequestContextGetter;
void Init() override;
void CleanUp() override;
void CreateDefaultAuthPreferences();
void ChangedToOnTheRecordOnIOThread();
std::unique_ptr<net::URLRequestContext> ConstructSystemRequestContext();
raw_ptr<net::NetLog> net_log_;
std::unique_ptr<Globals> globals_;
net::HttpNetworkSessionParams params_;
net::QuicParams quic_params_;
std::unique_ptr<net::LoggingNetworkChangeObserver> network_change_observer_;
std::unique_ptr<net::ProxyConfigService> system_proxy_config_service_;
std::unique_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_;
scoped_refptr<SystemURLRequestContextGetter>
system_url_request_context_getter_;
base::WeakPtrFactory<IOSIOThread> weak_factory_;
};
}
#endif