/*
 * 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);
};

