// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.web;

using fuchsia.io;
using fuchsia.mem;

enum ContextError : int32 {
    /// The remote debugging service was not opened.
    REMOTE_DEBUGGING_PORT_NOT_OPENED = 1;
};

/// The top-level service interface which allows for the creation of Context resources.
// TODO(fxbug.dev/29926): Remove ContextProvider in favor of launching Context instances directly.
[Discoverable]
protocol ContextProvider {
    /// Creates a new browser [`Context`] whose state is wholly independent and isolated from other
    /// [`Context`](`Contexts`).
    ///
    /// - `params`: The configuration used to create the [`Context`].
    /// - `context`: An interface request which will receive a bound [`Context`]
    ///   service.
    Create(CreateContextParams params, request<Context> context);
};

/// Defines a provider which hosts resources from a [`fuchsia.io/Directory`]. Content can `GET`
/// resource files via the provider, but not enumerate directories. Resources can be accessed by
/// their URLs: `fuchsia-dir://<provider-name>/<path/to/resource>`
///
/// By default the MIME types of files are determined automatically by "sniffing" the contents of
/// the files. No content encoding will be declared, which browsers will interpret as meaning
/// `"text/plain"`.
///
/// Content type and encoding metadata may optionally be specified explicitly by metadata files,
/// which reside alongside the file. Metadata is expressed in JSON files, named after the files
/// they describe with a `"._metadata"` suffix.
///
/// For example, the file `"index.html"` would have the a metadata file called
/// `"index.html._metadata"`, with the following contents:
/// ```
/// {
///   "charset": "utf-8",
///   "mime": "text/html"
/// }
/// ```
resource table ContentDirectoryProvider {
    /// Name of the provider. Must be non-empty and composed solely of alphanumerics, dots, and
    /// dashes.
    1: string:255 name;

    /// Directory containing the files served by this provider.
    2: fuchsia.io.Directory directory;
};

/// Feature flags that allow augmenting Context behavior. Some features require additional services
/// in the service directory provided during context initialization. See
/// [`CreateContextParams.service_directory`].
bits ContextFeatureFlags : uint64 {
    /// Enables network access. Requires the following services:
    /// - [`fuchsia.net/NameLookup`]
    /// - [`fuchsia.net.interfaces/State`]
    /// - [`fuchsia.netstack/Netstack`]
    /// - [`fuchsia.posix.socket/Provider`]
    NETWORK = 0x1;

    /// Enables audio input and output. Requires the following services:
    /// - [`fuchsia.media/Audio`]
    /// - [`fuchsia.media/SessionAudioConsumerFactory`]
    AUDIO = 0x2;

    /// Enables GPU-accelerated rendering of the web content. Requires the following services:
    /// - [`fuchsia.vulkan.loader/Loader`]
    VULKAN = 0x4;

    /// Enables hardware video decoding. `VULKAN` must be enabled as well. Requires the following
    /// service:
    /// - [`fuchsia.mediacodec/CodecFactory`]
    HARDWARE_VIDEO_DECODER = 0x8;

    /// Disables all software video decoders. Videos will be rendered only if they can be decoded
    /// in hardware using [`fuchsia.mediacodec/CodecFactory`]. Requires the
    /// `HARDWARE_VIDEO_DECODER` flag.
    HARDWARE_VIDEO_DECODER_ONLY = 0x10;

    /// Enables Widevine CDM modules for EME API. `VULKAN` feature must be enabled as well.
    /// Requires [`fuchsia.media.drm/Widevine`] service. Requires that a `cdm_data_directory` be
    /// specified in [`CreateContextParams`].
    WIDEVINE_CDM = 0x20;

    /// Allows embedders to render web content without graphical output or Scenic.
    /// Not compatible with the `VULKAN` flag.
    HEADLESS = 0x40;

    /// Report telemetry data to the [`fuchsia.legacymetrics/MetricsRecorder`].
    LEGACYMETRICS = 0x80;
};

