happy-dom 17.0.3 → 17.1.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.
Files changed (50) hide show
  1. package/cjs/browser/DefaultBrowserSettings.cjs +1 -0
  2. package/cjs/browser/DefaultBrowserSettings.cjs.map +1 -1
  3. package/cjs/browser/DefaultBrowserSettings.d.ts.map +1 -1
  4. package/cjs/browser/types/IBrowserSettings.d.ts +1 -0
  5. package/cjs/browser/types/IBrowserSettings.d.ts.map +1 -1
  6. package/cjs/browser/types/IOptionalBrowserSettings.d.ts +1 -0
  7. package/cjs/browser/types/IOptionalBrowserSettings.d.ts.map +1 -1
  8. package/cjs/custom-element/CustomElementReactionStack.cjs.map +1 -1
  9. package/cjs/custom-element/CustomElementReactionStack.d.ts +2 -2
  10. package/cjs/custom-element/CustomElementReactionStack.d.ts.map +1 -1
  11. package/cjs/match-media/MediaQueryItem.cjs +9 -2
  12. package/cjs/match-media/MediaQueryItem.cjs.map +1 -1
  13. package/cjs/match-media/MediaQueryItem.d.ts.map +1 -1
  14. package/cjs/nodes/element/Element.cjs +8 -1
  15. package/cjs/nodes/element/Element.cjs.map +1 -1
  16. package/cjs/nodes/element/Element.d.ts +16 -0
  17. package/cjs/nodes/element/Element.d.ts.map +1 -1
  18. package/cjs/nodes/html-element/HTMLElement.cjs +0 -14
  19. package/cjs/nodes/html-element/HTMLElement.cjs.map +1 -1
  20. package/cjs/nodes/html-element/HTMLElement.d.ts +0 -24
  21. package/cjs/nodes/html-element/HTMLElement.d.ts.map +1 -1
  22. package/lib/browser/DefaultBrowserSettings.d.ts.map +1 -1
  23. package/lib/browser/DefaultBrowserSettings.js +1 -0
  24. package/lib/browser/DefaultBrowserSettings.js.map +1 -1
  25. package/lib/browser/types/IBrowserSettings.d.ts +1 -0
  26. package/lib/browser/types/IBrowserSettings.d.ts.map +1 -1
  27. package/lib/browser/types/IOptionalBrowserSettings.d.ts +1 -0
  28. package/lib/browser/types/IOptionalBrowserSettings.d.ts.map +1 -1
  29. package/lib/custom-element/CustomElementReactionStack.d.ts +2 -2
  30. package/lib/custom-element/CustomElementReactionStack.d.ts.map +1 -1
  31. package/lib/custom-element/CustomElementReactionStack.js.map +1 -1
  32. package/lib/match-media/MediaQueryItem.d.ts.map +1 -1
  33. package/lib/match-media/MediaQueryItem.js +9 -2
  34. package/lib/match-media/MediaQueryItem.js.map +1 -1
  35. package/lib/nodes/element/Element.d.ts +16 -0
  36. package/lib/nodes/element/Element.d.ts.map +1 -1
  37. package/lib/nodes/element/Element.js +8 -1
  38. package/lib/nodes/element/Element.js.map +1 -1
  39. package/lib/nodes/html-element/HTMLElement.d.ts +0 -24
  40. package/lib/nodes/html-element/HTMLElement.d.ts.map +1 -1
  41. package/lib/nodes/html-element/HTMLElement.js +0 -14
  42. package/lib/nodes/html-element/HTMLElement.js.map +1 -1
  43. package/package.json +1 -1
  44. package/src/browser/DefaultBrowserSettings.ts +1 -0
  45. package/src/browser/types/IBrowserSettings.ts +1 -0
  46. package/src/browser/types/IOptionalBrowserSettings.ts +1 -0
  47. package/src/custom-element/CustomElementReactionStack.ts +2 -2
  48. package/src/match-media/MediaQueryItem.ts +11 -4
  49. package/src/nodes/element/Element.ts +36 -1
  50. package/src/nodes/html-element/HTMLElement.ts +0 -43
