/*
 * Copyright (C) 2007 Apple Inc. All rights reserved.
 * Copyright (C) 2009 Google 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.
 * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
 *     its contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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://www.w3.org/TR/selection-api/#idl-def-Selection
[
    GenerateIsReachable=ImplFrame,
    ImplementationLacksVTable,
    InterfaceName=Selection,
] interface DOMSelection {
    readonly attribute Node? anchorNode;
    readonly attribute unsigned long anchorOffset;
    readonly attribute Node? focusNode;
    readonly attribute unsigned long focusOffset;

    readonly attribute boolean isCollapsed;
    readonly attribute unsigned long rangeCount;

    void collapse(Node? node, optional unsigned long offset = 0);
    [MayThrowException] void collapseToEnd();
    [MayThrowException] void collapseToStart();

    [CEReactions] void deleteFromDocument();
    boolean containsNode(Node node, optional boolean allowPartial = false);
    void selectAllChildren(Node node);

    [MayThrowException] void extend(Node node, optional unsigned long offset = 0);

    [MayThrowException] Range getRangeAt(unsigned long index);
    void removeAllRanges();
    void addRange(Range range);

    [NotEnumerable] DOMString toString();

    readonly attribute DOMString type;

    void setBaseAndExtent(Node? baseNode, unsigned long baseOffset, Node? extentNode, unsigned long extentOffset);
    void setPosition(Node? node, optional unsigned long offset = 0);

    void empty();

    // FIXME: The following operation should be implemented.
    // void removeRange(Range range);

    // FIXME: Using "undefined" as default parameter value is wrong.
    void modify(optional DOMString alter = "undefined", optional DOMString direction = "undefined", optional DOMString granularity = "undefined");

    readonly attribute Node? baseNode;
    readonly attribute unsigned long baseOffset;
    readonly attribute Node? extentNode;
    readonly attribute unsigned long extentOffset;
};
