happy-dom 13.0.0 → 13.0.1

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 (192) hide show
  1. package/cjs/PropertySymbol.cjs +4 -1
  2. package/cjs/PropertySymbol.cjs.map +1 -1
  3. package/cjs/PropertySymbol.d.ts +3 -0
  4. package/cjs/PropertySymbol.d.ts.map +1 -1
  5. package/cjs/browser/Browser.cjs +2 -3
  6. package/cjs/browser/Browser.cjs.map +1 -1
  7. package/cjs/browser/Browser.d.ts +1 -3
  8. package/cjs/browser/Browser.d.ts.map +1 -1
  9. package/cjs/browser/BrowserContext.cjs +1 -3
  10. package/cjs/browser/BrowserContext.cjs.map +1 -1
  11. package/cjs/browser/BrowserContext.d.ts +1 -3
  12. package/cjs/browser/BrowserContext.d.ts.map +1 -1
  13. package/cjs/browser/BrowserFrame.cjs +5 -3
  14. package/cjs/browser/BrowserFrame.cjs.map +1 -1
  15. package/cjs/browser/BrowserFrame.d.ts +5 -1
  16. package/cjs/browser/BrowserFrame.d.ts.map +1 -1
  17. package/cjs/browser/BrowserPage.cjs +10 -1
  18. package/cjs/browser/BrowserPage.cjs.map +1 -1
  19. package/cjs/browser/BrowserPage.d.ts +4 -2
  20. package/cjs/browser/BrowserPage.d.ts.map +1 -1
  21. package/cjs/browser/DefaultBrowserPageViewport.cjs +8 -0
  22. package/cjs/browser/DefaultBrowserPageViewport.cjs.map +1 -0
  23. package/cjs/browser/DefaultBrowserPageViewport.d.ts +4 -0
  24. package/cjs/browser/DefaultBrowserPageViewport.d.ts.map +1 -0
  25. package/cjs/browser/detached-browser/DetachedBrowser.cjs +2 -3
  26. package/cjs/browser/detached-browser/DetachedBrowser.cjs.map +1 -1
  27. package/cjs/browser/detached-browser/DetachedBrowser.d.ts +1 -3
  28. package/cjs/browser/detached-browser/DetachedBrowser.d.ts.map +1 -1
  29. package/cjs/browser/detached-browser/DetachedBrowserContext.cjs +1 -2
  30. package/cjs/browser/detached-browser/DetachedBrowserContext.cjs.map +1 -1
  31. package/cjs/browser/detached-browser/DetachedBrowserContext.d.ts +1 -2
  32. package/cjs/browser/detached-browser/DetachedBrowserContext.d.ts.map +1 -1
  33. package/cjs/browser/detached-browser/DetachedBrowserFrame.cjs +5 -3
  34. package/cjs/browser/detached-browser/DetachedBrowserFrame.cjs.map +1 -1
  35. package/cjs/browser/detached-browser/DetachedBrowserFrame.d.ts +4 -1
  36. package/cjs/browser/detached-browser/DetachedBrowserFrame.d.ts.map +1 -1
  37. package/cjs/browser/detached-browser/DetachedBrowserPage.cjs +10 -1
  38. package/cjs/browser/detached-browser/DetachedBrowserPage.cjs.map +1 -1
  39. package/cjs/browser/detached-browser/DetachedBrowserPage.d.ts +4 -2
  40. package/cjs/browser/detached-browser/DetachedBrowserPage.d.ts.map +1 -1
  41. package/cjs/browser/types/IBrowser.d.ts +1 -3
  42. package/cjs/browser/types/IBrowser.d.ts.map +1 -1
  43. package/cjs/browser/types/IBrowserContext.d.ts +1 -3
  44. package/cjs/browser/types/IBrowserContext.d.ts.map +1 -1
  45. package/cjs/browser/types/IBrowserFrame.d.ts +4 -1
  46. package/cjs/browser/types/IBrowserFrame.d.ts.map +1 -1
  47. package/cjs/browser/types/IBrowserPage.d.ts +4 -2
  48. package/cjs/browser/types/IBrowserPage.d.ts.map +1 -1
  49. package/cjs/browser/types/IBrowserPageViewport.d.ts +3 -3
  50. package/cjs/browser/types/IBrowserPageViewport.d.ts.map +1 -1
  51. package/cjs/browser/types/IOptionalBrowserPageViewport.cjs +3 -0
  52. package/cjs/browser/types/IOptionalBrowserPageViewport.cjs.map +1 -0
  53. package/cjs/browser/types/IOptionalBrowserPageViewport.d.ts +6 -0
  54. package/cjs/browser/types/IOptionalBrowserPageViewport.d.ts.map +1 -0
  55. package/cjs/browser/utilities/BrowserFrameFactory.cjs +2 -1
  56. package/cjs/browser/utilities/BrowserFrameFactory.cjs.map +1 -1
  57. package/cjs/browser/utilities/BrowserFrameFactory.d.ts.map +1 -1
  58. package/cjs/browser/utilities/BrowserFrameValidator.cjs +28 -4
  59. package/cjs/browser/utilities/BrowserFrameValidator.cjs.map +1 -1
  60. package/cjs/browser/utilities/BrowserFrameValidator.d.ts.map +1 -1
  61. package/cjs/browser/utilities/BrowserPageUtility.cjs +0 -24
  62. package/cjs/browser/utilities/BrowserPageUtility.cjs.map +1 -1
  63. package/cjs/browser/utilities/BrowserPageUtility.d.ts +0 -8
  64. package/cjs/browser/utilities/BrowserPageUtility.d.ts.map +1 -1
  65. package/cjs/index.cjs.map +1 -1
  66. package/cjs/index.d.ts +2 -1
  67. package/cjs/index.d.ts.map +1 -1
  68. package/cjs/version.cjs +1 -1
  69. package/cjs/window/BrowserWindow.cjs +147 -22
  70. package/cjs/window/BrowserWindow.cjs.map +1 -1
  71. package/cjs/window/BrowserWindow.d.ts +80 -10
  72. package/cjs/window/BrowserWindow.d.ts.map +1 -1
  73. package/cjs/window/DetachedWindowAPI.cjs.map +1 -1
  74. package/cjs/window/DetachedWindowAPI.d.ts +2 -2
  75. package/cjs/window/DetachedWindowAPI.d.ts.map +1 -1
  76. package/cjs/window/IBrowserWindow.d.ts +16 -5
  77. package/cjs/window/IBrowserWindow.d.ts.map +1 -1
  78. package/cjs/window/Window.cjs +9 -4
  79. package/cjs/window/Window.cjs.map +1 -1
  80. package/cjs/window/Window.d.ts.map +1 -1
  81. package/cjs/window/WindowPageOpenUtility.cjs +30 -3
  82. package/cjs/window/WindowPageOpenUtility.cjs.map +1 -1
  83. package/cjs/window/WindowPageOpenUtility.d.ts.map +1 -1
  84. package/lib/PropertySymbol.d.ts +3 -0
  85. package/lib/PropertySymbol.d.ts.map +1 -1
  86. package/lib/PropertySymbol.js +3 -0
  87. package/lib/PropertySymbol.js.map +1 -1
  88. package/lib/browser/Browser.d.ts +1 -3
  89. package/lib/browser/Browser.d.ts.map +1 -1
  90. package/lib/browser/Browser.js +2 -3
  91. package/lib/browser/Browser.js.map +1 -1
  92. package/lib/browser/BrowserContext.d.ts +1 -3
  93. package/lib/browser/BrowserContext.d.ts.map +1 -1
  94. package/lib/browser/BrowserContext.js +1 -3
  95. package/lib/browser/BrowserContext.js.map +1 -1
  96. package/lib/browser/BrowserFrame.d.ts +5 -1
  97. package/lib/browser/BrowserFrame.d.ts.map +1 -1
  98. package/lib/browser/BrowserFrame.js +5 -3
  99. package/lib/browser/BrowserFrame.js.map +1 -1
  100. package/lib/browser/BrowserPage.d.ts +4 -2
  101. package/lib/browser/BrowserPage.d.ts.map +1 -1
  102. package/lib/browser/BrowserPage.js +10 -1
  103. package/lib/browser/BrowserPage.js.map +1 -1
  104. package/lib/browser/DefaultBrowserPageViewport.d.ts +4 -0
  105. package/lib/browser/DefaultBrowserPageViewport.d.ts.map +1 -0
  106. package/lib/browser/DefaultBrowserPageViewport.js +6 -0
  107. package/lib/browser/DefaultBrowserPageViewport.js.map +1 -0
  108. package/lib/browser/detached-browser/DetachedBrowser.d.ts +1 -3
  109. package/lib/browser/detached-browser/DetachedBrowser.d.ts.map +1 -1
  110. package/lib/browser/detached-browser/DetachedBrowser.js +2 -3
  111. package/lib/browser/detached-browser/DetachedBrowser.js.map +1 -1
  112. package/lib/browser/detached-browser/DetachedBrowserContext.d.ts +1 -2
  113. package/lib/browser/detached-browser/DetachedBrowserContext.d.ts.map +1 -1
  114. package/lib/browser/detached-browser/DetachedBrowserContext.js +1 -2
  115. package/lib/browser/detached-browser/DetachedBrowserContext.js.map +1 -1
  116. package/lib/browser/detached-browser/DetachedBrowserFrame.d.ts +4 -1
  117. package/lib/browser/detached-browser/DetachedBrowserFrame.d.ts.map +1 -1
  118. package/lib/browser/detached-browser/DetachedBrowserFrame.js +5 -3
  119. package/lib/browser/detached-browser/DetachedBrowserFrame.js.map +1 -1
  120. package/lib/browser/detached-browser/DetachedBrowserPage.d.ts +4 -2
  121. package/lib/browser/detached-browser/DetachedBrowserPage.d.ts.map +1 -1
  122. package/lib/browser/detached-browser/DetachedBrowserPage.js +10 -1
  123. package/lib/browser/detached-browser/DetachedBrowserPage.js.map +1 -1
  124. package/lib/browser/types/IBrowser.d.ts +1 -3
  125. package/lib/browser/types/IBrowser.d.ts.map +1 -1
  126. package/lib/browser/types/IBrowserContext.d.ts +1 -3
  127. package/lib/browser/types/IBrowserContext.d.ts.map +1 -1
  128. package/lib/browser/types/IBrowserFrame.d.ts +4 -1
  129. package/lib/browser/types/IBrowserFrame.d.ts.map +1 -1
  130. package/lib/browser/types/IBrowserPage.d.ts +4 -2
  131. package/lib/browser/types/IBrowserPage.d.ts.map +1 -1
  132. package/lib/browser/types/IBrowserPageViewport.d.ts +3 -3
  133. package/lib/browser/types/IBrowserPageViewport.d.ts.map +1 -1
  134. package/lib/browser/types/IOptionalBrowserPageViewport.d.ts +6 -0
  135. package/lib/browser/types/IOptionalBrowserPageViewport.d.ts.map +1 -0
  136. package/lib/browser/types/IOptionalBrowserPageViewport.js +2 -0
  137. package/lib/browser/types/IOptionalBrowserPageViewport.js.map +1 -0
  138. package/lib/browser/utilities/BrowserFrameFactory.d.ts.map +1 -1
  139. package/lib/browser/utilities/BrowserFrameFactory.js +2 -1
  140. package/lib/browser/utilities/BrowserFrameFactory.js.map +1 -1
  141. package/lib/browser/utilities/BrowserFrameValidator.d.ts.map +1 -1
  142. package/lib/browser/utilities/BrowserFrameValidator.js +5 -4
  143. package/lib/browser/utilities/BrowserFrameValidator.js.map +1 -1
  144. package/lib/browser/utilities/BrowserPageUtility.d.ts +0 -8
  145. package/lib/browser/utilities/BrowserPageUtility.d.ts.map +1 -1
  146. package/lib/browser/utilities/BrowserPageUtility.js +0 -24
  147. package/lib/browser/utilities/BrowserPageUtility.js.map +1 -1
  148. package/lib/index.d.ts +2 -1
  149. package/lib/index.d.ts.map +1 -1
  150. package/lib/index.js.map +1 -1
  151. package/lib/version.js +1 -1
  152. package/lib/window/BrowserWindow.d.ts +80 -10
  153. package/lib/window/BrowserWindow.d.ts.map +1 -1
  154. package/lib/window/BrowserWindow.js +147 -22
  155. package/lib/window/BrowserWindow.js.map +1 -1
  156. package/lib/window/DetachedWindowAPI.d.ts +2 -2
  157. package/lib/window/DetachedWindowAPI.d.ts.map +1 -1
  158. package/lib/window/DetachedWindowAPI.js.map +1 -1
  159. package/lib/window/IBrowserWindow.d.ts +16 -5
  160. package/lib/window/IBrowserWindow.d.ts.map +1 -1
  161. package/lib/window/Window.d.ts.map +1 -1
  162. package/lib/window/Window.js +9 -4
  163. package/lib/window/Window.js.map +1 -1
  164. package/lib/window/WindowPageOpenUtility.d.ts.map +1 -1
  165. package/lib/window/WindowPageOpenUtility.js +7 -3
  166. package/lib/window/WindowPageOpenUtility.js.map +1 -1
  167. package/package.json +1 -1
  168. package/src/PropertySymbol.ts +3 -0
  169. package/src/browser/Browser.ts +2 -4
  170. package/src/browser/BrowserContext.ts +1 -4
  171. package/src/browser/BrowserFrame.ts +5 -1
  172. package/src/browser/BrowserPage.ts +15 -3
  173. package/src/browser/DefaultBrowserPageViewport.ts +7 -0
  174. package/src/browser/detached-browser/DetachedBrowser.ts +2 -4
  175. package/src/browser/detached-browser/DetachedBrowserContext.ts +1 -3
  176. package/src/browser/detached-browser/DetachedBrowserFrame.ts +4 -1
  177. package/src/browser/detached-browser/DetachedBrowserPage.ts +15 -3
  178. package/src/browser/types/IBrowser.ts +1 -3
  179. package/src/browser/types/IBrowserContext.ts +1 -3
  180. package/src/browser/types/IBrowserFrame.ts +4 -1
  181. package/src/browser/types/IBrowserPage.ts +4 -2
  182. package/src/browser/types/IBrowserPageViewport.ts +3 -3
  183. package/src/browser/types/IOptionalBrowserPageViewport.ts +5 -0
  184. package/src/browser/utilities/BrowserFrameFactory.ts +2 -1
  185. package/src/browser/utilities/BrowserFrameValidator.ts +5 -5
  186. package/src/browser/utilities/BrowserPageUtility.ts +0 -31
  187. package/src/index.ts +2 -0
  188. package/src/window/BrowserWindow.ts +165 -26
  189. package/src/window/DetachedWindowAPI.ts +2 -2
  190. package/src/window/IBrowserWindow.ts +18 -5
  191. package/src/window/Window.ts +10 -4
  192. package/src/window/WindowPageOpenUtility.ts +8 -3
