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

[
    V8SkipVTableValidation
] 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;
    attribute FileList files;
    [Reflect, URL] attribute DOMString formAction;
    [TreatNullAs=NullString] attribute DOMString formEnctype;
    [TreatNullAs=NullString] attribute DOMString formMethod;
    [Reflect] attribute boolean formNoValidate;
    [Reflect] attribute DOMString formTarget;
    attribute unsigned long height;
    attribute boolean indeterminate;
    [Conditional=DATALIST_ELEMENT] readonly attribute HTMLElement list;
    [Reflect] attribute DOMString max;
    attribute long maxLength setter raises(DOMException);
    [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;
#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
    [ObjCImplementedAsUnsignedLong] attribute DOMString size; // DOM level 2 changed this to a long, but ObjC API is a string
#else
    attribute unsigned long size setter raises(DOMException); // Changed string -> long -> unsigned long
#endif
    [Reflect, URL] attribute DOMString src;
    [Reflect] attribute DOMString step;
    [TreatNullAs=NullString] attribute DOMString type; // readonly dropped as part of DOM level 2
    [TreatNullAs=NullString] attribute DOMString defaultValue;
    // See the discussion in https://bugs.webkit.org/show_bug.cgi?id=100085
#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
    [TreatNullAs=NullString] attribute DOMString value setter raises(DOMException);
#else
    [TreatNullAs=NullString] attribute DOMString value;
#endif
#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
    attribute Date valueAsDate setter raises(DOMException);
#endif
    attribute double valueAsNumber setter raises(DOMException);

    void stepUp(in [Optional] long n) raises(DOMException);
    void stepDown(in [Optional] long n) raises(DOMException);

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

    readonly attribute NodeList labels;

    void select();
    [Custom] attribute long selectionStart;
    [Custom] attribute long selectionEnd;
    [Custom] attribute DOMString selectionDirection;

    void setRangeText(in DOMString replacement) raises(DOMException);
    void setRangeText(in DOMString replacement,
                        in unsigned long start,
                        in unsigned long end,
                        in [Optional=DefaultIsNullString] DOMString selectionMode) raises(DOMException);

#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
    [Custom] void setSelectionRange(in long start, in long end);
#else
    [Custom] void setSelectionRange(in [Optional=DefaultIsUndefined] long start, 
                                    in [Optional=DefaultIsUndefined] long end, 
                                    in [Optional] DOMString direction);
#endif

    // Non-standard attributes
    [Reflect] attribute DOMString align;
    [Conditional=DIRECTORY_UPLOAD, Reflect] attribute boolean webkitdirectory;
    [Reflect] attribute DOMString useMap;
    [Reflect] attribute boolean incremental;
    [Conditional=INPUT_SPEECH, Reflect, V8EnabledAtRuntime] attribute boolean webkitSpeech;
    [Conditional=INPUT_SPEECH, Reflect, V8EnabledAtRuntime] attribute boolean webkitGrammar;
    [Conditional=INPUT_SPEECH, NotEnumerable] attribute EventListener onwebkitspeechchange;

#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
    [Reflect] attribute DOMString accessKey;
#endif

#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
    void click();
#endif

#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
    void setValueForUser(in [TreatNullAs=NullString] DOMString value);
#endif

#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
    // Objective-C extension:
    readonly attribute DOMString altDisplayString;
    readonly attribute URL absoluteImageURL;
#endif

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