2015-02-14 00:17:08 +01:00
|
|
|
// Copyright (c) 2015 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.
|
|
|
|
|
|
|
|
#include "libcef/browser/browser_context.h"
|
|
|
|
#include "libcef/browser/content_browser_client.h"
|
2015-07-16 23:40:01 +02:00
|
|
|
#include "libcef/browser/extensions/extension_system.h"
|
2015-10-17 02:44:00 +02:00
|
|
|
#include "libcef/browser/thread_util.h"
|
2015-07-16 23:40:01 +02:00
|
|
|
#include "libcef/common/extensions/extensions_util.h"
|
2015-02-14 00:17:08 +01:00
|
|
|
|
|
|
|
#include "base/logging.h"
|
2015-10-17 02:44:00 +02:00
|
|
|
#include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h"
|
2015-02-14 00:17:08 +01:00
|
|
|
#include "components/keyed_service/content/browser_context_dependency_manager.h"
|
|
|
|
#include "components/user_prefs/user_prefs.h"
|
|
|
|
#include "content/public/browser/browser_thread.h"
|
2015-10-17 02:44:00 +02:00
|
|
|
#include "content/public/browser/storage_partition.h"
|
2015-02-14 00:17:08 +01:00
|
|
|
|
2016-08-31 13:25:56 +02:00
|
|
|
CefBrowserContext::CefBrowserContext(bool is_proxy)
|
|
|
|
: is_proxy_(is_proxy),
|
|
|
|
extension_system_(NULL) {
|
2015-02-14 00:17:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
CefBrowserContext::~CefBrowserContext() {
|
2015-10-17 02:44:00 +02:00
|
|
|
// Should be cleared in Shutdown().
|
|
|
|
DCHECK(!resource_context_.get());
|
2015-02-14 00:17:08 +01:00
|
|
|
}
|
|
|
|
|
2015-07-16 23:40:01 +02:00
|
|
|
void CefBrowserContext::Initialize() {
|
2016-03-16 03:55:59 +01:00
|
|
|
content::BrowserContext::Initialize(this, GetPath());
|
|
|
|
|
2015-07-16 23:40:01 +02:00
|
|
|
const bool extensions_enabled = extensions::ExtensionsEnabled();
|
|
|
|
if (extensions_enabled) {
|
|
|
|
// Create the custom ExtensionSystem first because other KeyedServices
|
|
|
|
// depend on it.
|
2016-08-24 11:28:52 +02:00
|
|
|
// The same CefExtensionSystem instance is shared by CefBrowserContextImpl
|
|
|
|
// and CefBrowserContextProxy objects.
|
2015-07-16 23:40:01 +02:00
|
|
|
extension_system_ = static_cast<extensions::CefExtensionSystem*>(
|
|
|
|
extensions::ExtensionSystem::Get(this));
|
2016-08-31 13:25:56 +02:00
|
|
|
if (is_proxy_) {
|
|
|
|
DCHECK(extension_system_->initialized());
|
|
|
|
} else {
|
2016-08-24 11:28:52 +02:00
|
|
|
extension_system_->InitForRegularProfile(true);
|
2016-08-31 13:25:56 +02:00
|
|
|
}
|
2015-07-16 23:40:01 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
resource_context_.reset(new CefResourceContext(
|
|
|
|
IsOffTheRecord(),
|
2015-09-25 13:59:30 +02:00
|
|
|
extensions_enabled ? extension_system_->info_map() : NULL,
|
|
|
|
GetHandler()));
|
2015-07-16 23:40:01 +02:00
|
|
|
|
|
|
|
BrowserContextDependencyManager::GetInstance()->CreateBrowserContextServices(
|
|
|
|
this);
|
|
|
|
|
|
|
|
// Spell checking support and possibly other subsystems retrieve the
|
|
|
|
// PrefService associated with a BrowserContext via UserPrefs::Get().
|
2015-09-09 16:05:39 +02:00
|
|
|
PrefService* pref_service = GetPrefs();
|
2015-07-16 23:40:01 +02:00
|
|
|
DCHECK(pref_service);
|
|
|
|
user_prefs::UserPrefs::Set(this, pref_service);
|
|
|
|
|
2016-08-31 13:25:56 +02:00
|
|
|
if (extensions_enabled && !is_proxy_)
|
2015-07-16 23:40:01 +02:00
|
|
|
extension_system_->Init();
|
|
|
|
}
|
|
|
|
|
2015-10-17 02:44:00 +02:00
|
|
|
void CefBrowserContext::Shutdown() {
|
|
|
|
CEF_REQUIRE_UIT();
|
|
|
|
|
2016-08-04 14:37:53 +02:00
|
|
|
// Send notifications to clean up objects associated with this Profile.
|
|
|
|
MaybeSendDestroyedNotification();
|
|
|
|
|
2016-08-31 13:25:56 +02:00
|
|
|
// Remove any BrowserContextKeyedServiceFactory associations. This must be
|
|
|
|
// called before the ProxyService owned by CefBrowserContextImpl is destroyed.
|
|
|
|
BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices(
|
|
|
|
this);
|
|
|
|
|
|
|
|
if (!is_proxy_) {
|
|
|
|
// Shuts down the storage partitions associated with this browser context.
|
|
|
|
// This must be called before the browser context is actually destroyed
|
|
|
|
// and before a clean-up task for its corresponding IO thread residents
|
|
|
|
// (e.g. ResourceContext) is posted, so that the classes that hung on
|
|
|
|
// StoragePartition can have time to do necessary cleanups on IO thread.
|
|
|
|
ShutdownStoragePartitions();
|
|
|
|
}
|
|
|
|
|
2015-10-17 02:44:00 +02:00
|
|
|
if (resource_context_.get()) {
|
|
|
|
// Destruction of the ResourceContext will trigger destruction of all
|
|
|
|
// associated URLRequests.
|
|
|
|
content::BrowserThread::DeleteSoon(
|
|
|
|
content::BrowserThread::IO, FROM_HERE, resource_context_.release());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-02-14 00:17:08 +01:00
|
|
|
content::ResourceContext* CefBrowserContext::GetResourceContext() {
|
|
|
|
return resource_context_.get();
|
|
|
|
}
|
2015-10-17 02:44:00 +02:00
|
|
|
|
2016-05-25 01:35:43 +02:00
|
|
|
net::URLRequestContextGetter* CefBrowserContext::GetRequestContext() {
|
|
|
|
CEF_REQUIRE_UIT();
|
|
|
|
return GetDefaultStoragePartition(this)->GetURLRequestContext();
|
|
|
|
}
|
|
|
|
|
|
|
|
net::URLRequestContextGetter* CefBrowserContext::CreateMediaRequestContext() {
|
|
|
|
return GetRequestContext();
|
|
|
|
}
|
|
|
|
|
|
|
|
net::URLRequestContextGetter*
|
|
|
|
CefBrowserContext::CreateMediaRequestContextForStoragePartition(
|
|
|
|
const base::FilePath& partition_path,
|
|
|
|
bool in_memory) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
2015-10-17 02:44:00 +02:00
|
|
|
ChromeZoomLevelPrefs* CefBrowserContext::GetZoomLevelPrefs() {
|
|
|
|
return static_cast<ChromeZoomLevelPrefs*>(
|
|
|
|
GetStoragePartition(this, NULL)->GetZoomLevelDelegate());
|
|
|
|
}
|
2016-10-17 20:14:44 +02:00
|
|
|
|
|
|
|
void CefBrowserContext::OnRenderFrameDeleted(int render_process_id,
|
|
|
|
int render_frame_id,
|
|
|
|
bool is_main_frame,
|
|
|
|
bool is_guest_view) {
|
2017-02-14 23:27:19 +01:00
|
|
|
CEF_REQUIRE_UIT();
|
2016-10-17 20:14:44 +02:00
|
|
|
if (resource_context_ && is_main_frame) {
|
|
|
|
DCHECK_GE(render_process_id, 0);
|
2017-02-14 23:27:19 +01:00
|
|
|
// Using base::Unretained() is safe because both this callback and possible
|
|
|
|
// deletion of |resource_context_| will execute on the IO thread, and this
|
|
|
|
// callback will be executed first.
|
|
|
|
CEF_POST_TASK(CEF_IOT,
|
|
|
|
base::Bind(&CefResourceContext::ClearPluginLoadDecision,
|
|
|
|
base::Unretained(resource_context_.get()),
|
|
|
|
render_process_id));
|
2016-10-17 20:14:44 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-02-14 23:27:19 +01:00
|
|
|
void CefBrowserContext::OnPurgePluginListCache() {
|
|
|
|
CEF_REQUIRE_UIT();
|
|
|
|
if (resource_context_) {
|
|
|
|
// Using base::Unretained() is safe because both this callback and possible
|
|
|
|
// deletion of |resource_context_| will execute on the IO thread, and this
|
|
|
|
// callback will be executed first.
|
|
|
|
CEF_POST_TASK(CEF_IOT,
|
|
|
|
base::Bind(&CefResourceContext::ClearPluginLoadDecision,
|
|
|
|
base::Unretained(resource_context_.get()), -1));
|
|
|
|
}
|
2016-10-17 20:14:44 +02:00
|
|
|
}
|