@@ -1,5 +1,4 @@
1
1
  import VirtualConsolePrinter from '../../console/VirtualConsolePrinter.js';
2
- import IBrowserPageViewport from '../types/IBrowserPageViewport.js';
3
2
  import DetachedBrowserFrame from './DetachedBrowserFrame.js';
4
3
  import DetachedBrowserContext from './DetachedBrowserContext.js';
5
4
  import VirtualConsole from '../../console/VirtualConsole.js';
@@ -9,6 +8,10 @@ import IGoToOptions from '../types/IGoToOptions.js';
9
8
  import IResponse from '../../fetch/types/IResponse.js';
10
9
  import BrowserPageUtility from '../utilities/BrowserPageUtility.js';
11
10
  import IReloadOptions from '../types/IReloadOptions.js';
11
+ import DefaultBrowserPageViewport from '../DefaultBrowserPageViewport.js';
12
+ import IOptionalBrowserPageViewport from '../types/IOptionalBrowserPageViewport.js';
13
+ import IBrowserPageViewport from '../types/IBrowserPageViewport.js';
14
+ import Event from '../../event/Event.js';
12
15
 
13
16
  /**
14
17
  * Detached browser page used when constructing a Window instance without a browser.
@@ -18,6 +21,7 @@ export default class DetachedBrowserPage implements IBrowserPage {
18
21
  public readonly mainFrame: DetachedBrowserFrame;
19
22
  public readonly context: DetachedBrowserContext;
20
23
  public readonly console: Console;
24
+ public readonly viewport: IBrowserPageViewport = Object.assign({}, DefaultBrowserPageViewport);
21
25
 
22
26
  /**
23
27
  * Constructor.
@@ -126,8 +130,16 @@ export default class DetachedBrowserPage implements IBrowserPage {
126
130
  *
127
131
  * @param viewport Viewport.
128
132
  */
