// 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 CookieName = string;

/// Provides methods for monitoring and accessing browser cookie state.
protocol CookieManager {
    /// Observe changes to all cookies named `name` that would be sent in a request to `url`.
    ///
    /// If neither `url` nor `name` are set then all cookies are observed. If only `url` is set
    /// then all cookies for that URL are observed. If both are set then only cookies matching both
    /// fields are observed.
    ///
    /// `changes` iterates over a stream of cookie changes. Additions or updates are expressed as
    /// complete cookies, while deletions are expressed as cookies with no `value` set.
    ObserveCookieChanges(
        Url? url,
        CookieName? name,
        request<CookiesIterator> changes);

    /// Returns a list of Cookies, optionally limited to those matching `url`, and optionally
    /// `name`. `cookies` iterates over the matching cookies, including their `value`s.
    GetCookieList(Url? url,
                  CookieName? name,
                  request<CookiesIterator> cookies);
};

/// Used to iterator over a set of cookies, or a stream of changes to cookies.
protocol CookiesIterator {
    /// Fetches the next batch of cookies, or of changes to cookies.
    GetNext() -> (vector<Cookie> changed_cookies);
};

table CookieId {
    /// The name of the cookie. An arbitrary string defined by the website.
    1: CookieName name;

    /// Specifies the host that is allowed to receive the cookie.
    2: string domain;

    /// Specifies the URL path prefix which is required to receive the cookie.
    3: string path;
};

table Cookie {
    /// A table with fields to identify a cookie.
    1: CookieId id;

    /// The cookie value.
    2: string value;
};
