/*
 * Copyright (C) 2006 Apple Computer, Inc.
 *
 * 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.
 */

[
] 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;
    [GetterRaisesException] readonly attribute double          numberValue;

    [GetterRaisesException] readonly attribute DOMString       stringValue;

    [GetterRaisesException] readonly attribute boolean         booleanValue;

    [GetterRaisesException] readonly attribute Node            singleNodeValue;

    readonly attribute boolean         invalidIteratorState;
    [GetterRaisesException] readonly attribute unsigned long   snapshotLength;

    [RaisesException] Node iterateNext();
    [RaisesException] Node snapshotItem([Default=Undefined] optional unsigned long index);
};

