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

[
] interface HTMLInputElement : HTMLElement {
    [Reflect] attribute DOMString accept;
    [Reflect] attribute DOMString alt;
    [Reflect] attribute DOMString autocomplete;
    [Reflect] attribute boolean autofocus;
    [Reflect=checked] attribute boolean defaultChecked;
    attribute boolean checked;
    [Reflect] attribute DOMString dirName;
    [Reflect] attribute boolean disabled;
    readonly attribute HTMLFormElement form;
    // The 'files' attribute is intentionally not readonly.
    // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22682
    attribute FileList files;
    [Reflect, URL] attribute DOMString formAction;
    [TreatNullAs=NullString, CustomElementCallbacks=Enable] attribute DOMString formEnctype;
    [TreatNullAs=NullString, CustomElementCallbacks=Enable] attribute DOMString formMethod;
    [Reflect] attribute boolean formNoValidate;
    [Reflect] attribute DOMString formTarget;
    [CustomElementCallbacks=Enable] attribute unsigned long height;
    attribute boolean indeterminate;
    [EnabledAtRuntime=DataListElement] readonly attribute HTMLElement list;
    [Reflect] attribute DOMString max;
    [SetterRaisesException, CustomElementCallbacks=Enable] attribute long maxLength;
    [Reflect] attribute DOMString min;
    [Reflect] attribute boolean multiple;
    [Reflect] attribute DOMString name;
    [Reflect] attribute DOMString pattern;
    [Reflect] attribute DOMString placeholder;
    [Reflect] attribute boolean readOnly;
    [Reflect] attribute boolean required;
    [SetterRaisesException, CustomElementCallbacks=Enable] attribute unsigned long size; // Changed string -> long -> unsigned long
    [Reflect, URL] attribute DOMString src;
    [Reflect] attribute DOMString step;
    [TreatNullAs=NullString, CustomElementCallbacks=Enable] attribute DOMString type; // readonly dropped as part of DOM level 2
    [TreatNullAs=NullString, CustomElementCallbacks=Enable] attribute DOMString defaultValue;
    // See the discussion in https://bugs.webkit.org/show_bug.cgi?id=100085
    [TreatNullAs=NullString, SetterRaisesException, CustomElementCallbacks=Enable] attribute DOMString value;
    [SetterRaisesException, CustomElementCallbacks=Enable] attribute Date valueAsDate;
    [SetterRaisesException, CustomElementCallbacks=Enable] attribute double valueAsNumber;
    [EnabledAtRuntime=InputModeAttribute, Reflect] attribute DOMString inputMode;

    [RaisesException, CustomElementCallbacks=Enable] void stepUp(optional long n);
    [RaisesException, CustomElementCallbacks=Enable] void stepDown(optional long n);

    [CustomElementCallbacks=Enable] attribute unsigned long width;
    readonly attribute boolean willValidate;
    readonly attribute ValidityState validity;
    readonly attribute DOMString validationMessage;
    boolean checkValidity();
    void setCustomValidity([TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString error);

    readonly attribute NodeList labels;

    void select();
    [RaisesException, ImplementedAs=selectionStartForBinding] attribute long selectionStart;
    [RaisesException, ImplementedAs=selectionEndForBinding] attribute long selectionEnd;
    [RaisesException, ImplementedAs=selectionDirectionForBinding] attribute DOMString selectionDirection;

    [RaisesException] void setRangeText(DOMString replacement);
    [RaisesException] void setRangeText(DOMString replacement,
                        unsigned long start,
                        unsigned long end,
                        [Default=NullString] optional DOMString selectionMode);

    [RaisesException, ImplementedAs=setSelectionRangeForBinding]
    void setSelectionRange([Default=Undefined] optional long start,
                           [Default=Undefined] optional long end,
                           optional DOMString direction);

    // Non-standard attributes
    [Reflect] attribute DOMString align;
    [Reflect, EnabledAtRuntime=DirectoryUpload] attribute boolean webkitdirectory;
    [Reflect] attribute DOMString useMap;
    [Reflect] attribute boolean incremental;
    [Conditional=INPUT_SPEECH, Reflect, EnabledAtRuntime=SpeechInput] attribute boolean webkitSpeech;
    [Conditional=INPUT_SPEECH, Reflect, EnabledAtRuntime=SpeechInput] attribute boolean webkitGrammar;
    [Conditional=INPUT_SPEECH, NotEnumerable] attribute EventHandler onwebkitspeechchange;

    // See http://www.w3.org/TR/html-media-capture/
    [Conditional=MEDIA_CAPTURE, Reflect] attribute boolean capture;
};
