/*
 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

// https://html.spec.whatwg.org/#the-history-interface

[
    GarbageCollected,
] interface History {
    // TODO(philipj): length is long in the spec, use that or change the spec:
    // https://www.w3.org/Bugs/Public/show_bug.cgi?id=28789
    readonly attribute unsigned long length;
    // TODO(philipj): The SerializedScriptValue type should be any.
    [CachedAttribute=stateChanged] readonly attribute SerializedScriptValue state;
    // TODO(philipj): delta does not have a default value in the spec:
    // https://www.w3.org/Bugs/Public/show_bug.cgi?id=28790
    [CallWith=ExecutionContext] void go(optional long delta = 0);
    [CallWith=ExecutionContext] void back();
    [CallWith=ExecutionContext] void forward();
    // TODO(philipj): The SerializedScriptValue types should be any.
    // TODO(philipj): The title arguments should simply be 'DOMString title'.
    // Note: The options arguments are part of the Scroll Restoration API.
    [RaisesException] void pushState(SerializedScriptValue data, [TreatUndefinedAs=NullString] DOMString? title, optional DOMString? url = null, optional StateOptions options);
    [RaisesException] void replaceState(SerializedScriptValue data, [TreatUndefinedAs=NullString] DOMString? title, optional DOMString? url = null, optional StateOptions options);

    // Experimental Scroll Restoration API
    // https://www.chromestatus.com/features/5657284784947200
    [RuntimeEnabled=ScrollRestoration] readonly attribute StateOptions options;
};
