happy-dom 12.3.0 → 12.5.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 (45) hide show
  1. package/cjs/nodes/document/Document.cjs +10 -0
  2. package/cjs/nodes/document/Document.cjs.map +1 -1
  3. package/cjs/nodes/document/Document.d.ts +8 -0
  4. package/cjs/nodes/document/Document.d.ts.map +1 -1
  5. package/cjs/nodes/document/IDocument.d.ts +1 -0
  6. package/cjs/nodes/document/IDocument.d.ts.map +1 -1
  7. package/cjs/nodes/element/Element.cjs +7 -1
  8. package/cjs/nodes/element/Element.cjs.map +1 -1
  9. package/cjs/nodes/element/Element.d.ts.map +1 -1
  10. package/cjs/nodes/html-element/HTMLElementUtility.cjs +10 -0
  11. package/cjs/nodes/html-element/HTMLElementUtility.cjs.map +1 -1
  12. package/cjs/nodes/html-element/HTMLElementUtility.d.ts.map +1 -1
  13. package/cjs/nodes/html-script-element/HTMLScriptElement.cjs +2 -0
  14. package/cjs/nodes/html-script-element/HTMLScriptElement.cjs.map +1 -1
  15. package/cjs/nodes/html-script-element/HTMLScriptElement.d.ts.map +1 -1
  16. package/cjs/nodes/html-script-element/HTMLScriptElementUtility.cjs +4 -0
  17. package/cjs/nodes/html-script-element/HTMLScriptElementUtility.cjs.map +1 -1
  18. package/cjs/nodes/html-script-element/HTMLScriptElementUtility.d.ts.map +1 -1
  19. package/cjs/version.cjs +1 -1
  20. package/lib/nodes/document/Document.d.ts +8 -0
  21. package/lib/nodes/document/Document.d.ts.map +1 -1
  22. package/lib/nodes/document/Document.js +10 -0
  23. package/lib/nodes/document/Document.js.map +1 -1
  24. package/lib/nodes/document/IDocument.d.ts +1 -0
  25. package/lib/nodes/document/IDocument.d.ts.map +1 -1
  26. package/lib/nodes/element/Element.d.ts.map +1 -1
  27. package/lib/nodes/element/Element.js +7 -1
  28. package/lib/nodes/element/Element.js.map +1 -1
  29. package/lib/nodes/html-element/HTMLElementUtility.d.ts.map +1 -1
  30. package/lib/nodes/html-element/HTMLElementUtility.js +10 -0
  31. package/lib/nodes/html-element/HTMLElementUtility.js.map +1 -1
  32. package/lib/nodes/html-script-element/HTMLScriptElement.d.ts.map +1 -1
  33. package/lib/nodes/html-script-element/HTMLScriptElement.js +2 -0
  34. package/lib/nodes/html-script-element/HTMLScriptElement.js.map +1 -1
  35. package/lib/nodes/html-script-element/HTMLScriptElementUtility.d.ts.map +1 -1
  36. package/lib/nodes/html-script-element/HTMLScriptElementUtility.js +4 -0
  37. package/lib/nodes/html-script-element/HTMLScriptElementUtility.js.map +1 -1
  38. package/lib/version.js +1 -1
  39. package/package.json +1 -1
  40. package/src/nodes/document/Document.ts +11 -0
  41. package/src/nodes/document/IDocument.ts +1 -0
  42. package/src/nodes/element/Element.ts +8 -1
  43. package/src/nodes/html-element/HTMLElementUtility.ts +14 -0
  44. package/src/nodes/html-script-element/HTMLScriptElement.ts +4 -0
  45. package/src/nodes/html-script-element/HTMLScriptElementUtility.ts +4 -0
@@ -16,16 +16,20 @@ export default class HTMLElementUtility {
16
16
  return;
17
17
  }
18
18
 
19
+ const relatedTarget = element.ownerDocument['_nextActiveElement'] ?? null;
20
+
19
21
  element.ownerDocument['_activeElement'] = null;