129
- public setViewport(viewport: IBrowserPageViewport): void {
130
- BrowserPageUtility.setViewport(this, viewport);
133
+ public setViewport(viewport: IOptionalBrowserPageViewport): void {
134
+ const previousViewport = Object.assign({}, this.viewport);
135
+ Object.assign(this.viewport, viewport);
136
+ if (
137
+ previousViewport.width !== this.viewport.width ||
138
+ previousViewport.height !== this.viewport.height ||
139
+ previousViewport.devicePixelRatio !== this.viewport.devicePixelRatio
140
+ ) {
141
+ this.mainFrame.window.dispatchEvent(new Event('resize'));
142
+ }
131
143
  }
132
144
 
133
145
  /**
@@ -1,5 +1,4 @@
1
1
  import IBrowserContext from './IBrowserContext.js';
2
- import IBrowserFrame from './IBrowserFrame.js';
3
2
  import IBrowserPage from './IBrowserPage.js';
4
3
  import IBrowserSettings from './IBrowserSettings.js';
5
4
 
@@ -41,8 +40,7 @@ export default interface IBrowser {
41
40
  /**
42
41
  * Creates a new page.
43
42
  *
44
- * @param [opener] Opener.
45
43
  * @returns Page.
46
44
  */
47
- newPage(opener?: IBrowserFrame): IBrowserPage;
45
+ newPage(): IBrowserPage;
48
46
  }
