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

[
    DependentLifetime
] interface TreeWalker {
    [SameObject] readonly attribute Node root;
    readonly attribute unsigned long whatToShow;
    readonly attribute NodeFilter? filter;
    attribute Node currentNode;

    [RaisesException] Node? parentNode();
    [RaisesException] Node? firstChild();
    [RaisesException] Node? lastChild();
    [RaisesException] Node? previousSibling();
    [RaisesException] Node? nextSibling();
    [RaisesException] Node? previousNode();
    [RaisesException] Node? nextNode();
};
