chromium/third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom

// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// See `content/browser/fenced_frame/fenced_frame_config.h` for a high-level
// description of the FencedFrameConfig information flow.

module blink.mojom;

import "services/network/public/mojom/schemeful_site.mojom";
import "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom";
import "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom";
import "url/mojom/url.mojom";
import "url/mojom/origin.mojom";

enum ReportingDestination {
  kBuyer,
  kSeller,
  kComponentSeller,
  kSharedStorageSelectUrl,
  kDirectSeller,
};

// The fenced frame config's "mode" describes a set of functionalities that it
// should have. (In the future, the concept of a "mode" will be removed, and
// replaced with individual fields controlling each functionality.)
// The mode is a function of the API that creates the config. Protected Audience
// and Shared Storage use kOpaqueAds mode, and the WebIDL FencedFrameConfig()
// constructor uses kDefault mode.
// https://github.com/WICG/fenced-frame/blob/master/explainer/modes.md
enum DeprecatedFencedFrameMode {
  kDefault = 0,
  kOpaqueAds = 1,
};

// In order to represent that a value exists in a different process but is
// hidden from this process, we use a union of a type T and this singleton enum
// `Opaque`. (This is used by a more privileged process to censor information
// that is being sent to a less privileged process, based on fenced
// frame-specific privacy policies.
enum Opaque {
  kOpaque
};

// Unlike event-level reporting through reportEvent(), automatic beacons only
// support a few specified types. Once the event type string is validated in
// setReportEventDataForAutomaticBeacons(), they are converted into an enum
// and used as the key in the automatic beacon info mapping stored in the
// browser.
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum AutomaticBeaconType {
  kDeprecatedTopNavigation = 0,
  kTopNavigationStart = 1,
  kTopNavigationCommit = 2
};

union PotentiallyOpaqueURL {
  url.mojom.Url transparent;
  Opaque opaque;
};

union PotentiallyOpaqueSize {
  gfx.mojom.Size transparent;
  Opaque opaque;
};

union PotentiallyOpaqueBool {
  bool transparent;
  Opaque opaque;
};

struct AdAuctionData {
  url.mojom.Origin interest_group_owner;
  string interest_group_name;
};

union PotentiallyOpaqueAdAuctionData {
  AdAuctionData transparent;
  Opaque opaque;
};

union PotentiallyOpaqueConfigVector {
  array<FencedFrameConfig> transparent;
  Opaque opaque;
};

struct URNConfigPair {
  url.mojom.Url urn;
  FencedFrameConfig config;
};

union PotentiallyOpaqueURNConfigVector {
  array<URNConfigPair> transparent;
  Opaque opaque;
};

struct SharedStorageBudgetMetadata {
  network.mojom.SchemefulSite site;
  double budget_to_charge;
  bool top_navigated;
};

union PotentiallyOpaqueSharedStorageBudgetMetadata {
  SharedStorageBudgetMetadata transparent;
  Opaque opaque;
};

// Stores information about the frame's parent's permissions policy. Normally
// this information is inaccessible due to the fenced frame boundary, but this
// is needed when calculating permissions inheritance. This information will be
// used to build a copy of the fenced frame's parent's permissions policy.
struct ParentPermissionsInfo {
  array<blink.mojom.ParsedPermissionsPolicyDeclaration>
      parsed_permissions_policy;
  url.mojom.Origin origin;
};

// The `FencedFrameConfig` struct is used to transfer a redacted version
// (`blink::RedactedFencedFrameConfig`) of `content::FencedFrameConfig` from the
// browser process, to the renderer process, where the redaction process is
// specific to whether the target renderer is either a fenced frame's embedder
// or a frame inside the fenced frame tree. For more documentation on the
// redaction process, see the comments above `content::FencedFrameConfig`. In
// brief, this is a collection of properties that the browser process exposes to
// an embedder that may wish to load into a fenced frame. The config will
// determine the fenced frame's behavior, but it may have certain fields
// redacted (marked as opaque) in order to preserve privacy. For example:
// * This object is returned to the caller of APIs that use fenced frames,
//   so that they can inspect the (unredacted) information inside and then
//   load it into a fenced frame.
// * When nested frames are declared in the above APIs, the top-level
//   frame will be given access to these objects in order to load the nested
//   configs.
struct FencedFrameConfig {
  // This is the actual URL that will be loaded into the fenced frame when
  // navigated to. It can be opaque because for the current use cases (Protected
  // Audience, shared storage), we never want to expose anything about the
  // actual resource beyond its existence, to the embedder of a fenced frame.
  PotentiallyOpaqueURL? mapped_url;

  PotentiallyOpaqueSize? container_size;

  PotentiallyOpaqueSize? content_size;

  PotentiallyOpaqueBool? deprecated_should_freeze_initial_size;

  PotentiallyOpaqueAdAuctionData? ad_auction_data;