@@ -1,7 +1,6 @@
1
1
  import ICookieContainer from '../../cookie/types/ICookieContainer.js';
2
2
  import IResponseCache from '../../fetch/cache/response/IResponseCache.js';
3
3
  import IBrowser from './IBrowser.js';
4
- import IBrowserFrame from './IBrowserFrame.js';
5
4
  import IBrowserPage from './IBrowserPage.js';
6
5
  import IPreflightResponseCache from '../../fetch/cache/preflight/IPreflightResponseCache.js';
7
6
 
@@ -35,8 +34,7 @@ export default interface IBrowserContext {
35
34
  /**
36
35
  * Creates a new page.
37
36
  *
38
- * @param [opener] Opener.
39
37
  * @returns Page.
40
38
  */
41
- newPage(opener?: IBrowserFrame): IBrowserPage;
39
+ newPage(): IBrowserPage;
42
40
  }
@@ -8,6 +8,7 @@ import IGoToOptions from './IGoToOptions.js';
8
8
  import { Script } from 'vm';
9
9
  import IReloadOptions from './IReloadOptions.js';
10
10
  import BrowserFrameExceptionObserver from '../utilities/BrowserFrameExceptionObserver.js';
11
+ import ICrossOriginBrowserWindow from '../../window/ICrossOriginBrowserWindow.js';
11
12
 
12
13
  /**
13
14
  * Browser frame.
@@ -15,7 +16,6 @@ import BrowserFrameExceptionObserver from '../utilities/BrowserFrameExceptionObs
15
16
  export default interface IBrowserFrame {
16
17
  readonly childFrames: IBrowserFrame[];
17
18
  readonly parentFrame: IBrowserFrame | null;
18
- readonly opener: IBrowserFrame | null;
19
19
  readonly page: IBrowserPage;
20
20
  readonly window: IBrowserWindow;
21
21
  readonly document: IDocument;
@@ -24,6 +24,9 @@ export default interface IBrowserFrame {
24
24
  [PropertySymbol.asyncTaskManager]: AsyncTaskManager;
25
25
  [PropertySymbol.exceptionObserver]: BrowserFrameExceptionObserver | null;
26
26
  [PropertySymbol.listeners]: { navigation: Array<() => void> };
27
+ [PropertySymbol.openerFrame]: IBrowserFrame | null;
28
+ [PropertySymbol.openerWindow]: IBrowserWindow | ICrossOriginBrowserWindow | null;
29
+ [PropertySymbol.popup]: boolean;
27
30
 
28
31
  /**
29
32
  * Returns a promise that is resolved when all resources has been loaded, fetch has completed, and all async tasks such as timers are complete.
@@ -1,4 +1,4 @@
1
- import IBrowserPageViewport from './IBrowserPageViewport.js';
1
+ import IBrowserPageViewport from '../types/IBrowserPageViewport.js';
2
2
  import VirtualConsolePrinter from '../../console/VirtualConsolePrinter.js';
3
3
  import IBrowserFrame from './IBrowserFrame.js';
4
4
  import IBrowserContext from './IBrowserContext.js';
@@ -6,6 +6,7 @@ import { Script } from 'vm';
6
6
  import IGoToOptions from './IGoToOptions.js';
7
7
  import IResponse from '../../fetch/types/IResponse.js';
8
8
  import IReloadOptions from './IReloadOptions.js';
9
+ import IOptionalBrowserPageViewport from './IOptionalBrowserPageViewport.js';
9
10
 
10
11
  /**
11
12
  * Browser page.
@@ -16,6 +17,7 @@ export default interface IBrowserPage {
16
17
  readonly context: IBrowserContext;
17
18
  readonly console: Console;
18
19
  readonly frames: IBrowserFrame[];
20
+ readonly viewport: IBrowserPageViewport;
19
21
  content: string;
20
22
  url: string;
21
23
 
@@ -49,7 +51,7 @@ export default interface IBrowserPage {
49
51
  *
50
52
  * @param viewport Viewport.
51
53
  */
