/*
 * Copyright (C) 2006 Apple Inc. All rights reserved.
 *
 * 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.
 */

[
    ExportToWrappedFunction,
    ImplementationLacksVTable,
    JSCustomMarkFunction,
] interface XPathResult {
    const unsigned short ANY_TYPE = 0;
    const unsigned short NUMBER_TYPE = 1;
    const unsigned short STRING_TYPE = 2;
    const unsigned short BOOLEAN_TYPE = 3;
    const unsigned short UNORDERED_NODE_ITERATOR_TYPE = 4;
    const unsigned short ORDERED_NODE_ITERATOR_TYPE = 5;
    const unsigned short UNORDERED_NODE_SNAPSHOT_TYPE = 6;
    const unsigned short ORDERED_NODE_SNAPSHOT_TYPE = 7;
    const unsigned short ANY_UNORDERED_NODE_TYPE = 8;
    const unsigned short FIRST_ORDERED_NODE_TYPE = 9;

    readonly attribute unsigned short resultType;
    readonly attribute unrestricted double numberValue;
    readonly attribute DOMString stringValue;
    readonly attribute boolean booleanValue;
    readonly attribute Node singleNodeValue;

    readonly attribute boolean invalidIteratorState;
    readonly attribute unsigned long snapshotLength;

    [MayThrowException] Node iterateNext();
    [MayThrowException] Node snapshotItem(optional unsigned long index = 0);
};
