mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-02-03 12:37:36 +01:00
Resolve request mapping issues with swapped out frames and browser-side navigation (issue #2290)
This commit is contained in:
parent
2733a561e4
commit
4787b45db2
@ -477,50 +477,45 @@ CefRefPtr<CefBrowserHostImpl> CefBrowserHostImpl::GetBrowserForRequest(
|
|||||||
const net::URLRequest* request) {
|
const net::URLRequest* request) {
|
||||||
DCHECK(request);
|
DCHECK(request);
|
||||||
CEF_REQUIRE_IOT();
|
CEF_REQUIRE_IOT();
|
||||||
|
|
||||||
|
// When navigating the main frame a new (pre-commit) URLRequest will be
|
||||||
|
// created before the RenderFrameHost. Consequently we can't rely on
|
||||||
|
// ResourceRequestInfo::GetRenderFrameForRequest returning a valid frame
|
||||||
|
// ID. See https://crbug.com/776884 for background.
|
||||||
int render_process_id = -1;
|
int render_process_id = -1;
|
||||||
int render_frame_id = MSG_ROUTING_NONE;
|
int render_frame_id = MSG_ROUTING_NONE;
|
||||||
|
if (content::ResourceRequestInfo::GetRenderFrameForRequest(
|
||||||
if (!content::ResourceRequestInfo::GetRenderFrameForRequest(
|
request, &render_process_id, &render_frame_id) &&
|
||||||
request, &render_process_id, &render_frame_id) ||
|
render_process_id >= 0 && render_frame_id >= 0) {
|
||||||
render_process_id == -1 || render_frame_id == MSG_ROUTING_NONE) {
|
return GetBrowserForFrame(render_process_id, render_frame_id);
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return GetBrowserForFrame(render_process_id, render_frame_id);
|
const content::ResourceRequestInfo* request_info =
|
||||||
|
content::ResourceRequestInfo::ForRequest(request);
|
||||||
|
if (request_info)
|
||||||
|
return GetBrowserForFrameTreeNode(request_info->GetFrameTreeNodeId());
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
CefRefPtr<CefBrowserHostImpl> CefBrowserHostImpl::GetBrowserForView(
|
CefRefPtr<CefBrowserHostImpl> CefBrowserHostImpl::GetBrowserForFrameTreeNode(
|
||||||
int render_process_id,
|
int frame_tree_node_id) {
|
||||||
int render_routing_id) {
|
// Use the thread-safe approach.
|
||||||
if (render_process_id == -1 || render_routing_id == MSG_ROUTING_NONE)
|
scoped_refptr<CefBrowserInfo> info =
|
||||||
return nullptr;
|
CefBrowserInfoManager::GetInstance()->GetBrowserInfoForFrameTreeNode(
|
||||||
|
frame_tree_node_id);
|
||||||
if (CEF_CURRENTLY_ON_UIT()) {
|
if (info.get()) {
|
||||||
// Use the non-thread-safe but potentially faster approach.
|
CefRefPtr<CefBrowserHostImpl> browser = info->browser();
|
||||||
content::RenderViewHost* render_view_host =
|
if (!browser.get()) {
|
||||||
content::RenderViewHost::FromID(render_process_id, render_routing_id);
|
LOG(WARNING) << "Found browser id " << info->browser_id()
|
||||||
if (!render_view_host)
|
<< " but no browser object matching frame tree node id "
|
||||||
return nullptr;
|
<< frame_tree_node_id;
|
||||||
return GetBrowserForHost(render_view_host);
|
|
||||||
} else {
|
|
||||||
// Use the thread-safe approach.
|
|
||||||
bool is_guest_view = false;
|
|
||||||
scoped_refptr<CefBrowserInfo> info =
|
|
||||||
CefBrowserInfoManager::GetInstance()->GetBrowserInfoForView(
|
|
||||||
render_process_id, render_routing_id, &is_guest_view);
|
|
||||||
if (info.get() && !is_guest_view) {
|
|
||||||
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 routing id "
|
|
||||||
<< render_routing_id;
|
|
||||||
}
|
|
||||||
return browser;
|
|
||||||
}
|
}
|
||||||
return nullptr;
|
return browser;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
@ -2591,17 +2586,39 @@ void CefBrowserHostImpl::RenderFrameCreated(
|
|||||||
content::RenderFrameHost* render_frame_host) {
|
content::RenderFrameHost* render_frame_host) {
|
||||||
const int render_process_id = render_frame_host->GetProcess()->GetID();
|
const int render_process_id = render_frame_host->GetProcess()->GetID();
|
||||||
const int render_routing_id = render_frame_host->GetRoutingID();
|
const int render_routing_id = render_frame_host->GetRoutingID();
|
||||||
browser_info_->render_id_manager()->add_render_frame_id(render_process_id,
|
if (!browser_info_->render_id_manager()->is_render_frame_id_match(
|
||||||
render_routing_id);
|
render_process_id, render_routing_id)) {
|
||||||
|
browser_info_->render_id_manager()->add_render_frame_id(render_process_id,
|
||||||
|
render_routing_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
const int frame_tree_node_id = render_frame_host->GetFrameTreeNodeId();
|
||||||
|
if (!browser_info_->frame_tree_node_id_manager()->is_frame_tree_node_id_match(
|
||||||
|
frame_tree_node_id)) {
|
||||||
|
browser_info_->frame_tree_node_id_manager()->add_frame_tree_node_id(
|
||||||
|
frame_tree_node_id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CefBrowserHostImpl::RenderFrameDeleted(
|
void CefBrowserHostImpl::RenderFrameHostChanged(
|
||||||
|
content::RenderFrameHost* old_host,
|
||||||
|
content::RenderFrameHost* new_host) {
|
||||||
|
// Just in case RenderFrameCreated wasn't called for some reason.
|
||||||
|
RenderFrameCreated(new_host);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CefBrowserHostImpl::FrameDeleted(
|
||||||
content::RenderFrameHost* render_frame_host) {
|
content::RenderFrameHost* render_frame_host) {
|
||||||
|
// The ID entries should currently exist.
|
||||||
const int render_process_id = render_frame_host->GetProcess()->GetID();
|
const int render_process_id = render_frame_host->GetProcess()->GetID();
|
||||||
const int render_routing_id = render_frame_host->GetRoutingID();
|
const int render_routing_id = render_frame_host->GetRoutingID();
|
||||||
browser_info_->render_id_manager()->remove_render_frame_id(render_process_id,
|
browser_info_->render_id_manager()->remove_render_frame_id(render_process_id,
|
||||||
render_routing_id);
|
render_routing_id);
|
||||||
|
|
||||||
|
const int frame_tree_node_id = render_frame_host->GetFrameTreeNodeId();
|
||||||
|
browser_info_->frame_tree_node_id_manager()->remove_frame_tree_node_id(
|
||||||
|
frame_tree_node_id);
|
||||||
|
|
||||||
if (web_contents()) {
|
if (web_contents()) {
|
||||||
const bool is_main_frame = (render_frame_host->GetParent() == nullptr);
|
const bool is_main_frame = (render_frame_host->GetParent() == nullptr);
|
||||||
CefBrowserContext* context =
|
CefBrowserContext* context =
|
||||||
@ -2611,18 +2628,24 @@ void CefBrowserHostImpl::RenderFrameDeleted(
|
|||||||
is_main_frame, false);
|
is_main_frame, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
base::AutoLock lock_scope(state_lock_);
|
||||||
|
|
||||||
|
const int64 frame_id = render_frame_host->GetRoutingID();
|
||||||
|
FrameMap::iterator it = frames_.find(frame_id);
|
||||||
|
if (it != frames_.end()) {
|
||||||
|
it->second->Detach();
|
||||||
|
frames_.erase(it);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (main_frame_id_ == frame_id)
|
||||||
|
main_frame_id_ = CefFrameHostImpl::kInvalidFrameId;
|
||||||
|
if (focused_frame_id_ == frame_id)
|
||||||
|
focused_frame_id_ = CefFrameHostImpl::kInvalidFrameId;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CefBrowserHostImpl::RenderViewCreated(
|
void CefBrowserHostImpl::RenderViewCreated(
|
||||||
content::RenderViewHost* render_view_host) {
|
content::RenderViewHost* render_view_host) {
|
||||||
// As of https://crrev.com/27caae83 this notification will be sent for RVHs
|
|
||||||
// created for provisional main frame navigations.
|
|
||||||
|
|
||||||
const int render_process_id = render_view_host->GetProcess()->GetID();
|
|
||||||
const int render_routing_id = render_view_host->GetRoutingID();
|
|
||||||
browser_info_->render_id_manager()->add_render_view_id(render_process_id,
|
|
||||||
render_routing_id);
|
|
||||||
|
|
||||||
// May be already registered if the renderer crashed previously.
|
// May be already registered if the renderer crashed previously.
|
||||||
if (!registrar_->IsRegistered(
|
if (!registrar_->IsRegistered(
|
||||||
this, content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE,
|
this, content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE,
|
||||||
@ -2636,11 +2659,6 @@ void CefBrowserHostImpl::RenderViewCreated(
|
|||||||
|
|
||||||
void CefBrowserHostImpl::RenderViewDeleted(
|
void CefBrowserHostImpl::RenderViewDeleted(
|
||||||
content::RenderViewHost* render_view_host) {
|
content::RenderViewHost* render_view_host) {
|
||||||
const int render_process_id = render_view_host->GetProcess()->GetID();
|
|
||||||
const int render_routing_id = render_view_host->GetRoutingID();
|
|
||||||
browser_info_->render_id_manager()->remove_render_view_id(render_process_id,
|
|
||||||
render_routing_id);
|
|
||||||
|
|
||||||
if (registrar_->IsRegistered(
|
if (registrar_->IsRegistered(
|
||||||
this, content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE,
|
this, content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE,
|
||||||
content::Source<content::RenderViewHost>(render_view_host))) {
|
content::Source<content::RenderViewHost>(render_view_host))) {
|
||||||
@ -2757,23 +2775,6 @@ void CefBrowserHostImpl::DidFailLoad(
|
|||||||
OnLoadEnd(frame, validated_url, error_code);
|
OnLoadEnd(frame, validated_url, error_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CefBrowserHostImpl::FrameDeleted(
|
|
||||||
content::RenderFrameHost* render_frame_host) {
|
|
||||||
base::AutoLock lock_scope(state_lock_);
|
|
||||||
|
|
||||||
const int64 frame_id = render_frame_host->GetRoutingID();
|
|
||||||
FrameMap::iterator it = frames_.find(frame_id);
|
|
||||||
if (it != frames_.end()) {
|
|
||||||
it->second->Detach();
|
|
||||||
frames_.erase(it);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (main_frame_id_ == frame_id)
|
|
||||||
main_frame_id_ = CefFrameHostImpl::kInvalidFrameId;
|
|
||||||
if (focused_frame_id_ == frame_id)
|
|
||||||
focused_frame_id_ = CefFrameHostImpl::kInvalidFrameId;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CefBrowserHostImpl::TitleWasSet(content::NavigationEntry* entry) {
|
void CefBrowserHostImpl::TitleWasSet(content::NavigationEntry* entry) {
|
||||||
// |entry| may be NULL if a popup is created via window.open and never
|
// |entry| may be NULL if a popup is created via window.open and never
|
||||||
// navigated.
|
// navigated.
|
||||||
|
@ -153,9 +153,9 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
|||||||
// Returns the browser associated with the specified URLRequest.
|
// Returns the browser associated with the specified URLRequest.
|
||||||
static CefRefPtr<CefBrowserHostImpl> GetBrowserForRequest(
|
static CefRefPtr<CefBrowserHostImpl> GetBrowserForRequest(
|
||||||
const net::URLRequest* request);
|
const net::URLRequest* request);
|
||||||
// Returns the browser associated with the specified view routing IDs.
|
// Returns the browser associated with the specified FrameTreeNode.
|
||||||
static CefRefPtr<CefBrowserHostImpl> GetBrowserForView(int render_process_id,
|
static CefRefPtr<CefBrowserHostImpl> GetBrowserForFrameTreeNode(
|
||||||
int render_routing_id);
|
int frame_tree_node_id);
|
||||||
// Returns the browser associated with the specified frame routing IDs.
|
// Returns the browser associated with the specified frame routing IDs.
|
||||||
static CefRefPtr<CefBrowserHostImpl> GetBrowserForFrame(
|
static CefRefPtr<CefBrowserHostImpl> GetBrowserForFrame(
|
||||||
int render_process_id,
|
int render_process_id,
|
||||||
@ -485,7 +485,9 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
|||||||
using content::WebContentsObserver::BeforeUnloadFired;
|
using content::WebContentsObserver::BeforeUnloadFired;
|
||||||
using content::WebContentsObserver::WasHidden;
|
using content::WebContentsObserver::WasHidden;
|
||||||
void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override;
|
void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override;
|
||||||
void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
|
void RenderFrameHostChanged(content::RenderFrameHost* old_host,
|
||||||
|
content::RenderFrameHost* new_host) override;
|
||||||
|
void FrameDeleted(content::RenderFrameHost* render_frame_host) override;
|
||||||
void RenderViewCreated(content::RenderViewHost* render_view_host) override;
|
void RenderViewCreated(content::RenderViewHost* render_view_host) override;
|
||||||
void RenderViewDeleted(content::RenderViewHost* render_view_host) override;
|
void RenderViewDeleted(content::RenderViewHost* render_view_host) override;
|
||||||
void RenderViewReady() override;
|
void RenderViewReady() override;
|
||||||
@ -497,7 +499,6 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
|||||||
const GURL& validated_url,
|
const GURL& validated_url,
|
||||||
int error_code,
|
int error_code,
|
||||||
const base::string16& error_description) override;
|
const base::string16& error_description) override;
|
||||||
void FrameDeleted(content::RenderFrameHost* render_frame_host) override;
|
|
||||||
void TitleWasSet(content::NavigationEntry* entry) override;
|
void TitleWasSet(content::NavigationEntry* entry) override;
|
||||||
void PluginCrashed(const base::FilePath& plugin_path,
|
void PluginCrashed(const base::FilePath& plugin_path,
|
||||||
base::ProcessId plugin_pid) override;
|
base::ProcessId plugin_pid) override;
|
||||||
|
@ -16,91 +16,104 @@ CefBrowserInfo::RenderIDManager::RenderIDManager(base::Lock* lock)
|
|||||||
DCHECK(lock);
|
DCHECK(lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CefBrowserInfo::RenderIDManager::add_render_view_id(
|
|
||||||
int render_process_id,
|
|
||||||
int render_routing_id) {
|
|
||||||
add_render_id(&render_view_id_set_, render_process_id, render_routing_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CefBrowserInfo::RenderIDManager::add_render_frame_id(
|
void CefBrowserInfo::RenderIDManager::add_render_frame_id(
|
||||||
int render_process_id,
|
int render_process_id,
|
||||||
int render_routing_id) {
|
int render_routing_id) {
|
||||||
add_render_id(&render_frame_id_set_, render_process_id, render_routing_id);
|
DCHECK_GT(render_process_id, 0);
|
||||||
}
|
DCHECK_GT(render_routing_id, 0);
|
||||||
|
|
||||||
void CefBrowserInfo::RenderIDManager::remove_render_view_id(
|
base::AutoLock lock_scope(*lock_);
|
||||||
int render_process_id,
|
|
||||||
int render_routing_id) {
|
if (!render_frame_id_set_.empty()) {
|
||||||
remove_render_id(&render_view_id_set_, render_process_id, render_routing_id);
|
RenderIdSet::const_iterator it = render_frame_id_set_.find(
|
||||||
|
std::make_pair(render_process_id, render_routing_id));
|
||||||
|
DCHECK(it == render_frame_id_set_.end());
|
||||||
|
if (it != render_frame_id_set_.end())
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
render_frame_id_set_.insert(
|
||||||
|
std::make_pair(render_process_id, render_routing_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CefBrowserInfo::RenderIDManager::remove_render_frame_id(
|
void CefBrowserInfo::RenderIDManager::remove_render_frame_id(
|
||||||
int render_process_id,
|
int render_process_id,
|
||||||
int render_routing_id) {
|
int render_routing_id) {
|
||||||
remove_render_id(&render_frame_id_set_, render_process_id, render_routing_id);
|
DCHECK_GT(render_process_id, 0);
|
||||||
}
|
DCHECK_GT(render_routing_id, 0);
|
||||||
|
|
||||||
bool CefBrowserInfo::RenderIDManager::is_render_view_id_match(
|
base::AutoLock lock_scope(*lock_);
|
||||||
int render_process_id,
|
|
||||||
int render_routing_id) const {
|
DCHECK(!render_frame_id_set_.empty());
|
||||||
return is_render_id_match(&render_view_id_set_, render_process_id,
|
if (render_frame_id_set_.empty())
|
||||||
render_routing_id);
|
return;
|
||||||
|
|
||||||
|
bool erased = render_frame_id_set_.erase(
|
||||||
|
std::make_pair(render_process_id, render_routing_id)) != 0;
|
||||||
|
DCHECK(erased);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CefBrowserInfo::RenderIDManager::is_render_frame_id_match(
|
bool CefBrowserInfo::RenderIDManager::is_render_frame_id_match(
|
||||||
int render_process_id,
|
int render_process_id,
|
||||||
int render_routing_id) const {
|
int render_routing_id) const {
|
||||||
return is_render_id_match(&render_frame_id_set_, render_process_id,
|
base::AutoLock lock_scope(*lock_);
|
||||||
render_routing_id);
|
|
||||||
|
if (render_frame_id_set_.empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
RenderIdSet::const_iterator it = render_frame_id_set_.find(
|
||||||
|
std::make_pair(render_process_id, render_routing_id));
|
||||||
|
return (it != render_frame_id_set_.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CefBrowserInfo::RenderIDManager::add_render_id(RenderIdSet* id_set,
|
// CefBrowserInfo::FrameTreeNodeIDManager
|
||||||
int render_process_id,
|
|
||||||
int render_routing_id) {
|
CefBrowserInfo::FrameTreeNodeIDManager::FrameTreeNodeIDManager(base::Lock* lock)
|
||||||
DCHECK_GT(render_process_id, 0);
|
: lock_(lock) {
|
||||||
DCHECK_GT(render_routing_id, 0);
|
DCHECK(lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CefBrowserInfo::FrameTreeNodeIDManager::add_frame_tree_node_id(
|
||||||
|
int frame_tree_node_id) {
|
||||||
|
DCHECK_GE(frame_tree_node_id, 0);
|
||||||
|
|
||||||
base::AutoLock lock_scope(*lock_);
|
base::AutoLock lock_scope(*lock_);
|
||||||
|
|
||||||
if (!id_set->empty()) {
|
if (!frame_tree_node_id_set_.empty()) {
|
||||||
RenderIdSet::const_iterator it =
|
FrameTreeNodeIdSet::const_iterator it =
|
||||||
id_set->find(std::make_pair(render_process_id, render_routing_id));
|
frame_tree_node_id_set_.find(frame_tree_node_id);
|
||||||
if (it != id_set->end())
|
DCHECK(it == frame_tree_node_id_set_.end());
|
||||||
|
if (it != frame_tree_node_id_set_.end())
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
id_set->insert(std::make_pair(render_process_id, render_routing_id));
|
frame_tree_node_id_set_.insert(frame_tree_node_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CefBrowserInfo::RenderIDManager::remove_render_id(RenderIdSet* id_set,
|
void CefBrowserInfo::FrameTreeNodeIDManager::remove_frame_tree_node_id(
|
||||||
int render_process_id,
|
int frame_tree_node_id) {
|
||||||
int render_routing_id) {
|
DCHECK_GE(frame_tree_node_id, 0);
|
||||||
DCHECK_GT(render_process_id, 0);
|
|
||||||
DCHECK_GT(render_routing_id, 0);
|
|
||||||
|
|
||||||
base::AutoLock lock_scope(*lock_);
|
base::AutoLock lock_scope(*lock_);
|
||||||
|
|
||||||
DCHECK(!id_set->empty());
|
DCHECK(!frame_tree_node_id_set_.empty());
|
||||||
if (id_set->empty())
|
if (frame_tree_node_id_set_.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bool erased =
|
bool erased = frame_tree_node_id_set_.erase(frame_tree_node_id) != 0;
|
||||||
id_set->erase(std::make_pair(render_process_id, render_routing_id)) != 0;
|
|
||||||
DCHECK(erased);
|
DCHECK(erased);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CefBrowserInfo::RenderIDManager::is_render_id_match(
|
bool CefBrowserInfo::FrameTreeNodeIDManager::is_frame_tree_node_id_match(
|
||||||
const RenderIdSet* id_set,
|
int frame_tree_node_id) const {
|
||||||
int render_process_id,
|
|
||||||
int render_routing_id) const {
|
|
||||||
base::AutoLock lock_scope(*lock_);
|
base::AutoLock lock_scope(*lock_);
|
||||||
|
|
||||||
if (id_set->empty())
|
if (frame_tree_node_id_set_.empty())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
RenderIdSet::const_iterator it =
|
FrameTreeNodeIdSet::const_iterator it =
|
||||||
id_set->find(std::make_pair(render_process_id, render_routing_id));
|
frame_tree_node_id_set_.find(frame_tree_node_id);
|
||||||
return (it != id_set->end());
|
return (it != frame_tree_node_id_set_.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
// CefBrowserInfo
|
// CefBrowserInfo
|
||||||
@ -110,7 +123,8 @@ CefBrowserInfo::CefBrowserInfo(int browser_id, bool is_popup)
|
|||||||
is_popup_(is_popup),
|
is_popup_(is_popup),
|
||||||
is_windowless_(false),
|
is_windowless_(false),
|
||||||
render_id_manager_(&lock_),
|
render_id_manager_(&lock_),
|
||||||
guest_render_id_manager_(&lock_) {
|
guest_render_id_manager_(&lock_),
|
||||||
|
frame_tree_node_id_manager_(&lock_) {
|
||||||
DCHECK_GT(browser_id, 0);
|
DCHECK_GT(browser_id, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,50 +28,61 @@ class CefBrowserInfo : public base::RefCountedThreadSafe<CefBrowserInfo> {
|
|||||||
explicit RenderIDManager(base::Lock* lock);
|
explicit RenderIDManager(base::Lock* lock);
|
||||||
|
|
||||||
// Adds an ID pair if it doesn't already exist.
|
// Adds an ID pair if it doesn't already exist.
|
||||||
void add_render_view_id(int render_process_id, int render_routing_id);
|
|
||||||
void add_render_frame_id(int render_process_id, int render_routing_id);
|
void add_render_frame_id(int render_process_id, int render_routing_id);
|
||||||
|
|
||||||
// Remove an ID pair if it exists.
|
// Remove an ID pair if it exists.
|
||||||
void remove_render_view_id(int render_process_id, int render_routing_id);
|
|
||||||
void remove_render_frame_id(int render_process_id, int render_routing_id);
|
void remove_render_frame_id(int render_process_id, int render_routing_id);
|
||||||
|
|
||||||
// Returns true if this browser matches the specified ID pair.
|
// Returns true if this browser matches the specified ID pair.
|
||||||
bool is_render_view_id_match(int render_process_id,
|
|
||||||
int render_routing_id) const;
|
|
||||||
bool is_render_frame_id_match(int render_process_id,
|
bool is_render_frame_id_match(int render_process_id,
|
||||||
int render_routing_id) const;
|
int render_routing_id) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef std::set<std::pair<int, int>> RenderIdSet;
|
typedef std::set<std::pair<int, int>> RenderIdSet;
|
||||||
|
|
||||||
void add_render_id(RenderIdSet* id_set,
|
// Access to |render_frame_id_set_| must be protected by |lock_|.
|
||||||
int render_process_id,
|
|
||||||
int render_routing_id);
|
|
||||||
void remove_render_id(RenderIdSet* id_set,
|
|
||||||
int render_process_id,
|
|
||||||
int render_routing_id);
|
|
||||||
bool is_render_id_match(const RenderIdSet* id_set,
|
|
||||||
int render_process_id,
|
|
||||||
int render_routing_id) const;
|
|
||||||
|
|
||||||
mutable base::Lock* lock_;
|
mutable base::Lock* lock_;
|
||||||
|
|
||||||
// The below members must be protected by |lock_|.
|
|
||||||
|
|
||||||
// Set of mapped (process_id, routing_id) pairs. Keeping this set is
|
// Set of mapped (process_id, routing_id) pairs. Keeping this set is
|
||||||
// necessary for the following reasons:
|
// necessary for the following reasons:
|
||||||
// 1. When navigating cross-origin the new (pending) RenderViewHost will be
|
// 1. When navigating cross-origin the new (pending) RenderFrameHost will be
|
||||||
// created before the old (current) RenderViewHost is destroyed.
|
// created before the old (current) RenderFrameHost is destroyed.
|
||||||
// 2. When canceling and asynchronously continuing navigation of the same
|
// 2. When canceling and asynchronously continuing navigation of the same
|
||||||
// URL a new RenderViewHost may be created for the first (canceled)
|
// URL a new RenderFrameHost may be created for the first (canceled)
|
||||||
// navigation and then destroyed as a result of the second (allowed)
|
// navigation and then destroyed as a result of the second (allowed)
|
||||||
// navigation.
|
// navigation.
|
||||||
// 3. Out-of-process iframes have their own render IDs which must also be
|
// 3. Out-of-process iframes have their own render IDs which must also be
|
||||||
// associated with the host browser.
|
// associated with the host browser.
|
||||||
RenderIdSet render_view_id_set_;
|
|
||||||
RenderIdSet render_frame_id_set_;
|
RenderIdSet render_frame_id_set_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class FrameTreeNodeIDManager {
|
||||||
|
public:
|
||||||
|
explicit FrameTreeNodeIDManager(base::Lock* lock);
|
||||||
|
|
||||||
|
// Adds an ID if it doesn't already exist.
|
||||||
|
void add_frame_tree_node_id(int frame_tree_node_id);
|
||||||
|
|
||||||
|
// Remove an ID if it exists.
|
||||||
|
void remove_frame_tree_node_id(int frame_tree_node_id);
|
||||||
|
|
||||||
|
// Returns true if this browser matches the specified ID.
|
||||||
|
bool is_frame_tree_node_id_match(int frame_tree_node_id) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
typedef std::set<int> FrameTreeNodeIdSet;
|
||||||
|
|
||||||
|
// Access to |request_id_set_| must be protected by |lock_|.
|
||||||
|
mutable base::Lock* lock_;
|
||||||
|
|
||||||
|
// Set of mapped frame_tree_node_id values. Keeping this set is necessary
|
||||||
|
// because, when navigating the main frame, a new (pre-commit) URLRequest
|
||||||
|
// will be created before the RenderFrameHost. Consequently we can't rely
|
||||||
|
// on ResourceRequestInfo::GetRenderFrameForRequest returning a valid frame
|
||||||
|
// ID. See https://crbug.com/776884 for background.
|
||||||
|
FrameTreeNodeIdSet frame_tree_node_id_set_;
|
||||||
|
};
|
||||||
|
|
||||||
CefBrowserInfo(int browser_id, bool is_popup);
|
CefBrowserInfo(int browser_id, bool is_popup);
|
||||||
|
|
||||||
int browser_id() const { return browser_id_; };
|
int browser_id() const { return browser_id_; };
|
||||||
@ -88,6 +99,11 @@ class CefBrowserInfo : public base::RefCountedThreadSafe<CefBrowserInfo> {
|
|||||||
return &guest_render_id_manager_;
|
return &guest_render_id_manager_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns the frame tree node ID manager for this browser.
|
||||||
|
FrameTreeNodeIDManager* frame_tree_node_id_manager() {
|
||||||
|
return &frame_tree_node_id_manager_;
|
||||||
|
}
|
||||||
|
|
||||||
CefRefPtr<CefBrowserHostImpl> browser() const;
|
CefRefPtr<CefBrowserHostImpl> browser() const;
|
||||||
void set_browser(CefRefPtr<CefBrowserHostImpl> browser);
|
void set_browser(CefRefPtr<CefBrowserHostImpl> browser);
|
||||||
|
|
||||||
@ -107,6 +123,8 @@ class CefBrowserInfo : public base::RefCountedThreadSafe<CefBrowserInfo> {
|
|||||||
RenderIDManager render_id_manager_;
|
RenderIDManager render_id_manager_;
|
||||||
RenderIDManager guest_render_id_manager_;
|
RenderIDManager guest_render_id_manager_;
|
||||||
|
|
||||||
|
FrameTreeNodeIDManager frame_tree_node_id_manager_;
|
||||||
|
|
||||||
// May be NULL if the browser has not yet been created or if the browser has
|
// May be NULL if the browser has not yet been created or if the browser has
|
||||||
// been destroyed.
|
// been destroyed.
|
||||||
CefRefPtr<CefBrowserHostImpl> browser_;
|
CefRefPtr<CefBrowserHostImpl> browser_;
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
#include "content/common/view_messages.h"
|
#include "content/common/view_messages.h"
|
||||||
#include "content/public/browser/render_frame_host.h"
|
#include "content/public/browser/render_frame_host.h"
|
||||||
#include "content/public/browser/render_process_host.h"
|
#include "content/public/browser/render_process_host.h"
|
||||||
#include "content/public/browser/render_view_host.h"
|
|
||||||
#include "content/public/browser/web_contents.h"
|
#include "content/public/browser/web_contents.h"
|
||||||
#include "content/public/common/child_process_host.h"
|
#include "content/public/common/child_process_host.h"
|
||||||
|
|
||||||
@ -79,23 +78,12 @@ scoped_refptr<CefBrowserInfo> CefBrowserInfoManager::CreatePopupBrowserInfo(
|
|||||||
bool is_windowless) {
|
bool is_windowless) {
|
||||||
base::AutoLock lock_scope(browser_info_lock_);
|
base::AutoLock lock_scope(browser_info_lock_);
|
||||||
|
|
||||||
content::RenderViewHost* view_host = new_contents->GetRenderViewHost();
|
content::RenderFrameHost* frame_host = new_contents->GetMainFrame();
|
||||||
content::RenderFrameHost* main_frame_host = new_contents->GetMainFrame();
|
const int render_process_id = frame_host->GetProcess()->GetID();
|
||||||
|
const int render_frame_routing_id = frame_host->GetRoutingID();
|
||||||
content::RenderProcessHost* host = view_host->GetProcess();
|
|
||||||
|
|
||||||
// The host processes may be different in the future with OOP iframes. When
|
|
||||||
// that happens re-visit the implementation of this class.
|
|
||||||
DCHECK_EQ(host, main_frame_host->GetProcess());
|
|
||||||
|
|
||||||
const int render_process_id = host->GetID();
|
|
||||||
const int render_view_routing_id = view_host->GetRoutingID();
|
|
||||||
const int render_frame_routing_id = main_frame_host->GetRoutingID();
|
|
||||||
|
|
||||||
scoped_refptr<CefBrowserInfo> browser_info =
|
scoped_refptr<CefBrowserInfo> browser_info =
|
||||||
new CefBrowserInfo(++next_browser_id_, true);
|
new CefBrowserInfo(++next_browser_id_, true);
|
||||||
browser_info->render_id_manager()->add_render_view_id(render_process_id,
|
|
||||||
render_view_routing_id);
|
|
||||||
browser_info->render_id_manager()->add_render_frame_id(
|
browser_info->render_id_manager()->add_render_frame_id(
|
||||||
render_process_id, render_frame_routing_id);
|
render_process_id, render_frame_routing_id);
|
||||||
browser_info_list_.push_back(browser_info);
|
browser_info_list_.push_back(browser_info);
|
||||||
@ -109,7 +97,6 @@ scoped_refptr<CefBrowserInfo> CefBrowserInfoManager::CreatePopupBrowserInfo(
|
|||||||
for (; it != pending_new_browser_info_list_.end(); ++it) {
|
for (; it != pending_new_browser_info_list_.end(); ++it) {
|
||||||
PendingNewBrowserInfo* info = it->get();
|
PendingNewBrowserInfo* info = it->get();
|
||||||
if (info->render_process_id == render_process_id &&
|
if (info->render_process_id == render_process_id &&
|
||||||
info->render_view_routing_id == render_view_routing_id &&
|
|
||||||
info->render_frame_routing_id == render_frame_routing_id) {
|
info->render_frame_routing_id == render_frame_routing_id) {
|
||||||
SendNewBrowserInfoResponse(render_process_id, browser_info, false,
|
SendNewBrowserInfoResponse(render_process_id, browser_info, false,
|
||||||
info->reply_msg);
|
info->reply_msg);
|
||||||
@ -281,11 +268,9 @@ void CefBrowserInfoManager::WebContentsCreated(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CefBrowserInfoManager::OnGetNewBrowserInfo(int render_process_id,
|
void CefBrowserInfoManager::OnGetNewBrowserInfo(int render_process_id,
|
||||||
int render_view_routing_id,
|
|
||||||
int render_frame_routing_id,
|
int render_frame_routing_id,
|
||||||
IPC::Message* reply_msg) {
|
IPC::Message* reply_msg) {
|
||||||
DCHECK_NE(render_process_id, content::ChildProcessHost::kInvalidUniqueID);
|
DCHECK_NE(render_process_id, content::ChildProcessHost::kInvalidUniqueID);
|
||||||
DCHECK_GT(render_view_routing_id, 0);
|
|
||||||
DCHECK_GT(render_frame_routing_id, 0);
|
DCHECK_GT(render_frame_routing_id, 0);
|
||||||
DCHECK(reply_msg);
|
DCHECK(reply_msg);
|
||||||
|
|
||||||
@ -294,8 +279,7 @@ void CefBrowserInfoManager::OnGetNewBrowserInfo(int render_process_id,
|
|||||||
bool is_guest_view = false;
|
bool is_guest_view = false;
|
||||||
|
|
||||||
scoped_refptr<CefBrowserInfo> browser_info = GetBrowserInfo(
|
scoped_refptr<CefBrowserInfo> browser_info = GetBrowserInfo(
|
||||||
render_process_id, render_view_routing_id, render_process_id,
|
render_process_id, render_frame_routing_id, &is_guest_view);
|
||||||
render_frame_routing_id, &is_guest_view);
|
|
||||||
|
|
||||||
if (browser_info.get()) {
|
if (browser_info.get()) {
|
||||||
// Send the response immediately.
|
// Send the response immediately.
|
||||||
@ -312,7 +296,6 @@ void CefBrowserInfoManager::OnGetNewBrowserInfo(int render_process_id,
|
|||||||
for (; it != pending_new_browser_info_list_.end(); ++it) {
|
for (; it != pending_new_browser_info_list_.end(); ++it) {
|
||||||
PendingNewBrowserInfo* info = it->get();
|
PendingNewBrowserInfo* info = it->get();
|
||||||
if (info->render_process_id == render_process_id &&
|
if (info->render_process_id == render_process_id &&
|
||||||
info->render_view_routing_id == render_view_routing_id &&
|
|
||||||
info->render_frame_routing_id == render_frame_routing_id) {
|
info->render_frame_routing_id == render_frame_routing_id) {
|
||||||
NOTREACHED();
|
NOTREACHED();
|
||||||
}
|
}
|
||||||
@ -323,7 +306,6 @@ void CefBrowserInfoManager::OnGetNewBrowserInfo(int render_process_id,
|
|||||||
// Queue the request.
|
// Queue the request.
|
||||||
std::unique_ptr<PendingNewBrowserInfo> pending(new PendingNewBrowserInfo());
|
std::unique_ptr<PendingNewBrowserInfo> pending(new PendingNewBrowserInfo());
|
||||||
pending->render_process_id = render_process_id;
|
pending->render_process_id = render_process_id;
|
||||||
pending->render_view_routing_id = render_view_routing_id;
|
|
||||||
pending->render_frame_routing_id = render_frame_routing_id;
|
pending->render_frame_routing_id = render_frame_routing_id;
|
||||||
pending->reply_msg = reply_msg;
|
pending->reply_msg = reply_msg;
|
||||||
pending_new_browser_info_list_.push_back(std::move(pending));
|
pending_new_browser_info_list_.push_back(std::move(pending));
|
||||||
@ -374,22 +356,31 @@ void CefBrowserInfoManager::DestroyAllBrowsers() {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
scoped_refptr<CefBrowserInfo> CefBrowserInfoManager::GetBrowserInfoForView(
|
|
||||||
int render_process_id,
|
|
||||||
int render_routing_id,
|
|
||||||
bool* is_guest_view) {
|
|
||||||
base::AutoLock lock_scope(browser_info_lock_);
|
|
||||||
return GetBrowserInfo(render_process_id, render_routing_id, 0, 0,
|
|
||||||
is_guest_view);
|
|
||||||
}
|
|
||||||
|
|
||||||
scoped_refptr<CefBrowserInfo> CefBrowserInfoManager::GetBrowserInfoForFrame(
|
scoped_refptr<CefBrowserInfo> CefBrowserInfoManager::GetBrowserInfoForFrame(
|
||||||
int render_process_id,
|
int render_process_id,
|
||||||
int render_routing_id,
|
int render_routing_id,
|
||||||
bool* is_guest_view) {
|
bool* is_guest_view) {
|
||||||
base::AutoLock lock_scope(browser_info_lock_);
|
base::AutoLock lock_scope(browser_info_lock_);
|
||||||
return GetBrowserInfo(0, 0, render_process_id, render_routing_id,
|
return GetBrowserInfo(render_process_id, render_routing_id, is_guest_view);
|
||||||
is_guest_view);
|
}
|
||||||
|
|
||||||
|
scoped_refptr<CefBrowserInfo>
|
||||||
|
CefBrowserInfoManager::GetBrowserInfoForFrameTreeNode(int frame_tree_node_id) {
|
||||||
|
if (frame_tree_node_id < 0)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
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->frame_tree_node_id_manager()->is_frame_tree_node_id_match(
|
||||||
|
frame_tree_node_id)) {
|
||||||
|
return browser_info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CefBrowserInfoManager::GetBrowserInfoList(BrowserInfoList& list) {
|
void CefBrowserInfoManager::GetBrowserInfoList(BrowserInfoList& list) {
|
||||||
@ -465,8 +456,6 @@ CefBrowserInfoManager::PopPendingPopup(PendingPopup::Step step,
|
|||||||
}
|
}
|
||||||
|
|
||||||
scoped_refptr<CefBrowserInfo> CefBrowserInfoManager::GetBrowserInfo(
|
scoped_refptr<CefBrowserInfo> CefBrowserInfoManager::GetBrowserInfo(
|
||||||
int render_view_process_id,
|
|
||||||
int render_view_routing_id,
|
|
||||||
int render_frame_process_id,
|
int render_frame_process_id,
|
||||||
int render_frame_routing_id,
|
int render_frame_routing_id,
|
||||||
bool* is_guest_view) {
|
bool* is_guest_view) {
|
||||||
@ -475,41 +464,19 @@ scoped_refptr<CefBrowserInfo> CefBrowserInfoManager::GetBrowserInfo(
|
|||||||
if (is_guest_view)
|
if (is_guest_view)
|
||||||
*is_guest_view = false;
|
*is_guest_view = false;
|
||||||
|
|
||||||
const bool valid_view_ids =
|
if (render_frame_process_id < 0 || render_frame_routing_id < 0)
|
||||||
render_view_process_id > 0 && render_view_routing_id > 0;
|
return nullptr;
|
||||||
const bool valid_frame_ids =
|
|
||||||
render_frame_process_id > 0 && render_frame_routing_id > 0;
|
|
||||||
|
|
||||||
BrowserInfoList::const_iterator it = browser_info_list_.begin();
|
BrowserInfoList::const_iterator it = browser_info_list_.begin();
|
||||||
for (; it != browser_info_list_.end(); ++it) {
|
for (; it != browser_info_list_.end(); ++it) {
|
||||||
const scoped_refptr<CefBrowserInfo>& browser_info = *it;
|
const scoped_refptr<CefBrowserInfo>& browser_info = *it;
|
||||||
if (valid_view_ids &&
|
if (browser_info->render_id_manager()->is_render_frame_id_match(
|
||||||
browser_info->render_id_manager()->is_render_view_id_match(
|
|
||||||
render_view_process_id, render_view_routing_id)) {
|
|
||||||
if (valid_frame_ids) {
|
|
||||||
// Make sure the frame id is also registered.
|
|
||||||
browser_info->render_id_manager()->add_render_frame_id(
|
|
||||||
render_frame_process_id, render_frame_routing_id);
|
|
||||||
}
|
|
||||||
return browser_info;
|
|
||||||
}
|
|
||||||
if (valid_frame_ids &&
|
|
||||||
browser_info->render_id_manager()->is_render_frame_id_match(
|
|
||||||
render_frame_process_id, render_frame_routing_id)) {
|
render_frame_process_id, render_frame_routing_id)) {
|
||||||
if (valid_view_ids) {
|
|
||||||
// Make sure the view id is also registered.
|
|
||||||
browser_info->render_id_manager()->add_render_view_id(
|
|
||||||
render_view_process_id, render_view_routing_id);
|
|
||||||
}
|
|
||||||
return browser_info;
|
return browser_info;
|
||||||
}
|
}
|
||||||
if (extensions::ExtensionsEnabled() &&
|
if (extensions::ExtensionsEnabled() &&
|
||||||
((valid_view_ids &&
|
browser_info->guest_render_id_manager()->is_render_frame_id_match(
|
||||||
browser_info->guest_render_id_manager()->is_render_view_id_match(
|
render_frame_process_id, render_frame_routing_id)) {
|
||||||
render_view_process_id, render_view_routing_id)) ||
|
|
||||||
(valid_frame_ids &&
|
|
||||||
browser_info->guest_render_id_manager()->is_render_frame_id_match(
|
|
||||||
render_frame_process_id, render_frame_routing_id)))) {
|
|
||||||
if (is_guest_view)
|
if (is_guest_view)
|
||||||
*is_guest_view = true;
|
*is_guest_view = true;
|
||||||
return browser_info;
|
return browser_info;
|
||||||
|
@ -99,7 +99,6 @@ class CefBrowserInfoManager : public content::RenderProcessHostObserver {
|
|||||||
// already exist for traditional popup browsers depending on timing. See
|
// already exist for traditional popup browsers depending on timing. See
|
||||||
// comments on PendingPopup for more information.
|
// comments on PendingPopup for more information.
|
||||||
void OnGetNewBrowserInfo(int render_process_id,
|
void OnGetNewBrowserInfo(int render_process_id,
|
||||||
int render_view_routing_id,
|
|
||||||
int render_frame_routing_id,
|
int render_frame_routing_id,
|
||||||
IPC::Message* reply_msg);
|
IPC::Message* reply_msg);
|
||||||
|
|
||||||
@ -112,17 +111,22 @@ class CefBrowserInfoManager : public content::RenderProcessHostObserver {
|
|||||||
|
|
||||||
// Retrieves the CefBrowserInfo matching the specified IDs or an empty
|
// Retrieves the CefBrowserInfo matching the specified IDs or an empty
|
||||||
// pointer if no match is found. It is allowed to add new callers of this
|
// pointer if no match is found. It is allowed to add new callers of this
|
||||||
// method but consider using CefBrowserHostImpl::GetBrowserFor[View|Frame]()
|
// method but consider using CefBrowserHostImpl::GetBrowserForFrame()
|
||||||
// or extensions::GetOwnerBrowserForFrame() instead.
|
// or extensions::GetOwnerBrowserForFrame() instead.
|
||||||
// |is_guest_view| will be set to true if the IDs match a guest view
|
// |is_guest_view| will be set to true if the IDs match a guest view
|
||||||
// associated with the returned browser info instead of the browser itself.
|
// associated with the returned browser info instead of the browser itself.
|
||||||
scoped_refptr<CefBrowserInfo> GetBrowserInfoForView(int render_process_id,
|
|
||||||
int render_routing_id,
|
|
||||||
bool* is_guest_view);
|
|
||||||
scoped_refptr<CefBrowserInfo> GetBrowserInfoForFrame(int render_process_id,
|
scoped_refptr<CefBrowserInfo> GetBrowserInfoForFrame(int render_process_id,
|
||||||
int render_routing_id,
|
int render_routing_id,
|
||||||
bool* is_guest_view);
|
bool* is_guest_view);
|
||||||
|
|
||||||
|
// Retrieves the CefBrowserInfo matching the specified ID or an empty
|
||||||
|
// pointer if no match is found. It is allowed to add new callers of this
|
||||||
|
// method but consider using CefBrowserHostImpl::GetBrowserForRequest()
|
||||||
|
// instead since we generally use this mapping for URLRequests on the IO
|
||||||
|
// thread.
|
||||||
|
scoped_refptr<CefBrowserInfo> GetBrowserInfoForFrameTreeNode(
|
||||||
|
int frame_tree_node_id);
|
||||||
|
|
||||||
// Retrieves all existing CefBrowserInfo objects.
|
// Retrieves all existing CefBrowserInfo objects.
|
||||||
typedef std::list<scoped_refptr<CefBrowserInfo>> BrowserInfoList;
|
typedef std::list<scoped_refptr<CefBrowserInfo>> BrowserInfoList;
|
||||||
void GetBrowserInfoList(BrowserInfoList& list);
|
void GetBrowserInfoList(BrowserInfoList& list);
|
||||||
@ -178,9 +182,7 @@ class CefBrowserInfoManager : public content::RenderProcessHostObserver {
|
|||||||
|
|
||||||
// Retrieves the BrowserInfo matching the specified IDs. If both sets are
|
// Retrieves the BrowserInfo matching the specified IDs. If both sets are
|
||||||
// valid then this method makes sure both sets have been registered.
|
// valid then this method makes sure both sets have been registered.
|
||||||
scoped_refptr<CefBrowserInfo> GetBrowserInfo(int render_view_process_id,
|
scoped_refptr<CefBrowserInfo> GetBrowserInfo(int render_frame_process_id,
|
||||||
int render_view_routing_id,
|
|
||||||
int render_frame_process_id,
|
|
||||||
int render_frame_routing_id,
|
int render_frame_routing_id,
|
||||||
bool* is_guest_view);
|
bool* is_guest_view);
|
||||||
|
|
||||||
@ -194,7 +196,6 @@ class CefBrowserInfoManager : public content::RenderProcessHostObserver {
|
|||||||
// Pending request for OnGetNewBrowserInfo.
|
// Pending request for OnGetNewBrowserInfo.
|
||||||
struct PendingNewBrowserInfo {
|
struct PendingNewBrowserInfo {
|
||||||
int render_process_id;
|
int render_process_id;
|
||||||
int render_view_routing_id;
|
|
||||||
int render_frame_routing_id;
|
int render_frame_routing_id;
|
||||||
IPC::Message* reply_msg;
|
IPC::Message* reply_msg;
|
||||||
};
|
};
|
||||||
|
@ -56,13 +56,11 @@ void CefBrowserMessageFilter::OnGetNewRenderThreadInfo(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CefBrowserMessageFilter::OnGetNewBrowserInfo(int render_view_routing_id,
|
void CefBrowserMessageFilter::OnGetNewBrowserInfo(int render_frame_routing_id,
|
||||||
int render_frame_routing_id,
|
|
||||||
IPC::Message* reply_msg) {
|
IPC::Message* reply_msg) {
|
||||||
if (render_process_id_ != content::ChildProcessHost::kInvalidUniqueID) {
|
if (render_process_id_ != content::ChildProcessHost::kInvalidUniqueID) {
|
||||||
CefBrowserInfoManager::GetInstance()->OnGetNewBrowserInfo(
|
CefBrowserInfoManager::GetInstance()->OnGetNewBrowserInfo(
|
||||||
render_process_id_, render_view_routing_id, render_frame_routing_id,
|
render_process_id_, render_frame_routing_id, reply_msg);
|
||||||
reply_msg);
|
|
||||||
} else {
|
} else {
|
||||||
delete reply_msg;
|
delete reply_msg;
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,7 @@ class CefBrowserMessageFilter : public content::BrowserMessageFilter {
|
|||||||
// Message handlers.
|
// Message handlers.
|
||||||
void OnGetNewRenderThreadInfo(
|
void OnGetNewRenderThreadInfo(
|
||||||
CefProcessHostMsg_GetNewRenderThreadInfo_Params* params);
|
CefProcessHostMsg_GetNewRenderThreadInfo_Params* params);
|
||||||
void OnGetNewBrowserInfo(int render_view_routing_id,
|
void OnGetNewBrowserInfo(int render_frame_routing_id,
|
||||||
int render_frame_routing_id,
|
|
||||||
IPC::Message* reply_msg);
|
IPC::Message* reply_msg);
|
||||||
|
|
||||||
int render_process_id_;
|
int render_process_id_;
|
||||||
|
@ -54,17 +54,20 @@ void CefMimeHandlerViewGuestDelegate::OnGuestAttached(
|
|||||||
content::WebContents* web_contents = guest_->web_contents();
|
content::WebContents* web_contents = guest_->web_contents();
|
||||||
DCHECK(web_contents);
|
DCHECK(web_contents);
|
||||||
|
|
||||||
content::RenderViewHost* view_host = web_contents->GetRenderViewHost();
|
|
||||||
content::RenderFrameHost* main_frame_host = web_contents->GetMainFrame();
|
|
||||||
|
|
||||||
CefRefPtr<CefBrowserHostImpl> owner_browser = GetOwnerBrowser(guest_);
|
CefRefPtr<CefBrowserHostImpl> owner_browser = GetOwnerBrowser(guest_);
|
||||||
|
|
||||||
// Associate guest state information with the owner browser.
|
// Associate guest state information with the owner browser.
|
||||||
scoped_refptr<CefBrowserInfo> info = owner_browser->browser_info();
|
scoped_refptr<CefBrowserInfo> info = owner_browser->browser_info();
|
||||||
info->guest_render_id_manager()->add_render_view_id(
|
content::RenderFrameHost* main_frame_host = web_contents->GetMainFrame();
|
||||||
view_host->GetProcess()->GetID(), view_host->GetRoutingID());
|
|
||||||
info->guest_render_id_manager()->add_render_frame_id(
|
const int render_process_id = main_frame_host->GetProcess()->GetID();
|
||||||
main_frame_host->GetProcess()->GetID(), main_frame_host->GetRoutingID());
|
const int render_frame_id = main_frame_host->GetRoutingID();
|
||||||
|
info->guest_render_id_manager()->add_render_frame_id(render_process_id,
|
||||||
|
render_frame_id);
|
||||||
|
|
||||||
|
const int frame_tree_node_id = main_frame_host->GetFrameTreeNodeId();
|
||||||
|
info->frame_tree_node_id_manager()->add_frame_tree_node_id(
|
||||||
|
frame_tree_node_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CefMimeHandlerViewGuestDelegate::OnGuestDetached(
|
void CefMimeHandlerViewGuestDelegate::OnGuestDetached(
|
||||||
@ -72,25 +75,25 @@ void CefMimeHandlerViewGuestDelegate::OnGuestDetached(
|
|||||||
content::WebContents* web_contents = guest_->web_contents();
|
content::WebContents* web_contents = guest_->web_contents();
|
||||||
DCHECK(web_contents);
|
DCHECK(web_contents);
|
||||||
|
|
||||||
content::RenderViewHost* view_host = web_contents->GetRenderViewHost();
|
|
||||||
content::RenderFrameHost* main_frame_host = web_contents->GetMainFrame();
|
|
||||||
|
|
||||||
CefRefPtr<CefBrowserHostImpl> owner_browser = GetOwnerBrowser(guest_);
|
CefRefPtr<CefBrowserHostImpl> owner_browser = GetOwnerBrowser(guest_);
|
||||||
|
|
||||||
const int render_process_id = main_frame_host->GetProcess()->GetID();
|
|
||||||
const int render_frame_id = main_frame_host->GetRoutingID();
|
|
||||||
const bool is_main_frame = (main_frame_host->GetParent() == nullptr);
|
|
||||||
|
|
||||||
// Disassociate guest state information with the owner browser.
|
// Disassociate guest state information with the owner browser.
|
||||||
scoped_refptr<CefBrowserInfo> info = owner_browser->browser_info();
|
scoped_refptr<CefBrowserInfo> info = owner_browser->browser_info();
|
||||||
info->guest_render_id_manager()->remove_render_view_id(
|
content::RenderFrameHost* main_frame_host = web_contents->GetMainFrame();
|
||||||
view_host->GetProcess()->GetID(), view_host->GetRoutingID());
|
|
||||||
|
const int render_process_id = main_frame_host->GetProcess()->GetID();
|
||||||
|
const int render_frame_id = main_frame_host->GetRoutingID();
|
||||||
info->guest_render_id_manager()->remove_render_frame_id(render_process_id,
|
info->guest_render_id_manager()->remove_render_frame_id(render_process_id,
|
||||||
render_frame_id);
|
render_frame_id);
|
||||||
|
|
||||||
|
const int frame_tree_node_id = main_frame_host->GetFrameTreeNodeId();
|
||||||
|
info->frame_tree_node_id_manager()->remove_frame_tree_node_id(
|
||||||
|
frame_tree_node_id);
|
||||||
|
|
||||||
CefBrowserContext* context =
|
CefBrowserContext* context =
|
||||||
static_cast<CefBrowserContext*>(web_contents->GetBrowserContext());
|
static_cast<CefBrowserContext*>(web_contents->GetBrowserContext());
|
||||||
if (context) {
|
if (context) {
|
||||||
|
const bool is_main_frame = (main_frame_host->GetParent() == nullptr);
|
||||||
context->OnRenderFrameDeleted(render_process_id, render_frame_id,
|
context->OnRenderFrameDeleted(render_process_id, render_frame_id,
|
||||||
is_main_frame, true);
|
is_main_frame, true);
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,12 @@ CefRequestInterceptor::~CefRequestInterceptor() {
|
|||||||
net::URLRequestJob* CefRequestInterceptor::MaybeInterceptRequest(
|
net::URLRequestJob* CefRequestInterceptor::MaybeInterceptRequest(
|
||||||
net::URLRequest* request,
|
net::URLRequest* request,
|
||||||
net::NetworkDelegate* network_delegate) const {
|
net::NetworkDelegate* network_delegate) const {
|
||||||
|
// With PlzNavigate we now receive blob URLs here.
|
||||||
|
// Ignore these URLs. See https://crbug.com/776884 for details.
|
||||||
|
if (request->url().SchemeIs(url::kBlobScheme)) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
CefRefPtr<CefBrowserHostImpl> browser =
|
CefRefPtr<CefBrowserHostImpl> browser =
|
||||||
CefBrowserHostImpl::GetBrowserForRequest(request);
|
CefBrowserHostImpl::GetBrowserForRequest(request);
|
||||||
if (browser.get()) {
|
if (browser.get()) {
|
||||||
|
@ -202,9 +202,8 @@ IPC_STRUCT_BEGIN(CefProcessHostMsg_GetNewBrowserInfo_Params)
|
|||||||
IPC_STRUCT_END()
|
IPC_STRUCT_END()
|
||||||
|
|
||||||
// Retrieve information about a newly created browser.
|
// Retrieve information about a newly created browser.
|
||||||
IPC_SYNC_MESSAGE_CONTROL2_1(
|
IPC_SYNC_MESSAGE_CONTROL1_1(
|
||||||
CefProcessHostMsg_GetNewBrowserInfo,
|
CefProcessHostMsg_GetNewBrowserInfo,
|
||||||
int /* render_view_routing_id */,
|
|
||||||
int /* render_frame_routing_id */,
|
int /* render_frame_routing_id */,
|
||||||
CefProcessHostMsg_GetNewBrowserInfo_Params /* params*/)
|
CefProcessHostMsg_GetNewBrowserInfo_Params /* params*/)
|
||||||
|
|
||||||
|
@ -26,7 +26,6 @@
|
|||||||
#include "content/public/renderer/navigation_state.h"
|
#include "content/public/renderer/navigation_state.h"
|
||||||
#include "content/public/renderer/render_view.h"
|
#include "content/public/renderer/render_view.h"
|
||||||
#include "content/renderer/navigation_state_impl.h"
|
#include "content/renderer/navigation_state_impl.h"
|
||||||
#include "content/renderer/render_view_impl.h"
|
|
||||||
#include "third_party/WebKit/public/platform/WebString.h"
|
#include "third_party/WebKit/public/platform/WebString.h"
|
||||||
#include "third_party/WebKit/public/platform/WebURL.h"
|
#include "third_party/WebKit/public/platform/WebURL.h"
|
||||||
#include "third_party/WebKit/public/platform/WebURLError.h"
|
#include "third_party/WebKit/public/platform/WebURLError.h"
|
||||||
@ -413,12 +412,6 @@ void CefBrowserImpl::AddFrameObject(int64_t frame_id,
|
|||||||
manager->Add(tracked_object);
|
manager->Add(tracked_object);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CefBrowserImpl::is_swapped_out() const {
|
|
||||||
content::RenderViewImpl* render_view_impl =
|
|
||||||
static_cast<content::RenderViewImpl*>(render_view());
|
|
||||||
return (!render_view_impl || render_view_impl->is_swapped_out());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RenderViewObserver methods.
|
// RenderViewObserver methods.
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -668,9 +661,6 @@ void CefBrowserImpl::OnResponseAck(int request_id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CefBrowserImpl::OnLoadingStateChange(bool isLoading) {
|
void CefBrowserImpl::OnLoadingStateChange(bool isLoading) {
|
||||||
if (is_swapped_out())
|
|
||||||
return;
|
|
||||||
|
|
||||||
CefRefPtr<CefApp> app = CefContentClient::Get()->application();
|
CefRefPtr<CefApp> app = CefContentClient::Get()->application();
|
||||||
if (app.get()) {
|
if (app.get()) {
|
||||||
CefRefPtr<CefRenderProcessHandler> handler = app->GetRenderProcessHandler();
|
CefRefPtr<CefRenderProcessHandler> handler = app->GetRenderProcessHandler();
|
||||||
@ -689,9 +679,6 @@ void CefBrowserImpl::OnLoadingStateChange(bool isLoading) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CefBrowserImpl::OnLoadStart(blink::WebLocalFrame* frame) {
|
void CefBrowserImpl::OnLoadStart(blink::WebLocalFrame* frame) {
|
||||||
if (is_swapped_out())
|
|
||||||
return;
|
|
||||||
|
|
||||||
CefRefPtr<CefApp> app = CefContentClient::Get()->application();
|
CefRefPtr<CefApp> app = CefContentClient::Get()->application();
|
||||||
if (app.get()) {
|
if (app.get()) {
|
||||||
CefRefPtr<CefRenderProcessHandler> handler = app->GetRenderProcessHandler();
|
CefRefPtr<CefRenderProcessHandler> handler = app->GetRenderProcessHandler();
|
||||||
@ -706,9 +693,6 @@ void CefBrowserImpl::OnLoadStart(blink::WebLocalFrame* frame) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CefBrowserImpl::OnLoadEnd(blink::WebLocalFrame* frame) {
|
void CefBrowserImpl::OnLoadEnd(blink::WebLocalFrame* frame) {
|
||||||
if (is_swapped_out())
|
|
||||||
return;
|
|
||||||
|
|
||||||
CefRefPtr<CefApp> app = CefContentClient::Get()->application();
|
CefRefPtr<CefApp> app = CefContentClient::Get()->application();
|
||||||
if (app.get()) {
|
if (app.get()) {
|
||||||
CefRefPtr<CefRenderProcessHandler> handler = app->GetRenderProcessHandler();
|
CefRefPtr<CefRenderProcessHandler> handler = app->GetRenderProcessHandler();
|
||||||
@ -726,9 +710,6 @@ void CefBrowserImpl::OnLoadEnd(blink::WebLocalFrame* frame) {
|
|||||||
|
|
||||||
void CefBrowserImpl::OnLoadError(blink::WebLocalFrame* frame,
|
void CefBrowserImpl::OnLoadError(blink::WebLocalFrame* frame,
|
||||||
const blink::WebURLError& error) {
|
const blink::WebURLError& error) {
|
||||||
if (is_swapped_out())
|
|
||||||
return;
|
|
||||||
|
|
||||||
CefRefPtr<CefApp> app = CefContentClient::Get()->application();
|
CefRefPtr<CefApp> app = CefContentClient::Get()->application();
|
||||||
if (app.get()) {
|
if (app.get()) {
|
||||||
CefRefPtr<CefRenderProcessHandler> handler = app->GetRenderProcessHandler();
|
CefRefPtr<CefRenderProcessHandler> handler = app->GetRenderProcessHandler();
|
||||||
|
@ -105,8 +105,6 @@ class CefBrowserImpl : public CefBrowser, public content::RenderViewObserver {
|
|||||||
return content::RenderViewObserver::render_view();
|
return content::RenderViewObserver::render_view();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_swapped_out() const;
|
|
||||||
|
|
||||||
// RenderViewObserver methods.
|
// RenderViewObserver methods.
|
||||||
void OnDestruct() override;
|
void OnDestruct() override;
|
||||||
void DidStartLoading() override;
|
void DidStartLoading() override;
|
||||||
|
@ -73,7 +73,6 @@
|
|||||||
#include "content/public/renderer/render_thread.h"
|
#include "content/public/renderer/render_thread.h"
|
||||||
#include "content/public/renderer/render_view.h"
|
#include "content/public/renderer/render_view.h"
|
||||||
#include "content/public/renderer/render_view_visitor.h"
|
#include "content/public/renderer/render_view_visitor.h"
|
||||||
#include "content/renderer/render_frame_impl.h"
|
|
||||||
#include "content/renderer/render_widget.h"
|
#include "content/renderer/render_widget.h"
|
||||||
#include "extensions/common/switches.h"
|
#include "extensions/common/switches.h"
|
||||||
#include "extensions/renderer/renderer_extension_registry.h"
|
#include "extensions/renderer/renderer_extension_registry.h"
|
||||||
@ -837,27 +836,18 @@ void CefContentRendererClient::BrowserCreated(
|
|||||||
if (!render_view || !render_frame)
|
if (!render_view || !render_frame)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Swapped out RenderWidgets will be created in the parent/owner process for
|
|
||||||
// frames that are hosted in a separate process (e.g. guest views or OOP
|
|
||||||
// frames). Don't create any CEF objects for swapped out RenderWidgets.
|
|
||||||
content::RenderFrameImpl* render_frame_impl =
|
|
||||||
static_cast<content::RenderFrameImpl*>(render_frame);
|
|
||||||
if (render_frame_impl->GetRenderWidget()->is_swapped_out())
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Don't create another browser or guest view object if one already exists for
|
// Don't create another browser or guest view object if one already exists for
|
||||||
// the view.
|
// the view.
|
||||||
if (GetBrowserForView(render_view).get() || HasGuestViewForView(render_view))
|
if (GetBrowserForView(render_view).get() || HasGuestViewForView(render_view))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const int render_view_routing_id = render_view->GetRoutingID();
|
|
||||||
const int render_frame_routing_id = render_frame->GetRoutingID();
|
const int render_frame_routing_id = render_frame->GetRoutingID();
|
||||||
|
|
||||||
// Retrieve the browser information synchronously. This will also register
|
// Retrieve the browser information synchronously. This will also register
|
||||||
// the routing ids with the browser info object in the browser process.
|
// the routing ids with the browser info object in the browser process.
|
||||||
CefProcessHostMsg_GetNewBrowserInfo_Params params;
|
CefProcessHostMsg_GetNewBrowserInfo_Params params;
|
||||||
content::RenderThread::Get()->Send(new CefProcessHostMsg_GetNewBrowserInfo(
|
content::RenderThread::Get()->Send(new CefProcessHostMsg_GetNewBrowserInfo(
|
||||||
render_view_routing_id, render_frame_routing_id, ¶ms));
|
render_frame_routing_id, ¶ms));
|
||||||
if (params.browser_id == 0) {
|
if (params.browser_id == 0) {
|
||||||
// The popup may have been canceled during creation.
|
// The popup may have been canceled during creation.
|
||||||
return;
|
return;
|
||||||
|
@ -215,11 +215,6 @@ patches = [
|
|||||||
# https://bitbucket.org/chromiumembedded/cef/issues/2102
|
# https://bitbucket.org/chromiumembedded/cef/issues/2102
|
||||||
'name': 'views_1749_2102',
|
'name': 'views_1749_2102',
|
||||||
},
|
},
|
||||||
{
|
|
||||||
# Expose RenderViewHostImpl swapped-out state.
|
|
||||||
# https://bitbucket.org/chromiumembedded/cef/issues/1392
|
|
||||||
'name': 'render_view_host_impl_1392',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
# Expose ui::Compositor via BrowserCompositorMac for OSR.
|
# Expose ui::Compositor via BrowserCompositorMac for OSR.
|
||||||
'name': 'browser_compositor_mac',
|
'name': 'browser_compositor_mac',
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
diff --git content/browser/renderer_host/render_view_host_impl.h content/browser/renderer_host/render_view_host_impl.h
|
|
||||||
index 071ed012bada..0957d5dda328 100644
|
|
||||||
--- content/browser/renderer_host/render_view_host_impl.h
|
|
||||||
+++ content/browser/renderer_host/render_view_host_impl.h
|
|
||||||
@@ -158,6 +158,7 @@ class CONTENT_EXPORT RenderViewHostImpl : public RenderViewHost,
|
|
||||||
void set_is_swapped_out(bool is_swapped_out) {
|
|
||||||
is_swapped_out_ = is_swapped_out;
|
|
||||||
}
|
|
||||||
+ bool is_swapped_out() const { return is_swapped_out_; }
|
|
||||||
|
|
||||||
// TODO(creis): Remove as part of http://crbug.com/418265.
|
|
||||||
bool is_waiting_for_close_ack() const { return is_waiting_for_close_ack_; }
|
|
Loading…
x
Reference in New Issue
Block a user