52
- setViewport(viewport: IBrowserPageViewport): void;
54
+ setViewport(viewport: IOptionalBrowserPageViewport): void;
53
55
 
54
56
  /**
55
57
  * Go to a page.
@@ -1,5 +1,5 @@
1
1
  export default interface IBrowserPageViewport {
2
- width?: number;
3
- height?: number;
4
- devicePixelRatio?: number;
2
+ width: number;
3
+ height: number;
4
+ devicePixelRatio: number;
5
5
  }
@@ -0,0 +1,5 @@
1
+ export default interface IOptionalBrowserPageViewport {
2
+ width?: number;
3
+ height?: number;
4
+ devicePixelRatio?: number;
5
+ }
@@ -45,7 +45,8 @@ export default class BrowserFrameFactory {
45
45
  frame.window[PropertySymbol.destroy]();
46
46
  (<IBrowserPage | null>frame.page) = null;
47
47
  (<IBrowserWindow | null>frame.window) = null;
48
- (<IBrowserFrame | null>frame.opener) = null;
48
+ frame[PropertySymbol.openerFrame] = null;
49
+ frame[PropertySymbol.openerWindow] = null;
49
50
 
50
51
  if (!frame.childFrames.length) {
51
52
  return frame[PropertySymbol.asyncTaskManager]
@@ -2,6 +2,7 @@ import IBrowserFrame from '../types/IBrowserFrame.js';
2
2
  import { URL } from 'url';
3
3
  import BrowserNavigationCrossOriginPolicyEnum from '../enums/BrowserNavigationCrossOriginPolicyEnum.js';
4
4
  import DetachedBrowserFrame from '../detached-browser/DetachedBrowserFrame.js';
5
+ import * as PropertySymbol from '../../PropertySymbol.js';
5
6
 
6
7
  /**
7
8
  * Browser frame validator.
@@ -18,10 +19,9 @@ export default class BrowserFrameValidator {
18
19
  const settings = frame.page.context.browser.settings;
19
20
  let fromURL = frame.page.mainFrame.window.location;
20
21
 
21
- if (frame.opener) {
22
- fromURL = frame.opener.window.location;
23
- }
24
- if (frame.parentFrame) {
22
+ if (frame[PropertySymbol.openerFrame]) {
23
+ fromURL = frame[PropertySymbol.openerFrame].window.location;
24
+ } else if (frame.parentFrame) {
25
25
  fromURL = frame.parentFrame.window.location;
26
26
  }
27
27
 
@@ -74,7 +74,7 @@ export default class BrowserFrameValidator {
74
74
  return false;
75
75
  }
76
76
 
77
- if (settings.navigation.disableChildPageNavigation && !!frame.opener) {
77
+ if (settings.navigation.disableChildPageNavigation && !!frame[PropertySymbol.openerFrame]) {
78
78
  return false;
79
79
  }
80
80
 
@@ -1,7 +1,5 @@
1
1
  import IBrowserFrame from '../types/IBrowserFrame.js';
2
2
  import IBrowserPage from '../types/IBrowserPage.js';
3
- import IBrowserPageViewport from '../types/IBrowserPageViewport.js';
4
- import Event from '../../event/Event.js';
5
3
  import IVirtualConsolePrinter from '../../console/types/IVirtualConsolePrinter.js';
6
4
  import IBrowserContext from '../types/IBrowserContext.js';
7
5
  import BrowserFrameFactory from './BrowserFrameFactory.js';
@@ -20,35 +18,6 @@ export default class BrowserPageUtility {
20
18
  return this.findFrames(page.mainFrame);
21
19
  }
22
20
 
23
- /**
24
- * Sets the viewport.
25
- *
26
- * @param page Page.
27
- * @param viewport Viewport.
28
- */
29
- public static setViewport(page: IBrowserPage, viewport: IBrowserPageViewport): void {
30
- if (
31
- (viewport.width !== undefined && page.mainFrame.window.innerWidth !== viewport.width) ||
32
- (viewport.height !== undefined && page.mainFrame.window.innerHeight !== viewport.height)
33
- ) {
34
- if (viewport.width !== undefined && page.mainFrame.window.innerWidth !== viewport.width) {
35
- (<number>page.mainFrame.window.innerWidth) = viewport.width;
36
- (<number>page.mainFrame.window.outerWidth) = viewport.width;
37
- }
38
-
39
- if (viewport.height !== undefined && page.mainFrame.window.innerHeight !== viewport.height) {
40
- (<number>page.mainFrame.window.innerHeight) = viewport.height;
41
- (<number>page.mainFrame.window.outerHeight) = viewport.height;
42
- }
43
-
44
- page.mainFrame.window.dispatchEvent(new Event('resize'));
45
- }
46
-
47
- if (viewport.devicePixelRatio !== undefined) {
48
- (<number>page.mainFrame.window.devicePixelRatio) = viewport.devicePixelRatio;
49
- }
50
- }
51
-
52
21
  /**
53
22
  * Aborts all ongoing operations and destroys the page.
54
23
  *
package/src/index.ts CHANGED
@@ -172,6 +172,7 @@ import type IBrowser from './browser/types/IBrowser.js';
172
172
  import type IBrowserContext from './browser/types/IBrowserContext.js';
173
173
  import type IBrowserFrame from './browser/types/IBrowserFrame.js';
174
174
  import type IBrowserPage from './browser/types/IBrowserPage.js';
175
+ import type ICrossOriginBrowserWindow from './window/ICrossOriginBrowserWindow.js';
175
176
 
176
177
  export type {
177
178
  IAnimationEventInit,
@@ -181,6 +182,7 @@ export type {
181
182
  IBrowserContext,
182
183
  IBrowserFrame,
183
184
  IBrowserPage,
185
+ ICrossOriginBrowserWindow,
184
186
  IClipboardEventInit,
185
187
  IComment,
186
188
  ICustomEventInit,
@@ -405,21 +405,15 @@ export default class BrowserWindow extends EventTarget implements IBrowserWindow
405
405
  public readonly history: History;
406
406
  public readonly navigator: Navigator;
407
407
  public readonly console: Console;
408
- public readonly opener: IBrowserWindow | null = null;
409
408
  public readonly self: IBrowserWindow = this;
410
409
  public readonly top: IBrowserWindow = this;
411
410
  public readonly parent: IBrowserWindow = this;
412
411
  public readonly window: IBrowserWindow = this;
413
412
  public readonly globalThis: IBrowserWindow = this;
414
413
  public readonly screen: Screen;
415
- public readonly devicePixelRatio = 1;
416
414
  public readonly sessionStorage: Storage;
417
415
  public readonly localStorage: Storage;
418
416
  public readonly performance = PerfHooks.performance;
419
- public readonly innerWidth: number = 1024;
420
- public readonly innerHeight: number = 768;
421
- public readonly outerWidth: number = 1024;
422
- public readonly outerHeight: number = 768;
423
417
  public readonly screenLeft: number = 0;
424
418
  public readonly screenTop: number = 0;
425
419
  public readonly screenX: number = 0;
@@ -504,6 +498,11 @@ export default class BrowserWindow extends EventTarget implements IBrowserWindow
504
498
  #clearInterval: (id: NodeJS.Timeout) => void;
505
499
  #queueMicrotask: (callback: Function) => void;
506
500
  #browserFrame: IBrowserFrame;
501
+ #innerWidth: number | null = null;
502
+ #innerHeight: number | null = null;
503
+ #outerWidth: number | null = null;
504
+ #outerHeight: number | null = null;
505
+ #devicePixelRatio: number | null = null;
507
506
 
508
507
  /**
509
508
  * Constructor.
@@ -511,13 +510,8 @@ export default class BrowserWindow extends EventTarget implements IBrowserWindow
511
510
  * @param browserFrame Browser frame.
512
511
  * @param [options] Options.
513
512
  * @param [options.url] URL.
514
- * @param [options.width] Window width. Defaults to "1024".
515
- * @param [options.height] Window height. Defaults to "768".
516
513
  */
