/*
 * 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
[
    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([Default=Undefined] optional DOMString alter,
                                            [Default=Undefined] optional DOMString direction,
                                            [Default=Undefined] optional DOMString granularity);
};