20
22
 
21
23
  element.dispatchEvent(
22
24
  new FocusEvent('blur', {
25
+ relatedTarget,
23
26
  bubbles: false,
24
27
  composed: true
25
28
  })
26
29
  );
27
30
  element.dispatchEvent(
28
31
  new FocusEvent('focusout', {
32
+ relatedTarget,
29
33
  bubbles: true,
30
34
  composed: true
31
35
  })
@@ -42,20 +46,30 @@ export default class HTMLElementUtility {
42
46
  return;
43
47
  }
44
48
 
49
+ // Set the next active element so `blur` can use it for `relatedTarget`.
50
+ element.ownerDocument['_nextActiveElement'] = element;
51
+
52
+ const relatedTarget = element.ownerDocument['_activeElement'];
53
+
45
54
  if (element.ownerDocument['_activeElement'] !== null) {
46
55
  element.ownerDocument['_activeElement'].blur();
47
56
  }
48
57
 
58
+ // Clean up after blur, so it does not affect next blur call.
59
+ element.ownerDocument['_nextActiveElement'] = null;
60
+
49
61
  element.ownerDocument['_activeElement'] = element;
50
62
 
51
63
  element.dispatchEvent(
52
64
  new FocusEvent('focus', {
65
+ relatedTarget,
53
66
  bubbles: false,
54
67
  composed: true
55
68
  })
56
69
  );
57
70
  element.dispatchEvent(
58
71
  new FocusEvent('focusin', {
72
+ relatedTarget,
59
73
  bubbles: true,
60
74
  composed: true
61
75
  })
@@ -189,6 +189,8 @@ export default class HTMLScriptElement extends HTMLElement implements IHTMLScrip
189
189
  type === 'application/x-javascript' ||
190
190
  type.startsWith('text/javascript'))
191
191
  ) {
192
+ this.ownerDocument['_currentScript'] = this;
193
+
192
194
  if (this.ownerDocument.defaultView.happyDOM.settings.disableErrorCapturing) {
193
195
  this.ownerDocument.defaultView.eval(textContent);
194
196
  } else {
@@ -196,6 +198,8 @@ export default class HTMLScriptElement extends HTMLElement implements IHTMLScrip
196
198
  this.ownerDocument.defaultView.eval(textContent)
197
199
  );
198
200
  }
201
+
202
+ this.ownerDocument['_currentScript'] = null;
199
203
  }
200
204
  }
201
205
  }
@@ -56,6 +56,7 @@ export default class HTMLScriptElementUtility {
56
56
  throw error;
57
57
  }
58
58
  } else {
59
+ element.ownerDocument['_currentScript'] = element;
59
60
  if (element.ownerDocument.defaultView.happyDOM.settings.disableErrorCapturing) {
60
61
  element.ownerDocument.defaultView.eval(code);
61
62
  } else {
@@ -63,6 +64,7 @@ export default class HTMLScriptElementUtility {
63
64
  element.ownerDocument.defaultView.eval(code)
64
65
  );
65
66
  }
67
+ element.ownerDocument['_currentScript'] = null;
66
68
  element.dispatchEvent(new Event('load'));
67
69
  }
68
70
  } else {
@@ -81,6 +83,7 @@ export default class HTMLScriptElementUtility {
81
83
  throw error;
82
84
  }
83
85
  } else {
86
+ element.ownerDocument['_currentScript'] = element;
84
87
  if (element.ownerDocument.defaultView.happyDOM.settings.disableErrorCapturing) {
85
88
  element.ownerDocument.defaultView.eval(code);
86
89
  } else {
@@ -88,6 +91,7 @@ export default class HTMLScriptElementUtility {
88
91
  element.ownerDocument.defaultView.eval(code)
89
92
  );
90
93
  }
94
+ element.ownerDocument['_currentScript'] = null;
91
95
  element.dispatchEvent(new Event('load'));
92
96
  }
93
97
  }