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

// RFC6265 specifies that implementations must support at least 4096 of data
// per-cookie (including name, value & attributes) but does not specify an
// upper-bound on their size.
alias CookieName = string:MAX;

/// 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(resource struct {
        url Url:optional;
        name CookieName:optional;
        changes server_end:CookiesIterator;
    });

    /// 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(resource struct {
        url Url:optional;
        name CookieName:optional;
        cookies server_end:CookiesIterator;
    });
};

/// 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.
    /// RFC6265 does not specify an upper-bound on the number of cookies which
    /// may be stored.
    GetNext() -> (resource struct {
        changed_cookies vector<Cookie>:MAX;
    });
};

type CookieId = table {
    /// An RFC2616 "token" chosen by the site to identify the cookie.
    1: name CookieName;

    /// The RFC1034 "subdomain" to which this cookie is scoped.
    /// e.g. "example.com" allows access from all *.example.com sub-domains.
    2: domain string:MAX_HOST_LENGTH;

    /// The URL "path" prefix to which this cookie is scoped.
    /// e.g. "/" allows access from all paths.
    3: path string:MAX_URL_LENGTH;
};

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

    /// The cookie value.
    /// RFC6265 does not specify an upper limit on cookie size, but recommends
    /// that at least 4096 bytes are supported.
    2: value string:MAX;
};
