happy-dom 7.6.3 → 7.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of happy-dom might be problematic. Click here for more details.
- package/lib/css/declaration/AbstractCSSStyleDeclaration.js +7 -12
- package/lib/css/declaration/AbstractCSSStyleDeclaration.js.map +1 -1
- package/lib/nodes/element/Element.d.ts +4 -2
- package/lib/nodes/element/Element.js +8 -1
- package/lib/nodes/element/Element.js.map +1 -1
- package/lib/nodes/element/IElement.d.ts +4 -2
- package/lib/nodes/html-element/HTMLElement.d.ts +8 -12
- package/lib/nodes/html-element/HTMLElement.js +10 -11
- package/lib/nodes/html-element/HTMLElement.js.map +1 -1
- package/lib/nodes/html-element/IHTMLElement.d.ts +2 -1
- package/lib/nodes/html-option-element/HTMLOptionElement.d.ts +17 -0
- package/lib/nodes/html-option-element/HTMLOptionElement.js +55 -32
- package/lib/nodes/html-option-element/HTMLOptionElement.js.map +1 -1
- package/lib/nodes/html-option-element/HTMLOptionsCollection.d.ts +0 -1
- package/lib/nodes/html-option-element/HTMLOptionsCollection.js +2 -10
- package/lib/nodes/html-option-element/HTMLOptionsCollection.js.map +1 -1
- package/lib/nodes/html-select-element/HTMLSelectElement.d.ts +18 -2
- package/lib/nodes/html-select-element/HTMLSelectElement.js +99 -22
- package/lib/nodes/html-select-element/HTMLSelectElement.js.map +1 -1
- package/lib/nodes/svg-element/SVGElement.d.ts +1 -8
- package/lib/nodes/svg-element/SVGElement.js +1 -7
- package/lib/nodes/svg-element/SVGElement.js.map +1 -1
- package/package.json +2 -2
- package/src/css/declaration/AbstractCSSStyleDeclaration.ts +9 -13
- package/src/nodes/element/Element.ts +15 -3
- package/src/nodes/element/IElement.ts +4 -2
- package/src/nodes/html-element/HTMLElement.ts +13 -12
- package/src/nodes/html-element/IHTMLElement.ts +3 -1
- package/src/nodes/html-option-element/HTMLOptionElement.ts +69 -35
- package/src/nodes/html-option-element/HTMLOptionsCollection.ts +2 -9
- package/src/nodes/html-select-element/HTMLSelectElement.ts +109 -27
- package/src/nodes/svg-element/SVGElement.ts +3 -8
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const HTMLElement_1 = __importDefault(require("../html-element/HTMLElement"));
|
7
7
|
const ValidityState_1 = __importDefault(require("../validity-state/ValidityState"));
|
8
|
-
const HTMLOptionElement_1 = __importDefault(require("../html-option-element/HTMLOptionElement"));
|
9
8
|
const HTMLOptionsCollection_1 = __importDefault(require("../html-option-element/HTMLOptionsCollection"));
|
10
9
|
const NodeTypeEnum_1 = __importDefault(require("../node/NodeTypeEnum"));
|
11
10
|
/**
|
@@ -152,11 +151,13 @@ class HTMLSelectElement extends HTMLElement_1.default {
|
|
152
151
|
* @returns Value.
|
153
152
|
*/
|
154
153
|
get value() {
|
155
|
-
|
156
|
-
|
154
|
+
for (let i = 0, max = this.options.length; i < max; i++) {
|
155
|
+
const option = this.options[i];
|
156
|
+
if (option._selectedness) {
|
157
|
+
return option.value;
|
158
|
+
}
|
157
159
|
}
|
158
|
-
|
159
|
-
return option instanceof HTMLOptionElement_1.default ? option.value : '';
|
160
|
+
return '';
|
160
161
|
}
|
161
162
|
/**
|
162
163
|
* Sets value.
|
@@ -164,7 +165,16 @@ class HTMLSelectElement extends HTMLElement_1.default {
|
|
164
165
|
* @param value Value.
|
165
166
|
*/
|
166
167
|
set value(value) {
|
167
|
-
|
168
|
+
for (let i = 0, max = this.options.length; i < max; i++) {
|
169
|
+
const option = this.options[i];
|
170
|
+
if (option.value === value) {
|
171
|
+
option._selectedness = true;
|
172
|
+
option._dirtyness = true;
|
173
|
+
}
|
174
|
+
else {
|
175
|
+
option._selectedness = false;
|
176
|
+
}
|
177
|
+
}
|
168
178
|
}
|
169
179
|
/**
|
170
180
|
* Returns value.
|
@@ -172,15 +182,29 @@ class HTMLSelectElement extends HTMLElement_1.default {
|
|
172
182
|
* @returns Value.
|
173
183
|
*/
|
174
184
|
get selectedIndex() {
|
175
|
-
|
185
|
+
for (let i = 0, max = this.options.length; i < max; i++) {
|
186
|
+
if (this.options[i]._selectedness) {
|
187
|
+
return i;
|
188
|
+
}
|
189
|
+
}
|
190
|
+
return -1;
|
176
191
|
}
|
177
192
|
/**
|
178
193
|
* Sets value.
|
179
194
|
*
|
180
|
-
* @param
|
195
|
+
* @param selectedIndex Selected index.
|
181
196
|
*/
|
182
|
-
set selectedIndex(
|
183
|
-
|
197
|
+
set selectedIndex(selectedIndex) {
|
198
|
+
if (typeof selectedIndex === 'number' && !isNaN(selectedIndex)) {
|
199
|
+
for (let i = 0, max = this.options.length; i < max; i++) {
|
200
|
+
this.options[i]._selectedness = false;
|
201
|
+
}
|
202
|
+
const selectedOption = this.options[selectedIndex];
|
203
|
+
if (selectedOption) {
|
204
|
+
selectedOption._selectedness = true;
|
205
|
+
selectedOption._dirtyness = true;
|
206
|
+
}
|
207
|
+
}
|
184
208
|
}
|
185
209
|
/**
|
186
210
|
* Returns the parent form element.
|
@@ -253,11 +277,9 @@ class HTMLSelectElement extends HTMLElement_1.default {
|
|
253
277
|
const previousLength = this.options.length;
|
254
278
|
if (element.tagName === 'OPTION' || element.tagName === 'OPTGROUP') {
|
255
279
|
this.options.push(element);
|
256
|
-
if (this.options.length === 1) {
|
257
|
-
this.options.selectedIndex = 0;
|
258
|
-
}
|
259
280
|
}
|
260
281
|
this._updateIndexProperties(previousLength, this.options.length);
|
282
|
+
this._resetOptionSelectednes();
|
261
283
|
}
|
262
284
|
return super.appendChild(node);
|
263
285
|
}
|
@@ -282,12 +304,12 @@ class HTMLSelectElement extends HTMLElement_1.default {
|
|
282
304
|
else {
|
283
305
|
this.options.push(newElement);
|
284
306
|
}
|
285
|
-
if (this.options.length === 1) {
|
286
|
-
this.options.selectedIndex = 0;
|
287
|
-
}
|
288
307
|
}
|
289
308
|
this._updateIndexProperties(previousLength, this.options.length);
|
290
309
|
}
|
310
|
+
if (newNode.nodeType === NodeTypeEnum_1.default.elementNode) {
|
311
|
+
this._resetOptionSelectednes();
|
312
|
+
}
|
291
313
|
return returnValue;
|
292
314
|
}
|
293
315
|
/**
|
@@ -302,17 +324,72 @@ class HTMLSelectElement extends HTMLElement_1.default {
|
|
302
324
|
if (index !== -1) {
|
303
325
|
this.options.splice(index, 1);
|
304
326
|
}
|
305
|
-
if (this.options.selectedIndex >= this.options.length) {
|
306
|
-
this.options.selectedIndex = this.options.length - 1;
|
307
|
-
}
|
308
|
-
if (!this.options.length) {
|
309
|
-
this.options.selectedIndex = -1;
|
310
|
-
}
|
311
327
|
}
|
312
328
|
this._updateIndexProperties(previousLength, this.options.length);
|
329
|
+
this._resetOptionSelectednes();
|
313
330
|
}
|
314
331
|
return super.removeChild(node);
|
315
332
|
}
|
333
|
+
/**
|
334
|
+
* Resets the option selectedness.
|
335
|
+
*
|
336
|
+
* Based on:
|
337
|
+
* https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/nodes/HTMLSelectElement-impl.js
|
338
|
+
*
|
339
|
+
* @param [newOption] Optional new option element to be selected.
|
340
|
+
* @see https://html.spec.whatwg.org/multipage/form-elements.html#selectedness-setting-algorithm
|
341
|
+
*/
|
342
|
+
_resetOptionSelectednes(newOption) {
|
343
|
+
if (this.hasAttributeNS(null, 'multiple')) {
|
344
|
+
return;
|
345
|
+
}
|
346
|
+
const selected = [];
|
347
|
+
for (let i = 0, max = this.options.length; i < max; i++) {
|
348
|
+
if (newOption) {
|
349
|
+
this.options[i]._selectedness = this.options[i] === newOption;
|
350
|
+
}
|
351
|
+
if (this.options[i]._selectedness) {
|
352
|
+
selected.push(this.options[i]);
|
353
|
+
}
|
354
|
+
}
|
355
|
+
const size = this._getDisplaySize();
|
356
|
+
if (size === 1 && !selected.length) {
|
357
|
+
for (let i = 0, max = this.options.length; i < max; i++) {
|
358
|
+
const option = this.options[i];
|
359
|
+
let disabled = option.hasAttributeNS(null, 'disabled');
|
360
|
+
const parentNode = option.parentNode;
|
361
|
+
if (parentNode &&
|
362
|
+
parentNode.nodeType === NodeTypeEnum_1.default.elementNode &&
|
363
|
+
parentNode.tagName === 'OPTGROUP' &&
|
364
|
+
parentNode.hasAttributeNS(null, 'disabled')) {
|
365
|
+
disabled = true;
|
366
|
+
}
|
367
|
+
if (!disabled) {
|
368
|
+
option._selectedness = true;
|
369
|
+
break;
|
370
|
+
}
|
371
|
+
}
|
372
|
+
}
|
373
|
+
else if (selected.length >= 2) {
|
374
|
+
for (let i = 0, max = this.options.length; i < max; i++) {
|
375
|
+
this.options[i]._selectedness = i === selected.length - 1;
|
376
|
+
}
|
377
|
+
}
|
378
|
+
}
|
379
|
+
/**
|
380
|
+
* Returns display size.
|
381
|
+
*
|
382
|
+
* @returns Display size.
|
383
|
+
*/
|
384
|
+
_getDisplaySize() {
|
385
|
+
if (this.hasAttributeNS(null, 'size')) {
|
386
|
+
const size = parseInt(this.getAttributeNS(null, 'size'));
|
387
|
+
if (!isNaN(size) && size >= 0) {
|
388
|
+
return size;
|
389
|
+
}
|
390
|
+
}
|
391
|
+
return this.hasAttributeNS(null, 'multiple') ? 4 : 1;
|
392
|
+
}
|
316
393
|
/**
|
317
394
|
* Updates index properties.
|
318
395
|
*
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"HTMLSelectElement.js","sourceRoot":"","sources":["../../../src/nodes/html-select-element/HTMLSelectElement.ts"],"names":[],"mappings":";;;;;AAAA,8EAAsD;AAGtD,oFAA4D;
|
1
|
+
{"version":3,"file":"HTMLSelectElement.js","sourceRoot":"","sources":["../../../src/nodes/html-select-element/HTMLSelectElement.ts"],"names":[],"mappings":"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"}
|
@@ -45,18 +45,11 @@ export default class SVGElement extends Element implements ISVGElement {
|
|
45
45
|
*/
|
46
46
|
get style(): CSSStyleDeclaration;
|
47
47
|
/**
|
48
|
-
* The setAttributeNode() method adds a new Attr node to the specified element.
|
49
|
-
*
|
50
48
|
* @override
|
51
|
-
* @param attribute Attribute.
|
52
|
-
* @returns Replaced attribute.
|
53
49
|
*/
|
54
50
|
setAttributeNode(attribute: IAttr): IAttr;
|
55
51
|
/**
|
56
|
-
* Removes an Attr node.
|
57
|
-
*
|
58
52
|
* @override
|
59
|
-
* @param attribute Attribute.
|
60
53
|
*/
|
61
|
-
removeAttributeNode(attribute: IAttr):
|
54
|
+
removeAttributeNode(attribute: IAttr): IAttr;
|
62
55
|
}
|
@@ -71,11 +71,7 @@ class SVGElement extends Element_1.default {
|
|
71
71
|
return this._style;
|
72
72
|
}
|
73
73
|
/**
|
74
|
-
* The setAttributeNode() method adds a new Attr node to the specified element.
|
75
|
-
*
|
76
74
|
* @override
|
77
|
-
* @param attribute Attribute.
|
78
|
-
* @returns Replaced attribute.
|
79
75
|
*/
|
80
76
|
setAttributeNode(attribute) {
|
81
77
|
const replacedAttribute = super.setAttributeNode(attribute);
|
@@ -85,16 +81,14 @@ class SVGElement extends Element_1.default {
|
|
85
81
|
return replacedAttribute;
|
86
82
|
}
|
87
83
|
/**
|
88
|
-
* Removes an Attr node.
|
89
|
-
*
|
90
84
|
* @override
|
91
|
-
* @param attribute Attribute.
|
92
85
|
*/
|
93
86
|
removeAttributeNode(attribute) {
|
94
87
|
super.removeAttributeNode(attribute);
|
95
88
|
if (attribute.name === 'style' && this._style) {
|
96
89
|
this._style.cssText = '';
|
97
90
|
}
|
91
|
+
return attribute;
|
98
92
|
}
|
99
93
|
}
|
100
94
|
exports.default = SVGElement;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SVGElement.js","sourceRoot":"","sources":["../../../src/nodes/svg-element/SVGElement.ts"],"names":[],"mappings":";;;;;AAAA,oGAA4E;AAC5E,iEAAyC;AAMzC;;;;;GAKG;AACH,MAAqB,UAAW,SAAQ,iBAAO;IAA/C;;QACC,SAAS;QACF,YAAO,GAAkC,IAAI,CAAC;QAC9C,YAAO,GAAkC,IAAI,CAAC;QAC9C,WAAM,GAAkC,IAAI,CAAC;QAC7C,aAAQ,GAAkC,IAAI,CAAC;QAC/C,aAAQ,GAAkC,IAAI,CAAC;QAC/C,aAAQ,GAAkC,IAAI,CAAC;QAE9C,WAAM,GAAwB,IAAI,CAAC;
|
1
|
+
{"version":3,"file":"SVGElement.js","sourceRoot":"","sources":["../../../src/nodes/svg-element/SVGElement.ts"],"names":[],"mappings":";;;;;AAAA,oGAA4E;AAC5E,iEAAyC;AAMzC;;;;;GAKG;AACH,MAAqB,UAAW,SAAQ,iBAAO;IAA/C;;QACC,SAAS;QACF,YAAO,GAAkC,IAAI,CAAC;QAC9C,YAAO,GAAkC,IAAI,CAAC;QAC9C,WAAM,GAAkC,IAAI,CAAC;QAC7C,aAAQ,GAAkC,IAAI,CAAC;QAC/C,aAAQ,GAAkC,IAAI,CAAC;QAC/C,aAAQ,GAAkC,IAAI,CAAC;QAE9C,WAAM,GAAwB,IAAI,CAAC;IA8E5C,CAAC;IA5EA;;;;OAIG;IACH,IAAW,eAAe;QACzB,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;OAIG;IACH,IAAW,eAAe;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QAC/B,OAAO,MAAM,EAAE;YACd,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,KAAK,EAAE;gBAChC,OAAuB,MAAM,CAAC;aAC9B;SACD;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;OAIG;IACH,IAAW,OAAO;QACjB,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YACjD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;gBAC7B,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;aAClE;SACD;QACD,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,IAAW,KAAK;QACf,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACjB,IAAI,CAAC,MAAM,GAAG,IAAI,6BAAmB,CAAC,IAAI,CAAC,CAAC;SAC5C;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED;;OAEG;IACI,gBAAgB,CAAC,SAAgB;QACvC,MAAM,iBAAiB,GAAG,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAE5D,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE;YAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC;SACtC;QAED,OAAO,iBAAiB,CAAC;IAC1B,CAAC;IAED;;OAEG;IACI,mBAAmB,CAAC,SAAgB;QAC1C,KAAK,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAErC,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE;YAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;SACzB;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;CACD;AAvFD,6BAuFC"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "happy-dom",
|
3
|
-
"version": "7.6.
|
3
|
+
"version": "7.6.5",
|
4
4
|
"license": "MIT",
|
5
5
|
"homepage": "https://github.com/capricorn86/happy-dom",
|
6
6
|
"repository": "https://github.com/capricorn86/happy-dom",
|
@@ -75,5 +75,5 @@
|
|
75
75
|
"ts-jest": "^27.1.3",
|
76
76
|
"typescript": "^4.6.2"
|
77
77
|
},
|
78
|
-
"gitHead": "
|
78
|
+
"gitHead": "d58adfe2717c50e042bf7f9d3e4d2fc5ce83c6b3"
|
79
79
|
}
|
@@ -77,21 +77,17 @@ export default abstract class AbstractCSSStyleDeclaration {
|
|
77
77
|
|
78
78
|
if (this._ownerElement) {
|
79
79
|
const style = new CSSStyleDeclarationPropertyManager({ cssText });
|
80
|
-
if (!style
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
this._ownerElement['_attributes']['style'] = new Attr();
|
86
|
-
this._ownerElement['_attributes']['style'].name = 'style';
|
87
|
-
}
|
88
|
-
|
89
|
-
if (this._ownerElement.isConnected) {
|
90
|
-
this._ownerElement.ownerDocument['_cacheID']++;
|
91
|
-
}
|
80
|
+
if (!this._ownerElement['_attributes']['style']) {
|
81
|
+
Attr._ownerDocument = this._ownerElement.ownerDocument;
|
82
|
+
this._ownerElement['_attributes']['style'] = new Attr();
|
83
|
+
this._ownerElement['_attributes']['style'].name = 'style';
|
84
|
+
}
|
92
85
|
|
93
|
-
|
86
|
+
if (this._ownerElement.isConnected) {
|
87
|
+
this._ownerElement.ownerDocument['_cacheID']++;
|
94
88
|
}
|
89
|
+
|
90
|
+
this._ownerElement['_attributes']['style'].value = style.toString();
|
95
91
|
} else {
|
96
92
|
this._style = new CSSStyleDeclarationPropertyManager({ cssText });
|
97
93
|
}
|
@@ -919,8 +919,17 @@ export default class Element extends Node implements IElement {
|
|
919
919
|
* Removes an Attr node.
|
920
920
|
*
|
921
921
|
* @param attribute Attribute.
|
922
|
+
* @returns Removed attribute.
|
922
923
|
*/
|
923
|
-
public removeAttributeNode(attribute: IAttr):
|
924
|
+
public removeAttributeNode(attribute: IAttr): IAttr {
|
925
|
+
const removedAttribute = this._attributes[attribute.name];
|
926
|
+
|
927
|
+
if (removedAttribute !== attribute) {
|
928
|
+
throw new DOMException(
|
929
|
+
`Failed to execute 'removeAttributeNode' on 'Element': The node provided is owned by another element.`
|
930
|
+
);
|
931
|
+
}
|
932
|
+
|
924
933
|
delete this._attributes[attribute.name];
|
925
934
|
|
926
935
|
if (this.isConnected) {
|
@@ -954,15 +963,18 @@ export default class Element extends Node implements IElement {
|
|
954
963
|
}
|
955
964
|
}
|
956
965
|
}
|
966
|
+
|
967
|
+
return attribute;
|
957
968
|
}
|
958
969
|
|
959
970
|
/**
|
960
971
|
* Removes an Attr node.
|
961
972
|
*
|
962
973
|
* @param attribute Attribute.
|
974
|
+
* @returns Removed attribute.
|
963
975
|
*/
|
964
|
-
public removeAttributeNodeNS(attribute: IAttr):
|
965
|
-
this.removeAttributeNode(attribute);
|
976
|
+
public removeAttributeNodeNS(attribute: IAttr): IAttr {
|
977
|
+
return this.removeAttributeNode(attribute);
|
966
978
|
}
|
967
979
|
|
968
980
|
/**
|
@@ -260,15 +260,17 @@ export default interface IElement extends IChildNode, INonDocumentTypeChildNode,
|
|
260
260
|
* Removes an Attr node.
|
261
261
|
*
|
262
262
|
* @param attribute Attribute.
|
263
|
+
* @returns Removed attribute.
|
263
264
|
*/
|
264
|
-
removeAttributeNode(attribute: IAttr):
|
265
|
+
removeAttributeNode(attribute: IAttr): IAttr;
|
265
266
|
|
266
267
|
/**
|
267
268
|
* Removes an Attr node.
|
268
269
|
*
|
269
270
|
* @param attribute Attribute.
|
271
|
+
* @returns Removed attribute.
|
270
272
|
*/
|
271
|
-
removeAttributeNodeNS(attribute: IAttr):
|
273
|
+
removeAttributeNodeNS(attribute: IAttr): IAttr;
|
272
274
|
|
273
275
|
/**
|
274
276
|
* Clones a node.
|
@@ -200,6 +200,16 @@ export default class HTMLElement extends Element implements IHTMLElement {
|
|
200
200
|
return this._style;
|
201
201
|
}
|
202
202
|
|
203
|
+
/**
|
204
|
+
* Sets style.
|
205
|
+
*
|
206
|
+
* @param cssText Style as text.
|
207
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/style#setting_styles
|
208
|
+
*/
|
209
|
+
public set style(cssText: string | CSSStyleDeclaration) {
|
210
|
+
this.style.cssText = typeof cssText === 'string' ? <string>cssText : '';
|
211
|
+
}
|
212
|
+
|
203
213
|
/**
|
204
214
|
* Returns data set.
|
205
215
|
*
|
@@ -411,11 +421,7 @@ export default class HTMLElement extends Element implements IHTMLElement {
|
|
411
421
|
}
|
412
422
|
|
413
423
|
/**
|
414
|
-
* The setAttributeNode() method adds a new Attr node to the specified element.
|
415
|
-
*
|
416
424
|
* @override
|
417
|
-
* @param attribute Attribute.
|
418
|
-
* @returns Replaced attribute.
|
419
425
|
*/
|
420
426
|
public setAttributeNode(attribute: IAttr): IAttr {
|
421
427
|
const replacedAttribute = super.setAttributeNode(attribute);
|
@@ -428,25 +434,20 @@ export default class HTMLElement extends Element implements IHTMLElement {
|
|
428
434
|
}
|
429
435
|
|
430
436
|
/**
|
431
|
-
* Removes an Attr node.
|
432
|
-
*
|
433
437
|
* @override
|
434
|
-
* @param attribute Attribute.
|
435
438
|
*/
|
436
|
-
public removeAttributeNode(attribute: IAttr):
|
439
|
+
public removeAttributeNode(attribute: IAttr): IAttr {
|
437
440
|
super.removeAttributeNode(attribute);
|
438
441
|
|
439
442
|
if (attribute.name === 'style' && this._style) {
|
440
443
|
this._style.cssText = '';
|
441
444
|
}
|
445
|
+
|
446
|
+
return attribute;
|
442
447
|
}
|
443
448
|
|
444
449
|
/**
|
445
|
-
* Clones a node.
|
446
|
-
*
|
447
450
|
* @override
|
448
|
-
* @param [deep=false] "true" to clone deep.
|
449
|
-
* @returns Cloned node.
|
450
451
|
*/
|
451
452
|
public cloneNode(deep = false): IHTMLElement {
|
452
453
|
const clone = <HTMLElement>super.cloneNode(deep);
|
@@ -9,7 +9,6 @@ import IElement from '../element/IElement';
|
|
9
9
|
* https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.
|
10
10
|
*/
|
11
11
|
export default interface IHTMLElement extends IElement {
|
12
|
-
style: CSSStyleDeclaration;
|
13
12
|
dataset: { [key: string]: string };
|
14
13
|
tabIndex: number;
|
15
14
|
offsetHeight: number;
|
@@ -48,6 +47,9 @@ export default interface IHTMLElement extends IElement {
|
|
48
47
|
ontransitionrun: (event: Event) => void | null;
|
49
48
|
ontransitionstart: (event: Event) => void | null;
|
50
49
|
|
50
|
+
get style(): CSSStyleDeclaration;
|
51
|
+
set style(cssText: CSSStyleDeclaration | string);
|
52
|
+
|
51
53
|
/**
|
52
54
|
* Triggers a click event.
|
53
55
|
*/
|
@@ -1,7 +1,8 @@
|
|
1
|
+
import IAttr from '../attr/IAttr';
|
1
2
|
import HTMLElement from '../html-element/HTMLElement';
|
2
3
|
import IHTMLElement from '../html-element/IHTMLElement';
|
3
4
|
import IHTMLFormElement from '../html-form-element/IHTMLFormElement';
|
4
|
-
import
|
5
|
+
import HTMLSelectElement from '../html-select-element/HTMLSelectElement';
|
5
6
|
import IHTMLOptionElement from './IHTMLOptionElement';
|
6
7
|
|
7
8
|
/**
|
@@ -12,6 +13,8 @@ import IHTMLOptionElement from './IHTMLOptionElement';
|
|
12
13
|
*/
|
13
14
|
export default class HTMLOptionElement extends HTMLElement implements IHTMLOptionElement {
|
14
15
|
public _index: number;
|
16
|
+
public _selectedness = false;
|
17
|
+
public _dirtyness = false;
|
15
18
|
|
16
19
|
/**
|
17
20
|
* Returns inner text, which is the rendered appearance of text.
|
@@ -59,20 +62,7 @@ export default class HTMLOptionElement extends HTMLElement implements IHTMLOptio
|
|
59
62
|
* @returns Selected.
|
60
63
|
*/
|
61
64
|
public get selected(): boolean {
|
62
|
-
|
63
|
-
|
64
|
-
if (parentNode?.tagName === 'SELECT') {
|
65
|
-
let index = -1;
|
66
|
-
for (let i = 0; i < parentNode.options.length; i++) {
|
67
|
-
if (parentNode.options[i] === this) {
|
68
|
-
index = i;
|
69
|
-
break;
|
70
|
-
}
|
71
|
-
}
|
72
|
-
return index !== -1 && parentNode.options.selectedIndex === index;
|
73
|
-
}
|
74
|
-
|
75
|
-
return false;
|
65
|
+
return this._selectedness;
|
76
66
|
}
|
77
67
|
|
78
68
|
/**
|
@@ -81,26 +71,13 @@ export default class HTMLOptionElement extends HTMLElement implements IHTMLOptio
|
|
81
71
|
* @param selected Selected.
|
82
72
|
*/
|
83
73
|
public set selected(selected: boolean) {
|
84
|
-
const
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
index = i;
|
92
|
-
break;
|
93
|
-
}
|
94
|
-
}
|
95
|
-
|
96
|
-
if (index !== -1) {
|
97
|
-
parentNode.options.selectedIndex = index;
|
98
|
-
}
|
99
|
-
} else if (parentNode.options.length) {
|
100
|
-
parentNode.options.selectedIndex = 0;
|
101
|
-
} else {
|
102
|
-
parentNode.options.selectedIndex = -1;
|
103
|
-
}
|
74
|
+
const selectElement = this._getSelectElement();
|
75
|
+
|
76
|
+
this._dirtyness = true;
|
77
|
+
this._selectedness = Boolean(selected);
|
78
|
+
|
79
|
+
if (selectElement) {
|
80
|
+
selectElement._resetOptionSelectednes(this._selectedness ? this : null);
|
104
81
|
}
|
105
82
|
}
|
106
83
|
|
@@ -143,4 +120,61 @@ export default class HTMLOptionElement extends HTMLElement implements IHTMLOptio
|
|
143
120
|
public set value(value: string) {
|
144
121
|
this.setAttributeNS(null, 'value', value);
|
145
122
|
}
|
123
|
+
|
124
|
+
/**
|
125
|
+
* @override
|
126
|
+
*/
|
127
|
+
public setAttributeNode(attribute: IAttr): IAttr {
|
128
|
+
const replacedAttribute = super.setAttributeNode(attribute);
|
129
|
+
|
130
|
+
if (
|
131
|
+
!this._dirtyness &&
|
132
|
+
attribute.name === 'selected' &&
|
133
|
+
replacedAttribute?.value !== attribute.value
|
134
|
+
) {
|
135
|
+
const selectElement = this._getSelectElement();
|
136
|
+
|
137
|
+
this._selectedness = true;
|
138
|
+
|
139
|
+
if (selectElement) {
|
140
|
+
selectElement._resetOptionSelectednes(this);
|
141
|
+
}
|
142
|
+
}
|
143
|
+
|
144
|
+
return replacedAttribute;
|
145
|
+
}
|
146
|
+
|
147
|
+
/**
|
148
|
+
* @override
|
149
|
+
*/
|
150
|
+
public removeAttributeNode(attribute: IAttr): IAttr {
|
151
|
+
super.removeAttributeNode(attribute);
|
152
|
+
|
153
|
+
if (!this._dirtyness && attribute.name === 'selected') {
|
154
|
+
const selectElement = this._getSelectElement();
|
155
|
+
|
156
|
+
this._selectedness = false;
|
157
|
+
|
158
|
+
if (selectElement) {
|
159
|
+
selectElement._resetOptionSelectednes();
|
160
|
+
}
|
161
|
+
}
|
162
|
+
|
163
|
+
return attribute;
|
164
|
+
}
|
165
|
+
|
166
|
+
/**
|
167
|
+
* Returns select element.
|
168
|
+
*
|
169
|
+
* @returns Select element.
|
170
|
+
*/
|
171
|
+
private _getSelectElement(): HTMLSelectElement {
|
172
|
+
const parentNode = <HTMLSelectElement>this.parentNode;
|
173
|
+
if (parentNode?.tagName === 'SELECT') {
|
174
|
+
return <HTMLSelectElement>parentNode;
|
175
|
+
}
|
176
|
+
if ((<HTMLSelectElement>parentNode?.parentNode)?.tagName === 'SELECT') {
|
177
|
+
return <HTMLSelectElement>parentNode.parentNode;
|
178
|
+
}
|
179
|
+
}
|
146
180
|
}
|
@@ -16,7 +16,6 @@ export default class HTMLOptionsCollection
|
|
16
16
|
implements IHTMLOptionsCollection
|
17
17
|
{
|
18
18
|
private _selectElement: IHTMLSelectElement;
|
19
|
-
private _selectedIndex = -1;
|
20
19
|
|
21
20
|
/**
|
22
21
|
*
|
@@ -34,7 +33,7 @@ export default class HTMLOptionsCollection
|
|
34
33
|
* @returns SelectedIndex.
|
35
34
|
*/
|
36
35
|
public get selectedIndex(): number {
|
37
|
-
return this.
|
36
|
+
return this._selectElement.selectedIndex;
|
38
37
|
}
|
39
38
|
|
40
39
|
/**
|
@@ -43,13 +42,7 @@ export default class HTMLOptionsCollection
|
|
43
42
|
* @param selectedIndex SelectedIndex.
|
44
43
|
*/
|
45
44
|
public set selectedIndex(selectedIndex: number) {
|
46
|
-
|
47
|
-
if (selectedIndex >= 0 && selectedIndex < this.length) {
|
48
|
-
this._selectedIndex = selectedIndex;
|
49
|
-
} else {
|
50
|
-
this._selectedIndex = -1;
|
51
|
-
}
|
52
|
-
}
|
45
|
+
this._selectElement.selectedIndex = selectedIndex;
|
53
46
|
}
|
54
47
|
|
55
48
|
/**
|