/// Parameters specifying the configuration for a new [`Context`].
resource table CreateContextParams {
    /// Service directory to be used by the context. The following services must be present in the
    /// directory:
    /// - [`fuchsia.device/NameProvider`]
    /// - [`fuchsia.fonts/Provider`]
    /// - [`fuchsia.intl/PropertyProvider`]
    /// - [`fuchsia.logger/LogSink`]
    /// - [`fuchsia.memorypressure/Provider`]
    /// - [`fuchsia.process/Launcher`]
    /// - [`fuchsia.sysmem/Allocator`]
    ///
    /// The following services must be present in order to render web content in a Scenic view
    /// using [`Frame.CreateView`] or [`Frame.CreateViewWithViewRef`]:
    /// - [`fuchsia.accessibility.semantics/SemanticsManager`]
    /// - [`fuchsia.ui.input/ImeService`]
    /// - [`fuchsia.ui.input/ImeVisibilityService`]
    /// - [`fuchsia.ui.scenic/Scenic`]
    1: fuchsia.io.Directory service_directory;

    /// Handle to the directory that will contain the [`Context`]'s persistent data. If it is left
    /// unset, then the created [`Context`] will be stateless, with all of its data discarded upon
    /// [`Context`] destruction.
    ///
    /// If set, `data_directory` must not be shared with any other [`Context`].
    // TODO(fxbug.dev/29925): Provide an API to inform the caller when the `data_directory` can be safely
    // removed.
    2: fuchsia.io.Directory data_directory;

    /// Optional string describing the embedding product to append to the User-Agent string.
    /// See the specification for the
    /// [HTTP User-Agent header](https://tools.ietf.org/html/rfc7231#section-5.5.3).
    /// Requires that `user_agent_version` is also specified.
    3: string:128 user_agent_product;

    /// Optional version for the embedding product to append to the User-Agent string.
    ///
    /// Requires that `user_agent_product` is also specified.
    4: string:128 user_agent_version;

    /// Enables Frames to be created with remote debugging enabled using the DevTools protocol. If
    /// `port` is 0, then an ephemeral port will be used, which can be queried via the
    /// [`Context.GetRemoteDebuggingPort`] API.
    5: uint16 remote_debugging_port;

    /// List of providers whose contents will be served by `fuchsia-dir://` URLs.
    6: vector<ContentDirectoryProvider>:100 content_directories;

    /// Optional features that should be enabled for this context. Some features may also require
    /// additional services in `service_directory`.
    7: ContextFeatureFlags features;

    /// Enables PlayReady CDM for the Context using the specified string as a key system
    /// string. The string should be a reverse domain name, as required by
    /// [EME API](https://www.w3.org/TR/encrypted-media/#key-system).
    ///
    /// - Requires [`fuchsia.media.drm/PlayReady`] service.
    /// - Requires that a `cdm_data_directory` be specified in [`CreateContextParams`].
    8: string:128 playready_key_system;

    /// Treat given insecure origins as secure origins. For the definition of secure contexts, see
    /// [Secure Contexts](https://w3c.github.io/webappsec-secure-contexts/) and
    /// [origin trustworthiness](https://www.w3.org/TR/powerful-features/#is-origin-trustworthy).
    ///
    /// Example value: `{"http://a.com", "http://b.com"}`.
    9: vector<UrlSchemeAndHostName>:100 unsafely_treat_insecure_origins_as_secure;

    /// Specifies a set of header names for which [Cross-Origin Resource Sharing
    /// (CORS)](https://www.w3.org/TR/cors/) checks should not be enforced.
    10: vector<bytes:MAX>:MAX cors_exempt_headers;

    /// Specifies the storage to use to persistent content licensing related data (e.g.
    /// provisioning data, persistent session data). By default these data will be placed under the
    /// `data_directory`, if specified.
    ///
    /// If neither `data_directory` nor `cdm_data_directory` are specified, then content licensing
    /// features requiring persistent storage (e.g. persistent licensing sessions) will not be
    /// available to the [`Context`].
    ///
    /// Note that not all content licensing systems support persistent sessions, regardless of
    /// whether persistent storage is provided.
    11: fuchsia.io.Directory cdm_data_directory;

    /// Specifies a target maximum size for `cdm_data_directory` contents, in bytes. If the amount
    /// of persisted CDM data exceeds this threshold, then the [`Context`] will attempt to purge
    /// some data to meet the specified quota.
    12: uint64 cdm_data_quota_bytes;

    /// Specifies a target maximum size for `data_directory` contents, in bytes.
    /// The [`Context`] will attempt to limit browsing state (e.g. cookies, LocalStorage) to
    /// not exceed the specified size.
    13: uint64 data_quota_bytes;
};

