Commit e33ea0af authored by Marshall Greenblatt's avatar Marshall Greenblatt

- Move browser object tracking from CefContext to CefContentBrowserClient and...

- Move browser object tracking from CefContext to CefContentBrowserClient and introduce a new CefBrowserInfo class to simplify ID management (issue #830).
- Add a new CefBrowser::IsSame method (issue #830).
- Improve CefRenderProcessHandler::OnBrowserCreated documentation (issue #830).
- Add a new NavigationTest.CrossOrigin test for cross-origin navigation (issue #830).
- Fix existing NavigationTest tests to run in single-process mode.

git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@963 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
parent 0605b8e8
......@@ -791,6 +791,8 @@
'libcef/browser/browser_context.h',
'libcef/browser/browser_host_impl.cc',
'libcef/browser/browser_host_impl.h',
'libcef/browser/browser_info.cc',
'libcef/browser/browser_info.h',
'libcef/browser/browser_main.cc',
'libcef/browser/browser_main.h',
'libcef/browser/browser_message_filter.cc',
......
......@@ -109,6 +109,13 @@ typedef struct _cef_browser_t {
///
int (CEF_CALLBACK *get_identifier)(struct _cef_browser_t* self);
///
// Returns true (1) if this object is pointing to the same handle as |that|
// object.
///
int (CEF_CALLBACK *is_same)(struct _cef_browser_t* self,
struct _cef_browser_t* that);
///
// Returns true (1) if the window is a popup window.
///
......
......@@ -72,7 +72,9 @@ typedef struct _cef_render_process_handler_t {
struct _cef_render_process_handler_t* self);
///
// Called after a browser has been created.
// Called after a browser has been created. When browsing cross-origin a new
// browser will be created before the old browser with the same identifier is
// destroyed.
///
void (CEF_CALLBACK *on_browser_created)(
struct _cef_render_process_handler_t* self,
......
......@@ -117,6 +117,13 @@ class CefBrowser : public virtual CefBase {
/*--cef()--*/
virtual int GetIdentifier() =0;
///
// Returns true if this object is pointing to the same handle as |that|
// object.
///
/*--cef()--*/
virtual bool IsSame(CefRefPtr<CefBrowser> that) =0;
///
// Returns true if the window is a popup window.
///
......
......@@ -71,7 +71,9 @@ class CefRenderProcessHandler : public virtual CefBase {
virtual void OnWebKitInitialized() {}
///
// Called after a browser has been created.
// Called after a browser has been created. When browsing cross-origin a new
// browser will be created before the old browser with the same identifier is
// destroyed.
///
/*--cef()--*/
virtual void OnBrowserCreated(CefRefPtr<CefBrowser> browser) {}
......
......@@ -9,6 +9,7 @@
#include <utility>
#include "libcef/browser/browser_context.h"
#include "libcef/browser/browser_info.h"
#include "libcef/browser/chrome_scheme_handler.h"
#include "libcef/browser/content_browser_client.h"
#include "libcef/browser/context.h"
......@@ -273,9 +274,11 @@ CefRefPtr<CefBrowser> CefBrowserHost::CreateBrowserSync(
_Context->browser_context()->set_use_osr_next_contents_view(
CefBrowserHostImpl::IsWindowRenderingDisabled(windowInfo));
int browser_id = _Context->GetNextBrowserID();
scoped_refptr<CefBrowserInfo> info =
CefContentBrowserClient::Get()->CreateBrowserInfo();
DCHECK(!info->is_popup());
CefRefPtr<CefBrowserHostImpl> browser =
CefBrowserHostImpl::Create(windowInfo, settings, client, NULL, browser_id,
CefBrowserHostImpl::Create(windowInfo, settings, client, NULL, info,
NULL);
if (!url.empty())
browser->LoadURL(CefFrameHostImpl::kMainFrameId, url);
......@@ -295,9 +298,13 @@ CefRefPtr<CefBrowserHostImpl> CefBrowserHostImpl::Create(
const CefBrowserSettings& settings,
CefRefPtr<CefClient> client,
content::WebContents* web_contents,
int browser_id,
scoped_refptr<CefBrowserInfo> browser_info,
CefWindowHandle opener) {
CEF_REQUIRE_UIT();
DCHECK(browser_info.get());
// If |opener| is non-NULL it must be a popup window.
DCHECK(opener == NULL || browser_info->is_popup());
if (web_contents == NULL) {
web_contents = content::WebContents::Create(
......@@ -309,7 +316,7 @@ CefRefPtr<CefBrowserHostImpl> CefBrowserHostImpl::Create(
CefRefPtr<CefBrowserHostImpl> browser =
new CefBrowserHostImpl(window_info, settings, client, web_contents,
browser_id, opener);
browser_info, opener);
if (!browser->IsWindowRenderingDisabled() &&
!browser->PlatformCreateWindow()) {
return NULL;
......@@ -327,8 +334,6 @@ CefRefPtr<CefBrowserHostImpl> CefBrowserHostImpl::Create(
}
#endif // OS_WIN
_Context->AddBrowser(browser);
if (client.get()) {
CefRefPtr<CefLifeSpanHandler> handler = client->GetLifeSpanHandler();
if (handler.get())
......@@ -784,8 +789,13 @@ int CefBrowserHostImpl::GetIdentifier() {
return browser_id();
}
bool CefBrowserHostImpl::IsSame(CefRefPtr<CefBrowser> that) {
CefBrowserHostImpl* impl = static_cast<CefBrowserHostImpl*>(that.get());
return (impl == this);
}
bool CefBrowserHostImpl::IsPopup() {
return (opener_ != NULL);
return browser_info_->is_popup();
}
bool CefBrowserHostImpl::HasDocument() {
......@@ -927,8 +937,8 @@ void CefBrowserHostImpl::DestroyBrowser() {
request_context_proxy_ = NULL;
// Remove the browser from the list maintained by the context.
_Context->RemoveBrowser(this);
CefContentBrowserClient::Get()->RemoveBrowserInfo(browser_info_);
browser_info_->set_browser(NULL);
}
gfx::NativeView CefBrowserHostImpl::GetContentView() const {
......@@ -1189,11 +1199,8 @@ void CefBrowserHostImpl::HandleExternalProtocol(const GURL& url) {
}
}
bool CefBrowserHostImpl::HasIDMatch(int render_process_id, int render_view_id) {
base::AutoLock lock_scope(state_lock_);
if (render_process_id != render_process_id_)
return false;
return (render_view_id == 0 || render_view_id == render_view_id_);
int CefBrowserHostImpl::browser_id() const {
return browser_info_->browser_id();
}
GURL CefBrowserHostImpl::GetLoadingURL() {
......@@ -1451,19 +1458,25 @@ void CefBrowserHostImpl::WebContentsCreated(
const GURL& target_url,
content::WebContents* new_contents) {
CefWindowHandle opener = NULL;
if (source_contents)
scoped_refptr<CefBrowserInfo> info;
if (source_contents) {
opener = GetBrowserForContents(source_contents)->GetWindowHandle();
CefContentBrowserClient::NewPopupBrowserInfo info;
CefContentBrowserClient::Get()->GetNewPopupBrowserInfo(
new_contents->GetRenderProcessHost()->GetID(),
new_contents->GetRoutingID(),
&info);
DCHECK_GT(info.browser_id, 0);
// Popup windows may not have info yet.
info = CefContentBrowserClient::Get()->GetOrCreateBrowserInfo(
new_contents->GetRenderProcessHost()->GetID(),
new_contents->GetRoutingID());
DCHECK(info->is_popup());
} else {
info = CefContentBrowserClient::Get()->GetBrowserInfo(
new_contents->GetRenderProcessHost()->GetID(),
new_contents->GetRoutingID());
DCHECK(!info->is_popup());
}
CefRefPtr<CefBrowserHostImpl> browser = CefBrowserHostImpl::Create(
pending_window_info_, pending_settings_, pending_client_, new_contents,
info.browser_id, opener);
info, opener);
pending_client_ = NULL;
}
......@@ -1521,7 +1534,24 @@ void CefBrowserHostImpl::RequestMediaAccessPermission(
void CefBrowserHostImpl::RenderViewCreated(
content::RenderViewHost* render_view_host) {
SetRenderViewHost(render_view_host);
// When navigating cross-origin the new (pending) RenderViewHost will be
// created before the old (current) RenderViewHost is destroyed. It may be
// necessary in the future to track both current and pending render IDs.
browser_info_->set_render_ids(render_view_host->GetProcess()->GetID(),
render_view_host->GetRoutingID());
// Update the DevTools URLs, if any.
CefDevToolsDelegate* devtools_delegate = _Context->devtools_delegate();
if (devtools_delegate) {
base::AutoLock lock_scope(state_lock_);
devtools_url_http_ =
devtools_delegate->GetDevToolsURL(render_view_host, true);
devtools_url_chrome_ =
devtools_delegate->GetDevToolsURL(render_view_host, false);
}
registrar_->Add(this, content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE,
content::Source<content::RenderViewHost>(render_view_host));
}
void CefBrowserHostImpl::RenderViewDeleted(
......@@ -1531,12 +1561,6 @@ void CefBrowserHostImpl::RenderViewDeleted(
}
void CefBrowserHostImpl::RenderViewReady() {
if (IsPopup()) {
CefContentBrowserClient::Get()->ClearNewPopupBrowserInfo(
web_contents()->GetRenderProcessHost()->GetID(),
web_contents()->GetRoutingID());
}
// Send the queued messages.
queue_messages_ = false;
while (!queued_messages_.empty()) {
......@@ -1756,20 +1780,19 @@ void CefBrowserHostImpl::Observe(int type,
// CefBrowserHostImpl private methods.
// -----------------------------------------------------------------------------
CefBrowserHostImpl::CefBrowserHostImpl(const CefWindowInfo& window_info,
const CefBrowserSettings& settings,
CefRefPtr<CefClient> client,
content::WebContents* web_contents,
int browser_id,
CefWindowHandle opener)
CefBrowserHostImpl::CefBrowserHostImpl(
const CefWindowInfo& window_info,
const CefBrowserSettings& settings,
CefRefPtr<CefClient> client,
content::WebContents* web_contents,
scoped_refptr<CefBrowserInfo> browser_info,
CefWindowHandle opener)
: content::WebContentsObserver(web_contents),
window_info_(window_info),
settings_(settings),
client_(client),
browser_id_(browser_id),
browser_info_(browser_info),
opener_(opener),
render_process_id_(MSG_ROUTING_NONE),
render_view_id_(MSG_ROUTING_NONE),
is_loading_(false),
can_go_back_(false),
can_go_forward_(false),
......@@ -1780,6 +1803,9 @@ CefBrowserHostImpl::CefBrowserHostImpl(const CefWindowInfo& window_info,
is_in_onsetfocus_(false),
focus_on_editable_field_(false),
file_chooser_pending_(false) {
DCHECK(!browser_info_->browser().get());
browser_info_->set_browser(this);
web_contents_.reset(web_contents);
web_contents->SetDelegate(this);
......@@ -1791,31 +1817,6 @@ CefBrowserHostImpl::CefBrowserHostImpl(const CefWindowInfo& window_info,
placeholder_frame_ =
new CefFrameHostImpl(this, CefFrameHostImpl::kInvalidFrameId, true);
SetRenderViewHost(web_contents->GetRenderViewHost());
}
void CefBrowserHostImpl::SetRenderViewHost(content::RenderViewHost* rvh) {
{
base::AutoLock lock_scope(state_lock_);
render_view_id_ = rvh->GetRoutingID();
render_process_id_ = rvh->GetProcess()->GetID();
// Update the DevTools URLs, if any.
CefDevToolsDelegate* devtools_delegate = _Context->devtools_delegate();
if (devtools_delegate) {
devtools_url_http_ = devtools_delegate->GetDevToolsURL(rvh, true);
devtools_url_chrome_ = devtools_delegate->GetDevToolsURL(rvh, false);
}
}
if (!registrar_->IsRegistered(
this, content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE,
content::Source<content::RenderViewHost>(rvh))) {
registrar_->Add(this, content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE,
content::Source<content::RenderViewHost>(rvh));
}
}
CefRefPtr<CefFrame> CefBrowserHostImpl::GetOrCreateFrame(
......
......@@ -45,6 +45,7 @@ class URLRequest;
struct Cef_Request_Params;
struct Cef_Response_Params;
class CefBrowserInfo;
struct CefNavigateParams;
class SiteInstance;
......@@ -83,7 +84,7 @@ class CefBrowserHostImpl : public CefBrowserHost,
const CefBrowserSettings& settings,
CefRefPtr<CefClient> client,
content::WebContents* web_contents,
int browser_id,
scoped_refptr<CefBrowserInfo> browser_info,
CefWindowHandle opener);
// Returns the browser associated with the specified RenderViewHost.
......@@ -145,6 +146,7 @@ class CefBrowserHostImpl : public CefBrowserHost,
virtual void ReloadIgnoreCache() OVERRIDE;
virtual void StopLoad() OVERRIDE;
virtual int GetIdentifier() OVERRIDE;
virtual bool IsSame(CefRefPtr<CefBrowser> that) OVERRIDE;
virtual bool IsPopup() OVERRIDE;
virtual bool HasDocument() OVERRIDE;
virtual CefRefPtr<CefFrame> GetMainFrame() OVERRIDE;
......@@ -211,15 +213,10 @@ class CefBrowserHostImpl : public CefBrowserHost,
// Handler for URLs involving external protocols.
void HandleExternalProtocol(const GURL& url);
// Returns true if this browser matches the specified ID values. If
// |render_view_id| is 0 any browser with the specified |render_process_id|
// will match.
bool HasIDMatch(int render_process_id, int render_view_id);
// Thread safe accessors.
const CefBrowserSettings& settings() const { return settings_; }
CefRefPtr<CefClient> client() const { return client_; }
int browser_id() const { return browser_id_; }
int browser_id() const;
// Returns the URL that is currently loading (or loaded) in the main frame.
GURL GetLoadingURL();
......@@ -344,12 +341,9 @@ class CefBrowserHostImpl : public CefBrowserHost,
const CefBrowserSettings& settings,
CefRefPtr<CefClient> client,
content::WebContents* web_contents,
int browser_id,
scoped_refptr<CefBrowserInfo> browser_info,
CefWindowHandle opener);
// Initialize settings based on the specified RenderViewHost.
void SetRenderViewHost(content::RenderViewHost* rvh);
// Updates and returns an existing frame or creates a new frame. Pass
// CefFrameHostImpl::kUnspecifiedFrameId for |parent_frame_id| if unknown.
CefRefPtr<CefFrame> GetOrCreateFrame(int64 frame_id,
......@@ -432,15 +426,9 @@ class CefBrowserHostImpl : public CefBrowserHost,
CefBrowserSettings settings_;
CefRefPtr<CefClient> client_;
scoped_ptr<content::WebContents> web_contents_;
int browser_id_;
scoped_refptr<CefBrowserInfo> browser_info_;
CefWindowHandle opener_;
// Unique ids used for routing communication to/from the renderer. We keep a
// copy of them as member variables so that we can locate matching browsers in
// a thread safe manner. All access must be protected by the state lock.
int render_process_id_;
int render_view_id_;
// Used when creating a new popup window.
CefWindowInfo pending_window_info_;
CefBrowserSettings pending_settings_;
......
// Copyright (c) 2012 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/browser_info.h"
#include "ipc/ipc_message.h"
CefBrowserInfo::CefBrowserInfo(int browser_id, bool is_popup)
: browser_id_(browser_id),
is_popup_(is_popup),
render_process_id_(MSG_ROUTING_NONE),
render_view_id_(MSG_ROUTING_NONE) {
DCHECK_GT(browser_id, 0);
}
CefBrowserInfo::~CefBrowserInfo() {
}
void CefBrowserInfo::set_render_ids(
int render_process_id, int render_view_id) {
base::AutoLock lock_scope(lock_);
render_process_id_ = render_process_id;
render_view_id_ = render_view_id;
}
bool CefBrowserInfo::is_render_id_match(
int render_process_id, int render_view_id) {
base::AutoLock lock_scope(lock_);
if (render_process_id != render_process_id_)
return false;
return (render_view_id == 0 || render_view_id == render_view_id_);
}
CefRefPtr<CefBrowserHostImpl> CefBrowserInfo::browser() {
base::AutoLock lock_scope(lock_);
return browser_;
}
void CefBrowserInfo::set_browser(CefRefPtr<CefBrowserHostImpl> browser) {
base::AutoLock lock_scope(lock_);
browser_ = browser;
}
// Copyright (c) 2012 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.
#ifndef CEF_LIBCEF_BROWSER_BROWSER_INFO_H_
#define CEF_LIBCEF_BROWSER_BROWSER_INFO_H_
#pragma once
#include "libcef/browser/browser_host_impl.h"
#include "base/memory/ref_counted.h"
// CefBrowserInfo is used to associate a browser ID and render view/process
// IDs with a particular CefBrowserHostImpl. Render view/process IDs may change
// during the lifetime of a single CefBrowserHostImpl.
//
// CefBrowserInfo objects are managed by CefContentBrowserClient and should not
// be created directly.
class CefBrowserInfo : public base::RefCountedThreadSafe<CefBrowserInfo> {
public:
CefBrowserInfo(int browser_id, bool is_popup);
virtual ~CefBrowserInfo();
int browser_id() const { return browser_id_; };
bool is_popup() const { return is_popup_; }
void set_render_ids(int render_process_id, int render_view_id);
// Returns true if this browser matches the specified ID values. If
// |render_view_id| is 0 any browser with the specified |render_process_id|
// will match.
bool is_render_id_match(int render_process_id, int render_view_id);
CefRefPtr<CefBrowserHostImpl> browser();
void set_browser(CefRefPtr<CefBrowserHostImpl> browser);
private:
int browser_id_;
bool is_popup_;
base::Lock lock_;
// The below members must be protected by |lock_|.
int render_process_id_;
int render_view_id_;
// May be NULL if the browser has not yet been created or if the browser has
// been destroyed.
CefRefPtr<CefBrowserHostImpl> browser_;
DISALLOW_COPY_AND_ASSIGN(CefBrowserInfo);
};
#endif // CEF_LIBCEF_BROWSER_BROWSER_INFO_H_
......@@ -6,6 +6,7 @@
#include "libcef/browser/browser_message_filter.h"
#include "libcef/browser/browser_host_impl.h"
#include "libcef/browser/browser_info.h"
#include "libcef/browser/content_browser_client.h"
#include "libcef/browser/context.h"
#include "libcef/browser/origin_whitelist_impl.h"
......@@ -68,18 +69,10 @@ void CefBrowserMessageFilter::OnGetNewRenderThreadInfo(
void CefBrowserMessageFilter::OnGetNewBrowserInfo(
int routing_id, CefProcessHostMsg_GetNewBrowserInfo_Params* params) {
CefRefPtr<CefBrowserHostImpl> browser =
CefBrowserHostImpl::GetBrowserByRoutingID(host_->GetID(), routing_id);
if (browser.get()) {
params->browser_id = browser->GetIdentifier();
params->is_popup = browser->IsPopup();
} else {
CefContentBrowserClient::NewPopupBrowserInfo info;
CefContentBrowserClient::Get()->GetNewPopupBrowserInfo(host_->GetID(),
routing_id,
&info);
DCHECK_GT(info.browser_id, 0);
params->browser_id = info.browser_id;
params->is_popup = true;
}
// Popup windows may not have info yet.
scoped_refptr<CefBrowserInfo> info =
CefContentBrowserClient::Get()->GetOrCreateBrowserInfo(host_->GetID(),
routing_id);
params->browser_id = info->browser_id();
params->is_popup = info->is_popup();
}
......@@ -7,6 +7,7 @@
#include <algorithm>
#include "libcef/browser/browser_context.h"
#include "libcef/browser/browser_info.h"
#include "libcef/browser/browser_host_impl.h"
#include "libcef/browser/browser_main.h"
#include "libcef/browser/browser_message_filter.h"
......@@ -244,9 +245,9 @@ class CefMediaObserver : public content::MediaObserver {
content::MediaRequestState state) OVERRIDE {}
};
CefContentBrowserClient::CefContentBrowserClient()
: browser_main_parts_(NULL) {
: browser_main_parts_(NULL),
next_browser_id_(0) {
plugin_service_filter_.reset(new CefPluginServiceFilter);
content::PluginServiceImpl::GetInstance()->SetFilter(
plugin_service_filter_.get());
......@@ -261,36 +262,92 @@ CefContentBrowserClient* CefContentBrowserClient::Get() {
content::GetContentClient()->browser());
}
void CefContentBrowserClient::GetNewPopupBrowserInfo(
int render_process_id, int render_view_id, NewPopupBrowserInfo* info) {
base::AutoLock lock_scope(new_popup_browser_lock_);
scoped_refptr<CefBrowserInfo> CefContentBrowserClient::CreateBrowserInfo() {
base::AutoLock lock_scope(browser_info_lock_);
scoped_refptr<CefBrowserInfo> browser_info =
new CefBrowserInfo(++next_browser_id_, false);
browser_info_list_.push_back(browser_info);
return browser_info;
}
scoped_refptr<CefBrowserInfo>
CefContentBrowserClient::GetOrCreateBrowserInfo(int render_process_id,
int render_view_id) {
base::AutoLock lock_scope(browser_info_lock_);
BrowserInfoList::const_iterator it = browser_info_list_.begin();
for (; it != browser_info_list_.end(); ++it) {
const scoped_refptr<CefBrowserInfo>& browser_info = *it;
if (browser_info->is_render_id_match(render_process_id, render_view_id))
return browser_info;
}
// Must be a popup if it hasn't already been created.
scoped_refptr<CefBrowserInfo> browser_info =
new CefBrowserInfo(++next_browser_id_, true);
browser_info->set_render_ids(render_process_id, render_view_id);
browser_info_list_.push_back(browser_info);
return browser_info;
}
void CefContentBrowserClient::RemoveBrowserInfo(
scoped_refptr<CefBrowserInfo> browser_info) {
base::AutoLock lock_scope(browser_info_lock_);
BrowserInfoList::iterator it = browser_info_list_.begin();
for (; it != browser_info_list_.end(); ++it) {
if (*it == browser_info) {
browser_info_list_.erase(it);
return;
}
}
NOTREACHED();
}
void CefContentBrowserClient::DestroyAllBrowsers() {
BrowserInfoList list;
NewPopupBrowserInfoMap::const_iterator it =
new_popup_browser_info_map_.find(
std::make_pair(render_process_id, render_view_id));
if (it != new_popup_browser_info_map_.end()) {
*info = it->second;
return;
{
base::AutoLock lock_scope(browser_info_lock_);
list = browser_info_list_;
}
// Destroy any remaining browser windows.
if (!list.empty()) {
BrowserInfoList::iterator it = list.begin();
for (; it != list.end(); ++it) {
CefRefPtr<CefBrowserHostImpl> browser = (*it)->browser();
if (browser.get())
browser->DestroyBrowser();
}
}
// Create the info now.
NewPopupBrowserInfo new_info;
new_info.browser_id = _Context->GetNextBrowserID();
new_popup_browser_info_map_.insert(
std::make_pair(
std::make_pair(render_process_id, render_view_id), new_info));
*info = new_info;
#ifndef NDEBUG
{
// Verify that all browser windows have been destroyed.
base::AutoLock lock_scope(browser_info_lock_);
DCHECK(browser_info_list_.empty());
}
#endif
}
void CefContentBrowserClient::ClearNewPopupBrowserInfo(int render_process_id,
int render_view_id) {
base::AutoLock lock_scope(new_popup_browser_lock_);
scoped_refptr<CefBrowserInfo> CefContentBrowserClient::GetBrowserInfo(
int render_process_id, int render_view_id) {
base::AutoLock lock_scope(browser_info_lock_);
BrowserInfoList::const_iterator it = browser_info_list_.begin();
for (; it != browser_info_list_.end(); ++it) {
const scoped_refptr<CefBrowserInfo>& browser_info = *it;
if (browser_info->is_render_id_match(render_process_id, render_view_id))
return browser_info;
}
DLOG(WARNING) << "No browser info matching process id " <<
render_process_id << " and view id " << render_view_id;
NewPopupBrowserInfoMap::iterator it =
new_popup_browser_info_map_.find(
std::make_pair(render_process_id, render_view_id));
if (it != new_popup_browser_info_map_.end())
new_popup_browser_info_map_.erase(it);
return scoped_refptr<CefBrowserInfo>();
}
content::BrowserMainParts* CefContentBrowserClient::CreateBrowserMainParts(
......
......@@ -6,16 +6,18 @@
#define CEF_LIBCEF_BROWSER_CONTENT_BROWSER_CLIENT_H_
#pragma once