happy-dom 12.8.0 → 12.9.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 (73) hide show
  1. package/cjs/async-task-manager/AsyncTaskManager.cjs +75 -69
  2. package/cjs/async-task-manager/AsyncTaskManager.cjs.map +1 -1
  3. package/cjs/async-task-manager/AsyncTaskManager.d.ts +20 -11
  4. package/cjs/async-task-manager/AsyncTaskManager.d.ts.map +1 -1
  5. package/cjs/fetch/Fetch.cjs +2 -2
  6. package/cjs/fetch/Fetch.cjs.map +1 -1
  7. package/cjs/mutation-observer/MutationListener.cjs +1 -0
  8. package/cjs/mutation-observer/MutationListener.cjs.map +1 -1
  9. package/cjs/mutation-observer/MutationListener.d.ts +3 -1
  10. package/cjs/mutation-observer/MutationListener.d.ts.map +1 -1
  11. package/cjs/mutation-observer/MutationObserver.cjs +1 -0
  12. package/cjs/mutation-observer/MutationObserver.cjs.map +1 -1
  13. package/cjs/mutation-observer/MutationObserver.d.ts +1 -1
  14. package/cjs/mutation-observer/MutationObserver.d.ts.map +1 -1
  15. package/cjs/nodes/character-data/CharacterData.cjs +1 -1
  16. package/cjs/nodes/character-data/CharacterData.cjs.map +1 -1
  17. package/cjs/nodes/document/DocumentReadyStateManager.cjs +9 -9
  18. package/cjs/nodes/document/DocumentReadyStateManager.cjs.map +1 -1
  19. package/cjs/nodes/document/DocumentReadyStateManager.d.ts +1 -1
  20. package/cjs/nodes/document/DocumentReadyStateManager.d.ts.map +1 -1
  21. package/cjs/nodes/element/ElementNamedNodeMap.cjs +2 -2
  22. package/cjs/nodes/element/ElementNamedNodeMap.cjs.map +1 -1
  23. package/cjs/nodes/node/NodeUtility.cjs +3 -3
  24. package/cjs/nodes/node/NodeUtility.cjs.map +1 -1
  25. package/cjs/version.cjs +1 -1
  26. package/cjs/window/IWindow.d.ts +4 -4
  27. package/cjs/window/IWindow.d.ts.map +1 -1
  28. package/cjs/window/Window.cjs +17 -6
  29. package/cjs/window/Window.cjs.map +1 -1
  30. package/cjs/window/Window.d.ts +4 -4
  31. package/cjs/window/Window.d.ts.map +1 -1
  32. package/lib/async-task-manager/AsyncTaskManager.d.ts +20 -11
  33. package/lib/async-task-manager/AsyncTaskManager.d.ts.map +1 -1
  34. package/lib/async-task-manager/AsyncTaskManager.js +75 -69
  35. package/lib/async-task-manager/AsyncTaskManager.js.map +1 -1
  36. package/lib/fetch/Fetch.js +2 -2
  37. package/lib/fetch/Fetch.js.map +1 -1
  38. package/lib/mutation-observer/MutationListener.d.ts +3 -1
  39. package/lib/mutation-observer/MutationListener.d.ts.map +1 -1
  40. package/lib/mutation-observer/MutationListener.js +1 -0
  41. package/lib/mutation-observer/MutationListener.js.map +1 -1
  42. package/lib/mutation-observer/MutationObserver.d.ts +1 -1
  43. package/lib/mutation-observer/MutationObserver.d.ts.map +1 -1
  44. package/lib/mutation-observer/MutationObserver.js +1 -0
  45. package/lib/mutation-observer/MutationObserver.js.map +1 -1
  46. package/lib/nodes/character-data/CharacterData.js +1 -1
  47. package/lib/nodes/character-data/CharacterData.js.map +1 -1
  48. package/lib/nodes/document/DocumentReadyStateManager.d.ts +1 -1
  49. package/lib/nodes/document/DocumentReadyStateManager.d.ts.map +1 -1
  50. package/lib/nodes/document/DocumentReadyStateManager.js +9 -9
  51. package/lib/nodes/document/DocumentReadyStateManager.js.map +1 -1
  52. package/lib/nodes/element/ElementNamedNodeMap.js +2 -2
  53. package/lib/nodes/element/ElementNamedNodeMap.js.map +1 -1
  54. package/lib/nodes/node/NodeUtility.js +3 -3
  55. package/lib/nodes/node/NodeUtility.js.map +1 -1
  56. package/lib/version.js +1 -1
  57. package/lib/window/IWindow.d.ts +4 -4
  58. package/lib/window/IWindow.d.ts.map +1 -1
  59. package/lib/window/Window.d.ts +4 -4
  60. package/lib/window/Window.d.ts.map +1 -1
  61. package/lib/window/Window.js +17 -6
  62. package/lib/window/Window.js.map +1 -1
  63. package/package.json +1 -1
  64. package/src/async-task-manager/AsyncTaskManager.ts +85 -72
  65. package/src/fetch/Fetch.ts +2 -2
  66. package/src/mutation-observer/MutationListener.ts +3 -1
  67. package/src/mutation-observer/MutationObserver.ts +3 -2
  68. package/src/nodes/character-data/CharacterData.ts +1 -1
  69. package/src/nodes/document/DocumentReadyStateManager.ts +9 -9
  70. package/src/nodes/element/ElementNamedNodeMap.ts +2 -2
  71. package/src/nodes/node/NodeUtility.ts +3 -3
  72. package/src/window/IWindow.ts +4 -4
  73. package/src/window/Window.ts +18 -9
