# What is content/browser/renderer_host? This directory contains code that can be loosely categorized as "handling the renderer," covering a wide range of topics (navigation, compositing, input, etc). Many of the classes represent a browser-side version of a renderer concept (e.g., RenderFrameHostImpl is the browser-side equivalent of RenderFrameImpl). Refer to the class-level comments on how each class relates to or interacts with the renderer. Note that many of the key classes here are defined in `content/public` and exposed to `//content` embedders, with implementations living in `content/browser/renderer_host`. ## Rough Categories A non-exhaustive list of rough categories and descriptions for the code within `renderer_host` is below. When adding something that falls into the miscellaneous category, consider if it belongs in a separate directory, either under `content/browser/` or under `content/browser/renderer_host`. ### Browser-side representation of documents and frame-tree-related renderer-side objects Allows the browser-side code to represent document and frame-tree related concepts, and communicate with the renderer-side. Some important classes include: - **FrameTree** and **FrameTreeNode**: Represents the frames in the frame tree of a page. - **RenderFrameHost**: Roughly represents a document within a frame, although it does not (yet) change for every new document. - **RenderFrameProxyHost**: A placeholder for a frame in other SiteInstanceGroups and renderer processes. - **RenderViewHost**: Represents a page within a given SiteInstanceGroup. - **RenderWidgetHost**: A group of contiguous same-SiteInstanceGroup frames that can paint or handle input events as a single unit. For diagrams and explanations of how those classes fit with each other, see also [this documentation](https://www.chromium.org/developers/design-documents/oop-iframes/) and [docs/frame_trees.md](https://chromium.googlesource.com/chromium/src/+/main/docs/frame_trees.md). ### Connections between browser and renderer/GPU processes, process-related code Represents child processes (e.g., renderers, GPU, etc) and their connection to the browser process. An important class in this category is **RenderProcessHost**, which represents the browser side of the browser <-> renderer communication channel. There will be one RenderProcessHost per renderer process. ### Navigation Navigation handling code, coordinating the browser & renderer from navigation start to finish. Also keeps track of the session history entries created by the committed navigations. Some important classes include: - **NavigationRequest**: Represents a navigation attempt, and tracks information related to it. - **NavigationController**: Manages the joint session history for a frame tree. - **NavigationEntry** and **FrameNavigationEntry**: Represents joint session history items (for pages), made up of a tree of session history items (for frames). See also [docs/navigation.md](https://chromium.googlesource.com/chromium/src/+/main/docs/navigation.md) and [docs/session_history.md](https://chromium.googlesource.com/chromium/src/+/main/docs/session_history.md). ### Compositing, input, display Coordinates handling of input, display, and compositing between the browser, renderer, and GPU processes. Some important classes include: - **RenderWidgetHostView\***: The browser owned object that mediates the blink::VisualProperties to be used by an embedded Renderer. - **DelegatedFrameHost**: Used by RenderWidgetHostView to control which viz::Surface of an embedded Renderer the GPU process will display EmbeddedFrameSinkImpl: The browser owned object that mediates between an embedded Renderer and the GPU process. Allowing for the creation of Renderer-GPU Mojo connections. - **viz::HostFrameSinkManager**: The browser owned object, accessed via GetHostFrameSinkManager, that controls the Browser-GPU Mojo connection. Used to establish future connections for Renderers, as well as to control what viz::Surfaces to display. ### Misc features that heavily interact with the renderer Examples: loading/networking, file/storage, plugins, UI, fonts, media, accessibility. ## Layering restriction with WebContents Code in this directory can't call up to the WebContents "layer," except through delegate interfaces (e.g. RenderFrameHostDelegate). This is to separate out code that deals with the renderer process and code that deals with the tab. This is enforced by the [DEPS](https://source.chromium.org/chromium/chromium/src/+/main:content/browser/renderer_host/DEPS).