Index: content/browser/frame_host/render_frame_host_manager.h |
diff --git a/content/browser/frame_host/render_frame_host_manager.h b/content/browser/frame_host/render_frame_host_manager.h |
index 53876bf969f2ec266cb934b97bd9109c8cb727fc..564d8beb61d555ec6174d99d6d0b6240b39ac2ea 100644 |
--- a/content/browser/frame_host/render_frame_host_manager.h |
+++ b/content/browser/frame_host/render_frame_host_manager.h |
@@ -5,6 +5,8 @@ |
#ifndef CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_ |
#define CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_ |
+#include <list> |
+ |
#include "base/basictypes.h" |
#include "base/logging.h" |
#include "base/memory/scoped_ptr.h" |
@@ -298,9 +300,12 @@ class CONTENT_EXPORT RenderFrameHostManager : public NotificationObserver { |
RenderFrameProxyHost* GetRenderFrameProxyHost( |
SiteInstance* instance) const; |
- // Deletes a RenderFrameHost that was pending shutdown. |
- void ClearPendingShutdownRFHForSiteInstance(int32 site_instance_id, |
- RenderFrameHostImpl* rfh); |
+ // Returns whether |render_frame_host| is on the pending deletion list. |
+ bool IsPendingDeletion(RenderFrameHostImpl* render_frame_host); |
+ |
+ // If |render_frame_host| is on the pending deletion list, this deletes it. |
+ // Returns whether it was deleted. |
+ bool DeleteFromPendingList(RenderFrameHostImpl* render_frame_host); |
// Deletes any proxy hosts associated with this node. Used during destruction |
// of WebContentsImpl. |
@@ -416,9 +421,15 @@ class CONTENT_EXPORT RenderFrameHostManager : public NotificationObserver { |
// since there could be Web UI switching as well. Call this for every commit. |
void CommitPending(); |
- // Runs the unload handler in the current page, after the new page has |
- // committed. |
- void SwapOutOldPage(RenderFrameHostImpl* old_render_frame_host); |
+ // Runs the unload handler in the old RenderFrameHost, after the new |
+ // RenderFrameHost has committed. |old_render_frame_host| will either be |
+ // deleted or put on the pending delete list during this call. |
+ void SwapOutOldFrame(scoped_ptr<RenderFrameHostImpl> old_render_frame_host); |
+ |
+ // Holds |render_frame_host| until it can be deleted when its swap out ACK |
+ // arrives. |
+ void MoveToPendingDeleteHosts( |
+ scoped_ptr<RenderFrameHostImpl> render_frame_host); |
// Shutdown all RenderFrameProxyHosts in a SiteInstance. This is called to |
// shutdown frames when all the frames in a SiteInstance are confirmed to be |
@@ -507,10 +518,11 @@ class CONTENT_EXPORT RenderFrameHostManager : public NotificationObserver { |
typedef base::hash_map<int32, RenderFrameProxyHost*> RenderFrameProxyHostMap; |
RenderFrameProxyHostMap proxy_hosts_; |
- // A map of RenderFrameHosts pending shutdown. |
- typedef base::hash_map<int32, linked_ptr<RenderFrameHostImpl> > |
- RFHPendingDeleteMap; |
- RFHPendingDeleteMap pending_delete_hosts_; |
+ // A list of RenderFrameHosts waiting to shut down after swapping out. We use |
+ // a linked list since we expect frequent deletes and no indexed access, and |
+ // because sets don't appear to support linked_ptrs. |
+ typedef std::list<linked_ptr<RenderFrameHostImpl> > RFHPendingDeleteList; |
+ RFHPendingDeleteList pending_delete_hosts_; |
// The intersitial page currently shown if any, not own by this class |
// (the InterstitialPage is self-owned, it deletes itself when hidden). |