/*
 * Copyright (C) 2006 Apple Computer, Inc.
 * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

// https://dom.spec.whatwg.org/#interface-range
[
    Constructor,
    ConstructorCallWith=Document
] interface Range {
    readonly attribute Node startContainer;
    readonly attribute unsigned long startOffset;
    readonly attribute Node endContainer;
    readonly attribute unsigned long endOffset;
    readonly attribute boolean collapsed;
    readonly attribute Node commonAncestorContainer;

    [RaisesException] void setStart(Node node, unsigned long offset);
    [RaisesException] void setEnd(Node node, unsigned long offset);
    [RaisesException] void setStartBefore(Node node);
    [RaisesException] void setStartAfter(Node node);
    [RaisesException] void setEndBefore(Node node);
    [RaisesException] void setEndAfter(Node node);
    void collapse(optional boolean toStart = false);
    [RaisesException] void selectNode(Node node);
    [RaisesException] void selectNodeContents(Node node);

    const unsigned short START_TO_START = 0;
    const unsigned short START_TO_END = 1;
    const unsigned short END_TO_END = 2;
    const unsigned short END_TO_START = 3;
    [RaisesException] short compareBoundaryPoints(unsigned short how, Range sourceRange);

    [RaisesException, CEReactions, CustomElementCallbacks] void deleteContents();
    [NewObject, RaisesException, CEReactions, CustomElementCallbacks] DocumentFragment extractContents();
    [NewObject, RaisesException, CEReactions, CustomElementCallbacks] DocumentFragment cloneContents();
    [RaisesException, CEReactions, CustomElementCallbacks] void insertNode(Node node);
    [RaisesException, CEReactions, CustomElementCallbacks] void surroundContents(Node newParent);

    [NewObject] Range cloneRange();
    [MeasureAs=RangeDetach] void detach();

    [RaisesException] boolean isPointInRange(Node node, unsigned long offset);
    [RaisesException] short comparePoint(Node node, unsigned long offset);

    [RaisesException] boolean intersectsNode(Node node);

    stringifier;

    // CSSOM View Module
    // https://drafts.csswg.org/cssom-view/#extensions-to-the-range-interface
    DOMRectList getClientRects();
    DOMRect getBoundingClientRect();

    // DOM Parsing and Serialization
    // https://w3c.github.io/DOM-Parsing/#extensions-to-the-range-interface
    [NewObject, RaisesException, CEReactions, CustomElementCallbacks] DocumentFragment createContextualFragment(DOMString fragment);

    // Non-standard API
    [RaisesException, DeprecateAs=RangeExpand] void expand([Default=Undefined] optional DOMString unit);
};
