happy-dom
Version:
Happy DOM is a JavaScript implementation of a web browser without its graphical user interface. It includes many web standards from WHATWG DOM and HTML.
1,287 lines • 42.8 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var _HTMLInputElement_instances, _HTMLInputElement_selectionStart, _HTMLInputElement_selectionEnd, _HTMLInputElement_selectionDirection, _HTMLInputElement_isSelectionSupported, _HTMLInputElement_setChecked, _a, _b, _c, _d, _e, _f, _g, _h, _j;
Object.defineProperty(exports, "__esModule", { value: true });
const HTMLElement_js_1 = __importDefault(require("../html-element/HTMLElement.cjs"));
const PropertySymbol = __importStar(require("../../PropertySymbol.cjs"));
const ValidityState_js_1 = __importDefault(require("../../validity-state/ValidityState.cjs"));
const DOMException_js_1 = __importDefault(require("../../exception/DOMException.cjs"));
const DOMExceptionNameEnum_js_1 = __importDefault(require("../../exception/DOMExceptionNameEnum.cjs"));
const Event_js_1 = __importDefault(require("../../event/Event.cjs"));
const HTMLInputElementValueSanitizer_js_1 = __importDefault(require("./HTMLInputElementValueSanitizer.cjs"));
const HTMLInputElementSelectionModeEnum_js_1 = __importDefault(require("./HTMLInputElementSelectionModeEnum.cjs"));
const HTMLInputElementSelectionDirectionEnum_js_1 = __importDefault(require("./HTMLInputElementSelectionDirectionEnum.cjs"));
const HTMLInputElementValueStepping_js_1 = __importDefault(require("./HTMLInputElementValueStepping.cjs"));
const FileList_js_1 = __importDefault(require("./FileList.cjs"));
const EventPhaseEnum_js_1 = __importDefault(require("../../event/EventPhaseEnum.cjs"));
const HTMLInputElementDateUtility_js_1 = __importDefault(require("./HTMLInputElementDateUtility.cjs"));
const HTMLLabelElementUtility_js_1 = __importDefault(require("../html-label-element/HTMLLabelElementUtility.cjs"));
const HTMLInputElementNamedNodeMap_js_1 = __importDefault(require("./HTMLInputElementNamedNodeMap.cjs"));
const url_1 = require("url");
const MouseEvent_js_1 = __importDefault(require("../../event/events/MouseEvent.cjs"));
/**
* HTML Input Element.
*
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement.
*
* Used as reference for some of the logic (like selection range):
* https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/nodes/nodes/HTMLInputElement-impl.js (MIT licensed).
*/
class HTMLInputElement extends HTMLElement_js_1.default {
constructor() {
super(...arguments);
_HTMLInputElement_instances.add(this);
// Events
this.oninput = null;
this.oninvalid = null;
this.onselectionchange = null;
// Internal properties
this[_a] = new HTMLInputElementNamedNodeMap_js_1.default(this);
this[_b] = null;
this[_c] = 0;
this[_d] = 0;
this[_e] = false;
this[_f] = null;
this[_g] = '';
this[_h] = new ValidityState_js_1.default(this);
this[_j] = new FileList_js_1.default();
// Private properties
_HTMLInputElement_selectionStart.set(this, null);
_HTMLInputElement_selectionEnd.set(this, null);
_HTMLInputElement_selectionDirection.set(this, HTMLInputElementSelectionDirectionEnum_js_1.default.none);
}
/**
* Returns default checked.
*
* @returns Default checked.
*/
get defaultChecked() {
return this[PropertySymbol.defaultChecked];
}
/**
* Sets default checked.
*
* @param defaultChecked Default checked.
*/
set defaultChecked(defaultChecked) {
this[PropertySymbol.defaultChecked] = defaultChecked;
}
/**
* Returns files.
*
* @returns Files.
*/
get files() {
return this[PropertySymbol.files];
}
/**
* Sets files.
*
* @param files Files.
*/
set files(files) {
this[PropertySymbol.files] = files;
}
/**
* Returns form action.
*
* @returns Form action.
*/
get formAction() {
if (!this.hasAttribute('formaction')) {
return this[PropertySymbol.ownerDocument].location.href;
}
try {
return new url_1.URL(this.getAttribute('formaction'), this[PropertySymbol.ownerDocument].location.href).href;
}
catch (e) {
return '';
}
}
/**
* Sets form action.
*
* @param formAction Form action.
*/
set formAction(formAction) {
this.setAttribute('formaction', formAction);
}
/**
* Returns form enctype.
*
* @returns Form enctype.
*/
get formEnctype() {
return this.getAttribute('formenctype') || '';
}
/**
* Sets form enctype.
*
* @param formEnctype Form enctype.
*/
set formEnctype(formEnctype) {
this.setAttribute('formenctype', formEnctype);
}
/**
* Returns form method.
*
* @returns Form method.
*/
get formMethod() {
return this.getAttribute('formmethod') || '';
}
/**
* Sets form method.
*
* @param formMethod Form method.
*/
set formMethod(formMethod) {
this.setAttribute('formmethod', formMethod);
}
/**
* Returns no validate.
*
* @returns No validate.
*/
get formNoValidate() {
return this.getAttribute('formnovalidate') !== null;
}
/**
* Sets no validate.
*
* @param formNoValidate No validate.
*/
set formNoValidate(formNoValidate) {
if (!formNoValidate) {
this.removeAttribute('formnovalidate');
}
else {
this.setAttribute('formnovalidate', '');
}
}
/**
* Returns form target.
*
* @returns Form target.
*/
get formTarget() {
return this.getAttribute('formtarget') || '';
}
/**
* Sets form target.
*
* @param formTarget Form target.
*/
set formTarget(formTarget) {
this.setAttribute('formtarget', formTarget);
}
/**
* Returns the parent form element.
*
* @returns Form.
*/
get form() {
if (this[PropertySymbol.formNode]) {
return this[PropertySymbol.formNode];
}
if (!this.isConnected) {
return null;
}
const formID = this.getAttribute('form');
return formID
? this[PropertySymbol.ownerDocument].getElementById(formID)
: null;
}
/**
* Returns validation message.
*
* @returns Validation message.
*/
get validationMessage() {
return this[PropertySymbol.validationMessage];
}
/**
* Returns validity.
*
* @returns Validity.
*/
get validity() {
return this[PropertySymbol.validity];
}
/**
* Returns height.
*
* @returns Height.
*/
get height() {
return this[PropertySymbol.height];
}
/**
* Sets height.
*
* @param height Height.
*/
set height(height) {
this[PropertySymbol.height] = height;
this.setAttribute('height', String(height));
}
/**
* Returns width.
*
* @returns Width.
*/
get width() {
return this[PropertySymbol.width];
}
/**
* Sets width.
*
* @param width Width.
*/
set width(width) {
this[PropertySymbol.width] = width;
this.setAttribute('width', String(width));
}
/**
* Returns size.
*
* @returns Size.
*/
get size() {
const size = this.getAttribute('size');
if (size !== null) {
return parseInt(size);
}
return 20;
}
/**
* Sets size.
*
* @param size Size.
*/
set size(size) {
this.setAttribute('size', String(size));
}
/**
* Returns minlength.
*
* @returns Min length.
*/
get minLength() {
const minLength = this.getAttribute('minlength');
if (minLength !== null) {
return parseInt(minLength);
}
return -1;
}
/**
* Sets minlength.
*
* @param minLength Min length.
*/
set minLength(minlength) {
this.setAttribute('minlength', String(minlength));
}
/**
* Returns maxlength.
*
* @returns Max length.
*/
get maxLength() {
const maxLength = this.getAttribute('maxlength');
if (maxLength !== null) {
return parseInt(maxLength);
}
return -1;
}
/**
* Sets maxlength.
*
* @param maxlength Max length.
*/
set maxLength(maxLength) {
this.setAttribute('maxlength', String(maxLength));
}
/**
* Returns type.
*
* @returns Type. Defaults to "text".
*/
get type() {
return this.getAttribute('type') || 'text';
}
/**
* Sets type.
*
* @param type Type.
*/
set type(type) {
this.setAttribute('type', type.toLowerCase());
}
/**
* Returns name.
*
* @returns Name.
*/
get name() {
return this.getAttribute('name') || '';
}
/**
* Sets name.
*
* @param name Name.
*/
set name(name) {
this.setAttribute('name', name);
}
/**
* Returns alt.
*
* @returns Alt.
*/
get alt() {
return this.getAttribute('alt') || '';
}
/**
* Sets alt.
*
* @param alt Alt.
*/
set alt(alt) {
this.setAttribute('alt', alt);
}
/**
* Returns min.
*
* @returns Min.
*/
get min() {
return this.getAttribute('min') || '';
}
/**
* Sets min.
*
* @param min Min.
*/
set min(min) {
this.setAttribute('min', min);
}
/**
* Returns max.
*
* @returns Max.
*/
get max() {
return this.getAttribute('max') || '';
}
/**
* Sets max.
*
* @param max Max.
*/
set max(max) {
this.setAttribute('max', max);
}
/**
* Returns pattern.
*
* @returns Pattern.
*/
get pattern() {
return this.getAttribute('pattern') || '';
}
/**
* Sets pattern.
*
* @param pattern Pattern.
*/
set pattern(pattern) {
this.setAttribute('pattern', pattern);
}
/**
* Returns placeholder.
*
* @returns Placeholder.
*/
get placeholder() {
return this.getAttribute('placeholder') || '';
}
/**
* Sets placeholder.
*
* @param placeholder Placeholder.
*/
set placeholder(placeholder) {
this.setAttribute('placeholder', placeholder);
}
/**
* Returns step.
*
* @returns Step.
*/
get step() {
return this.getAttribute('step') || '';
}
/**
* Sets step.
*
* @param step Step.
*/
set step(step) {
this.setAttribute('step', step);
}
/**
* Returns inputmode.
*
* @returns Inputmode.
*/
get inputmode() {
return this.getAttribute('inputmode') || '';
}
/**
* Sets inputmode.
*
* @param inputmode Inputmode.
*/
set inputmode(inputmode) {
this.setAttribute('inputmode', inputmode);
}
/**
* Returns accept.
*
* @returns Accept.
*/
get accept() {
return this.getAttribute('accept') || '';
}
/**
* Sets accept.
*
* @param accept Accept.
*/
set accept(accept) {
this.setAttribute('accept', accept);
}
/**
* Returns allowdirs.
*
* @returns Allowdirs.
*/
get allowdirs() {
return this.getAttribute('allowdirs') || '';
}
/**
* Sets allowdirs.
*
* @param allowdirs Allowdirs.
*/
set allowdirs(allowdirs) {
this.setAttribute('allowdirs', allowdirs);
}
/**
* Returns autocomplete.
*
* @returns Autocomplete.
*/
get autocomplete() {
return this.getAttribute('autocomplete') || '';
}
/**
* Sets autocomplete.
*
* @param autocomplete Autocomplete.
*/
set autocomplete(autocomplete) {
this.setAttribute('autocomplete', autocomplete);
}
/**
* Returns src.
*
* @returns Src.
*/
get src() {
return this.getAttribute('src') || '';
}
/**
* Sets src.
*
* @param src Src.
*/
set src(src) {
this.setAttribute('src', src);
}
/**
* Returns defaultValue.
*
* @returns Defaultvalue.
*/
get defaultValue() {
return this.getAttribute('value') || '';
}
/**
* Sets defaultValue.
*
* @param defaultValue Defaultvalue.
*/
set defaultValue(defaultValue) {
this.setAttribute('value', defaultValue);
}
/**
* Returns read only.
*
* @returns Read only.
*/
get readOnly() {
return this.getAttribute('readonly') !== null;
}
/**
* Sets read only.
*
* @param readOnly Read only.
*/
set readOnly(readOnly) {
if (!readOnly) {
this.removeAttribute('readonly');
}
else {
this.setAttribute('readonly', '');
}
}
/**
* Returns disabled.
*
* @returns Disabled.
*/
get disabled() {
return this.getAttribute('disabled') !== null;
}
/**
* Sets disabled.
*
* @param disabled Disabled.
*/
set disabled(disabled) {
if (!disabled) {
this.removeAttribute('disabled');
}
else {
this.setAttribute('disabled', '');
}
}
/**
* Returns autofocus.
*
* @returns Autofocus.
*/
get autofocus() {
return this.getAttribute('autofocus') !== null;
}
/**
* Sets autofocus.
*
* @param autofocus Autofocus.
*/
set autofocus(autofocus) {
if (!autofocus) {
this.removeAttribute('autofocus');
}
else {
this.setAttribute('autofocus', '');
}
}
/**
* Returns required.
*
* @returns Required.
*/
get required() {
return this.getAttribute('required') !== null;
}
/**
* Sets required.
*
* @param required Required.
*/
set required(required) {
if (!required) {
this.removeAttribute('required');
}
else {
this.setAttribute('required', '');
}
}
/**
* Returns indeterminate.
*
* @returns Indeterminate.
*/
get indeterminate() {
return this.getAttribute('indeterminate') !== null;
}
/**
* Sets indeterminate.
*
* @param indeterminate Indeterminate.
*/
set indeterminate(indeterminate) {
if (!indeterminate) {
this.removeAttribute('indeterminate');
}
else {
this.setAttribute('indeterminate', '');
}
}
/**
* Returns multiple.
*
* @returns Multiple.
*/
get multiple() {
return this.getAttribute('multiple') !== null;
}
/**
* Sets multiple.
*
* @param multiple Multiple.
*/
set multiple(multiple) {
if (!multiple) {
this.removeAttribute('multiple');
}
else {
this.setAttribute('multiple', '');
}
}
/**
* Returns checked.
*
* @returns Checked.
*/
get checked() {
if (this[PropertySymbol.checked] !== null) {
return this[PropertySymbol.checked];
}
return this.getAttribute('checked') !== null;
}
/**
* Sets checked.
*
* @param checked Checked.
*/
set checked(checked) {
__classPrivateFieldGet(this, _HTMLInputElement_instances, "m", _HTMLInputElement_setChecked).call(this, checked);
}
/**
* Returns value.
*
* @returns Value.
*/
get value() {
switch (this.type) {
case 'hidden':
case 'submit':
case 'image':
case 'reset':
case 'button':
return this.getAttribute('value') || '';
case 'checkbox':
case 'radio':
const attritube = this.getAttribute('value');
return attritube !== null ? attritube : 'on';
case 'file':
return this[PropertySymbol.files].length > 0
? '/fake/path/' + this[PropertySymbol.files][0].name
: '';
}
if (this[PropertySymbol.value] === null) {
return this.getAttribute('value') || '';
}
return this[PropertySymbol.value];
}
/**
* Sets value.
*
* @param value Value.
*/
set value(value) {
// The value maybe not string, so we need to convert it to string
value = String(value);
switch (this.type) {
case 'hidden':
case 'submit':
case 'image':
case 'reset':
case 'button':
case 'checkbox':
case 'radio':
this.setAttribute('value', value);
break;
case 'file':
if (value !== '') {
throw new DOMException_js_1.default('Input elements of type "file" may only programmatically set the value to empty string.', DOMExceptionNameEnum_js_1.default.invalidStateError);
}
break;
default:
const oldValue = this.value;
this[PropertySymbol.value] = HTMLInputElementValueSanitizer_js_1.default.sanitize(this, value);
if (oldValue !== this[PropertySymbol.value]) {
__classPrivateFieldSet(this, _HTMLInputElement_selectionStart, this[PropertySymbol.value].length, "f");
__classPrivateFieldSet(this, _HTMLInputElement_selectionEnd, this[PropertySymbol.value].length, "f");
__classPrivateFieldSet(this, _HTMLInputElement_selectionDirection, HTMLInputElementSelectionDirectionEnum_js_1.default.none, "f");
}
break;
}
}
/**
* Returns selection start.
*
* @returns Selection start.
*/
get selectionStart() {
if (!__classPrivateFieldGet(this, _HTMLInputElement_instances, "m", _HTMLInputElement_isSelectionSupported).call(this)) {
return null;
}
if (__classPrivateFieldGet(this, _HTMLInputElement_selectionStart, "f") === null) {
return this.value.length;
}
return __classPrivateFieldGet(this, _HTMLInputElement_selectionStart, "f");
}
/**
* Sets selection start.
*
* @param start Start.
*/
set selectionStart(start) {
if (!__classPrivateFieldGet(this, _HTMLInputElement_instances, "m", _HTMLInputElement_isSelectionSupported).call(this)) {
throw new DOMException_js_1.default(`The input element's type (${this.type}) does not support selection.`, DOMExceptionNameEnum_js_1.default.invalidStateError);
}
this.setSelectionRange(start, Math.max(start, this.selectionEnd), __classPrivateFieldGet(this, _HTMLInputElement_selectionDirection, "f"));
}
/**
* Returns selection end.
*
* @returns Selection end.
*/
get selectionEnd() {
if (!__classPrivateFieldGet(this, _HTMLInputElement_instances, "m", _HTMLInputElement_isSelectionSupported).call(this)) {
return null;
}
if (__classPrivateFieldGet(this, _HTMLInputElement_selectionEnd, "f") === null) {
return this.value.length;
}
return __classPrivateFieldGet(this, _HTMLInputElement_selectionEnd, "f");
}
/**
* Sets selection end.
*
* @param end End.
*/
set selectionEnd(end) {
if (!__classPrivateFieldGet(this, _HTMLInputElement_instances, "m", _HTMLInputElement_isSelectionSupported).call(this)) {
throw new DOMException_js_1.default(`The input element's type (${this.type}) does not support selection.`, DOMExceptionNameEnum_js_1.default.invalidStateError);
}
this.setSelectionRange(this.selectionStart, end, __classPrivateFieldGet(this, _HTMLInputElement_selectionDirection, "f"));
}
/**
* Returns selection direction.
*
* @returns Selection direction.
*/
get selectionDirection() {
if (!__classPrivateFieldGet(this, _HTMLInputElement_instances, "m", _HTMLInputElement_isSelectionSupported).call(this)) {
return null;
}
return __classPrivateFieldGet(this, _HTMLInputElement_selectionDirection, "f");
}
/**
* Sets selection direction.
*
* @param direction Direction.
*/
set selectionDirection(direction) {
if (!__classPrivateFieldGet(this, _HTMLInputElement_instances, "m", _HTMLInputElement_isSelectionSupported).call(this)) {
throw new DOMException_js_1.default(`The input element's type (${this.type}) does not support selection.`, DOMExceptionNameEnum_js_1.default.invalidStateError);
}
this.setSelectionRange(__classPrivateFieldGet(this, _HTMLInputElement_selectionStart, "f"), __classPrivateFieldGet(this, _HTMLInputElement_selectionEnd, "f"), direction);
}
/**
* Returns "true" if it will validate.
*
* @returns "true" if it will validate.
*/
get willValidate() {
return (this.type !== 'hidden' &&
this.type !== 'reset' &&
this.type !== 'button' &&
!this.disabled &&
!this['readOnly']);
}
/**
* Returns value as Date.
*
* @returns Date.
*/
get valueAsDate() {
switch (this.type) {
case 'date':
case 'month':
return isNaN(new Date(String(this.value)).getTime()) ? null : new Date(this.value);
case 'week': {
const d = HTMLInputElementDateUtility_js_1.default.isoWeekDate(this.value);
return isNaN(d.getTime()) ? null : d;
}
case 'time': {
const d = new Date(`1970-01-01T${this.value}Z`);
return isNaN(d.getTime()) ? null : d;
}
default:
return null;
}
}
/**
* Sets value from a Date.
*
* @param value Date.
*/
set valueAsDate(value) {
// Specs at https://html.spec.whatwg.org/multipage/input.html#dom-input-valueasdate
if (!['date', 'month', 'time', 'week'].includes(this.type)) {
throw new DOMException_js_1.default("Failed to set the 'valueAsDate' property on 'HTMLInputElement': This input element does not support Date values.", DOMExceptionNameEnum_js_1.default.invalidStateError);
}
if (typeof value !== 'object') {
throw new TypeError("Failed to set the 'valueAsDate' property on 'HTMLInputElement': Failed to convert value to 'object'.");
}
else if (value && !(value instanceof Date)) {
throw new TypeError("Failed to set the 'valueAsDate' property on 'HTMLInputElement': The provided value is not a Date.");
}
else if (value === null || isNaN(value.getTime())) {
this.value = '';
return;
}
switch (this.type) {
case 'date':
this.value = value.toISOString().split('T')[0];
break;
case 'month':
this.value = value.toISOString().split('T')[0].slice(0, -3);
break;
case 'time':
this.value = value.toISOString().split('T')[1].slice(0, 5);
break;
case 'week':
this.value = HTMLInputElementDateUtility_js_1.default.dateIsoWeek(value);
break;
}
}
/**
* Returns value as number.
*
* @returns Number.
*/
get valueAsNumber() {
const value = this.value;
if (!this.type.match(/^(range|number|date|datetime-local|month|time|week)$/) || !value) {
return NaN;
}
switch (this.type) {
case 'number':
return parseFloat(value);
case 'range': {
const number = parseFloat(value);
const min = parseFloat(this.min) || 0;
const max = parseFloat(this.max) || 100;
if (isNaN(number)) {
return max < min ? min : (min + max) / 2;
}
else if (number < min) {
return min;
}
else if (number > max) {
return max;
}
return number;
}
case 'date':
return new Date(value).getTime();
case 'datetime-local':
return new Date(value).getTime() - new Date(value).getTimezoneOffset() * 60000;
case 'month':
return (new Date(value).getUTCFullYear() - 1970) * 12 + new Date(value).getUTCMonth();
case 'time':
return (new Date('1970-01-01T' + value).getTime() - new Date('1970-01-01T00:00:00').getTime());
case 'week': {
// https://html.spec.whatwg.org/multipage/input.html#week-state-(type=week)
const match = value.match(/^(\d{4})-W(\d{2})$/);
if (!match) {
return NaN;
}
const d = new Date(Date.UTC(parseInt(match[1], 10), 0));
const day = d.getUTCDay();
const diff = ((day === 0 ? -6 : 1) - day) * 86400000 + parseInt(match[2], 10) * 604800000;
return d.getTime() + diff;
}
}
}
/**
* Sets value from a number.
*
* @param value number.
*/
set valueAsNumber(value) {
// Specs at https://html.spec.whatwg.org/multipage/input.html
switch (this.type) {
case 'number':
case 'range':
// We Rely on HTMLInputElementValueSanitizer
this.value = Number(value).toString();
break;
case 'date':
case 'datetime-local': {
const d = new Date(Number(value));
if (isNaN(d.getTime())) {
// Reset to default value
this.value = '';
break;
}
if (this.type == 'date') {
this.value = d.toISOString().slice(0, 10);
}
else {
this.value = d.toISOString().slice(0, -1);
}
break;
}
case 'month':
if (!Number.isInteger(value) || value < 0) {
this.value = '';
}
else {
this.value = new Date(Date.UTC(1970, Number(value))).toISOString().slice(0, 7);
}
break;
case 'time':
if (!Number.isInteger(value) || value < 0) {
this.value = '';
}
else {
this.value = new Date(Number(value)).toISOString().slice(11, -1);
}
break;
case 'week': {
const d = new Date(Number(value));
this.value = isNaN(d.getTime()) ? '' : HTMLInputElementDateUtility_js_1.default.dateIsoWeek(d);
break;
}
default:
throw new DOMException_js_1.default("Failed to set the 'valueAsNumber' property on 'HTMLInputElement': This input element does not support Number values.", DOMExceptionNameEnum_js_1.default.invalidStateError);
}
}
/**
* Returns the associated label elements.
*
* @returns Label elements.
*/
get labels() {
return HTMLLabelElementUtility_js_1.default.getAssociatedLabelElements(this);
}
/**
* Sets validation message.
*
* @param message Message.
*/
setCustomValidity(message) {
this[PropertySymbol.validationMessage] = String(message);
}
/**
* Selects the text.
*/
select() {
if (!__classPrivateFieldGet(this, _HTMLInputElement_instances, "m", _HTMLInputElement_isSelectionSupported).call(this)) {
return null;
}
__classPrivateFieldSet(this, _HTMLInputElement_selectionStart, 0, "f");
__classPrivateFieldSet(this, _HTMLInputElement_selectionEnd, this.value.length, "f");
__classPrivateFieldSet(this, _HTMLInputElement_selectionDirection, HTMLInputElementSelectionDirectionEnum_js_1.default.none, "f");
this.dispatchEvent(new Event_js_1.default('select', { bubbles: true, cancelable: true }));
}
/**
* Set selection range.
*
* @param start Start.
* @param end End.
* @param [direction="none"] Direction.
*/
setSelectionRange(start, end, direction = 'none') {
if (!__classPrivateFieldGet(this, _HTMLInputElement_instances, "m", _HTMLInputElement_isSelectionSupported).call(this)) {
throw new DOMException_js_1.default(`The input element's type (${this.type}) does not support selection.`, DOMExceptionNameEnum_js_1.default.invalidStateError);
}
__classPrivateFieldSet(this, _HTMLInputElement_selectionEnd, Math.min(end, this.value.length), "f");
__classPrivateFieldSet(this, _HTMLInputElement_selectionStart, Math.min(start, __classPrivateFieldGet(this, _HTMLInputElement_selectionEnd, "f")), "f");
__classPrivateFieldSet(this, _HTMLInputElement_selectionDirection, direction === HTMLInputElementSelectionDirectionEnum_js_1.default.forward ||
direction === HTMLInputElementSelectionDirectionEnum_js_1.default.backward
? direction
: HTMLInputElementSelectionDirectionEnum_js_1.default.none, "f");
this.dispatchEvent(new Event_js_1.default('select', { bubbles: true, cancelable: true }));
}
/**
* Set range text.
*
* @param replacement Replacement.
* @param [start] Start.
* @param [end] End.
* @param [direction] Direction.
* @param selectionMode
*/
setRangeText(replacement, start = null, end = null, selectionMode = HTMLInputElementSelectionModeEnum_js_1.default.preserve) {
if (!__classPrivateFieldGet(this, _HTMLInputElement_instances, "m", _HTMLInputElement_isSelectionSupported).call(this)) {
throw new DOMException_js_1.default(`The input element's type (${this.type}) does not support selection.`, DOMExceptionNameEnum_js_1.default.invalidStateError);
}
if (start === null) {
start = __classPrivateFieldGet(this, _HTMLInputElement_selectionStart, "f");
}
if (end === null) {
end = __classPrivateFieldGet(this, _HTMLInputElement_selectionEnd, "f");
}
if (start > end) {
throw new DOMException_js_1.default('The index is not in the allowed range.', DOMExceptionNameEnum_js_1.default.invalidStateError);
}
start = Math.min(start, this.value.length);
end = Math.min(end, this.value.length);
const val = this.value;
let selectionStart = __classPrivateFieldGet(this, _HTMLInputElement_selectionStart, "f");
let selectionEnd = __classPrivateFieldGet(this, _HTMLInputElement_selectionEnd, "f");
this.value = val.slice(0, start) + replacement + val.slice(end);
const newEnd = start + this.value.length;
switch (selectionMode) {
case HTMLInputElementSelectionModeEnum_js_1.default.select:
this.setSelectionRange(start, newEnd);
break;
case HTMLInputElementSelectionModeEnum_js_1.default.start:
this.setSelectionRange(start, start);
break;
case HTMLInputElementSelectionModeEnum_js_1.default.end:
this.setSelectionRange(newEnd, newEnd);
break;
default:
const delta = replacement.length - (end - start);
if (selectionStart > end) {
selectionStart += delta;
}
else if (selectionStart > start) {
selectionStart = start;
}
if (selectionEnd > end) {
selectionEnd += delta;
}
else if (selectionEnd > start) {
selectionEnd = newEnd;
}
this.setSelectionRange(selectionStart, selectionEnd);
break;
}
}
/**
* Checks validity.
*
* @returns "true" if the field is valid.
*/
checkValidity() {
const valid = this.disabled ||
this.readOnly ||
this.type === 'hidden' ||
this.type === 'reset' ||
this.type === 'button' ||
this[PropertySymbol.validity].valid;
if (!valid) {
this.dispatchEvent(new Event_js_1.default('invalid', { bubbles: true, cancelable: true }));
}
return valid;
}
/**
* Reports validity.
*
* @returns "true" if the field is valid.
*/
reportValidity() {
return this.checkValidity();
}
/**
* Steps up.
*
* @param [increment] Increment.
*/
stepUp(increment) {
const newValue = HTMLInputElementValueStepping_js_1.default.step(this.type, this.value, 1, increment);
if (newValue !== null) {
this.value = newValue;
}
}
/**
* Steps down.
*
* @param [increment] Increment.
*/
stepDown(increment) {
const newValue = HTMLInputElementValueStepping_js_1.default.step(this.type, this.value, -1, increment);
if (newValue !== null) {
this.value = newValue;
}
}
/**
* @override
*/
[(_HTMLInputElement_selectionStart = new WeakMap(), _HTMLInputElement_selectionEnd = new WeakMap(), _HTMLInputElement_selectionDirection = new WeakMap(), _HTMLInputElement_instances = new WeakSet(), _a = PropertySymbol.attributes, _b = PropertySymbol.value, _c = PropertySymbol.height, _d = PropertySymbol.width, _e = PropertySymbol.defaultChecked, _f = PropertySymbol.checked, _g = PropertySymbol.validationMessage, _h = PropertySymbol.validity, _j = PropertySymbol.files, PropertySymbol.cloneNode)](deep = false) {
const clone = super[PropertySymbol.cloneNode](deep);
clone.formAction = this.formAction;
clone.formMethod = this.formMethod;
clone[PropertySymbol.value] = this[PropertySymbol.value];
clone[PropertySymbol.height] = this[PropertySymbol.height];
clone[PropertySymbol.width] = this[PropertySymbol.width];
clone[PropertySymbol.defaultChecked] = this[PropertySymbol.defaultChecked];
clone[PropertySymbol.files] = this[PropertySymbol.files].slice();
__classPrivateFieldSet(clone, _HTMLInputElement_selectionStart, __classPrivateFieldGet(this, _HTMLInputElement_selectionStart, "f"), "f");
__classPrivateFieldSet(clone, _HTMLInputElement_selectionEnd, __classPrivateFieldGet(this, _HTMLInputElement_selectionEnd, "f"), "f");
__classPrivateFieldSet(clone, _HTMLInputElement_selectionDirection, __classPrivateFieldGet(this, _HTMLInputElement_selectionDirection, "f"), "f");
return clone;
}
/**
* @override
*/
dispatchEvent(event) {
// Do nothing if the input element is disabled and the event is a click event.
if (event.type === 'click' &&
event instanceof MouseEvent_js_1.default &&
event.eventPhase === EventPhaseEnum_js_1.default.none &&
this.disabled) {
return false;
}
let previousCheckedValue = null;
// The checkbox or radio button has to be checked before the click event is dispatched, so that event listeners can check the checked value.
// However, the value has to be restored if preventDefault() is called on the click event.
if ((event.eventPhase === EventPhaseEnum_js_1.default.atTarget ||
event.eventPhase === EventPhaseEnum_js_1.default.bubbling) &&
event.type === 'click' &&
event instanceof MouseEvent_js_1.default) {
const inputType = this.type;
if (inputType === 'checkbox' || inputType === 'radio') {
previousCheckedValue = this.checked;
__classPrivateFieldGet(this, _HTMLInputElement_instances, "m", _HTMLInputElement_setChecked).call(this, inputType === 'checkbox' ? !previousCheckedValue : true);
}
}
const returnValue = super.dispatchEvent(event);
if (!event.defaultPrevented &&
(event.eventPhase === EventPhaseEnum_js_1.default.atTarget ||
event.eventPhase === EventPhaseEnum_js_1.default.bubbling) &&
event.type === 'click' &&
event instanceof MouseEvent_js_1.default &&
this[PropertySymbol.isConnected]) {
const inputType = this.type;
if (!this.readOnly || inputType === 'checkbox' || inputType === 'radio') {
if (inputType === 'checkbox' || inputType === 'radio') {
this.dispatchEvent(new Event_js_1.default('input', { bubbles: true, cancelable: true }));
this.dispatchEvent(new Event_js_1.default('change', { bubbles: true, cancelable: true }));
}
else if (inputType === 'submit') {
const form = this.form;
if (form) {
form.requestSubmit(this);
}
}
else if (inputType === 'reset' && this[PropertySymbol.isConnected]) {
const form = this.form;
if (form) {
form.reset();
}
}
}
}
// Restore checked state if preventDefault() is triggered on the click event.
if (event.defaultPrevented &&
(event.eventPhase === EventPhaseEnum_js_1.default.atTarget ||
event.eventPhase === EventPhaseEnum_js_1.default.bubbling) &&
event.type === 'click' &&
event instanceof MouseEvent_js_1.default &&
previousCheckedValue !== null) {
const inputType = this.type;
if (inputType === 'checkbox' || inputType === 'radio') {
__classPrivateFieldGet(this, _HTMLInputElement_instances, "m", _HTMLInputElement_setChecked).call(this, previousCheckedValue);
}
}
return returnValue;
}
/**
* @override
*/
[PropertySymbol.connectToNode](parentNode = null) {
const oldFormNode = this[PropertySymbol.formNode];
super[PropertySymbol.connectToNode](parentNode);
if (oldFormNode !== this[PropertySymbol.formNode]) {
if (oldFormNode) {
oldFormNode[PropertySymbol.removeFormControlItem](this, this.name);
oldFormNode[PropertySymbol.removeFormControlItem](this, this.id);
}
if (this[PropertySymbol.formNode]) {
this[PropertySymbol.formNode][PropertySymbol.appendFormControlItem](this, this.name);
this[PropertySymbol.formNode][PropertySymbol.appendFormControlItem](this, this.id);
}
}
}
}
_HTMLInputElement_isSelectionSupported = function _HTMLInputElement_isSelectionSupported() {
const inputType = this.type;
return (inputType === 'text' ||
inputType === 'search' ||
inputType === 'url' ||
inputType === 'tel' ||
inputType === 'password');
}, _HTMLInputElement_setChecked = function _HTMLInputElement_setChecked(checked) {
this[PropertySymbol.checked] = checked;
if (checked && this.type === 'radio' && this.name) {
const root = ((this[PropertySymbol.formNode] || this.getRootNode()));
const radioButtons = root.querySelectorAll(`input[type="radio"][name="${this.name}"]`);
for (const radioButton of radioButtons) {
if (radioButton !== this) {
radioButton[PropertySymbol.checked] = false;
}
}
}
};
exports.default = HTMLInputElement;
//# sourceMappingURL=HTMLInputElement.cjs.map
;