mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-02-10 00:50:38 +01:00
This change removes cookie and request handler functionality that will not supported by the NetworkService. Specifically, it is no longer possible to change cookie storage locations at runime by returning a different CefCookieManager for an already initialized CefRequestContext. After this change you will need to use a separate CefRequestContext when creating a CefBrowser if you require separate cookie storage. The following methods have been removed: - CefCookieManager::CreateManager - CefCookieManager::GetBlockingManager - CefCookieManager::SetStoragePath - CefRequestContextHandler::GetCookieManager The following methods have been renamed: - CefRequestContext::GetDefaultCookieManager to GetCookieManager. This change substantially simplifies the network implementation in CEF because it is no longer necessary to proxy objects that are normally owned by Chromium. Chromium patches that are no longer necessary will be removed as a follow-up commit. To test: Verify that `ceftests --gtest_filter=-PluginTest.*` pass with NetworkService disabled. Plugin tests will be fixed in a follow-up commit.
177 lines
6.1 KiB
C++
177 lines
6.1 KiB
C++
// Copyright (c) 2015 The Chromium Embedded Framework 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/extensions/browser_extensions_util.h"
|
|
|
|
#include "libcef/browser/browser_context.h"
|
|
#include "libcef/browser/browser_info_manager.h"
|
|
#include "libcef/browser/thread_util.h"
|
|
#include "libcef/common/extensions/extensions_util.h"
|
|
|
|
#include "content/browser/browser_plugin/browser_plugin_embedder.h"
|
|
#include "content/browser/browser_plugin/browser_plugin_guest.h"
|
|
#include "content/browser/web_contents/web_contents_impl.h"
|
|
#include "content/public/browser/browser_context.h"
|
|
#include "content/public/browser/browser_plugin_guest_manager.h"
|
|
#include "extensions/browser/extension_registry.h"
|
|
|
|
namespace extensions {
|
|
|
|
namespace {
|
|
|
|
bool InsertWebContents(std::vector<content::WebContents*>* vector,
|
|
content::WebContents* web_contents) {
|
|
vector->push_back(web_contents);
|
|
return false; // Continue iterating.
|
|
}
|
|
|
|
} // namespace
|
|
|
|
content::WebContents* GetFullPageGuestForOwnerContents(
|
|
content::WebContents* owner) {
|
|
content::WebContentsImpl* owner_impl =
|
|
static_cast<content::WebContentsImpl*>(owner);
|
|
content::BrowserPluginEmbedder* plugin_embedder =
|
|
owner_impl->GetBrowserPluginEmbedder();
|
|
if (plugin_embedder) {
|
|
content::BrowserPluginGuest* plugin_guest =
|
|
plugin_embedder->GetFullPageGuest();
|
|
if (plugin_guest)
|
|
return plugin_guest->web_contents();
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void GetAllGuestsForOwnerContents(content::WebContents* owner,
|
|
std::vector<content::WebContents*>* guests) {
|
|
content::BrowserPluginGuestManager* plugin_guest_manager =
|
|
owner->GetBrowserContext()->GetGuestManager();
|
|
plugin_guest_manager->ForEachGuest(owner,
|
|
base::Bind(InsertWebContents, guests));
|
|
}
|
|
|
|
content::WebContents* GetOwnerForGuestContents(content::WebContents* guest) {
|
|
content::WebContentsImpl* guest_impl =
|
|
static_cast<content::WebContentsImpl*>(guest);
|
|
content::BrowserPluginGuest* plugin_guest =
|
|
guest_impl->GetBrowserPluginGuest();
|
|
if (plugin_guest)
|
|
return plugin_guest->embedder_web_contents();
|
|
return NULL;
|
|
}
|
|
|
|
CefRefPtr<CefBrowserHostImpl> GetOwnerBrowserForFrame(int render_process_id,
|
|
int render_routing_id,
|
|
bool* is_guest_view) {
|
|
if (CEF_CURRENTLY_ON_UIT()) {
|
|
// Use the non-thread-safe but potentially faster approach.
|
|
content::RenderFrameHost* host =
|
|
content::RenderFrameHost::FromID(render_process_id, render_routing_id);
|
|
if (host)
|
|
return GetOwnerBrowserForHost(host, is_guest_view);
|
|
return NULL;
|
|
} else {
|
|
// Use the thread-safe approach.
|
|
scoped_refptr<CefBrowserInfo> info =
|
|
CefBrowserInfoManager::GetInstance()->GetBrowserInfoForFrame(
|
|
render_process_id, render_routing_id, is_guest_view);
|
|
if (info.get()) {
|
|
CefRefPtr<CefBrowserHostImpl> browser = info->browser();
|
|
if (!browser.get()) {
|
|
LOG(WARNING) << "Found browser id " << info->browser_id()
|
|
<< " but no browser object matching view process id "
|
|
<< render_process_id << " and frame routing id "
|
|
<< render_routing_id;
|
|
}
|
|
return browser;
|
|
}
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
CefRefPtr<CefBrowserHostImpl> GetOwnerBrowserForHost(
|
|
content::RenderViewHost* host,
|
|
bool* is_guest_view) {
|
|
if (is_guest_view)
|
|
*is_guest_view = false;
|
|
|
|
CefRefPtr<CefBrowserHostImpl> browser =
|
|
CefBrowserHostImpl::GetBrowserForHost(host);
|
|
if (!browser.get() && ExtensionsEnabled()) {
|
|
// Retrieve the owner browser, if any.
|
|
content::WebContents* owner = GetOwnerForGuestContents(
|
|
content::WebContents::FromRenderViewHost(host));
|
|
if (owner) {
|
|
browser = CefBrowserHostImpl::GetBrowserForContents(owner);
|
|
if (browser.get() && is_guest_view)
|
|
*is_guest_view = true;
|
|
}
|
|
}
|
|
return browser;
|
|
}
|
|
|
|
CefRefPtr<CefBrowserHostImpl> GetOwnerBrowserForHost(
|
|
content::RenderFrameHost* host,
|
|
bool* is_guest_view) {
|
|
if (is_guest_view)
|
|
*is_guest_view = false;
|
|
|
|
CefRefPtr<CefBrowserHostImpl> browser =
|
|
CefBrowserHostImpl::GetBrowserForHost(host);
|
|
if (!browser.get() && ExtensionsEnabled()) {
|
|
// Retrieve the owner browser, if any.
|
|
content::WebContents* owner = GetOwnerForGuestContents(
|
|
content::WebContents::FromRenderFrameHost(host));
|
|
if (owner) {
|
|
browser = CefBrowserHostImpl::GetBrowserForContents(owner);
|
|
if (browser.get() && is_guest_view)
|
|
*is_guest_view = true;
|
|
}
|
|
}
|
|
return browser;
|
|
}
|
|
|
|
CefRefPtr<CefBrowserHostImpl> GetBrowserForTabId(
|
|
int tab_id,
|
|
content::BrowserContext* browser_context) {
|
|
CEF_REQUIRE_UIT();
|
|
DCHECK(browser_context);
|
|
if (tab_id < 0 || !browser_context)
|
|
return nullptr;
|
|
|
|
CefBrowserContext* browser_context_impl =
|
|
CefBrowserContext::GetForContext(browser_context);
|
|
|
|
CefBrowserInfoManager::BrowserInfoList list;
|
|
CefBrowserInfoManager::GetInstance()->GetBrowserInfoList(list);
|
|
for (auto browser_info : list) {
|
|
CefRefPtr<CefBrowserHostImpl> current_browser = browser_info->browser();
|
|
if (current_browser && current_browser->GetIdentifier() == tab_id) {
|
|
// Make sure we're operating in the same BrowserContextImpl.
|
|
if (CefBrowserContext::GetForContext(
|
|
current_browser->GetBrowserContext()) == browser_context_impl) {
|
|
return current_browser;
|
|
} else {
|
|
LOG(WARNING) << "Browser with tabId " << tab_id
|
|
<< " cannot be accessed because is uses a different "
|
|
"CefRequestContext";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
const Extension* GetExtensionForUrl(content::BrowserContext* browser_context,
|
|
const GURL& url) {
|
|
ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context);
|
|
if (!registry)
|
|
return nullptr;
|
|
std::string extension_id = url.host();
|
|
return registry->enabled_extensions().GetByID(extension_id);
|
|
}
|
|
|
|
} // namespace extensions
|