517
- constructor(
518
- browserFrame: IBrowserFrame,
519
- options?: { url?: string; width?: number; height?: number }
520
- ) {
514
+ constructor(browserFrame: IBrowserFrame, options?: { url?: string }) {
521
515
  super();
522
516
 
523
517
  this.#browserFrame = browserFrame;
@@ -538,20 +532,6 @@ export default class BrowserWindow extends EventTarget implements IBrowserWindow
538
532
 
539
533
  WindowBrowserSettingsReader.setSettings(this, this.#browserFrame.page.context.browser.settings);
540
534
 
541
- if (options) {
542
- if (options.width !== undefined) {
543
- if (options.width !== undefined && this.innerWidth !== options.width) {
544
- (<number>this.innerWidth) = options.width;
545
- (<number>this.outerWidth) = options.width;
546
- }
547
- }
548
-
549
- if (options.height !== undefined && this.innerHeight !== options.height) {
550
- (<number>this.innerHeight) = options.height;
551
- (<number>this.outerHeight) = options.height;
552
- }
553
- }
554
-
555
535
  // Binds all methods to "this", so that it will use the correct context when called globally.
556
536
  for (const key of Object.getOwnPropertyNames(BrowserWindow.prototype).concat(
557
537
  Object.getOwnPropertyNames(EventTarget.prototype)
@@ -684,6 +664,15 @@ export default class BrowserWindow extends EventTarget implements IBrowserWindow
684
664
  });
685
665
  }
686
666
 
667
+ /**
668
+ * Returns opener.
669
+ *
670
+ * @returns Opener.
671
+ */
672
+ public get opener(): IBrowserWindow | ICrossOriginBrowserWindow | null {
673
+ return this.#browserFrame[PropertySymbol.openerWindow];
674
+ }
675
+
687
676
  /**
688
677
  * The number of pixels that the document is currently scrolled horizontally.
689
678
  *
@@ -729,6 +718,114 @@ export default class BrowserWindow extends EventTarget implements IBrowserWindow
729
718
  return new CSS();
730
719
  }
731
720
 
721
+ /**
722
+ * Returns inner width.
723
+ *
724
+ * @returns Inner width.
725
+ */
726
+ public get innerWidth(): number {
727
+ if (this.#innerWidth === null) {
728
+ return this.#browserFrame.page.viewport.width;
729
+ }
730
+ return this.#innerWidth;
731
+ }
732
+
733
+ /**
734
+ * Sets inner width.
735
+ *
736
+ * @param value Inner width.
737
+ */
738
+ public set innerWidth(value: number) {
739
+ this.#innerWidth = value;
740
+ }
741
+
742
+ /**
743
+ * Returns inner height.
744
+ *
745
+ * @returns Inner height.
746
+ */
747
+ public get innerHeight(): number {
748
+ // It seems like this value can be defined according to spec, but changing it has no effect on the actual viewport.
749
+ if (this.#innerHeight === null) {
750
+ return this.#browserFrame.page.viewport.height;
751
+ }
752
+ return this.#innerHeight;
753
+ }
754
+
755
+ /**
756
+ * Sets inner height.
757
+ *
758
+ * @param value Inner height.
759
+ */
760
+ public set innerHeight(value: number) {
761
+ this.#innerHeight = value;
762
+ }
763
+
764
+ /**
765
+ * Returns outer width.
766
+ *
767
+ * @returns Outer width.
768
+ */
769
+ public get outerWidth(): number {
770
+ // It seems like this value can be defined according to spec, but changing it has no effect on the actual viewport.
771
+ if (this.#outerWidth === null) {
772
+ return this.#browserFrame.page.viewport.width;
773
+ }
774
+ return this.#outerWidth;
775
+ }
776
+
777
+ /**
778
+ * Sets outer width.
779
+ *
780
+ * @param value Outer width.
781
+ */
782
+ public set outerWidth(value: number) {
783
+ this.#outerWidth = value;
784
+ }
785
+
786
+ /**
787
+ * Returns outer height.
788
+ *
789
+ * @returns Outer height.
790
+ */
791
+ public get outerHeight(): number {
792
+ if (this.#outerHeight === null) {
793
+ return this.#browserFrame.page.viewport.height;
794
+ }
795
+ return this.#outerHeight;
796
+ }
797
+
798
+ /**
799
+ * Sets outer height.
800
+ *
801
+ * @param value Outer height.
802
+ */
803
+ public set outerHeight(value: number) {
804
+ this.#outerHeight = value;
805
+ }
806
+
807
+ /**
808
+ * Returns device pixel ratio.
809
+ *
810
+ * @returns Device pixel ratio.
811
+ */
812
+ public get devicePixelRatio(): number {
813
+ // It seems like this value can be defined according to spec, but changing it has no effect on the actual viewport.
814
+ if (this.#devicePixelRatio === null) {
815
+ return this.#browserFrame.page.viewport.devicePixelRatio;
816
+ }
817
+ return this.#devicePixelRatio;
818
+ }
819
+
820
+ /**
821
+ * Sets device pixel ratio.
822
+ *
823
+ * @param value Device pixel ratio.
824
+ */
825
+ public set devicePixelRatio(value: number) {
826
+ this.#devicePixelRatio = value;
827
+ }
828
+
732
829
  /**
733
830
  * Returns an object containing the values of all CSS properties of an element.
734
831
  *
@@ -1067,6 +1164,48 @@ export default class BrowserWindow extends EventTarget implements IBrowserWindow
1067
1164
  );
1068
1165
  }
1069
1166
 
1167
+ /**
1168
+ * Resizes the window.
1169
+ *
1170
+ * @param width Width.
1171
+ * @param height Height.
1172
+ */
1173
+ public resizeTo(width: number, height: number): void {
1174
+ if (!width || !height) {
1175
+ throw new DOMException(
1176
+ `Failed to execute 'resizeTo' on 'Window': 2 arguments required, but only ${arguments.length} present.`
1177
+ );
1178
+ }
1179
+
1180
+ // We can only resize the window if it is a popup.
1181
+ if (this.#browserFrame[PropertySymbol.popup]) {
1182
+ this.#browserFrame.page.setViewport({ width, height });
1183
+ }
1184
+ }
1185
+
1186
+ /**
1187
+ * Resizes the current window by a specified amount.
1188
+ *
1189
+ * @param width Width.
1190
+ * @param height Height.
1191
+ */
1192
+ public resizeBy(width: number, height: number): void {
1193
+ if (!width || !height) {
1194
+ throw new DOMException(
1195
+ `Failed to execute 'resizeBy' on 'Window': 2 arguments required, but only ${arguments.length} present.`
1196
+ );
1197
+ }
1198
+
1199
+ // We can only resize the window if it is a popup.
1200
+ if (this.#browserFrame[PropertySymbol.popup]) {
1201
+ const viewport = this.#browserFrame.page.viewport;
1202
+ this.#browserFrame.page.setViewport({
1203
+ width: viewport.width + width,
1204
+ height: viewport.height + height
1205
+ });
1206
+ }
1207
+ }
1208
+
1070
1209
  /**
1071
1210
  * Setup of VM context.
1072
1211
  */
