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

// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#htmlinputelement

interface HTMLInputElement : HTMLElement {
    [Reflect] attribute DOMString accept;
    [Reflect] attribute DOMString align;
    [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;
    [ImplementedAs=formOwner] 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;
    [CustomElementCallbacks] attribute DOMString formEnctype;
    [CustomElementCallbacks] attribute DOMString formMethod;
    [Reflect] attribute boolean formNoValidate;
    [Reflect] attribute DOMString formTarget;
    [CustomElementCallbacks] attribute unsigned long height;
    attribute boolean indeterminate;
    [RuntimeEnabled=InputModeAttribute, Reflect] attribute DOMString inputMode;
    readonly attribute HTMLElement list;
    [Reflect] attribute DOMString max;
    [RaisesException=Setter, CustomElementCallbacks] 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;
    [RaisesException=Setter, CustomElementCallbacks] attribute unsigned long size; // Changed string -> long -> unsigned long
    [Reflect, URL] attribute DOMString src;
    [Reflect] attribute DOMString step;
    [CustomElementCallbacks] attribute DOMString type; // readonly dropped as part of DOM level 2
    [Reflect=value, CustomElementCallbacks] attribute DOMString defaultValue;
    [Reflect] attribute DOMString useMap;
    // See the discussion in https://bugs.webkit.org/show_bug.cgi?id=100085
    [TreatNullAs=EmptyString, RaisesException=Setter, CustomElementCallbacks] attribute DOMString value;
    [RaisesException=Setter, CustomElementCallbacks] attribute Date? valueAsDate;
    [RaisesException=Setter, CustomElementCallbacks] attribute unrestricted double valueAsNumber;

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

    [CustomElementCallbacks] attribute unsigned long width;
    readonly attribute boolean willValidate;
    readonly attribute ValidityState validity;
    readonly attribute DOMString validationMessage;
    boolean checkValidity();
    void setCustomValidity([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,
                        optional DOMString selectionMode = null);

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

    // Non-standard attributes
    [Reflect, MeasureAs=PrefixedDirectoryAttribute] attribute boolean webkitdirectory;
    [Reflect, MeasureAs=IncrementalAttribute] attribute boolean incremental;

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