// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_BROWSER_RENDERER_HOST_RENDER_FRAME_PROXY_HOST_H_ #define CONTENT_BROWSER_RENDERER_HOST_RENDER_FRAME_PROXY_HOST_H_ #include <stdint.h> #include <memory> #include "base/functional/callback_forward.h" #include "base/memory/raw_ptr.h" #include "base/memory/safe_ref.h" #include "content/browser/renderer_host/agent_scheduling_group_host.h" #include "content/browser/site_instance_impl.h" #include "content/common/content_export.h" #include "content/common/frame.mojom.h" #include "content/public/browser/global_routing_id.h" #include "content/public/browser/render_process_host.h" #include "ipc/ipc_listener.h" #include "ipc/ipc_sender.h" #include "mojo/public/cpp/bindings/associated_receiver.h" #include "mojo/public/cpp/bindings/associated_remote.h" #include "third_party/blink/public/common/tokens/tokens.h" #include "third_party/blink/public/mojom/frame/frame.mojom.h" #include "third_party/blink/public/mojom/input/focus_type.mojom-forward.h" #include "third_party/blink/public/mojom/messaging/transferable_message.mojom-forward.h" #include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom-forward.h" namespace blink { class AssociatedInterfaceProvider; } namespace gfx { class Rect; class RectF; } namespace perfetto { namespace protos { namespace pbzero { class RenderFrameProxyHost; } } // namespace protos } // namespace perfetto namespace content { class BatchedProxyIPCSender; class CrossProcessFrameConnector; class FrameTreeNode; class RenderViewHostImpl; class RenderWidgetHostViewChildFrame; class SiteInstanceGroup; // When a page's frames are rendered by multiple processes, each renderer has a // full copy of the frame tree. It has full RenderFrames for the frames it is // responsible for rendering and placeholder objects (i.e., // `blink::RemoteFrame`) for frames rendered by other processes. // // This class is the browser-side host object for the placeholder. Each node in // the frame tree has a RenderFrameHost for the active SiteInstance and a set // of RenderFrameProxyHost objects - one for all other SiteInstanceGroups with // references to this frame. The proxies allow us to keep existing window // references valid over cross-process navigations and route cross-site // asynchronous JavaScript calls, such as postMessage. // // RenderFrameProxyHost is created whenever a cross-site // navigation occurs and a reference to the frame navigating needs to be kept // alive. A RenderFrameProxyHost and a RenderFrameHost in the same // SiteInstanceGroup can exist at the same time, but only one will be "active" // at a time. There are two cases where the two objects will coexist: // * When navigating cross-process and there is already a RenderFrameProxyHost // for the new SiteInstanceGroup. A pending RenderFrameHost is created, but it // is not used until it commits. At that point, RenderFrameHostManager // transitions the pending RenderFrameHost to the active one and deletes the // proxy. // * When navigating cross-process and the existing document has an unload // event handler. When the new navigation commits, RenderFrameHostManager // creates a RenderFrameProxyHost for the old SiteInstanceGroup and uses it // going forward. It also instructs the RenderFrameHost to run the unload event // handler and is kept alive for the duration. Once the event handling is // complete, the RenderFrameHost is deleted. class CONTENT_EXPORT RenderFrameProxyHost : public IPC::Listener, public IPC::Sender, public blink::mojom::RemoteFrameHost, public blink::mojom::RemoteMainFrameHost { … }; } // namespace content #endif // CONTENT_BROWSER_RENDERER_HOST_RENDER_FRAME_PROXY_HOST_H_