happy-dom 15.5.0 → 15.6.0
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/cjs/browser/utilities/BrowserFrameNavigator.cjs +13 -9
- package/cjs/browser/utilities/BrowserFrameNavigator.cjs.map +1 -1
- package/cjs/browser/utilities/BrowserFrameNavigator.d.ts.map +1 -1
- package/cjs/nodes/html-element/HTMLElementUtility.cjs +14 -10
- package/cjs/nodes/html-element/HTMLElementUtility.cjs.map +1 -1
- package/cjs/nodes/html-element/HTMLElementUtility.d.ts.map +1 -1
- package/cjs/nodes/html-input-element/HTMLInputElement.cjs +2 -2
- package/cjs/nodes/html-input-element/HTMLInputElement.d.ts +2 -2
- package/cjs/nodes/html-text-area-element/HTMLTextAreaElement.cjs +2 -2
- package/cjs/nodes/html-text-area-element/HTMLTextAreaElement.d.ts +2 -2
- package/cjs/nodes/node/Node.cjs +1 -0
- package/cjs/nodes/node/Node.cjs.map +1 -1
- package/cjs/nodes/node/Node.d.ts.map +1 -1
- package/cjs/query-selector/QuerySelector.cjs +4 -0
- package/cjs/query-selector/QuerySelector.cjs.map +1 -1
- package/cjs/query-selector/QuerySelector.d.ts.map +1 -1
- package/cjs/query-selector/SelectorItem.cjs +5 -0
- package/cjs/query-selector/SelectorItem.cjs.map +1 -1
- package/cjs/query-selector/SelectorItem.d.ts.map +1 -1
- package/lib/browser/utilities/BrowserFrameNavigator.d.ts.map +1 -1
- package/lib/browser/utilities/BrowserFrameNavigator.js +13 -9
- package/lib/browser/utilities/BrowserFrameNavigator.js.map +1 -1
- package/lib/nodes/html-element/HTMLElementUtility.d.ts.map +1 -1
- package/lib/nodes/html-element/HTMLElementUtility.js +14 -10
- package/lib/nodes/html-element/HTMLElementUtility.js.map +1 -1
- package/lib/nodes/html-input-element/HTMLInputElement.d.ts +2 -2
- package/lib/nodes/html-input-element/HTMLInputElement.js +2 -2
- package/lib/nodes/html-text-area-element/HTMLTextAreaElement.d.ts +2 -2
- package/lib/nodes/html-text-area-element/HTMLTextAreaElement.js +2 -2
- package/lib/nodes/node/Node.d.ts.map +1 -1
- package/lib/nodes/node/Node.js +1 -0
- package/lib/nodes/node/Node.js.map +1 -1
- package/lib/query-selector/QuerySelector.d.ts.map +1 -1
- package/lib/query-selector/QuerySelector.js +4 -0
- package/lib/query-selector/QuerySelector.js.map +1 -1
- package/lib/query-selector/SelectorItem.d.ts.map +1 -1
- package/lib/query-selector/SelectorItem.js +5 -0
- package/lib/query-selector/SelectorItem.js.map +1 -1
- package/package.json +4 -4
- package/src/browser/utilities/BrowserFrameNavigator.ts +14 -13
- package/src/nodes/html-element/HTMLElementUtility.ts +18 -11
- package/src/nodes/html-input-element/HTMLInputElement.ts +2 -2
- package/src/nodes/html-text-area-element/HTMLTextAreaElement.ts +2 -2
- package/src/nodes/node/Node.ts +1 -0
- package/src/query-selector/QuerySelector.ts +7 -0
- package/src/query-selector/SelectorItem.ts +5 -0
@@ -73,10 +73,12 @@ export default class BrowserFrameNavigator {
|
|
73
73
|
// Fixes issue where evaluating the response can throw an error.
|
74
74
|
// By using requestAnimationFrame() the error will not reject the promise.
|
75
75
|
// The error will be caught by process error level listener or a try and catch in the requestAnimationFrame().
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
76
|
+
await new Promise((resolve) => {
|
77
|
+
frame.window.requestAnimationFrame(() => {
|
78
|
+
frame.window.requestAnimationFrame(resolve);
|
79
|
+
frame.window.eval(code);
|
80
|
+
});
|
81
|
+
});
|
80
82
|
|
81
83
|
readyStateManager.endTask();
|
82
84
|
resolveNavigationListeners();
|
@@ -235,15 +237,14 @@ export default class BrowserFrameNavigator {
|
|
235
237
|
// Fixes issue where evaluating the response can throw an error.
|
236
238
|
// By using requestAnimationFrame() the error will not reject the promise.
|
237
239
|
// The error will be caught by process error level listener or a try and catch in the requestAnimationFrame().
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
);
|
240
|
+
await new Promise((resolve) => {
|
241
|
+
frame.window.requestAnimationFrame(() => {
|
242
|
+
frame.window.requestAnimationFrame(resolve);
|
243
|
+
frame.content = responseText;
|
244
|
+
});
|
245
|
+
});
|
246
|
+
|
247
|
+
finalize();
|
247
248
|
|
248
249
|
return response;
|
249
250
|
}
|
@@ -13,17 +13,20 @@ export default class HTMLElementUtility {
|
|
13
13
|
* @param element Element.
|
14
14
|
*/
|
15
15
|
public static blur(element: HTMLElement | SVGElement): void {
|
16
|
+
const document = element[PropertySymbol.ownerDocument];
|
17
|
+
|
16
18
|
if (
|
17
|
-
|
19
|
+
document[PropertySymbol.activeElement] !== element ||
|
18
20
|
!element[PropertySymbol.isConnected]
|
19
21
|
) {
|
20
22
|
return;
|
21
23
|
}
|
22
24
|
|
23
|
-
const relatedTarget =
|
24
|
-
|
25
|
+
const relatedTarget = document[PropertySymbol.nextActiveElement] ?? null;
|
26
|
+
|
27
|
+
document[PropertySymbol.activeElement] = null;
|
25
28
|
|
26
|
-
|
29
|
+
document[PropertySymbol.clearCache]();
|
27
30
|
|
28
31
|
element.dispatchEvent(
|
29
32
|
new FocusEvent('blur', {
|
@@ -49,26 +52,30 @@ export default class HTMLElementUtility {
|
|
49
52
|
* @param element Element.
|
50
53
|
*/
|
51
54
|
public static focus(element: HTMLElement | SVGElement): void {
|
55
|
+
const document = element[PropertySymbol.ownerDocument];
|
56
|
+
|
52
57
|
if (
|
53
|
-
|
58
|
+
document[PropertySymbol.activeElement] === element ||
|
54
59
|
!element[PropertySymbol.isConnected]
|
55
60
|
) {
|
56
61
|
return;
|
57
62
|
}
|
58
63
|
|
59
64
|
// Set the next active element so `blur` can use it for `relatedTarget`.
|
60
|
-
|
65
|
+
document[PropertySymbol.nextActiveElement] = element;
|
61
66
|
|
62
|
-
const relatedTarget =
|
67
|
+
const relatedTarget = document[PropertySymbol.activeElement];
|
63
68
|
|
64
|
-
if (
|
65
|
-
|
69
|
+
if (document[PropertySymbol.activeElement] !== null) {
|
70
|
+
document[PropertySymbol.activeElement].blur();
|
66
71
|
}
|
67
72
|
|
68
73
|
// Clean up after blur, so it does not affect next blur call.
|
69
|
-
|
74
|
+
document[PropertySymbol.nextActiveElement] = null;
|
75
|
+
|
76
|
+
document[PropertySymbol.activeElement] = element;
|
70
77
|
|
71
|
-
|
78
|
+
document[PropertySymbol.clearCache]();
|
72
79
|
|
73
80
|
element.dispatchEvent(
|
74
81
|
new FocusEvent('focus', {
|
@@ -487,7 +487,7 @@ export default class HTMLInputElement extends HTMLElement {
|
|
487
487
|
*
|
488
488
|
* @returns Inputmode.
|
489
489
|
*/
|
490
|
-
public get
|
490
|
+
public get inputMode(): string {
|
491
491
|
return this.getAttribute('inputmode') || '';
|
492
492
|
}
|
493
493
|
|
@@ -496,7 +496,7 @@ export default class HTMLInputElement extends HTMLElement {
|
|
496
496
|
*
|
497
497
|
* @param inputmode Inputmode.
|
498
498
|
*/
|
499
|
-
public set
|
499
|
+
public set inputMode(inputmode: string) {
|
500
500
|
this.setAttribute('inputmode', inputmode);
|
501
501
|
}
|
502
502
|
|
@@ -158,7 +158,7 @@ export default class HTMLTextAreaElement extends HTMLElement {
|
|
158
158
|
*
|
159
159
|
* @returns Inputmode.
|
160
160
|
*/
|
161
|
-
public get
|
161
|
+
public get inputMode(): string {
|
162
162
|
return this.getAttribute('inputmode') || '';
|
163
163
|
}
|
164
164
|
|
@@ -167,7 +167,7 @@ export default class HTMLTextAreaElement extends HTMLElement {
|
|
167
167
|
*
|
168
168
|
* @param inputmode Inputmode.
|
169
169
|
*/
|
170
|
-
public set
|
170
|
+
public set inputMode(inputmode: string) {
|
171
171
|
this.setAttribute('inputmode', inputmode);
|
172
172
|
}
|
173
173
|
|
package/src/nodes/node/Node.ts
CHANGED
@@ -1030,6 +1030,7 @@ export default class Node extends EventTarget {
|
|
1030
1030
|
this[PropertySymbol.rootNode] = null;
|
1031
1031
|
|
1032
1032
|
if (this[PropertySymbol.ownerDocument][PropertySymbol.activeElement] === <unknown>this) {
|
1033
|
+
this[PropertySymbol.ownerDocument][PropertySymbol.clearCache]();
|
1033
1034
|
this[PropertySymbol.ownerDocument][PropertySymbol.activeElement] = null;
|
1034
1035
|
}
|
1035
1036
|
|
@@ -332,6 +332,13 @@ export default class QuerySelector {
|
|
332
332
|
|
333
333
|
element[PropertySymbol.cache].matches.set(selector, cachedItem);
|
334
334
|
|
335
|
+
if (element[PropertySymbol.isConnected]) {
|
336
|
+
// Document is affected for the ":target" selector
|
337
|
+
(element[PropertySymbol.ownerDocument] || element)[PropertySymbol.affectsCache].push(
|
338
|
+
cachedItem
|
339
|
+
);
|
340
|
+
}
|
341
|
+
|
335
342
|
for (const items of SelectorParser.getSelectorGroups(selector, options)) {
|
336
343
|
const result = this.matchSelector(element, items.reverse(), cachedItem);
|
337
344
|
|
@@ -323,6 +323,11 @@ export default class SelectorItem {
|
|
323
323
|
}
|
324
324
|
}
|
325
325
|
return null;
|
326
|
+
case 'focus':
|
327
|
+
case 'focus-visible':
|
328
|
+
return element[PropertySymbol.ownerDocument].activeElement === element
|
329
|
+
? { priorityWeight: 10 }
|
330
|
+
: null;
|
326
331
|
default:
|
327
332
|
return null;
|
328
333
|
}
|