/*
 * 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 Computer, 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://w3c.github.io/selection-api/#selection-interface
[
    Exposed=Window,
    ImplementedAs=DOMSelection
] interface Selection {
    [MeasureAs=SelectionAnchorNode] readonly attribute Node? anchorNode;
    [MeasureAs=SelectionAnchorOffset] readonly attribute unsigned long anchorOffset;
    [MeasureAs=SelectionFocusNode] readonly attribute Node? focusNode;
    [MeasureAs=SelectionFocusOffset] readonly attribute unsigned long focusOffset;
    [MeasureAs=SelectionIsCollapsed] readonly attribute boolean isCollapsed;
    [MeasureAs=SelectionRangeCount] readonly attribute unsigned long rangeCount;
    [MeasureAs=SelectionType] readonly attribute DOMString type;
    [MeasureAs=SelectionGetRangeAt, RaisesException] Range getRangeAt(unsigned long index);
    [MeasureAs=SelectionAddRange] void addRange(Range range);
    void removeRange(Range range);
    [MeasureAs=SelectionRemoveAllRanges] void removeAllRanges();
    [MeasureAs=SelectionEmpty] void empty();
    [MeasureAs=SelectionCollapse, RaisesException] void collapse(Node? node, optional unsigned long offset = 0);
    [ImplementedAs=collapse, MeasureAs=SelectionSetPosition, RaisesException] void setPosition(Node? node, optional unsigned long offset = 0);
    [MeasureAs=SelectionCollapseToStart, RaisesException] void collapseToStart();
    [MeasureAs=SelectionCollapseToEnd, RaisesException] void collapseToEnd();
    [MeasureAs=SelectionExtend, RaisesException] void extend(Node node, optional unsigned long offset = 0);
    // TODO(foolip): The arguments should be anchorNode, anchorOffset,
    // focusNode and focusOffset, and none of them are nullable in the spec.
    [MeasureAs=SelectionSetBaseAndExtent, RaisesException] void setBaseAndExtent(Node? baseNode, unsigned long baseOffset,
                                                                                 Node? extentNode, unsigned long extentOffset);
    [MeasureAs=SelectionSelectAllChildren, RaisesException] void selectAllChildren(Node node);
    [MeasureAs=SelectionDeleteDromDocument, CEReactions, CustomElementCallbacks] void deleteFromDocument();
    [MeasureAs=SelectionContainsNode] boolean containsNode(Node node, optional boolean allowPartialContainment = false);
    [MeasureAs=SelectionDOMString] stringifier;

    // Non-standard APIs

    // https://github.com/w3c/selection-api/issues/34
    [MeasureAs=SelectionBaseNode] readonly attribute Node? baseNode;
    [MeasureAs=SelectionBaseOffset] readonly attribute unsigned long baseOffset;
    [MeasureAs=SelectionExtentNode] readonly attribute Node? extentNode;
    [MeasureAs=SelectionExtentOffset] readonly attribute unsigned long extentOffset;

    // https://github.com/w3c/selection-api/issues/37
    [MeasureAs=SelectionModify] void modify([DefaultValue=Undefined] optional DOMString alter,
                                            [DefaultValue=Undefined] optional DOMString direction,
                                            [DefaultValue=Undefined] optional DOMString granularity);
};
