/*
 * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
 * 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.
 */

[
    ExportMacro=WEBCORE_EXPORT,
    JSGenerateToNativeObject,
] interface HTMLSelectElement : HTMLElement {
    [CEReactions] attribute DOMString autocomplete;
    [CEReactions, Reflect] attribute boolean autofocus;
    [CEReactions, Reflect] attribute boolean disabled;
    readonly attribute HTMLFormElement? form;
    [CEReactions] attribute boolean multiple;
    [CEReactions, Reflect] attribute DOMString name;
    [CEReactions, Reflect] attribute boolean required;
    [CEReactions] attribute unsigned long size;

    readonly attribute DOMString type;

    /* [SameObject] */ readonly attribute HTMLOptionsCollection options;
    [CEReactions] attribute unsigned long length;
    getter HTMLOptionElement? item(unsigned long index); // FIXME: The spec has this returning Element?.
    HTMLOptionElement? namedItem(DOMString name);
    [CEReactions, MayThrowException] void add((HTMLOptionElement or HTMLOptGroupElement) element, optional (HTMLElement or long)? before = null);
    [CEReactions, MayThrowException] void remove(); // ChildNode overload
    [CEReactions] void remove(long index);
    [CEReactions] setter void (unsigned long index, HTMLOptionElement? option);

    /* [SameObject] */ readonly attribute HTMLCollection selectedOptions;
    attribute long selectedIndex;
    attribute DOMString value;

    readonly attribute boolean willValidate;
    readonly attribute ValidityState validity;
    readonly attribute DOMString validationMessage;
    boolean checkValidity();
    [EnabledAtRuntime=InteractiveFormValidation] boolean reportValidity();
    void setCustomValidity(DOMString error);

    readonly attribute NodeList labels;
};
