Chromium Code Reviews| 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( |