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.

Files changed (46) hide show
  1. package/cjs/browser/utilities/BrowserFrameNavigator.cjs +13 -9
  2. package/cjs/browser/utilities/BrowserFrameNavigator.cjs.map +1 -1
  3. package/cjs/browser/utilities/BrowserFrameNavigator.d.ts.map +1 -1
  4. package/cjs/nodes/html-element/HTMLElementUtility.cjs +14 -10
  5. package/cjs/nodes/html-element/HTMLElementUtility.cjs.map +1 -1
  6. package/cjs/nodes/html-element/HTMLElementUtility.d.ts.map +1 -1
  7. package/cjs/nodes/html-input-element/HTMLInputElement.cjs +2 -2
  8. package/cjs/nodes/html-input-element/HTMLInputElement.d.ts +2 -2
  9. package/cjs/nodes/html-text-area-element/HTMLTextAreaElement.cjs +2 -2
  10. package/cjs/nodes/html-text-area-element/HTMLTextAreaElement.d.ts +2 -2
  11. package/cjs/nodes/node/Node.cjs +1 -0
  12. package/cjs/nodes/node/Node.cjs.map +1 -1
  13. package/cjs/nodes/node/Node.d.ts.map +1 -1
  14. package/cjs/query-selector/QuerySelector.cjs +4 -0
  15. package/cjs/query-selector/QuerySelector.cjs.map +1 -1
  16. package/cjs/query-selector/QuerySelector.d.ts.map +1 -1
  17. package/cjs/query-selector/SelectorItem.cjs +5 -0
  18. package/cjs/query-selector/SelectorItem.cjs.map +1 -1
  19. package/cjs/query-selector/SelectorItem.d.ts.map +1 -1
  20. package/lib/browser/utilities/BrowserFrameNavigator.d.ts.map +1 -1
  21. package/lib/browser/utilities/BrowserFrameNavigator.js +13 -9
  22. package/lib/browser/utilities/BrowserFrameNavigator.js.map +1 -1
  23. package/lib/nodes/html-element/HTMLElementUtility.d.ts.map +1 -1
  24. package/lib/nodes/html-element/HTMLElementUtility.js +14 -10
  25. package/lib/nodes/html-element/HTMLElementUtility.js.map +1 -1
  26. package/lib/nodes/html-input-element/HTMLInputElement.d.ts +2 -2
  27. package/lib/nodes/html-input-element/HTMLInputElement.js +2 -2
  28. package/lib/nodes/html-text-area-element/HTMLTextAreaElement.d.ts +2 -2
  29. package/lib/nodes/html-text-area-element/HTMLTextAreaElement.js +2 -2
  30. package/lib/nodes/node/Node.d.ts.map +1 -1
  31. package/lib/nodes/node/Node.js +1 -0
  32. package/lib/nodes/node/Node.js.map +1 -1
  33. package/lib/query-selector/QuerySelector.d.ts.map +1 -1
  34. package/lib/query-selector/QuerySelector.js +4 -0
  35. package/lib/query-selector/QuerySelector.js.map +1 -1
  36. package/lib/query-selector/SelectorItem.d.ts.map +1 -1
  37. package/lib/query-selector/SelectorItem.js +5 -0
  38. package/lib/query-selector/SelectorItem.js.map +1 -1
  39. package/package.json +4 -4
  40. package/src/browser/utilities/BrowserFrameNavigator.ts +14 -13
  41. package/src/nodes/html-element/HTMLElementUtility.ts +18 -11
  42. package/src/nodes/html-input-element/HTMLInputElement.ts +2 -2
  43. package/src/nodes/html-text-area-element/HTMLTextAreaElement.ts +2 -2
  44. package/src/nodes/node/Node.ts +1 -0
  45. package/src/query-selector/QuerySelector.ts +7 -0
  46. 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
- frame.window.requestAnimationFrame(() => frame.window.eval(code));
77
-
78
- // We need to wait for the next tick before resolving navigation listeners and ending the ready state task.
79
- await new Promise((resolve) => frame.window.setTimeout(() => resolve(null)));
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
- frame.window.requestAnimationFrame(() => (frame.content = responseText));
239
-
240
- // Finalize the navigation
241
- await new Promise((resolve) =>
242
- frame.window.setTimeout(() => {
243
- finalize();
244
- resolve(null);
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
- element[PropertySymbol.ownerDocument][PropertySymbol.activeElement] !== element ||
19
+ document[PropertySymbol.activeElement] !== element ||
18
20
  !element[PropertySymbol.isConnected]
19
21
  ) {
20
22
  return;
21
23
  }
22
24
 
23
- const relatedTarget =
24
- element[PropertySymbol.ownerDocument][PropertySymbol.nextActiveElement] ?? null;
25
+ const relatedTarget = document[PropertySymbol.nextActiveElement] ?? null;
26
+
27
+ document[PropertySymbol.activeElement] = null;
25
28
 
26
- element[PropertySymbol.ownerDocument][PropertySymbol.activeElement] = null;
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
- element[PropertySymbol.ownerDocument][PropertySymbol.activeElement] === element ||
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
- element[PropertySymbol.ownerDocument][PropertySymbol.nextActiveElement] = element;
65
+ document[PropertySymbol.nextActiveElement] = element;
61
66
 
62
- const relatedTarget = element[PropertySymbol.ownerDocument][PropertySymbol.activeElement];
67
+ const relatedTarget = document[PropertySymbol.activeElement];
63
68
 
64
- if (element[PropertySymbol.ownerDocument][PropertySymbol.activeElement] !== null) {
65
- element[PropertySymbol.ownerDocument][PropertySymbol.activeElement].blur();
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
- element[PropertySymbol.ownerDocument][PropertySymbol.nextActiveElement] = null;
74
+ document[PropertySymbol.nextActiveElement] = null;
75
+
76
+ document[PropertySymbol.activeElement] = element;
70
77
 
71
- element[PropertySymbol.ownerDocument][PropertySymbol.activeElement] = element;
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 inputmode(): string {
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 inputmode(inputmode: string) {
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 inputmode(): string {
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 inputmode(inputmode: string) {
170
+ public set inputMode(inputmode: string) {
171
171
  this.setAttribute('inputmode', inputmode);
172
172
  }
173
173
 
@@ -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
  }