/*
 * 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.
 */

[
    ImplementationLacksVTable
] 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 double          numberValue
        getter raises (DOMException);
        
    readonly attribute DOMString       stringValue
        getter raises (DOMException);

    readonly attribute boolean         booleanValue
        getter raises (DOMException);

    readonly attribute Node            singleNodeValue
        getter raises (DOMException);

    readonly attribute boolean         invalidIteratorState;
    readonly attribute unsigned long   snapshotLength
        getter raises (DOMException);
        
    Node iterateNext()
        raises (DOMException);
    Node snapshotItem(in [Optional=DefaultIsUndefined] unsigned long index)
        raises (DOMException);
};