  PotentiallyOpaqueConfigVector? nested_configs;

  PotentiallyOpaqueSharedStorageBudgetMetadata? shared_storage_budget_metadata;

  // This is the internal URN that represents this config in the browser-side
  // `FencedFrameURLMapping`. When this config is navigated to via a fenced
  // frame, it is this internal urn:uuid that we send to the browser to navigate
  // to the actual browser-side `content::FencedFrameConfig` object that
  // represents this instance of this struct. `blink::IsValidUrnUuidURL()` will
  // always be true when called with this urn.
  url.mojom.Url urn_uuid;

  // The fenced frame's mode (default or opaque-ads).
  // TODO(crbug.com/1347953): This field is not yet used.
  // TODO(crbug.com/1347953): Decompose this field into flags that directly
  // control the frame's behavior, e.g. sandbox flags. We don't want the
  // concept of a mode to stick around in the future.
  DeprecatedFencedFrameMode mode;

  // APIs like Protected Audience and Shared Storage require specific features
  // to be enabled in the loaded frame. If an embedder is allowed to set
  // arbitrary permissions on a fenced frame, it can be used as a fingerprinting
  // channel. Instead, each API sets a list of feature permissions that a fenced
  // frame needs to enable to be allowed to load. Only used for fenced frames
  // with a fixed permissions policy.
  array<PermissionsPolicyFeature> effective_enabled_permissions;

  // Fenced frames with a flexible permissions policy are allowed to inherit
  // certain permissions policies from their parent. However, a fenced frame's
  // renderer process doesn't have access to its parent. Instead, we give it
  // this information through the fenced frame config so that it can calculate
  // permissions inheritance. Only non-null for non-opaque fenced frames (i.e.
  // fenced frames whose mode = DeprecatedFencedFrameMode::kDefault).
  ParentPermissionsInfo? parent_permissions_info;
};

// The `FencedFrameProperties` struct is used to transfer a redacted version
// (`blink::RedactedFencedFrameProperties`) of `content::FencedFrameProperties`
// across processes. In brief, this is a collection of properties that is being
// or has already been loaded into a fenced frame and determines its behavior,
// but may have certain fields redacted (marked as opaque) in order to preserve
// privacy.
// For example:
// * When a `FencedFrameConfig` (see above) is loaded into a fenced frame, a
//   `FencedFrameProperties` object is generated from the config and is
//   sent to the fenced frame's renderer upon navigation commit. These
//   properties are used to determine availability of certain APIs, store
//   nested configs, etc.
struct FencedFrameProperties {
  PotentiallyOpaqueURL? mapped_url;

  PotentiallyOpaqueSize? container_size;

  PotentiallyOpaqueSize? content_size;

  PotentiallyOpaqueBool? deprecated_should_freeze_initial_size;

  PotentiallyOpaqueAdAuctionData? ad_auction_data;

  // If this is a navigation to the result of an InterestGroup auction, this
  // is a list of URNs that map to auction component URLs. Null, otherwise.
  // When non-null, always contains exactly kMaxAdAuctionAdComponents=20 URNs
  // to avoid use as a data sidechannel between auction worklets and the
  // fenced frames their results are loaded in.
  PotentiallyOpaqueURNConfigVector? nested_urn_config_pairs;

  PotentiallyOpaqueSharedStorageBudgetMetadata? shared_storage_budget_metadata;

  // Whether the fenced frame potentially has any fenced frame reporting
  // information associated with it.
  bool has_fenced_frame_reporting;

  DeprecatedFencedFrameMode mode;

  array<PermissionsPolicyFeature> effective_enabled_permissions;

  // Fenced frames with a flexible permissions policy are allowed to inherit
  // certain permissions policies from their parent. However, a fenced frame's
  // renderer process doesn't have access to its parent. Instead, we give it
  // this information through the fenced frame config so that it can calculate
  // permissions inheritance. Only non-null for non-opaque fenced frames (i.e.
  // fenced frames whose mode = DeprecatedFencedFrameMode::kDefault).
  ParentPermissionsInfo? parent_permissions_info;

  // Whether this config allows calls to window.fence.disableUntrustedNetwork()
  // (and then access to unpartitioned storage).
  // Currently false in urn iframes, and in documents cross-origin to the
  // mapped url in fenced frames.
  bool can_disable_untrusted_network;

  // Whether the document this config belongs to is cross-origin to the document
  // that owns the fenced frame config. Equivalent to
  // FencedFrameEntity::kCrossOriginContent in the browser-side config.
  bool is_cross_origin_content;

  // Whether the original document loaded with this config opted in to
  // cross-origin event-level reporting. That is, if the document was served
  // with the `Allow-Cross-Origin-Event-Reporting=true` response header. This is
  // the first half of the opt-in process for a cross-origin subframe to send a
  // `reportEvent()` beacon using this config's reporting metadata successfully.
  bool allow_cross_origin_event_reporting;
};