blob: 94585a5c8d4b8d31be96715fd4f208d2a679a667 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/shared/model/profile/profile_ios.h"
#import <memory>
#import <utility>
#import "base/check_op.h"
#import "base/files/file_path.h"
#import "base/task/sequenced_task_runner.h"
#import "components/sync_preferences/pref_service_syncable.h"
#import "components/variations/net/variations_http_headers.h"
#import "ios/chrome/browser/shared/model/url/chrome_url_constants.h"
#import "ios/components/webui/web_ui_url_constants.h"
#import "ios/web/public/web_state.h"
#import "ios/web/public/webui/web_ui_ios.h"
#import "ios/web/webui/url_data_manager_ios_backend.h"
#import "net/url_request/url_request_context_getter.h"
#import "net/url_request/url_request_interceptor.h"
namespace {
// All ProfileIOS will store a dummy base::SupportsUserData::Data
// object with this key. It can be used to check that a web::BrowserState
// is effectively a ProfileIOS when converting.
const char kBrowserStateIsProfileIOS[] = "IsProfileIOS";
} // namespace
ProfileIOS::ProfileIOS(const base::FilePath& state_path,
std::string_view profile_name,
scoped_refptr<base::SequencedTaskRunner> io_task_runner)
: state_path_(state_path),
profile_name_(profile_name),
io_task_runner_(std::move(io_task_runner)) {
DCHECK(io_task_runner_);
DCHECK(!state_path_.empty());
SetUserData(kBrowserStateIsProfileIOS,
std::make_unique<base::SupportsUserData::Data>());
}
ProfileIOS::~ProfileIOS() {
CHECK(profile_destroyed_callbacks_.empty());
}
// static
ProfileIOS* ProfileIOS::FromBrowserState(web::BrowserState* browser_state) {
if (!browser_state) {
return nullptr;
}
// Check that the BrowserState is a ProfileIOS. It should always
// be true in production and during tests as the only BrowserState that
// should be used in ios/chrome inherits from ProfileIOS.
DCHECK(browser_state->GetUserData(kBrowserStateIsProfileIOS));
ProfileIOS* profile = static_cast<ProfileIOS*>(browser_state);
DCHECK_CALLED_ON_VALID_SEQUENCE(profile->sequence_checker_);
return profile;
}
// static
ProfileIOS* ProfileIOS::FromWebUIIOS(web::WebUIIOS* web_ui) {
return FromBrowserState(web_ui->GetWebState()->GetBrowserState());
}
const std::string& ProfileIOS::GetProfileName() const {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return profile_name_;
}
scoped_refptr<base::SequencedTaskRunner> ProfileIOS::GetIOTaskRunner() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return io_task_runner_;
}
PrefService* ProfileIOS::GetPrefs() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return GetSyncablePrefs();
}
const PrefService* ProfileIOS::GetPrefs() const {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return GetSyncablePrefs();
}
base::FilePath ProfileIOS::GetOffTheRecordStatePath() const {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (IsOffTheRecord()) {
return state_path_;
}
return state_path_.Append(FILE_PATH_LITERAL("OTR"));
}
base::FilePath ProfileIOS::GetStatePath() const {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return state_path_;
}
net::URLRequestContextGetter* ProfileIOS::GetRequestContext() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (!request_context_getter_) {
ProtocolHandlerMap protocol_handlers;
protocol_handlers[kChromeUIScheme] =
web::URLDataManagerIOSBackend::CreateProtocolHandler(this);
request_context_getter_ =
base::WrapRefCounted(CreateRequestContext(&protocol_handlers));
}
return request_context_getter_.get();
}
void ProfileIOS::UpdateCorsExemptHeader(
network::mojom::NetworkContextParams* params) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
variations::UpdateCorsExemptHeaderForVariations(params);
}
base::CallbackListSubscription ProfileIOS::RegisterProfileDestroyedCallback(
base::OnceClosure closure) {
return profile_destroyed_callbacks_.Add(std::move(closure));
}
void ProfileIOS::NotifyProfileDestroyed() {
profile_destroyed_callbacks_.Notify();
CHECK(profile_destroyed_callbacks_.empty());
}