@@ -103,6 +103,7 @@ export default interface IOptionalBrowserSettings {
103
103
  */
104
104
  device?: {
105
105
  prefersColorScheme?: string;
106
+ prefersReducedMotion?: string;
106
107
  mediaType?: string;
107
108
  };
108
109
 
@@ -1,7 +1,7 @@
1
- import HTMLElement from '../nodes/html-element/HTMLElement.js';
2
1
  import BrowserWindow from '../window/BrowserWindow.js';
3
2
  import * as PropertySymbol from '../PropertySymbol.js';
4
3
  import WindowBrowserContext from '../window/WindowBrowserContext.js';
4
+ import Element from '../nodes/element/Element.js';
5
5
 
6
6
  /**
7
7
  * Custom element reaction stack.
@@ -29,7 +29,7 @@ export default class CustomElementReactionStack {
29
29
  * @param callbackName Callback name.
30
30
  * @param [args] Arguments.
31
31
  */
32
- public enqueueReaction(element: HTMLElement, callbackName: string, args?: any[]): void {
32
+ public enqueueReaction(element: Element, callbackName: string, args?: any[]): void {
33
33
  // If a polyfill is used, [PropertySymbol.registry] may be undefined
34
34
  const definition = this.window.customElements[PropertySymbol.registry]?.get(element.localName);
35
35
 
@@ -199,6 +199,12 @@ export default class MediaQueryItem {
199
199
  * @returns "true" if the rule matches.
200
200
  */
201
201
  private matchesRule(rule: IMediaQueryRule): boolean {
202
+ const settings = new WindowBrowserContext(this.window).getSettings();
203
+
204
+ if (!settings) {
205
+ return false;
206
+ }
207
+
202
208
  if (!rule.value) {
203
209
  switch (rule.name) {
204
210
  case 'min-width':
@@ -218,6 +224,8 @@ export default class MediaQueryItem {
218
224
  case 'max-aspect-ratio':
219
225
  case 'aspect-ratio':
220
226
  return true;
227
+ case 'prefers-reduced-motion':
228
+ return settings.device.prefersReducedMotion === 'reduce';
221
229
  }
222
230
  return false;
223
231
  }
@@ -246,10 +254,9 @@ export default class MediaQueryItem {
246
254
  ? this.window.innerWidth > this.window.innerHeight
247
255
  : this.window.innerWidth < this.window.innerHeight;
248
256
  case 'prefers-color-scheme':
249
- return (
250
- rule.value ===
251
- new WindowBrowserContext(this.window).getSettings().device.prefersColorScheme
252
- );
257
+ return rule.value === settings.device.prefersColorScheme;
258
+ case 'prefers-reduced-motion':
259
+ return rule.value === settings.device.prefersReducedMotion;
253
260
  case 'any-hover':
254
261
  case 'hover':
255
262
  if (rule.value === 'none') {
@@ -953,6 +953,25 @@ export default class Element
953
953
  return null;
954
954
  }
955
955
 
956
+ /**
957
+ * Connected callback.
958
+ */
959
+ public connectedCallback?(): void;
960
+
961
+ /**
962
+ * Disconnected callback.
963
+ */
964
+ public disconnectedCallback?(): void;
965
+
966
+ /**
967
+ * Attribute changed callback.
968
+ *
969
+ * @param name Name.
970
+ * @param oldValue Old value.
971
+ * @param newValue New value.
972
+ */
973
+ public attributeChangedCallback?(name: string, oldValue: string, newValue: string): void;
974
+
956
975
  /**
957
976
  * Query CSS selector to find matching nodes.
958
977
  *
@@ -1449,6 +1468,17 @@ export default class Element
1449
1468
  }
1450
1469
 
1451
1470
  super[PropertySymbol.connectedToDocument]();
1471
+
1472
+ this[PropertySymbol.window][PropertySymbol.customElementReactionStack].enqueueReaction(
1473
+ this,
1474
+ 'connectedCallback'
1475
+ );
1476
+
1477
+ if (this[PropertySymbol.shadowRoot]) {
1478
+ for (const childNode of this[PropertySymbol.nodeArray]) {
1479
+ this.#onSlotChange(childNode);
1480
+ }
1481
+ }
1452
1482
  }
1453
1483
 
1454
1484
  /**
@@ -1461,6 +1491,11 @@ export default class Element
1461
1491
  if (id) {
1462
1492
  this.#removeIdentifierFromWindow(id);
1463
1493
  }
1494
+
1495
+ this[PropertySymbol.window][PropertySymbol.customElementReactionStack].enqueueReaction(
1496
+ this,
1497
+ 'disconnectedCallback'
1498
+ );
1464
1499
  }
1465
1500
 
1466
1501
  /**
@@ -1563,7 +1598,7 @@ export default class Element
1563
1598
  #onSlotChange(addedOrRemovedNode: Node): void {
1564
1599
  const shadowRoot = this[PropertySymbol.shadowRoot];
1565
1600
 
1566
- if (!shadowRoot) {
1601
+ if (!shadowRoot || !this[PropertySymbol.isConnected]) {
1567
1602
  return;
1568
1603
  }
1569
1604
 
@@ -498,25 +498,6 @@ export default class HTMLElement extends Element {
498
498
  this.setAttribute('popover', value);
499
499
  }
500
500
 
501
- /**
502
- * Connected callback.
503
- */
504
- public connectedCallback?(): void;
505
-
506
- /**
507
- * Disconnected callback.
508
- */
509
- public disconnectedCallback?(): void;
510
-
511
- /**
512
- * Attribute changed callback.
513
- *
514
- * @param name Name.
515
- * @param oldValue Old value.
516
- * @param newValue New value.
517
- */
518
- public attributeChangedCallback?(name: string, oldValue: string, newValue: string): void;
519
-
520
501
  /**
521
502
  * Triggers a click event.
522
503
  */
@@ -612,30 +593,6 @@ export default class HTMLElement extends Element {
612
593
  super[PropertySymbol.disconnectedFromNode]();
613
594
  }
614
595
 
615
- /**
616
- * @override
617
- */
618
- public override [PropertySymbol.connectedToDocument](): void {
619
- super[PropertySymbol.connectedToDocument]();
620
-
621
- this[PropertySymbol.window][PropertySymbol.customElementReactionStack].enqueueReaction(
622
- this,
623
- 'connectedCallback'
624
- );
625
- }
626
-
627
- /**
628
- * @override
629
- */
630
- public override [PropertySymbol.disconnectedFromDocument](): void {
631
- super[PropertySymbol.disconnectedFromDocument]();
632
-
633
- this[PropertySymbol.window][PropertySymbol.customElementReactionStack].enqueueReaction(
634
- this,
635
- 'disconnectedCallback'
636
- );
637
- }
638
-
639
596
  /**
640
597
  * @override
641
598
  */