// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. part of $LIBRARYNAME; $(ANNOTATIONS)class $CLASSNAME$EXTENDS implements HiddenInputElement, SearchInputElement, TextInputElement, UrlInputElement, TelephoneInputElement, EmailInputElement, PasswordInputElement, DateTimeInputElement, DateInputElement, MonthInputElement, WeekInputElement, TimeInputElement, LocalDateTimeInputElement, NumberInputElement, RangeInputElement, CheckboxInputElement, RadioButtonInputElement, FileUploadInputElement, SubmitButtonInputElement, ImageButtonInputElement, ResetButtonInputElement, ButtonInputElement $NATIVESPEC { factory InputElement({String type}) { var e = document.$dom_createElement("input"); if (type != null) { try { // IE throws an exception for unknown types. e.type = type; } catch(_) {} } return e; } $!MEMBERS } // Interfaces representing the InputElement APIs which are supported // for the various types of InputElement. // From http://dev.w3.org/html5/spec/the-input-element.html#the-input-element. /** * Exposes the functionality common between all InputElement types. */ abstract class InputElementBase implements Element { @DomName('HTMLInputElement.autofocus') bool autofocus; @DomName('HTMLInputElement.disabled') bool disabled; @DomName('HTMLInputElement.incremental') bool incremental; @DomName('HTMLInputElement.indeterminate') bool indeterminate; @DomName('HTMLInputElement.labels') List get labels; @DomName('HTMLInputElement.name') String name; @DomName('HTMLInputElement.validationMessage') String get validationMessage; @DomName('HTMLInputElement.validity') ValidityState get validity; @DomName('HTMLInputElement.value') String value; @DomName('HTMLInputElement.willValidate') bool get willValidate; @DomName('HTMLInputElement.checkValidity') bool checkValidity(); @DomName('HTMLInputElement.setCustomValidity') void setCustomValidity(String error); } /** * Hidden input which is not intended to be seen or edited by the user. */ abstract class HiddenInputElement implements Element { factory HiddenInputElement() => new InputElement(type: 'hidden'); } /** * Base interface for all inputs which involve text editing. */ abstract class TextInputElementBase implements InputElementBase { @DomName('HTMLInputElement.autocomplete') String autocomplete; @DomName('HTMLInputElement.maxLength') int maxLength; @DomName('HTMLInputElement.pattern') String pattern; @DomName('HTMLInputElement.placeholder') String placeholder; @DomName('HTMLInputElement.readOnly') bool readOnly; @DomName('HTMLInputElement.required') bool required; @DomName('HTMLInputElement.size') int size; @DomName('HTMLInputElement.select') void select(); @DomName('HTMLInputElement.selectionDirection') String selectionDirection; @DomName('HTMLInputElement.selectionEnd') int selectionEnd; @DomName('HTMLInputElement.selectionStart') int selectionStart; @DomName('HTMLInputElement.setSelectionRange') void setSelectionRange(int start, int end, [String direction]); } /** * Similar to [TextInputElement], but on platforms where search is styled * differently this will get the search style. * * Use [supported] to check if this is supported on the current platform. */ @SupportedBrowser(SupportedBrowser.CHROME) @SupportedBrowser(SupportedBrowser.FIREFOX) @SupportedBrowser(SupportedBrowser.IE, '10') @SupportedBrowser(SupportedBrowser.SAFARI) abstract class SearchInputElement implements TextInputElementBase { factory SearchInputElement() => new InputElement(type: 'search'); @DomName('HTMLInputElement.dirName') String dirName; @DomName('HTMLInputElement.list') Element get list; /// Returns true if this input type is supported on the current platform. static bool get supported { return (new InputElement(type: 'search')).type == 'search'; } } /** * A basic text input editor control. */ abstract class TextInputElement implements TextInputElementBase { factory TextInputElement() => new InputElement(type: 'text'); @DomName('HTMLInputElement.dirName') String dirName; @DomName('HTMLInputElement.list') Element get list; } /** * A control for editing an absolute URL. * * Use [supported] to check if this is supported on the current platform. */ @SupportedBrowser(SupportedBrowser.CHROME) @SupportedBrowser(SupportedBrowser.FIREFOX) @SupportedBrowser(SupportedBrowser.IE, '10') @SupportedBrowser(SupportedBrowser.SAFARI) abstract class UrlInputElement implements TextInputElementBase { factory UrlInputElement() => new InputElement(type: 'url'); @DomName('HTMLInputElement.list') Element get list; /// Returns true if this input type is supported on the current platform. static bool get supported { return (new InputElement(type: 'url')).type == 'url'; } } /** * Represents a control for editing a telephone number. * * This provides a single line of text with minimal formatting help since * there is a wide variety of telephone numbers. * * Use [supported] to check if this is supported on the current platform. */ @SupportedBrowser(SupportedBrowser.CHROME) @SupportedBrowser(SupportedBrowser.FIREFOX) @SupportedBrowser(SupportedBrowser.IE, '10') @SupportedBrowser(SupportedBrowser.SAFARI) abstract class TelephoneInputElement implements TextInputElementBase { factory TelephoneInputElement() => new InputElement(type: 'tel'); @DomName('HTMLInputElement.list') Element get list; /// Returns true if this input type is supported on the current platform. static bool get supported { return (new InputElement(type: 'tel')).type == 'tel'; } } /** * An e-mail address or list of e-mail addresses. * * Use [supported] to check if this is supported on the current platform. */ @SupportedBrowser(SupportedBrowser.CHROME) @SupportedBrowser(SupportedBrowser.FIREFOX) @SupportedBrowser(SupportedBrowser.IE, '10') @SupportedBrowser(SupportedBrowser.SAFARI) abstract class EmailInputElement implements TextInputElementBase { factory EmailInputElement() => new InputElement(type: 'email'); @DomName('HTMLInputElement.autocomplete') String autocomplete; @DomName('HTMLInputElement.autofocus') bool autofocus; @DomName('HTMLInputElement.list') Element get list; @DomName('HTMLInputElement.maxLength') int maxLength; @DomName('HTMLInputElement.multiple') bool multiple; @DomName('HTMLInputElement.pattern') String pattern; @DomName('HTMLInputElement.placeholder') String placeholder; @DomName('HTMLInputElement.readOnly') bool readOnly; @DomName('HTMLInputElement.required') bool required; @DomName('HTMLInputElement.size') int size; /// Returns true if this input type is supported on the current platform. static bool get supported { return (new InputElement(type: 'email')).type == 'email'; } } /** * Text with no line breaks (sensitive information). */ abstract class PasswordInputElement implements TextInputElementBase { factory PasswordInputElement() => new InputElement(type: 'password'); } /** * Base interface for all input element types which involve ranges. */ abstract class RangeInputElementBase implements InputElementBase { @DomName('HTMLInputElement.list') Element get list; @DomName('HTMLInputElement.max') String max; @DomName('HTMLInputElement.min') String min; @DomName('HTMLInputElement.step') String step; @DomName('HTMLInputElement.valueAsNumber') num valueAsNumber; @DomName('HTMLInputElement.stepDown') void stepDown([int n]); @DomName('HTMLInputElement.stepUp') void stepUp([int n]); } /** * A date and time (year, month, day, hour, minute, second, fraction of a * second) with the time zone set to UTC. * * Use [supported] to check if this is supported on the current platform. */ @SupportedBrowser(SupportedBrowser.CHROME, '25') @Experimental abstract class DateTimeInputElement implements RangeInputElementBase { factory DateTimeInputElement() => new InputElement(type: 'datetime'); @DomName('HTMLInputElement.valueAsDate') DateTime valueAsDate; @DomName('HTMLInputElement.readOnly') bool readOnly; @DomName('HTMLInputElement.required') bool required; /// Returns true if this input type is supported on the current platform. static bool get supported { return (new InputElement(type: 'datetime')).type == 'datetime'; } } /** * A date (year, month, day) with no time zone. * * Use [supported] to check if this is supported on the current platform. */ @SupportedBrowser(SupportedBrowser.CHROME, '25') @Experimental abstract class DateInputElement implements RangeInputElementBase { factory DateInputElement() => new InputElement(type: 'date'); @DomName('HTMLInputElement.valueAsDate') DateTime valueAsDate; @DomName('HTMLInputElement.readOnly') bool readOnly; @DomName('HTMLInputElement.required') bool required; /// Returns true if this input type is supported on the current platform. static bool get supported { return (new InputElement(type: 'date')).type == 'date'; } } /** * A date consisting of a year and a month with no time zone. * * Use [supported] to check if this is supported on the current platform. */ @SupportedBrowser(SupportedBrowser.CHROME, '25') @Experimental abstract class MonthInputElement implements RangeInputElementBase { factory MonthInputElement() => new InputElement(type: 'month'); @DomName('HTMLInputElement.valueAsDate') DateTime valueAsDate; @DomName('HTMLInputElement.readOnly') bool readOnly; @DomName('HTMLInputElement.required') bool required; /// Returns true if this input type is supported on the current platform. static bool get supported { return (new InputElement(type: 'month')).type == 'month'; } } /** * A date consisting of a week-year number and a week number with no time zone. * * Use [supported] to check if this is supported on the current platform. */ @SupportedBrowser(SupportedBrowser.CHROME, '25') @Experimental abstract class WeekInputElement implements RangeInputElementBase { factory WeekInputElement() => new InputElement(type: 'week'); @DomName('HTMLInputElement.valueAsDate') DateTime valueAsDate; @DomName('HTMLInputElement.readOnly') bool readOnly; @DomName('HTMLInputElement.required') bool required; /// Returns true if this input type is supported on the current platform. static bool get supported { return (new InputElement(type: 'week')).type == 'week'; } } /** * A time (hour, minute, seconds, fractional seconds) with no time zone. * * Use [supported] to check if this is supported on the current platform. */ @SupportedBrowser(SupportedBrowser.CHROME) @Experimental abstract class TimeInputElement implements RangeInputElementBase { factory TimeInputElement() => new InputElement(type: 'time'); @DomName('HTMLInputElement.valueAsDate') DateTime valueAsDate; @DomName('HTMLInputElement.readOnly') bool readOnly; @DomName('HTMLInputElement.required') bool required; /// Returns true if this input type is supported on the current platform. static bool get supported { return (new InputElement(type: 'time')).type == 'time'; } } /** * A date and time (year, month, day, hour, minute, second, fraction of a * second) with no time zone. * * Use [supported] to check if this is supported on the current platform. */ @SupportedBrowser(SupportedBrowser.CHROME, '25') @Experimental abstract class LocalDateTimeInputElement implements RangeInputElementBase { factory LocalDateTimeInputElement() => new InputElement(type: 'datetime-local'); @DomName('HTMLInputElement.readOnly') bool readOnly; @DomName('HTMLInputElement.required') bool required; /// Returns true if this input type is supported on the current platform. static bool get supported { return (new InputElement(type: 'datetime-local')).type == 'datetime-local'; } } /** * A numeric editor control. */ @SupportedBrowser(SupportedBrowser.CHROME) @SupportedBrowser(SupportedBrowser.IE) @SupportedBrowser(SupportedBrowser.SAFARI) @Experimental abstract class NumberInputElement implements RangeInputElementBase { factory NumberInputElement() => new InputElement(type: 'number'); @DomName('HTMLInputElement.placeholder') String placeholder; @DomName('HTMLInputElement.readOnly') bool readOnly; @DomName('HTMLInputElement.required') bool required; /// Returns true if this input type is supported on the current platform. static bool get supported { return (new InputElement(type: 'number')).type == 'number'; } } /** * Similar to [NumberInputElement] but the browser may provide more optimal * styling (such as a slider control). * * Use [supported] to check if this is supported on the current platform. */ @SupportedBrowser(SupportedBrowser.CHROME) @SupportedBrowser(SupportedBrowser.IE, '10') @Experimental abstract class RangeInputElement implements RangeInputElementBase { factory RangeInputElement() => new InputElement(type: 'range'); /// Returns true if this input type is supported on the current platform. static bool get supported { return (new InputElement(type: 'range')).type == 'range'; } } /** * A boolean editor control. * * Note that if [indeterminate] is set then this control is in a third * indeterminate state. */ abstract class CheckboxInputElement implements InputElementBase { factory CheckboxInputElement() => new InputElement(type: 'checkbox'); @DomName('HTMLInputElement.checked') bool checked; @DomName('HTMLInputElement.required') bool required; } /** * A control that when used with other [ReadioButtonInputElement] controls * forms a radio button group in which only one control can be checked at a * time. * * Radio buttons are considered to be in the same radio button group if: * * * They are all of type 'radio'. * * They all have either the same [FormElement] owner, or no owner. * * Their name attributes contain the same name. */ abstract class RadioButtonInputElement implements InputElementBase { factory RadioButtonInputElement() => new InputElement(type: 'radio'); @DomName('HTMLInputElement.checked') bool checked; @DomName('HTMLInputElement.required') bool required; } /** * A control for picking files from the user's computer. */ abstract class FileUploadInputElement implements InputElementBase { factory FileUploadInputElement() => new InputElement(type: 'file'); @DomName('HTMLInputElement.accept') String accept; @DomName('HTMLInputElement.multiple') bool multiple; @DomName('HTMLInputElement.required') bool required; @DomName('HTMLInputElement.files') List files; } /** * A button, which when clicked, submits the form. */ abstract class SubmitButtonInputElement implements InputElementBase { factory SubmitButtonInputElement() => new InputElement(type: 'submit'); @DomName('HTMLInputElement.formAction') String formAction; @DomName('HTMLInputElement.formEnctype') String formEnctype; @DomName('HTMLInputElement.formMethod') String formMethod; @DomName('HTMLInputElement.formNoValidate') bool formNoValidate; @DomName('HTMLInputElement.formTarget') String formTarget; } /** * Either an image which the user can select a coordinate to or a form * submit button. */ abstract class ImageButtonInputElement implements InputElementBase { factory ImageButtonInputElement() => new InputElement(type: 'image'); @DomName('HTMLInputElement.alt') String alt; @DomName('HTMLInputElement.formAction') String formAction; @DomName('HTMLInputElement.formEnctype') String formEnctype; @DomName('HTMLInputElement.formMethod') String formMethod; @DomName('HTMLInputElement.formNoValidate') bool formNoValidate; @DomName('HTMLInputElement.formTarget') String formTarget; @DomName('HTMLInputElement.height') int height; @DomName('HTMLInputElement.src') String src; @DomName('HTMLInputElement.width') int width; } /** * A button, which when clicked, resets the form. */ abstract class ResetButtonInputElement implements InputElementBase { factory ResetButtonInputElement() => new InputElement(type: 'reset'); } /** * A button, with no default behavior. */ abstract class ButtonInputElement implements InputElementBase { factory ButtonInputElement() => new InputElement(type: 'button'); }