@@ -1,5 +1,5 @@
1
1
  import VirtualConsolePrinter from '../console/VirtualConsolePrinter.js';
2
- import IBrowserPageViewport from '../browser/types/IBrowserPageViewport.js';
2
+ import IOptionalBrowserPageViewport from '../browser/types/IOptionalBrowserPageViewport.js';
3
3
  import IBrowserFrame from '../browser/types/IBrowserFrame.js';
4
4
  import IBrowserSettings from '../browser/types/IBrowserSettings.js';
5
5
 
@@ -85,7 +85,7 @@ export default class DetachedWindowAPI {
85
85
  *
86
86
  * @param viewport Viewport.
87
87
  */
88
- public setViewport(viewport: IBrowserPageViewport): void {
88
+ public setViewport(viewport: IOptionalBrowserPageViewport): void {
89
89
  this.#browserFrame.page.setViewport(viewport);
90
90
  }
91
91
 
@@ -398,11 +398,11 @@ export default interface IBrowserWindow extends IEventTarget, INodeJSGlobal {
398
398
  readonly window: IBrowserWindow;
399
399
  readonly globalThis: IBrowserWindow;
400
400
  readonly screen: Screen;
401
- readonly devicePixelRatio: number;
402
- readonly innerWidth: number;
403
- readonly innerHeight: number;
404
- readonly outerWidth: number;
405
- readonly outerHeight: number;
401
+ innerWidth: number;
402
+ innerHeight: number;
403
+ outerWidth: number;
404
+ outerHeight: number;
405
+ devicePixelRatio: number;
406
406
  readonly screenLeft: number;
407
407
  readonly screenTop: number;
408
408
  readonly screenX: number;
@@ -571,6 +571,19 @@ export default interface IBrowserWindow extends IEventTarget, INodeJSGlobal {
571
571
  */
572
572
  postMessage(message: unknown, targetOrigin?: string, transfer?: unknown[]): void;
573
573
 
574
+ /**
575
+ * Resizes the window.
576
+ *
577
+ * @param width Width.
578
+ * @param height Height.
579
+ */
580
+ resizeTo(width: number, height: number): void;
581
+
582
+ /**
583
+ * Resizes the current window by a specified amount.
584
+ */
585
+ resizeBy(width: number, height: number): void;
586
+
574
587
  /**
575
588
  * Destroys the window.
576
589
  */
@@ -41,12 +41,18 @@ export default class Window extends BrowserWindow implements IWindow {
41
41
  console: options?.console,
42
42
  settings: options?.settings
43
43
  });
44
- const browserFrame = browser.defaultContext.pages[0].mainFrame;
44
+ const browserPage = browser.defaultContext.pages[0];
45
+ const browserFrame = browserPage.mainFrame;
46
+
47
+ if (options && (options.width || options.height || options.innerWidth || options.innerHeight)) {
48
+ Object.assign(browserPage.viewport, {
49
+ width: options.width || options.innerWidth || browserPage.viewport.width,
50
+ height: options.height || options.innerHeight || browserPage.viewport.height
51
+ });
52
+ }
45
53
 
46
54
  super(browserFrame, {
47
- url: options?.url,
48
- width: options?.width ?? options?.innerWidth,
49
- height: options?.height ?? options?.innerHeight
55
+ url: options?.url
50
56
  });
51
57
 
52
58
  browserFrame.window = this;
@@ -4,6 +4,7 @@ import IBrowserFrame from '../browser/types/IBrowserFrame.js';
4
4
  import FetchCORSUtility from '../fetch/utilities/FetchCORSUtility.js';
5
5
  import ICrossOriginBrowserWindow from './ICrossOriginBrowserWindow.js';
6
6
  import BrowserFrameURL from '../browser/utilities/BrowserFrameURL.js';
7
+ import * as PropertySymbol from '../PropertySymbol.js';
7
8
 
8
9
  /**
9
10
  * Window page open handler.
@@ -45,8 +46,9 @@ export default class WindowPageOpenUtility {
45
46
  break;
46
47
  case '_blank':
47
48
  default:
48
- const newPage = browserFrame.page.context.newPage(browserFrame);
49
+ const newPage = browserFrame.page.context.newPage();
49
50
  targetFrame = newPage.mainFrame;
51
+ targetFrame[PropertySymbol.openerFrame] = browserFrame;
50
52
  break;
51
53
  }
52
54
 
@@ -66,6 +68,8 @@ export default class WindowPageOpenUtility {
66
68
  }
67
69
 
68
70
  if (features.popup && target !== '_self' && target !== '_top' && target !== '_parent') {
71
+ targetFrame[PropertySymbol.popup] = true;
72
+
69
73
  if (features?.width || features?.height) {
70
74
  targetFrame.page.setViewport({
71
75
  width: features?.width,
@@ -100,9 +104,10 @@ export default class WindowPageOpenUtility {
100
104
  !features.noopener &&
101
105
  !features.noreferrer &&
102
106
  browserFrame.window &&
107
+ targetFrame[PropertySymbol.openerFrame] &&
103
108
  targetFrame.window !== browserFrame.window
104
109
  ) {
105
- (<IBrowserWindow | ICrossOriginBrowserWindow>targetFrame.window.opener) = isCORS
110
+ targetFrame[PropertySymbol.openerWindow] = isCORS
106
111
  ? new CrossOriginBrowserWindow(browserFrame.window)
107
112
  : browserFrame.window;
108
113
  }
@@ -156,7 +161,7 @@ export default class WindowPageOpenUtility {
156
161
  const [key, value] = part.split('=');
157
162
  switch (key) {
158
163
  case 'popup':
159
- result.popup = value === 'yes' || value === '1' || value === 'true';
164
+ result.popup = !value || value === 'yes' || value === '1' || value === 'true';
160
165
  break;
161
166
  case 'width':
162
167
  case 'innerWidth':