Index: content/browser/web_contents/web_contents_impl.cc |
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc |
index 595bdc10043e58d74b1db9de274e590c2316490e..32cf3b82a9e66dc501f8619e371d51043eaf1ff0 100644 |
--- a/content/browser/web_contents/web_contents_impl.cc |
+++ b/content/browser/web_contents/web_contents_impl.cc |
@@ -211,30 +211,12 @@ bool ForEachFrameInternal( |
return true; |
} |
-bool ForEachPendingFrameInternal( |
- const base::Callback<void(RenderFrameHost*)>& on_frame, |
- FrameTreeNode* node) { |
- RenderFrameHost* pending_frame_host = |
- node->render_manager()->pending_frame_host(); |
- if (pending_frame_host) |
- on_frame.Run(pending_frame_host); |
- return true; |
-} |
- |
void SendToAllFramesInternal(IPC::Message* message, RenderFrameHost* rfh) { |
IPC::Message* message_copy = new IPC::Message(*message); |
message_copy->set_routing_id(rfh->GetRoutingID()); |
rfh->Send(message_copy); |
} |
-void RunRenderFrameDeleted( |
- ObserverList<WebContentsObserver>* observer_list, |
- RenderFrameHost* render_frame_host) { |
- FOR_EACH_OBSERVER(WebContentsObserver, |
- *observer_list, |
- RenderFrameDeleted(render_frame_host)); |
-} |
- |
} // namespace |
WebContents* WebContents::Create(const WebContents::CreateParams& params) { |
@@ -400,23 +382,29 @@ WebContentsImpl::~WebContentsImpl() { |
Source<WebContents>(this), |
NotificationService::NoDetails()); |
- base::Callback<void(RenderFrameHost*)> run_render_frame_deleted_callback = |
- base::Bind(&RunRenderFrameDeleted, base::Unretained(&observers_)); |
- frame_tree_.ForEach(base::Bind(&ForEachPendingFrameInternal, |
- run_render_frame_deleted_callback)); |
+ // Destroy all frame tree nodes except for the root; this notifies observers. |
+ frame_tree_.ResetForMainFrameSwap(); |
+ GetRenderManager()->ResetProxyHosts(); |
- RenderViewHost* pending_rvh = GetRenderManager()->pending_render_view_host(); |
- if (pending_rvh) { |
+ // Manually call the observer methods for the root frame tree node. |
+ RenderFrameHostManager* root = GetRenderManager(); |
+ if (root->pending_frame_host()) { |
FOR_EACH_OBSERVER(WebContentsObserver, |
observers_, |
- RenderViewDeleted(pending_rvh)); |
+ RenderFrameDeleted(root->pending_frame_host())); |
} |
- |
- ForEachFrame(run_render_frame_deleted_callback); |
- |
FOR_EACH_OBSERVER(WebContentsObserver, |
observers_, |
- RenderViewDeleted(GetRenderManager()->current_host())); |
+ RenderFrameDeleted(root->current_frame_host())); |
+ |
+ if (root->pending_render_view_host()) { |
+ FOR_EACH_OBSERVER(WebContentsObserver, |
+ observers_, |
+ RenderViewDeleted(root->pending_render_view_host())); |
+ } |
+ |
+ FOR_EACH_OBSERVER( |
+ WebContentsObserver, observers_, RenderViewDeleted(root->current_host())); |
FOR_EACH_OBSERVER(WebContentsObserver, |
observers_, |