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 564d8beb61d555ec6174d99d6d0b6240b39ac2ea..72bc0db8664b48c8fd0536284d362306fbcb29cc 100644 |
--- a/content/browser/frame_host/render_frame_host_manager.h |
+++ b/content/browser/frame_host/render_frame_host_manager.h |
@@ -44,8 +44,53 @@ class RenderWidgetHostView; |
class TestWebContents; |
class WebUIImpl; |
-// Manages RenderFrameHosts for a FrameTreeNode. This class acts as a state |
-// machine to make cross-process navigations in a frame possible. |
+// Manages RenderFrameHosts for a FrameTreeNode. It maintains a |
+// current_frame_host() which is the content currently visible to the user. When |
+// a frame is told to navigate to a different web site (as determined by |
+// SiteInstance), it will replace its current RenderFrameHost with a new |
+// RenderFrameHost dedicated to the new SiteInstance, possibly in a new process. |
+// |
+// Cross-process navigation works like this: |
+// |
+// - RFHM::Navigate determines whether the destination is cross-site, and if so, |
+// it creates a pending_render_frame_host_. |
+// |
+// - The pending RFH is created in the "navigations suspended" state, meaning no |
+// navigation messages are sent to its renderer until the beforeunload handler |
+// has a chance to run in the current RFH. |
+// |
+// - The current RFH runs its beforeunload handler. If it returns false, we |
+// cancel all the pending logic. Otherwise we allow the pending RFH to send |
+// the navigation request to its renderer. |
+// |
+// - ResourceDispatcherHost receives a ResourceRequest on the IO thread for the |
+// main resource load from the pending RFH. It creates a |
+// CrossSiteResourceHandler to check whether a process transfer is needed when |
+// the request is ready to commit. |
+// |
+// - When RDH receives a response, the BufferedResourceHandler determines |
+// whether it is a navigation type that doesn't commit (e.g. download, 204 or |
+// error page). If so, it sends a message to the new renderer causing it to |
+// cancel the request, and the request (e.g. the download) proceeds. In this |
+// case, the pending RFH will never become the current RFH, but it remains |
+// until the next DidNavigate event for this WebContentsImpl. |
+// |
+// - After RDH receives a response and determines that it is safe and not a |
+// download, the CrossSiteResourceHandler checks whether a transfer for a |
+// redirect is needed. If so, it pauses the network response and starts an |
+// identical navigation in a new pending RFH. When the identical request is |
+// later received by RDH, the response is transferred and unpaused. |
+// |
+// - Otherwise, the network response commits in the pending RFH's renderer, |
+// which sends a DidCommitProvisionalLoad message back to the browser process. |
+// |
+// - RFHM::CommitPending makes visible the new RFH, and initiates the unload |
+// handler in the old RFH. The unload handler will complete in the background. |
+// |
+// - RenderFrameHostManager may keep the previous RFH alive as a |
+// RenderFrameProxyHost, to be used (for example) if the user goes back. The |
+// process only stays live if another tab is using it, but if so, the existing |
+// frame relationships will be maintained. |
class CONTENT_EXPORT RenderFrameHostManager : public NotificationObserver { |
public: |
// Functions implemented by our owner that we need. |