/// Manages browsing state (e.g. LocalStorage, cookies, etc) associated with a set of [`Frame`].
protocol Context {
    /// Creates a new [`Frame`] under this [`Context`]. Destruction of a [`Context`] triggers the
    /// destruction of all of its associated [`Frame`]. [`Frame`] can be transferred to another
    /// component but cannot be shared across multiple components.
    ///
    /// - `frame`: An interface request that will be bound to the created [`Frame`].
    CreateFrame(request<Frame> frame);

    /// Similar to [`Context.CreateFrame`], with extra parameters.
    ///
    /// - `params`: The configuration used to create the [`Frame`].
    ///   This method will fail with `ZX_ERR_INVALID_ARGS` if the table is not clonable.
    /// - `frame`: An interface request that will be bound to the created [`Frame`].
    // TODO(fxbug.dev/65750): Consider removing the clonable params restriction if clients
    // become responsible for providing parameters for [each] popup.
    CreateFrameWithParams(CreateFrameParams params, request<Frame> frame);

    /// Used to observe cookies for sites hosted under this Context.
    GetCookieManager(request<CookieManager> manager);

    /// Waits until debugging is available on one or more Frames, and returns the DevTools port
    /// number. Multiple calls may be queued to received the port number.
    ///
    /// If an error occured, the [`ContextError`] will be set to this value:
    /// - `REMOTE_DEBUGGING_PORT_NOT_OPENED`: `remote_debugging_port` was not set in
    ///   [`CreateContextParams`] or the remote debugging service failed to start.
    GetRemoteDebuggingPort() -> (uint16 port) error ContextError;
};

/// Parameters specifying the configuration for a new [`Frame`].
resource table CreateFrameParams {
    /// Set to true to enable remote debugging. The [`Frame`] will be closed with
    /// `ERR_INVALID_ARGS` if `remote_debugging_port` was not set in
    /// [`CreateContextParams`].
    1: bool enable_remote_debugging;

    /// Set to give the Frame a name to help distinguish it in debug contexts , such as system log
    /// output. For example, the name may be added to messages from web content when they are logged
    /// to the system logger. The name does not affect user- or web-visible behavior.
    /// Popup Frames created by the Frame will have a name derived from the parent Frame's name.
    2: string:MAX debug_name;

    /// Sets the autoplay policy for the Frame. If omitted, the default policy is
    /// `REQUIRE_USER_ACTIVATION`.
    /// [`CreateFrame`] will fail with `ZX_ERR_NOT_SUPPORTED` if the value specified is not
    /// supported by the [`Context`].
    3: AutoplayPolicy autoplay_policy;

    /// Enables automatic blocking of navigations to explicit sites, and specifies the error page
    /// content, in HTML, to be loaded in the Frame when a navigation is canceled by the filter.
    /// Applies to navigations in all frames within the Frame.
    /// When navigation of the main document is canceled, the Frame's [`NavigationState.PageType`]
    /// is `ERROR`.
    /// If set to an empty buffer, a default error message will be displayed.
    /// If set and such filtering is not supported, the [`Frame`] will disconnect with
    /// `ZX_ERR_NOT_SUPPORTED`.
    4: fuchsia.mem.Data explicit_sites_filter_error_page;
};

/// Used by [`Context`] clients to delegate [`Frame`] hosting capabilities to selected peers.
[Discoverable]
protocol FrameHost {
    /// Behaves identically to [`Context.CreateFrameWithParams`].
    CreateFrameWithParams(CreateFrameParams params, request<Frame> frame);
};

/// Specifies the policy for automatic (non user-initiated) playback of video and audio content.
enum AutoplayPolicy : int32 {
    /// All media is permitted to autoplay.
    ALLOW = 1;

    /// Allow autoplay when the document has received a user activation. This can be the result of
    /// user action or [`LoadUrlParams.was_user_activated`] being set.
    REQUIRE_USER_ACTIVATION = 2;
};
