0
Files
src/content
William Liu 7cc3858a4c [view-transition] Force a BFCache-restored page to show its fallback
content during ViewTransition.

Without a fallback surface, the restore page could draw the a new
frame using the restored page's primary surface before the VT
animation runs. The primary surface is the last surface drew before
entering the BFCache, hence introducing a visual glitch.

To ensure a smooth view transition:
1. We need to ensure that drawing content from the restored page starts with its first main frame (i.e a commit from the renderer main
thread). That requires updating the SurfaceID when the page is
restored. Generally updating the parent sequence number is sufficient
for this but we want to prevent Viz from reusing a cached
CompositorFrame for the restored page. This happens because the logic
here favours using any frame from the primary Surface's SurfaceAllocationGroup:
https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:components/viz/service/surfaces/surface_manager.cc;l=392;drc=73265a30d5b5a3873dbf3b92f01abc5c2892ece3. In the case of BFCache activation, the
primary surface is captured as the last frame before the page entered
BFCache. So we also need to change the allocation group, which is done
by updating the embed token.
2. We need to ensure we keep drawing the content from the previous
page until the restored page draws a frame. This is done by reusing the
existing code for retaining a fallback surface when swapping RWHVs.

This CL explicitly tells the View/ui::Layer/CC/Viz to not use the
primary surface of the BFC-restored page. Instead, set the fallback
surface of the restored page to the primary surface of the current view,
and draw using the fallback.

need tests.

Low-Coverage-Reason: render_widget_host_view_child_frame.cc does not
Bug: 1415340
Change-Id: I00da69d9988ca269668d6748fb99760658843fa7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4563504
Reviewed-by: Khushal Sagar <khushalsagar@chromium.org>
Reviewed-by: Bo Liu <boliu@chromium.org>
Commit-Queue: William Liu <liuwilliam@chromium.org>
Reviewed-by: Nico Weber <thakis@chromium.org>
Reviewed-by: Jonathan Ross <jonross@chromium.org>
Reviewed-by: Vladimir Levin <vmpstr@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1182211}
2023-08-10 19:04:09 +00:00
..

Content module

High-level overview

The "content" module is located in src/content, and is the core code needed to render a page using a multi-process sandboxed browser. It includes all the web platform features (i.e. HTML5) and GPU acceleration. It does not include Chrome features, e.g. extensions/autofill/spelling etc.

Motivation

As the Chromium code has grown, features inevitably hooked into the wrong places, causing layering violations and dependencies that shouldn't exist. It's been hard for developers to figure out what the "best" way is because the APIs (when they existed) and features were together in the same directory. To avoid this happening, and to add a clear separation between the core pieces of the code that render a page using a multi-process browser, consensus was reached to move the core Chrome code into src/content (content not chrome :) ).

content vs chrome

content should only contain code that is required to implement the web platform. Generally, a feature belongs in this category if and only if all of the following are true:

In contrast, many features that are common to modern web browsers do not satisfy these criteria and thus, are not implemented in content. A non-exhaustive list:

  • Extensions
  • NaCl
  • SpellCheck
  • Autofill
  • Sync
  • Safe Browsing
  • Translate

Instead, these features are implemented in chrome, while content only provides generic extension points that allow these features to subscribe to the events they require. Some features will require adding new extension points: for more information, see How to Add New Features (without bloating RenderView/RenderViewHost/WebContents).

Finally, there are a number of browser features that require interaction with online services supplied by the vendor, e.g. from the above list, Safe Browsing, Translate, Sync, and Autofill all require various network services to function. The chrome layer is the natural place to encapsulate that vendor-specific integration behavior. For the rare cases where a web platform feature implemented in content has a dependency on a network service (e.g. the network location service used by Geolocation), content should provide a way for the embedder to inject an endpoint (e.g. chrome might provide the service URL to use). The content module itself must remain generic, with no hardcoded vendor-specific logic.

Architectural Diagram

Chrome browser depends on content, which as a whole depends on Chromium's
low-level libraries and on the constituent parts of
//content.

See an older diagram at: https://www.chromium.org/developers/content-module.

The diagram illustrates the layering of the different modules. A module can include code directly from lower modules. However, a module can not include code from a module that is higher than it. This is enforced through DEPS rules. Modules can implement embedder APIs so that modules lower than them can call them. Examples of these APIs are the WebKit API and the Content API.

Content API

The Content API is how code in content can indirectly call Chrome. Where possible, Chrome features try to hook in by filtering IPCs and listening to events per How to Add New Features (without bloating RenderView/RenderViewHost/WebContents). When there isn't enough context (i.e. callback from WebKit) or when the callback is a one-off, we have a ContentClient interface that the embedder (Chrome) implements. ContentClient is available in all processes. Some processes also have their own callback API as well, i.e. ContentBrowserClient/ContentRendererClient/ContentPluginClient.

Status and Roadmap

The current status is content doesn't depend on chrome at all (see the meta bug and all bugs it depends on). We now have a basic browser built on top of content ("content_shell") that renders pages using content on all platforms. This allow developers working on the web platform and core code to only have to build/test content, instead of all of chrome.

We have a separate target for content's unit tests in content_unittests, and integration tests in content_browsertests.

content is build at a separate dll to speed up the build.

We've created an API around content, similar to our WebKit API. This isolates embedders from content's inner workings, and makes it clear to people working on content which methods are used by embedders.

Further documentation