diff options
Diffstat (limited to 'school/node_modules/jsdom/lib/jsdom/living/nodes/HTMLOptionsCollection-impl.js')
-rw-r--r-- | school/node_modules/jsdom/lib/jsdom/living/nodes/HTMLOptionsCollection-impl.js | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/school/node_modules/jsdom/lib/jsdom/living/nodes/HTMLOptionsCollection-impl.js b/school/node_modules/jsdom/lib/jsdom/living/nodes/HTMLOptionsCollection-impl.js new file mode 100644 index 0000000..67d51e7 --- /dev/null +++ b/school/node_modules/jsdom/lib/jsdom/living/nodes/HTMLOptionsCollection-impl.js @@ -0,0 +1,110 @@ +"use strict"; + +const idlUtils = require("../generated/utils.js"); +const DOMException = require("domexception/webidl2js-wrapper"); +const { DOCUMENT_POSITION_CONTAINS, DOCUMENT_POSITION_CONTAINED_BY } = require("../node-document-position"); +const Element = require("../generated/Element"); +const Node = require("../generated/Node"); +const HTMLCollectionImpl = require("./HTMLCollection-impl").implementation; + +exports.implementation = class HTMLOptionsCollectionImpl extends HTMLCollectionImpl { + // inherits supported property indices + get length() { + this._update(); + return this._list.length; + } + set length(value) { + this._update(); + if (value > this._list.length) { + const doc = this._element._ownerDocument; + for (let i = this._list.length; i < value; i++) { + const el = doc.createElement("option"); + this._element.appendChild(el); + } + } else if (value < this._list.length) { + for (let i = this._list.length - 1; i >= value; i--) { + const el = this._list[i]; + this._element.removeChild(el); + } + } + } + + get [idlUtils.supportedPropertyNames]() { + this._update(); + const result = new Set(); + for (const element of this._list) { + result.add(element.getAttributeNS(null, "id")); + result.add(element.getAttributeNS(null, "name")); + } + return result; + } + [idlUtils.indexedSetNew](index, value) { + if (value === null) { + this.remove(index); + return; + } + this._update(); + const { length } = this._list; + const n = index - length; + if (n > 0) { + const doc = this._element._ownerDocument; + const frag = doc.createDocumentFragment(); + // Spec says n - 1, but n seems to be the right number here. + for (let i = 0; i < n; i++) { + const el = doc.createElement("option"); + frag.appendChild(el); + } + this._element._append(frag); + } + if (n >= 0) { + this._element._append(value); + } else { + this._element._replace(value, this._list[index]); + } + } + [idlUtils.indexedSetExisting](index, value) { + return this[idlUtils.indexedSetNew](index, value); + } + add(element, before) { + if (this._element.compareDocumentPosition(element) & DOCUMENT_POSITION_CONTAINS) { + throw DOMException.create(this._globalObject, [ + "The operation would yield an incorrect node tree.", + "HierarchyRequestError" + ]); + } + if (Element.isImpl(before) && !(this._element.compareDocumentPosition(before) & DOCUMENT_POSITION_CONTAINED_BY)) { + throw DOMException.create(this._globalObject, ["The object can not be found here.", "NotFoundError"]); + } + if (element === before) { + return; + } + + let reference = null; + if (Node.isImpl(before)) { + reference = before; + } else if (typeof before === "number") { + this._update(); + reference = this._list[before] || null; + } + + const parent = reference !== null ? reference.parentNode : this._element; + parent._preInsert(element, reference); + } + remove(index) { + this._update(); + if (this._list.length === 0) { + return; + } + if (index < 0 || index >= this._list.length) { + return; + } + const element = this._list[index]; + element.parentNode._remove(element); + } + get selectedIndex() { + return this._element.selectedIndex; + } + set selectedIndex(value) { + this._element.selectedIndex = value; + } +}; |