"use strict"; const HTMLElementImpl = require("./HTMLElement-impl").implementation; const idlUtils = require("../generated/utils"); const descendantsByHTMLLocalNames = require("../helpers/traversal").descendantsByHTMLLocalNames; const domSymbolTree = require("../helpers/internal-constants").domSymbolTree; const createHTMLCollection = require("../../living/html-collection").create; const notImplemented = require("../../browser/not-implemented"); const reflectURLAttribute = require("../../utils").reflectURLAttribute; // http://www.whatwg.org/specs/web-apps/current-work/#category-listed const listedElements = new Set(["button", "fieldset", "input", "keygen", "object", "select", "textarea"]); const encTypes = new Set([ "application/x-www-form-urlencoded", "multipart/form-data", "text/plain" ]); const methods = new Set([ "get", "post", "dialog" ]); class HTMLFormElementImpl extends HTMLElementImpl { _descendantAdded(parent, child) { const form = this; for (const el of domSymbolTree.treeIterator(child)) { if (typeof el._changedFormOwner === "function") { el._changedFormOwner(form); } } super._descendantAdded.apply(this, arguments); } _descendantRemoved(parent, child) { for (const el of domSymbolTree.treeIterator(child)) { if (typeof el._changedFormOwner === "function") { el._changedFormOwner(null); } } super._descendantRemoved.apply(this, arguments); } get elements() { return createHTMLCollection(this, () => descendantsByHTMLLocalNames(this, listedElements)); } get length() { return this.elements.length; } _dispatchSubmitEvent() { const ev = this._ownerDocument.createEvent("HTMLEvents"); ev.initEvent("submit", true, true); if (!this.dispatchEvent(ev)) { this.submit(); } } submit() { notImplemented("HTMLFormElement.prototype.submit", this._ownerDocument._defaultView); } reset() { Array.prototype.forEach.call(this.elements, el => { el = idlUtils.implForWrapper(el); if (typeof el._formReset === "function") { el._formReset(); } }); } get method() { let method = this.getAttribute("method"); if (method) { method = method.toLowerCase(); } if (methods.has(method)) { return method; } return "get"; } set method(V) { this.setAttribute("method", V); } get enctype() { let type = this.getAttribute("enctype"); if (type) { type = type.toLowerCase(); } if (encTypes.has(type)) { return type; } return "application/x-www-form-urlencoded"; } set enctype(V) { this.setAttribute("enctype", V); } get action() { const attributeValue = this.getAttribute("action"); if (attributeValue === null || attributeValue === "") { return this._ownerDocument.URL; } return reflectURLAttribute(this, "action"); } set action(V) { this.setAttribute("action", V); } } module.exports = { implementation: HTMLFormElementImpl };