@@ -68,7 +68,7 @@ export default abstract class CharacterData extends Node implements ICharacterDa
68
68
  record.target = this;
69
69
  record.type = MutationTypeEnum.characterData;
70
70
  record.oldValue = observer.options.characterDataOldValue ? oldValue : null;
71
- observer.callback([record]);
71
+ observer.callback([record], observer.observer);
72
72
  }
73
73
  }
74
74
  }
@@ -7,7 +7,7 @@ export default class DocumentReadyStateManager {
7
7
  private totalTasks = 0;
8
8
  private readyStateCallbacks: (() => void)[] = [];
9
9
  private window: IWindow = null;
10
- private timer: NodeJS.Timeout = null;
10
+ private immediate: NodeJS.Immediate | null = null;
11
11
  private isComplete = false;
12
12
 
13
13
  /**
@@ -30,8 +30,8 @@ export default class DocumentReadyStateManager {
30
30
  resolve();
31
31
  } else {
32
32
  this.readyStateCallbacks.push(resolve);
33
- if (this.totalTasks === 0 && !this.timer) {
34
- this.timer = this.window.setTimeout(this.endTask.bind(this));
33
+ if (this.totalTasks === 0 && !this.immediate) {
34
+ this.immediate = this.window.requestAnimationFrame(this.endTask.bind(this));
35
35
  }
36
36
  }
37
37
  });
@@ -45,9 +45,9 @@ export default class DocumentReadyStateManager {
45
45
  return;
46
46
  }
47
47
 
48
- if (this.timer) {
49
- this.window.clearTimeout(this.timer);
50
- this.timer = null;
48
+ if (this.immediate) {
49
+ this.window.cancelAnimationFrame(this.immediate);
50
+ this.immediate = null;
51
51
  }
52
52
 
53
53
  this.totalTasks++;
@@ -61,9 +61,9 @@ export default class DocumentReadyStateManager {
61
61
  return;
62
62
  }
63
63
 
64
- if (this.timer) {
65
- this.window.clearTimeout(this.timer);
66
- this.timer = null;
64
+ if (this.immediate) {
65
+ this.window.cancelAnimationFrame(this.immediate);
66
+ this.immediate = null;
67
67
  }
68
68
 
69
69
  this.totalTasks--;
@@ -103,7 +103,7 @@ export default class ElementNamedNodeMap extends NamedNodeMap {
103
103
  record.type = MutationTypeEnum.attributes;
104
104
  record.attributeName = item.name;
105
105
  record.oldValue = observer.options.attributeOldValue ? oldValue : null;
106
- observer.callback([record]);
106
+ observer.callback([record], observer.observer);
107
107
  }
108
108
  }
109
109
  }
@@ -164,7 +164,7 @@ export default class ElementNamedNodeMap extends NamedNodeMap {
164
164
  record.type = MutationTypeEnum.attributes;
165
165
  record.attributeName = removedItem.name;
166
166
  record.oldValue = observer.options.attributeOldValue ? removedItem.value : null;
167
- observer.callback([record]);
167
+ observer.callback([record], observer.observer);
168
168
  }
169
169
  }
170
170
  }
@@ -81,7 +81,7 @@ export default class NodeUtility {
81
81
  (<Node>node)._observe(observer);
82
82
  }
83
83
  if (observer.options.childList) {
84
- observer.callback([record]);
84
+ observer.callback([record], observer.observer);
85
85
  }
86
86
  }
87
87
  }
@@ -121,7 +121,7 @@ export default class NodeUtility {
121
121
  for (const observer of (<Node>ancestorNode)._observers) {
122
122
  (<Node>node)._unobserve(observer);
123
123
  if (observer.options.childList) {
124
- observer.callback([record]);
124
+ observer.callback([record], observer.observer);
125
125
  }
126
126
  }
127
127
  }
@@ -208,7 +208,7 @@ export default class NodeUtility {
208
208
  (<Node>newNode)._observe(observer);
209
209
  }
210
210
  if (observer.options.childList) {
211
- observer.callback([record]);
211
+ observer.callback([record], observer.observer);
212
212
  }
213
213
  }
214
214
  }
@@ -492,16 +492,16 @@ export default interface IWindow extends IEventTarget, INodeJSGlobal {
492
492
  * Mock animation frames with timeouts.
493
493
  *
494
494
  * @param {Function} callback Callback.
495
- * @returns {NodeJS.Timeout} Timeout ID.
495
+ * @returns {NodeJS.Timeout} ID.
496
496
  */
497
- requestAnimationFrame(callback: (timestamp: number) => void): NodeJS.Timeout;
497
+ requestAnimationFrame(callback: (timestamp: number) => void): NodeJS.Immediate;
498
498
 
499
499
  /**
500
500
  * Mock animation frames with timeouts.
501
501
  *
502
- * @param {NodeJS.Timeout} id Timeout ID.
502
+ * @param {NodeJS.Timeout} id ID.
503
503
  */
504
- cancelAnimationFrame(id: NodeJS.Timeout): void;
504
+ cancelAnimationFrame(id: NodeJS.Immediate): void;
505
505
 
506
506
  /**
507
507
  * This method provides an easy, logical way to fetch resources asynchronously across the network.
@@ -837,12 +837,12 @@ export default class Window extends EventTarget implements IWindow {
837
837
  */
838
838
  public setTimeout(callback: Function, delay = 0, ...args: unknown[]): NodeJS.Timeout {
839
839
  const id = this._setTimeout(() => {
840
- this.happyDOM.asyncTaskManager.endTimer(id);
841
840
  if (this.happyDOM.settings.disableErrorCapturing) {
842
841
  callback(...args);
843
842
  } else {
844
843
  WindowErrorUtility.captureError(this, () => callback(...args));
845
844
  }
845
+ this.happyDOM.asyncTaskManager.endTimer(id);
846
846
  }, delay);
847
847
  this.happyDOM.asyncTaskManager.startTimer(id);
848
848
  return id;
@@ -896,19 +896,29 @@ export default class Window extends EventTarget implements IWindow {
896
896
  * Mock animation frames with timeouts.
897
897
  *
898
898
  * @param callback Callback.
899
- * @returns Timeout ID.
899
+ * @returns ID.
900
900
  */
901
- public requestAnimationFrame(callback: (timestamp: number) => void): NodeJS.Timeout {
902
- return this.setTimeout(() => callback(this.performance.now()));
901
+ public requestAnimationFrame(callback: (timestamp: number) => void): NodeJS.Immediate {
902
+ const id = global.setImmediate(() => {
903
+ if (this.happyDOM.settings.disableErrorCapturing) {
904
+ callback(this.performance.now());
905
+ } else {
906
+ WindowErrorUtility.captureError(this, () => callback(this.performance.now()));
907
+ }
908
+ this.happyDOM.asyncTaskManager.endImmediate(id);
909
+ });
910
+ this.happyDOM.asyncTaskManager.startImmediate(id);
911
+ return id;
903
912
  }
904
913
 
905
914
  /**
906
915
  * Mock animation frames with timeouts.
907
916
  *
908
- * @param id Timeout ID.
917
+ * @param id ID.
909
918
  */
910
- public cancelAnimationFrame(id: NodeJS.Timeout): void {
911
- this.clearTimeout(id);
919
+ public cancelAnimationFrame(id: NodeJS.Immediate): void {
920
+ global.clearImmediate(id);
921
+ this.happyDOM.asyncTaskManager.endImmediate(id);
912
922
  }
913
923
 
914
924
  /**
@@ -921,13 +931,12 @@ export default class Window extends EventTarget implements IWindow {
921
931
  const taskId = this.happyDOM.asyncTaskManager.startTask(() => (isAborted = true));
922
932
  this._queueMicrotask(() => {
923
933
  if (!isAborted) {
924
- this.happyDOM.asyncTaskManager.endTask(taskId);
925
-
926
934
  if (this.happyDOM.settings.disableErrorCapturing) {
927
935
  callback();
928
936
  } else {
929
937
  WindowErrorUtility.captureError(this, <() => unknown>callback);
930
938
  }
939
+ this.happyDOM.asyncTaskManager.endTask(taskId);
931
940
  }
932
941
  });
933
942
  }