// 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;

/// The top-level service interface which allows for the creation of
/// Context resources.
// TODO(WEB-29): 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 Contexts.
    ///
    /// |context|: An interface request which will receive a bound Context
    ///            service.
    Create(CreateContextParams params, request<Context> context);
};

table CreateContextParams {
    /// Service directory to be used by the context.
    // TODO(WEB-26): Document required and optional services that Context uses.
    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(WEB-28): Provide an API to inform the caller when the
    // |data_directory| can be safely removed.
    2: fuchsia.io.Directory data_directory;
};

/// Manages browsing state (e.g. LocalStorage, cookies, etc) associated with
/// a set of Frames.
protocol Context {
    /// Creates a new frame under this Context. Destruction of a Context
    /// triggers the destruction of all of its associated Frames. Frames 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);
};
