Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(907)

Unified Diff: content/browser/frame_host/render_frame_host_manager.cc

Issue 1245903004: Switch RenderFrameHostManager to use RenderProcessHostObserver, remove NOTIFICATION_RENDERER_PROCES… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/frame_host/render_frame_host_manager.cc
diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc
index 67f66fa0cd45f9a52296e9c1b475264b7baa3746..21335e35409a13d53ea09b58ab7f9e4bc6dfca01 100644
--- a/content/browser/frame_host/render_frame_host_manager.cc
+++ b/content/browser/frame_host/render_frame_host_manager.cc
@@ -4,6 +4,7 @@
#include "content/browser/frame_host/render_frame_host_manager.h"
+#include <algorithm>
#include <utility>
#include "base/command_line.h"
@@ -32,8 +33,7 @@
#include "content/common/frame_messages.h"
#include "content/common/view_messages.h"
#include "content/public/browser/content_browser_client.h"
-#include "content/public/browser/notification_service.h"
-#include "content/public/browser/notification_types.h"
+#include "content/public/browser/render_process_host_observer.h"
#include "content/public/browser/render_widget_host_iterator.h"
#include "content/public/browser/render_widget_host_view.h"
#include "content/public/browser/user_metrics.h"
@@ -44,6 +44,122 @@
namespace content {
+// A helper class to hold all frame proxies and register as a
+// RenderProcessHostObserver for them.
+class RenderFrameHostManager::RenderFrameProxyHostMap
+ : public RenderProcessHostObserver {
+ public:
+ typedef base::hash_map<int32, RenderFrameProxyHost*> MapType;
ncarter (slow) 2015/07/21 19:07:14 using MapType = base::hash_map<int32, RenderFrameP
Avi (use Gerrit) 2015/07/21 20:45:16 Done.
+
+ RenderFrameProxyHostMap(RenderFrameHostManager* manager);
+ ~RenderFrameProxyHostMap() override;
+
+ // Read-only access to the underlying map of site instance ID to
+ // RenderFrameProxyHosts.
+ MapType::const_iterator begin() { return map_.begin(); }
ncarter (slow) 2015/07/21 19:07:15 Should these accessors be const, to fit the flavor
Avi (use Gerrit) 2015/07/21 20:45:16 Done.
+ MapType::const_iterator end() { return map_.end(); }
+ bool empty() { return map_.empty(); }
+
+ // Returns the proxy with the specified ID, or nullptr if there is no such
+ // one.
+ RenderFrameProxyHost* Get(int32 id);
+
+ // Adds the specified proxy with the specified ID. It is an error (and fatal)
+ // to add more than one proxy with the specified ID.
+ void Add(int32 id, scoped_ptr<RenderFrameProxyHost> proxy);
+
+ // Removes the proxy with the specified site instance ID.
+ void Remove(int32 id);
+
+ // Removes all proxies.
+ void Clear();
+
+ // RenderProcessHostObserver implementation.
+ void RenderProcessWillExit(RenderProcessHost* host) override;
+ void RenderProcessExited(RenderProcessHost* host,
+ base::TerminationStatus status,
+ int exit_code) override;
+
+ private:
+ RenderFrameHostManager* manager_;
+ MapType map_;
+};
+
+RenderFrameHostManager::RenderFrameProxyHostMap::RenderFrameProxyHostMap(
+ RenderFrameHostManager* manager)
+ : manager_(manager) {}
+
+RenderFrameHostManager::RenderFrameProxyHostMap::~RenderFrameProxyHostMap() {
+ Clear();
+}
+
+RenderFrameProxyHost* RenderFrameHostManager::RenderFrameProxyHostMap::Get(
+ int32 id) {
+ auto it = map_.find(id);
+ if (it != map_.end())
+ return it->second;
+ return nullptr;
+}
+
+void RenderFrameHostManager::RenderFrameProxyHostMap::Add(
+ int32 id,
+ scoped_ptr<RenderFrameProxyHost> proxy) {
+ CHECK_EQ(0u, map_.count(id)) << "Inserting a duplicate item.";
+
+ // If this is the first proxy that has this process host, observe the
+ // process host.
+ RenderProcessHost* host = proxy->GetProcess();
+ size_t count =
+ std::count_if(begin(), end(), [host](MapType::value_type item) {
+ return item.second->GetProcess() == host;
+ });
+ if (count == 0)
+ host->AddObserver(this);
+
+ map_[id] = proxy.release();
+}
+
+void RenderFrameHostManager::RenderFrameProxyHostMap::Remove(int32 id) {
+ auto it = map_.find(id);
+ if (it == map_.end())
+ return;
+
+ // If this is the last proxy that has this process host, stop observing the
+ // process host.
+ RenderProcessHost* host = it->second->GetProcess();
+ size_t count =
+ std::count_if(begin(), end(), [host](MapType::value_type item) {
+ return item.second->GetProcess() == host;
+ });
+ if (count == 1)
+ host->RemoveObserver(this);
+
+ delete it->second;
+ map_.erase(it);
+}
+
+void RenderFrameHostManager::RenderFrameProxyHostMap::Clear() {
+ std::set<RenderProcessHost*> hosts;
+ for (const auto& pair : map_)
+ hosts.insert(pair.second->GetProcess());
+ for (auto host : hosts)
+ host->RemoveObserver(this);
+
+ STLDeleteValues(&map_);
+}
+
+void RenderFrameHostManager::RenderFrameProxyHostMap::RenderProcessWillExit(
+ RenderProcessHost* host) {
+ manager_->RendererProcessClosing(host);
+}
+
+void RenderFrameHostManager::RenderFrameProxyHostMap::RenderProcessExited(
+ RenderProcessHost* host,
+ base::TerminationStatus status,
+ int exit_code) {
+ manager_->RendererProcessClosing(host);
+}
+
// static
bool RenderFrameHostManager::ClearRFHsPendingShutdown(FrameTreeNode* node) {
node->render_manager()->pending_delete_hosts_.clear();
@@ -67,6 +183,7 @@ RenderFrameHostManager::RenderFrameHostManager(
render_frame_delegate_(render_frame_delegate),
render_view_delegate_(render_view_delegate),
render_widget_delegate_(render_widget_delegate),
+ proxy_hosts_(new RenderFrameProxyHostMap(this)),
interstitial_page_(nullptr),
should_reuse_web_ui_(false),
weak_factory_(this) {
@@ -91,7 +208,7 @@ RenderFrameHostManager::~RenderFrameHostManager() {
// RenderFrameHost, since the CrossProcessFrameConnector (owned by
// RenderFrameProxyHost) points to the RenderWidgetHostView associated with
// the current RenderFrameHost and uses it during its destructor.
- STLDeleteValues(&proxy_hosts_);
+ ResetProxyHosts();
// Release the WebUI prior to resetting the current RenderFrameHost, as the
// WebUI accesses the RenderFrameHost during cleanup.
@@ -122,24 +239,17 @@ void RenderFrameHostManager::Init(BrowserContext* browser_context,
delegate_->NotifySwappedFromRenderManager(
nullptr, render_frame_host_.get(), false);
}
-
- // Keep track of renderer processes as they start to shut down or are
- // crashed/killed.
- registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED,
- NotificationService::AllSources());
- registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING,
- NotificationService::AllSources());
}
RenderViewHostImpl* RenderFrameHostManager::current_host() const {
if (!render_frame_host_)
- return NULL;
+ return nullptr;
return render_frame_host_->render_view_host();
}
RenderViewHostImpl* RenderFrameHostManager::pending_render_view_host() const {
if (!pending_render_frame_host_)
- return NULL;
+ return nullptr;
return pending_render_frame_host_->render_view_host();
}
@@ -175,18 +285,13 @@ RenderFrameHostManager::GetOuterRenderWidgetHostForKeyboardInput() {
RenderFrameProxyHost* RenderFrameHostManager::GetProxyToParent() {
if (frame_tree_node_->IsMainFrame())
- return NULL;
-
- RenderFrameProxyHostMap::iterator iter =
- proxy_hosts_.find(frame_tree_node_->parent()
- ->render_manager()
- ->current_frame_host()
- ->GetSiteInstance()
- ->GetId());
- if (iter == proxy_hosts_.end())
- return NULL;
+ return nullptr;
- return iter->second;
+ return proxy_hosts_->Get(frame_tree_node_->parent()
+ ->render_manager()
+ ->current_frame_host()
+ ->GetSiteInstance()
+ ->GetId());
}
RenderFrameProxyHost* RenderFrameHostManager::GetProxyToOuterDelegate() {
@@ -250,7 +355,7 @@ RenderFrameHostImpl* RenderFrameHostManager::Navigate(
entry.IsViewSourceMode(), entry.transferred_global_request_id(),
entry.bindings());
if (!dest_render_frame_host)
- return NULL; // We weren't able to create a pending render frame host.
+ return nullptr; // We weren't able to create a pending render frame host.
// If the current render_frame_host_ isn't live, we should create it so
// that we don't show a sad tab while the dest_render_frame_host fetches
@@ -282,7 +387,7 @@ RenderFrameHostImpl* RenderFrameHostManager::Navigate(
if (!InitRenderView(dest_render_frame_host->render_view_host(),
MSG_ROUTING_NONE,
frame_tree_node_->IsMainFrame()))
- return NULL;
+ return nullptr;
// Now that we've created a new renderer, be sure to hide it if it isn't
// our primary one. Otherwise, we might crash if we try to call Show()
@@ -541,12 +646,10 @@ void RenderFrameHostManager::DidDisownOpener(
RenderFrameHost* render_frame_host) {
// Notify all RenderFrameHosts but the one that notified us. This is necessary
// in case a process swap has occurred while the message was in flight.
- for (RenderFrameProxyHostMap::iterator iter = proxy_hosts_.begin();
- iter != proxy_hosts_.end();
- ++iter) {
- DCHECK_NE(iter->second->GetSiteInstance(),
+ for (const auto& pair : *proxy_hosts_) {
+ DCHECK_NE(pair.second->GetSiteInstance(),
current_frame_host()->GetSiteInstance());
- iter->second->DisownOpener();
+ pair.second->DisownOpener();
}
if (render_frame_host_.get() != render_frame_host)
@@ -570,7 +673,7 @@ void RenderFrameHostManager::CommitPendingSandboxFlags() {
// the parent process since it already knows the latest flags.
SiteInstance* parent_site_instance =
frame_tree_node_->parent()->current_frame_host()->GetSiteInstance();
- for (const auto& pair : proxy_hosts_) {
+ for (const auto& pair : *proxy_hosts_) {
if (pair.second->GetSiteInstance() != parent_site_instance) {
pair.second->Send(new FrameMsg_DidUpdateSandboxFlags(
pair.second->GetRoutingID(),
@@ -588,25 +691,22 @@ void RenderFrameHostManager::RendererProcessClosing(
// Do not remove proxies in the dead process that still have active frame
// count though, we just reset them to be uninitialized.
std::list<int> ids_to_keep;
- for (RenderFrameProxyHostMap::iterator iter = proxy_hosts_.begin();
- iter != proxy_hosts_.end();
- ++iter) {
- RenderFrameProxyHost* proxy = iter->second;
+ for (const auto& pair : *proxy_hosts_) {
ncarter (slow) 2015/07/21 19:07:14 This is cool.
Avi (use Gerrit) 2015/07/21 20:45:16 Thanks!
+ RenderFrameProxyHost* proxy = pair.second;
if (proxy->GetProcess() != render_process_host)
continue;
if (static_cast<SiteInstanceImpl*>(proxy->GetSiteInstance())
->active_frame_count() >= 1U) {
- ids_to_keep.push_back(iter->first);
+ ids_to_keep.push_back(pair.first);
} else {
- ids_to_remove.push_back(iter->first);
+ ids_to_remove.push_back(pair.first);
}
}
// Now delete them.
while (!ids_to_remove.empty()) {
- delete proxy_hosts_[ids_to_remove.back()];
- proxy_hosts_.erase(ids_to_remove.back());
+ proxy_hosts_->Remove(ids_to_remove.back());
ids_to_remove.pop_back();
}
@@ -655,19 +755,18 @@ void RenderFrameHostManager::SwapOutOldFrame(
ShutdownProxiesIfLastActiveFrameInSiteInstance(old_render_frame_host.get());
// Tell the old RenderFrameHost to swap out, with no proxy to replace it.
- old_render_frame_host->SwapOut(NULL, true);
+ old_render_frame_host->SwapOut(nullptr, true);
MoveToPendingDeleteHosts(old_render_frame_host.Pass());
return;
}
// Otherwise there are active views and we need a proxy for the old RFH.
// (There should not be one yet.)
- CHECK(!GetRenderFrameProxyHost(old_render_frame_host->GetSiteInstance()));
- RenderFrameProxyHost* proxy = new RenderFrameProxyHost(
+ scoped_ptr<RenderFrameProxyHost> scoped_proxy(new RenderFrameProxyHost(
old_render_frame_host->GetSiteInstance(),
- old_render_frame_host->render_view_host(), frame_tree_node_);
- CHECK(proxy_hosts_.insert(std::make_pair(old_site_instance_id, proxy)).second)
- << "Inserting a duplicate item.";
+ old_render_frame_host->render_view_host(), frame_tree_node_));
+ RenderFrameProxyHost* proxy = scoped_proxy.get();
ncarter (slow) 2015/07/21 19:07:14 You could simplify this a little by eliminating th
Avi (use Gerrit) 2015/07/21 20:45:16 That's a little cleaner; I'll go with that. I just
+ proxy_hosts_->Add(old_site_instance_id, scoped_proxy.Pass());
// Tell the old RenderFrameHost to swap out and be replaced by the proxy.
old_render_frame_host->SwapOut(proxy, true);
@@ -705,10 +804,11 @@ void RenderFrameHostManager::DiscardUnusedFrame(
// Any currently suspended navigations are no longer needed.
render_frame_host->CancelSuspendedNavigations();
- CHECK(!GetRenderFrameProxyHost(site_instance));
- RenderFrameProxyHost* proxy = new RenderFrameProxyHost(
- site_instance, render_frame_host->render_view_host(), frame_tree_node_);
- proxy_hosts_[site_instance->GetId()] = proxy;
+ scoped_ptr<RenderFrameProxyHost> scoped_proxy(new RenderFrameProxyHost(
+ site_instance, render_frame_host->render_view_host(),
+ frame_tree_node_));
+ RenderFrameProxyHost* proxy = scoped_proxy.get();
ncarter (slow) 2015/07/21 19:07:14 Ditto.
Avi (use Gerrit) 2015/07/21 20:45:16 Done.
+ proxy_hosts_->Add(site_instance->GetId(), scoped_proxy.Pass());
// Check if the RenderFrameHost is already swapped out, to avoid swapping it
// out again.
@@ -760,7 +860,7 @@ bool RenderFrameHostManager::DeleteFromPendingList(
}
void RenderFrameHostManager::ResetProxyHosts() {
- STLDeleteValues(&proxy_hosts_);
+ proxy_hosts_->Clear();
}
// PlzNavigate
@@ -913,14 +1013,14 @@ RenderFrameHostManager::UnsetSpeculativeRenderFrameHost() {
}
void RenderFrameHostManager::OnDidStartLoading() {
- for (const auto& pair : proxy_hosts_) {
+ for (const auto& pair : *proxy_hosts_) {
pair.second->Send(
new FrameMsg_DidStartLoading(pair.second->GetRoutingID()));
}
}
void RenderFrameHostManager::OnDidStopLoading() {
- for (const auto& pair : proxy_hosts_) {
+ for (const auto& pair : *proxy_hosts_) {
pair.second->Send(new FrameMsg_DidStopLoading(pair.second->GetRoutingID()));
}
}
@@ -933,7 +1033,7 @@ void RenderFrameHostManager::OnDidUpdateName(const std::string& name) {
switches::kSitePerProcess))
return;
- for (const auto& pair : proxy_hosts_) {
+ for (const auto& pair : *proxy_hosts_) {
pair.second->Send(
new FrameMsg_DidUpdateName(pair.second->GetRoutingID(), name));
}
@@ -944,28 +1044,12 @@ void RenderFrameHostManager::OnDidUpdateOrigin(
if (!IsSwappedOutStateForbidden())
return;
- for (const auto& pair : proxy_hosts_) {
+ for (const auto& pair : *proxy_hosts_) {
pair.second->Send(
new FrameMsg_DidUpdateOrigin(pair.second->GetRoutingID(), origin));
}
}
-void RenderFrameHostManager::Observe(
- int type,
- const NotificationSource& source,
- const NotificationDetails& details) {
- switch (type) {
- case NOTIFICATION_RENDERER_PROCESS_CLOSED:
- case NOTIFICATION_RENDERER_PROCESS_CLOSING:
- RendererProcessClosing(
- Source<RenderProcessHost>(source).ptr());
- break;
-
- default:
- NOTREACHED();
- }
-}
-
RenderFrameHostManager::SiteInstanceDescriptor::SiteInstanceDescriptor(
BrowserContext* browser_context,
GURL dest_url,
@@ -979,10 +1063,9 @@ RenderFrameHostManager::SiteInstanceDescriptor::SiteInstanceDescriptor(
bool RenderFrameHostManager::ClearProxiesInSiteInstance(
int32 site_instance_id,
FrameTreeNode* node) {
- RenderFrameProxyHostMap::iterator iter =
- node->render_manager()->proxy_hosts_.find(site_instance_id);
- if (iter != node->render_manager()->proxy_hosts_.end()) {
- RenderFrameProxyHost* proxy = iter->second;
+ RenderFrameProxyHost* proxy =
+ node->render_manager()->proxy_hosts_->Get(site_instance_id);
+ if (proxy) {
// Delete the proxy. If it is for a main frame (and thus the RFH is stored
// in the proxy) and it was still pending swap out, move the RFH to the
// pending deletion list first.
@@ -995,8 +1078,7 @@ bool RenderFrameHostManager::ClearProxiesInSiteInstance(
proxy->PassFrameHostOwnership();
node->render_manager()->MoveToPendingDeleteHosts(swapped_out_rfh.Pass());
}
- delete proxy;
- node->render_manager()->proxy_hosts_.erase(site_instance_id);
+ node->render_manager()->proxy_hosts_->Remove(site_instance_id);
}
return true;
@@ -1005,10 +1087,10 @@ bool RenderFrameHostManager::ClearProxiesInSiteInstance(
// static.
bool RenderFrameHostManager::ResetProxiesInSiteInstance(int32 site_instance_id,
FrameTreeNode* node) {
- RenderFrameProxyHostMap::iterator iter =
- node->render_manager()->proxy_hosts_.find(site_instance_id);
- if (iter != node->render_manager()->proxy_hosts_.end())
- iter->second->set_render_frame_proxy_created(false);
+ RenderFrameProxyHost* proxy =
+ node->render_manager()->proxy_hosts_->Get(site_instance_id);
+ if (proxy)
+ proxy->set_render_frame_proxy_created(false);
return true;
}
@@ -1555,8 +1637,7 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame(
new_render_frame_host = proxy->PassFrameHostOwnership();
new_render_frame_host->GetProcess()->AddPendingView();
- proxy_hosts_.erase(instance->GetId());
- delete proxy;
+ proxy_hosts_->Remove(instance->GetId());
ncarter (slow) 2015/07/21 19:07:14 Is it worth adding a "// deletes |proxy|" or "prox
Avi (use Gerrit) 2015/07/21 20:45:16 Done.
}
} else {
// Create a new RenderFrameHost if we don't find an existing one.
@@ -1571,10 +1652,11 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame(
if (!swapped_out) {
new_render_frame_host->GetProcess()->AddPendingView();
} else {
- proxy = new RenderFrameProxyHost(
+ scoped_ptr<RenderFrameProxyHost> scoped_proxy(new RenderFrameProxyHost(
new_render_frame_host->GetSiteInstance(),
- new_render_frame_host->render_view_host(), frame_tree_node_);
- proxy_hosts_[instance->GetId()] = proxy;
+ new_render_frame_host->render_view_host(), frame_tree_node_));
+ proxy = scoped_proxy.get();
ncarter (slow) 2015/07/21 19:07:14 Ditto
Avi (use Gerrit) 2015/07/21 20:45:16 Done.
+ proxy_hosts_->Add(instance->GetId(), scoped_proxy.Pass());
proxy_routing_id = proxy->GetRoutingID();
proxy->TakeFrameHostOwnership(new_render_frame_host.Pass());
}
@@ -1658,9 +1740,10 @@ int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) {
return proxy->GetRoutingID();
if (!proxy) {
- proxy = new RenderFrameProxyHost(
- instance, render_view_host, frame_tree_node_);
- proxy_hosts_[instance->GetId()] = proxy;
+ scoped_ptr<RenderFrameProxyHost> scoped_proxy(
+ new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_));
+ proxy = scoped_proxy.get();
ncarter (slow) 2015/07/21 19:07:14 Ditto
Avi (use Gerrit) 2015/07/21 20:45:16 Done.
+ proxy_hosts_->Add(instance->GetId(), scoped_proxy.Pass());
}
if (RenderFrameHostManager::IsSwappedOutStateForbidden() &&
@@ -1675,7 +1758,7 @@ int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) {
}
void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) {
- for (const auto& pair : proxy_hosts_) {
+ for (const auto& pair : *proxy_hosts_) {
child->render_manager()->CreateRenderFrameProxy(
pair.second->GetSiteInstance());
}
@@ -1707,9 +1790,10 @@ void RenderFrameHostManager::CreateOuterDelegateProxy(
RenderFrameHostImpl* render_frame_host) {
CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kSitePerProcess));
- RenderFrameProxyHost* proxy = new RenderFrameProxyHost(
- outer_contents_site_instance, nullptr, frame_tree_node_);
- proxy_hosts_[outer_contents_site_instance->GetId()] = proxy;
+ scoped_ptr<RenderFrameProxyHost> scoped_proxy(new RenderFrameProxyHost(
+ outer_contents_site_instance, nullptr, frame_tree_node_));
+ RenderFrameProxyHost* proxy = scoped_proxy.get();
ncarter (slow) 2015/07/21 19:07:14 Ditto
Avi (use Gerrit) 2015/07/21 20:45:16 Done.
+ proxy_hosts_->Add(outer_contents_site_instance->GetId(), scoped_proxy.Pass());
// Swap the outer WebContents's frame with the proxy to inner WebContents.
//
@@ -1972,12 +2056,7 @@ void RenderFrameHostManager::CommitPending() {
if (RenderFrameHostManager::IsSwappedOutStateForbidden()) {
// Since the new RenderFrameHost is now committed, there must be no proxies
// for its SiteInstance. Delete any existing ones.
- RenderFrameProxyHostMap::iterator iter =
- proxy_hosts_.find(render_frame_host_->GetSiteInstance()->GetId());
- if (iter != proxy_hosts_.end()) {
- delete iter->second;
- proxy_hosts_.erase(iter);
- }
+ proxy_hosts_->Remove(render_frame_host_->GetSiteInstance()->GetId());
}
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
@@ -1996,8 +2075,8 @@ void RenderFrameHostManager::CommitPending() {
// After all is done, there must never be a proxy in the list which has the
// same SiteInstance as the current RenderFrameHost.
- CHECK(proxy_hosts_.find(render_frame_host_->GetSiteInstance()->GetId()) ==
- proxy_hosts_.end());
+ CHECK(proxy_hosts_->Get(render_frame_host_->GetSiteInstance()->GetId()) ==
ncarter (slow) 2015/07/21 19:07:14 CHECK(!proxy_hosts->Get(...)) ?
Avi (use Gerrit) 2015/07/21 20:45:16 Done.
+ nullptr);
}
void RenderFrameHostManager::ShutdownProxiesIfLastActiveFrameInSiteInstance(
@@ -2147,7 +2226,7 @@ RenderFrameHostImpl* RenderFrameHostManager::UpdateStateForNavigate(
// original site). In that case, we have a proxy for the current RFH but
// haven't deleted it yet. The new navigation will swap it back in, so we can
// delete the proxy.
- DeleteRenderFrameProxyHost(new_instance.get());
+ proxy_hosts_->Remove(new_instance.get()->GetId());
if (ShouldReuseWebUI(current_entry, dest_url)) {
pending_web_ui_.reset();
@@ -2245,12 +2324,12 @@ bool RenderFrameHostManager::IsOnSwappedOutList(
if (!rfh->GetSiteInstance())
return false;
- RenderFrameProxyHostMap::const_iterator iter = proxy_hosts_.find(
- rfh->GetSiteInstance()->GetId());
- if (iter == proxy_hosts_.end())
+ RenderFrameProxyHost* host =
+ proxy_hosts_->Get(rfh->GetSiteInstance()->GetId());
+ if (!host)
return false;
- return iter->second->render_frame_host() == rfh;
+ return host->render_frame_host() == rfh;
}
RenderViewHostImpl* RenderFrameHostManager::GetSwappedOutRenderViewHost(
@@ -2258,26 +2337,19 @@ RenderViewHostImpl* RenderFrameHostManager::GetSwappedOutRenderViewHost(
RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance);
if (proxy)
return proxy->GetRenderViewHost();
- return NULL;
+ return nullptr;
}
RenderFrameProxyHost* RenderFrameHostManager::GetRenderFrameProxyHost(
SiteInstance* instance) const {
- RenderFrameProxyHostMap::const_iterator iter =
- proxy_hosts_.find(instance->GetId());
- if (iter != proxy_hosts_.end())
- return iter->second;
-
- return NULL;
+ return proxy_hosts_->Get(instance->GetId());
}
-void RenderFrameHostManager::DeleteRenderFrameProxyHost(
- SiteInstance* instance) {
- RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId());
- if (iter != proxy_hosts_.end()) {
- delete iter->second;
- proxy_hosts_.erase(iter);
- }
+std::map<int, RenderFrameProxyHost*>
+RenderFrameHostManager::GetAllProxyHostsForTesting() {
+ std::map<int, RenderFrameProxyHost*> result;
+ result.insert(proxy_hosts_->begin(), proxy_hosts_->end());
+ return result;
}
void RenderFrameHostManager::CreateOpenerProxiesIfNeeded(

Powered by Google App Engine
This is Rietveld 408576698