/*
 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
 * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
 * Copyright (C) 2013 Samsung Electronics. 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.
 */

[
    DependentLifetime,
    GenerateVisitDOMWrapper=ownerNode,
] interface HTMLOptionsCollection : HTMLCollection {
    attribute long selectedIndex;
    [Custom=Setter, RaisesException=Setter] attribute unsigned long length;
    [ImplementedAs=item] getter Node(unsigned long index);
    [ImplementedAs=anonymousIndexedSetter, RaisesException] setter HTMLOptionElement (unsigned long index, [TreatNullAs=anonymousIndexedSetterRemove, TreatUndefinedAs=anonymousIndexedSetterRemove] HTMLOptionElement value);
    [ImplementedAs=anonymousNamedGetter, NotEnumerable] getter (NodeList or Node)(DOMString name);

    [Custom] Node namedItem([Default=Undefined] optional DOMString name);

    [Custom, RaisesException] void add([Default=Undefined] optional HTMLOptionElement option,
                      optional unsigned long index);
    void remove(unsigned long index);
    void remove(HTMLOptionElement option); // Non standard.
};

