/*
 * Copyright (C) 2006, 2010 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.
 */

// https://html.spec.whatwg.org/#the-select-element

interface HTMLSelectElement : HTMLElement {
    // TODO(philipj): attribute DOMString autocomplete;
    [Reflect] attribute boolean autofocus;
    [Reflect] attribute boolean disabled;
    [ImplementedAs=formOwner] readonly attribute HTMLFormElement? form;
    attribute boolean multiple;
    [Reflect] attribute DOMString name;
    [Reflect] attribute boolean required;
    attribute unsigned long size;

    readonly attribute DOMString type;

    readonly attribute HTMLOptionsCollection options;
    // TODO(philipj): The length setter should never throw.
    [RaisesException=Setter] attribute unsigned long length;
    getter Element? item(unsigned long index);
    HTMLOptionElement? namedItem(DOMString name);
    [RaisesException] void add((HTMLOptionElement or HTMLOptGroupElement) element,
                               optional (HTMLElement or long)? before = null);
    [RaisesException] void remove(); // ChildNode overload
    void remove(long index);
    [RaisesException] setter void (unsigned long index, HTMLOptionElement? option);

    readonly attribute HTMLCollection selectedOptions;
    attribute long selectedIndex;
    attribute DOMString value;

    readonly attribute boolean willValidate;
    readonly attribute ValidityState validity;
    readonly attribute DOMString validationMessage;
    boolean checkValidity();
    boolean reportValidity();
    void setCustomValidity(DOMString error);

    readonly attribute NodeList labels;
};
