forms.js.map
13.8 KB
{"version":3,"sources":["dom/forms.js"],"names":[],"mappings":";;;;;;;;;AACA,IAAM,GAAG,GAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AACjC,IAAM,IAAI,GAAI,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5B,IAAM,IAAI,GAAI,OAAO,CAAC,MAAM,CAAC,CAAC;AAC9B,IAAM,IAAI,GAAI,OAAO,CAAC,MAAM,CAAC,CAAC;;;;;;;;;;;;AAa9B,SAAS,YAAY,CAAC,QAAQ,EAAE;AAC9B,MAAM,IAAI,GAAG;AACX,WAAO,EAAA,mBAAG;AACR,aAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;KAChC;GACF,CAAC;AACF,MAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;AACzB,MAAI,CAAC,IAAI,GAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACtC,MAAI,CAAC,IAAI,GAAO,YAAW;AACzB,WAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;GACpC,CAAC;AACF,SAAO,IAAI,CAAC;CACb;;;;AAKD,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,GAAG,UAAS,MAAM,EAAE;AACtD,MAAM,IAAI,GAAQ,IAAI,CAAC;AACvB,MAAM,QAAQ,GAAI,IAAI,CAAC,aAAa,CAAC;AACrC,MAAM,MAAM,GAAM,UAAS,CAAC;;AAE5B,WAAS,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE;AACzC,QAAM,OAAO,GAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,AAAC,CAAC;AAC9C,QAAM,IAAI,GAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACvC,UAAM,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;GAC7B;;AAED,WAAS,gBAAgB,CAAC,KAAK,EAAE;AAC/B,QAAI,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,EAChC,OAAO;;AAET,QAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;AACxC,QAAI,CAAC,IAAI,EACP,OAAO;;AAET,QAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE;AAC/B,UAAM,QAAQ,GAAG,YAAW,KAAK,CAAC,OAAO,CAAC,CACvC,MAAM,CAAC,UAAA,MAAM;eAAK,MAAM,CAAC,QAAQ;OAAA,CAAC,CAClC,GAAG,CAAC,UAAA,OAAO;eAAO,OAAO,CAAC,KAAK;OAAA,CAAC,CAAC;;AAEpC,UAAI,KAAK,CAAC,QAAQ,EAChB,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,KAC5B;AACH,YAAM,KAAK,GAAG,AAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAChC,QAAQ,CAAC,CAAC,CAAC,GACV,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,AAAC,CAAC;AACnD,sBAAc,CAAC,IAAI,EAAE,CAAE,KAAK,CAAE,CAAC,CAAC;OACjC;AACD,aAAO;KACR;;AAED,QAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,KAAK,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAA,AAAC,EAAE;AACvF,UAAI,KAAK,CAAC,OAAO,EAAE;AACjB,YAAM,KAAK,GAAK,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC;AACnC,sBAAc,CAAC,IAAI,EAAE,CAAE,KAAK,CAAE,CAAC,CAAC;OACjC;AACD,aAAO;KACR;;AAED,QAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;AACvD,UAAI,KAAK,CAAC,KAAK,EAAE;AACf,YAAM,KAAK,GAAK,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1C,sBAAc,CAAC,IAAI,EAAE,CAAE,KAAK,CAAE,CAAC,CAAC;OACjC;AACD,aAAO;KACR;;AAED,QAAI,KAAK,CAAC,QAAQ,KAAK,UAAU,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,EAAE;AAC/D,UAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EACnD,cAAc,CAAC,IAAI,EAAE,CAAE,KAAK,CAAC,KAAK,CAAE,CAAC,CAAC;AACxC,aAAO;KACR;GACF;;AAED,WAAS,iBAAiB,GAAG;AAC3B,QAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE;AAC1D,oBAAc,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,EAAE,CAAE,GAAG,CAAE,CAAC,CAAC;AAC5C,oBAAc,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,EAAE,CAAE,GAAG,CAAE,CAAC,CAAC;;AAE5C,UAAI,MAAM,CAAC,KAAK,EACd,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,CAAE,MAAM,CAAC,KAAK,CAAE,CAAC,CAAC;KACjD,MACC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,CAAE,MAAM,CAAC,KAAK,CAAE,CAAC,CAAC;GACjD;;AAED,WAAS,MAAM,GAAG;AAChB,QAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EACvB,iBAAiB,EAAE,CAAC;;;;AAItB,YAAQ,CAAC,WAAW,CAAC,OAAO,CAAC;AAC3B,SAAG,EAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI;AAC/D,YAAM,EAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,KAAK;AAC9C,cAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;AACtC,YAAM,EAAI,MAAM;AAChB,YAAM,EAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;KACtC,CAAC,CAAC;GACJ;;AAED,WAAS,OAAO,CAAC,KAAK,EAAE;AACtB,QAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxC,QAAI,CAAC,KAAK,EAAE;AACV,YAAM,EAAE,CAAC;AACT,aAAO;KACR;AACD,oBAAgB,CAAC,KAAK,CAAC,CAAC;AACxB,WAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;GACpB;;AAED,SAAO,CAAC,CAAC,CAAC,CAAC;CACZ,CAAC;;;AAKF,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,oBAAoB,GAAG,UAAS,MAAM,EAAE;AACpE,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC3D,OAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACtC,OAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvB,SAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;CAClC,CAAC;;;;AAKF,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,GAAG,UAAS,KAAK,EAAE;AACpE,OAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;CACpC,CAAC;;;;;;AAOF,GAAG,CAAC,gBAAgB,CAAC,SAAS,CAAC,cAAc,GAC3C,eAAc,EAAE,EAAE,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;;AAE9D,GAAG,CAAC,gBAAgB,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,GAAG,UAAS,KAAK,EAAE;AACpE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;;AAE3B,WAAS,MAAM,GAAG;AAChB,QAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAClE,eAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC5C,SAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;GAClC;;AAED,UAAQ,KAAK,CAAC,IAAI;AAChB,SAAK,OAAO;AAAE;AACZ,YAAI,KAAK,CAAC,IAAI,EACZ,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACrB,cAAM;OACP;AAAA,AACD,SAAK,QAAQ;AAAE;AACb,YAAI,KAAK,CAAC,IAAI,EACZ,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACzC,cAAM;OACP;AAAA,AACD,SAAK,OAAO;AAAE;AACZ,YAAI,KAAK,CAAC,IAAI,EACZ,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACzC,cAAM;OACP;AAAA,AACD,SAAK,UAAU;AAAE;AACf,cAAM,EAAE,CAAC;AACT,cAAM;OACP;AAAA,AACD,SAAK,OAAO;AAAE;AACZ,YAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE;AACnC,eAAK,CAAC,OAAO,GAAG,IAAI,CAAC;AACrB,gBAAM,EAAE,CAAC;SACV;OACF;AAAA,GACF;CACF,CAAC;;;;;AAOF,GAAG,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,GAAG,YAAW;;;AAChD,MAAM,KAAK,GAAG,IAAI,CAAC;AACnB,OAAK,CAAC,KAAK,EAAE,CAAC;;;AAGd,WAAS,KAAK,GAAG;AACf,QAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AACjE,cAAU,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC1C,WAAO,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;GACxC;;AAED,UAAQ,KAAK,CAAC,IAAI;AAChB,SAAK,UAAU;AAAE;AACf,YAAI,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,EAChC,MAAM;;AAER,YAAM,QAAQ,GAAM,KAAK,CAAC,OAAO,CAAC;AAClC,aAAK,CAAC,OAAO,GAAO,CAAC,QAAQ,CAAC;AAC9B,YAAM,WAAW,GAAG,KAAK,EAAE,CAAC;AAC5B,YAAI,WAAW,KAAK,KAAK,EACvB,KAAK,CAAC,OAAO,GAAG,QAAQ,CAAC;AAC3B,cAAM;OACP;;AAAA,AAED,SAAK,OAAO;AAAE;AACZ,YAAI,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,EAChC,MAAM;;AAER,YAAI,KAAK,CAAC,OAAO,EACf,KAAK,EAAE,CAAC,KACL;;AACH,gBAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,gBAAgB,+BAA4B,MAAK,YAAY,CAAC,MAAM,CAAC,SAAK,CAAC;AAC9G,gBAAM,OAAO,GAAG,YAAW,MAAM,CAAC,CAC/B,MAAM,CAAC,UAAA,KAAK;qBAAM,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,MAAK,IAAI;aAAA,CAAE,CAC7D,GAAG,CAAC,UAAA,KAAK,EAAK;AACb,mBAAK,CAAC,OAAO,GAAG,KAAK,CAAC;aACvB,CAAC,CAAC,CAAC,CAAC,CAAC;;AAER,iBAAK,CAAC,OAAO,GAAG,IAAI,CAAC;AACrB,gBAAM,WAAW,GAAG,KAAK,EAAE,CAAC;AAC5B,gBAAI,WAAW,KAAK,KAAK,EAAE;AACzB,mBAAK,CAAC,OAAO,GAAG,KAAK,CAAC;AACtB,0BAAW,MAAM,CAAC,CACf,MAAM,CAAC,UAAA,KAAK;uBAAM,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;eAAA,CAAE,CAC7C,OAAO,CAAC,UAAA,KAAK,EAAK;AACjB,qBAAK,CAAC,OAAO,GAAI,KAAK,KAAK,OAAO,AAAC,CAAC;eACrC,CAAC,CAAC;aACN;;SACF;AACD,cAAM;OACP;;AAAA,AAED;AAAS;AACP,aAAK,EAAE,CAAC;AACR,cAAM;OACP;AAAA,GACF;CACF,CAAC;;;AAIF,GAAG,CAAC,iBAAiB,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,GAAG,UAAS,KAAK,EAAE;AACrE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;AAC5B,MAAI,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,EACjC,OAAO,KAAK,CAAC;;AAEf,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;AACzB,MAAI,IAAI,EACN,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;CAC5C,CAAC","file":"forms.js","sourcesContent":["// Patches to JSDOM for properly handling forms.\nconst DOM = require('./index');\nconst File = require('fs');\nconst Mime = require('mime');\nconst Path = require('path');\n\n\n// The Form\n// --------\n\n// Forms convert INPUT fields of type file into this object and pass it as\n// parameter to resource request.\n//\n// The base class is a String, so the value (e.g. when passed in a GET request)\n// is the base filename. Additional properties include the MIME type (`mime`),\n// the full filename (`filename`) and the `read` method that returns the file\n// contents.\nfunction uploadedFile(filename) {\n const file = {\n valueOf() {\n return Path.basename(filename);\n }\n };\n file.filename = filename;\n file.mime = Mime.lookup(filename);\n file.read = function() {\n return File.readFileSync(filename);\n };\n return file;\n}\n\n\n// Implement form.submit such that it actually submits a request to the server.\n// This method takes the submitting button so we can send the button name/value.\nDOM.HTMLFormElement.prototype.submit = function(button) {\n const form = this;\n const document = form.ownerDocument;\n const params = new Map();\n\n function addFieldValues(fieldName, values) {\n const current = (params.get(fieldName) || []);\n const next = current.concat(values);\n params.set(fieldName, next);\n }\n\n function addFieldToParams(field) {\n if (field.getAttribute('disabled'))\n return;\n\n const name = field.getAttribute('name');\n if (!name)\n return;\n\n if (field.nodeName === 'SELECT') {\n const selected = Array.from(field.options)\n .filter(option => option.selected)\n .map(options => options.value);\n\n if (field.multiple)\n addFieldValues(name, selected);\n else {\n const value = (selected.length > 0) ?\n selected[0] :\n (field.options.length && field.options[0].value);\n addFieldValues(name, [ value ]);\n }\n return;\n }\n\n if (field.nodeName === 'INPUT' && (field.type === 'checkbox' || field.type === 'radio')) {\n if (field.checked) {\n const value = field.value || '1';\n addFieldValues(name, [ value ]);\n }\n return;\n }\n\n if (field.nodeName === 'INPUT' && field.type === 'file') {\n if (field.value) {\n const value = uploadedFile(field.value);\n addFieldValues(name, [ value ]);\n }\n return;\n }\n\n if (field.nodeName === 'TEXTAREA' || field.nodeName === 'INPUT') {\n if (field.type !== 'submit' && field.type !== 'image')\n addFieldValues(name, [ field.value ]);\n return;\n }\n }\n\n function addButtonToParams() {\n if (button.nodeName === 'INPUT' && button.type === 'image') {\n addFieldValues(button.name + '.x', [ '0' ]);\n addFieldValues(button.name + '.y', [ '0' ]);\n\n if (button.value)\n addFieldValues(button.name, [ button.value ]);\n } else\n addFieldValues(button.name, [ button.value ]);\n }\n\n function submit() {\n if (button && button.name)\n addButtonToParams();\n\n // Ask window to submit form, let it figure out how to handle this based on\n // the target attribute.\n document.defaultView._submit({\n url: form.getAttribute('action') || document.location.href,\n method: form.getAttribute('method') || 'GET',\n encoding: form.getAttribute('enctype'),\n params: params,\n target: form.getAttribute('target')\n });\n }\n\n function process(index) {\n const field = form.elements.item(index);\n if (!field) {\n submit();\n return;\n }\n addFieldToParams(field);\n process(index + 1);\n }\n\n process(0);\n};\n\n\n\n// Replace dispatchEvent so we can send the button along the event.\nDOM.HTMLFormElement.prototype._dispatchSubmitEvent = function(button) {\n const event = this.ownerDocument.createEvent('HTMLEvents');\n event.initEvent('submit', true, true);\n event._button = button;\n return this.dispatchEvent(event);\n};\n\n\n// Default behavior for submit events is to call the form's submit method, but we\n// also pass the submitting button.\nDOM.HTMLFormElement.prototype._eventDefaults.submit = function(event) {\n event.target.submit(event._button);\n};\n\n\n// Buttons\n// -------\n\n// Default behavior for clicking on inputs.\nDOM.HTMLInputElement.prototype._eventDefaults =\n Object.assign({}, DOM.HTMLElement.prototype._eventDefaults);\n\nDOM.HTMLInputElement.prototype._eventDefaults.click = function(event) {\n const input = event.target;\n\n function change() {\n const changeEvent = input.ownerDocument.createEvent('HTMLEvents');\n changeEvent.initEvent('change', true, true);\n input.dispatchEvent(changeEvent);\n }\n\n switch (input.type) {\n case 'reset': {\n if (input.form)\n input.form.reset();\n break;\n }\n case 'submit': {\n if (input.form)\n input.form._dispatchSubmitEvent(input);\n break;\n }\n case 'image': {\n if (input.form)\n input.form._dispatchSubmitEvent(input);\n break;\n }\n case 'checkbox': {\n change();\n break;\n }\n case 'radio': {\n if (!input.getAttribute('readonly')) {\n input.checked = true;\n change();\n }\n }\n }\n};\n\n\n\n// Current INPUT behavior on click is to capture sumbit and handle it, but\n// ignore all other clicks. We need those other clicks to occur, so we're going\n// to dispatch them all.\nDOM.HTMLInputElement.prototype.click = function() {\n const input = this;\n input.focus();\n\n // First event we fire is click event\n function click() {\n const clickEvent = input.ownerDocument.createEvent('HTMLEvents');\n clickEvent.initEvent('click', true, true);\n return input.dispatchEvent(clickEvent);\n }\n\n switch (input.type) {\n case 'checkbox': {\n if (input.getAttribute('readonly'))\n break;\n\n const original = input.checked;\n input.checked = !original;\n const checkResult = click();\n if (checkResult === false)\n input.checked = original;\n break;\n }\n\n case 'radio': {\n if (input.getAttribute('readonly'))\n break;\n\n if (input.checked)\n click();\n else {\n const radios = input.ownerDocument.querySelectorAll(`input[type=radio][name='${this.getAttribute('name')}']`);\n const checked = Array.from(radios)\n .filter(radio => radio.checked && radio.form === this.form )\n .map(radio => {\n radio.checked = false;\n })[0];\n\n input.checked = true;\n const radioResult = click();\n if (radioResult === false) {\n input.checked = false;\n Array.from(radios)\n .filter(radio => radio.form === input.form )\n .forEach(radio => {\n radio.checked = (radio === checked);\n });\n }\n }\n break;\n }\n\n default: {\n click();\n break;\n }\n }\n};\n\n\n// Default behavior for form BUTTON: submit form.\nDOM.HTMLButtonElement.prototype._eventDefaults.click = function(event) {\n const button = event.target;\n if (button.getAttribute('disabled'))\n return false;\n\n const form = button.form;\n if (form)\n return form._dispatchSubmitEvent(button);\n};\n\n"]}