diff --git a/cef3/libcef/browser/browser_host_impl.cc b/cef3/libcef/browser/browser_host_impl.cc index f5d7c2656..dc99093a7 100644 --- a/cef3/libcef/browser/browser_host_impl.cc +++ b/cef3/libcef/browser/browser_host_impl.cc @@ -265,6 +265,9 @@ CefRefPtr CefBrowserHost::CreateBrowserSync( // CefBrowserHostImpl static methods. // ----------------------------------------------------------------------------- +CefBrowserHostImpl::~CefBrowserHostImpl() { +} + // static CefRefPtr CefBrowserHostImpl::Create( const CefWindowInfo& window_info, diff --git a/cef3/libcef/browser/browser_host_impl.h b/cef3/libcef/browser/browser_host_impl.h index 8b4e7b9ba..8724a6d9c 100644 --- a/cef3/libcef/browser/browser_host_impl.h +++ b/cef3/libcef/browser/browser_host_impl.h @@ -70,7 +70,7 @@ class CefBrowserHostImpl : public CefBrowserHost, virtual void OnResponse(const std::string& response) =0; }; - virtual ~CefBrowserHostImpl() {} + virtual ~CefBrowserHostImpl(); // Create a new CefBrowserHostImpl instance. static CefRefPtr Create( diff --git a/cef3/libcef/browser/url_request_context_getter.cc b/cef3/libcef/browser/url_request_context_getter.cc index 4c0a1be7e..9c45ca434 100644 --- a/cef3/libcef/browser/url_request_context_getter.cc +++ b/cef3/libcef/browser/url_request_context_getter.cc @@ -141,6 +141,7 @@ CefURLRequestContextGetter::CefURLRequestContextGetter( } CefURLRequestContextGetter::~CefURLRequestContextGetter() { + CEF_REQUIRE_IOT(); STLDeleteElements(&url_request_context_proxies_); } diff --git a/cef3/libcef/browser/url_request_context_getter.h b/cef3/libcef/browser/url_request_context_getter.h index 8d4d51235..1bffe4568 100644 --- a/cef3/libcef/browser/url_request_context_getter.h +++ b/cef3/libcef/browser/url_request_context_getter.h @@ -28,6 +28,45 @@ class URLRequestJobFactory; class URLSecurityManager; } +// Classes used in network request processing: +// +// RC = net::URLRequestContext +// Owns various network-related objects including the global cookie manager. +// +// RCP = CefURLRequestContextProxy +// Creates the CSP and forwards requests to the objects owned by RC. +// +// CSP = CefCookieStoreProxy +// Gives the CefCookieManager associated with CefBrowserHostImpl an +// opportunity to handle cookie requests. Otherwise forwards requests via RC +// to the global cookie manager. +// +// RCG = CefURLRequestContextGetter +// Creates the RC and manages RCP lifespan. +// +// RCGP = CefURLRequestContextGetterProxy +// Causes the RCG to create and destroy browser-specific RCPs. +// +// Relationship diagram: +// ref = reference (scoped_refptr) +// own = ownership (scoped_ptr) +// ptr = raw pointer +// +// global cookie manager, etc... +// ^ +// | +// /-own-> RC <-ptr-\ +// / \ +// / /<-ptr-\ \ +// / / \ \ +// CefBrowserContext -ref-> RCG --own-> RCP --ref-> CSP +// ^ ^ / +// ref ptr / +// | / / +// CefBrowserHostImpl -ref-> RCGP----/ / +// ^ / +// \-ref--------------------------/ + class CefURLRequestContextGetter : public net::URLRequestContextGetter { public: CefURLRequestContextGetter( diff --git a/cef3/libcef/browser/url_request_context_getter_proxy.cc b/cef3/libcef/browser/url_request_context_getter_proxy.cc index 4284ffaf8..866f05010 100644 --- a/cef3/libcef/browser/url_request_context_getter_proxy.cc +++ b/cef3/libcef/browser/url_request_context_getter_proxy.cc @@ -3,125 +3,10 @@ // be found in the LICENSE file. #include "libcef/browser/url_request_context_getter_proxy.h" - -#include - -#include "libcef/browser/browser_host_impl.h" -#include "libcef/browser/cookie_manager_impl.h" #include "libcef/browser/thread_util.h" #include "libcef/browser/url_request_context_getter.h" #include "libcef/browser/url_request_context_proxy.h" -#include "base/logging.h" -#include "base/message_loop_proxy.h" -#include "net/cookies/cookie_store.h" -#include "net/url_request/url_request_context.h" - -namespace { - -class CefCookieStoreProxy : public net::CookieStore { - public: - explicit CefCookieStoreProxy(CefBrowserHostImpl* browser, - net::URLRequestContext* parent) - : parent_(parent), - browser_(browser) { - } - - // net::CookieStore methods. - virtual void SetCookieWithOptionsAsync( - const GURL& url, - const std::string& cookie_line, - const net::CookieOptions& options, - const SetCookiesCallback& callback) OVERRIDE { - scoped_refptr cookie_store = GetCookieStore(); - cookie_store->SetCookieWithOptionsAsync(url, cookie_line, options, - callback); - } - - virtual void GetCookiesWithOptionsAsync( - const GURL& url, const net::CookieOptions& options, - const GetCookiesCallback& callback) OVERRIDE { - scoped_refptr cookie_store = GetCookieStore(); - cookie_store->GetCookiesWithOptionsAsync(url, options, callback); - } - - void GetCookiesWithInfoAsync( - const GURL& url, - const net::CookieOptions& options, - const GetCookieInfoCallback& callback) OVERRIDE { - scoped_refptr cookie_store = GetCookieStore(); - cookie_store->GetCookiesWithInfoAsync(url, options, callback); - } - - virtual void DeleteCookieAsync(const GURL& url, - const std::string& cookie_name, - const base::Closure& callback) OVERRIDE { - scoped_refptr cookie_store = GetCookieStore(); - cookie_store->DeleteCookieAsync(url, cookie_name, callback); - } - - virtual void DeleteAllCreatedBetweenAsync(const base::Time& delete_begin, - const base::Time& delete_end, - const DeleteCallback& callback) - OVERRIDE { - scoped_refptr cookie_store = GetCookieStore(); - cookie_store->DeleteAllCreatedBetweenAsync(delete_begin, delete_end, - callback); - } - - virtual void DeleteSessionCookiesAsync(const DeleteCallback& callback) - OVERRIDE { - scoped_refptr cookie_store = GetCookieStore(); - cookie_store->DeleteSessionCookiesAsync(callback); - } - - virtual net::CookieMonster* GetCookieMonster() OVERRIDE { - scoped_refptr cookie_store = GetCookieStore(); - return cookie_store->GetCookieMonster(); - } - - private: - net::CookieStore* GetCookieStore() { - CEF_REQUIRE_IOT(); - - scoped_refptr cookie_store; - - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetRequestHandler(); - if (handler.get()) { - // Get the manager from the handler. - CefRefPtr manager = - handler->GetCookieManager(browser_, - browser_->GetLoadingURL().spec()); - if (manager.get()) { - cookie_store = - reinterpret_cast( - manager.get())->cookie_monster(); - DCHECK(cookie_store); - } - } - } - - if (!cookie_store) { - // Use the global cookie store. - cookie_store = parent_->cookie_store(); - } - - DCHECK(cookie_store); - return cookie_store; - } - - // This pointer is guaranteed by the CefRequestContextProxy object. - net::URLRequestContext* parent_; - CefBrowserHostImpl* browser_; - - DISALLOW_COPY_AND_ASSIGN(CefCookieStoreProxy); -}; - -} // namespace - - CefURLRequestContextGetterProxy::CefURLRequestContextGetterProxy( CefBrowserHostImpl* browser, CefURLRequestContextGetter* parent) @@ -133,6 +18,7 @@ CefURLRequestContextGetterProxy::CefURLRequestContextGetterProxy( } CefURLRequestContextGetterProxy::~CefURLRequestContextGetterProxy() { + CEF_REQUIRE_IOT(); if (context_proxy_) parent_->ReleaseURLRequestContextProxy(context_proxy_); } diff --git a/cef3/libcef/browser/url_request_context_proxy.cc b/cef3/libcef/browser/url_request_context_proxy.cc index c2fa68093..3accc9eef 100644 --- a/cef3/libcef/browser/url_request_context_proxy.cc +++ b/cef3/libcef/browser/url_request_context_proxy.cc @@ -24,6 +24,9 @@ class CefCookieStoreProxy : public net::CookieStore { : parent_(parent), browser_(browser) { } + virtual ~CefCookieStoreProxy() { + CEF_REQUIRE_IOT(); + } // net::CookieStore methods. virtual void SetCookieWithOptionsAsync( @@ -90,7 +93,7 @@ class CefCookieStoreProxy : public net::CookieStore { if (handler.get()) { // Get the manager from the handler. CefRefPtr manager = - handler->GetCookieManager(browser_, + handler->GetCookieManager(browser_.get(), browser_->GetLoadingURL().spec()); if (manager.get()) { cookie_store = @@ -112,7 +115,7 @@ class CefCookieStoreProxy : public net::CookieStore { // This pointer is guaranteed by the CefRequestContextProxy object. net::URLRequestContext* parent_; - CefBrowserHostImpl* browser_; + CefRefPtr browser_; DISALLOW_COPY_AND_ASSIGN(CefCookieStoreProxy); }; @@ -127,6 +130,7 @@ CefURLRequestContextProxy::CefURLRequestContextProxy( } CefURLRequestContextProxy::~CefURLRequestContextProxy() { + CEF_REQUIRE_IOT(); } const std::string& CefURLRequestContextProxy::GetUserAgent(const GURL& url) const {