happy-dom 2.50.0 → 2.52.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 (113) hide show
  1. package/lib/async-task-manager/AsyncTaskManager.d.ts +65 -0
  2. package/lib/{window → async-task-manager}/AsyncTaskManager.js +52 -55
  3. package/lib/async-task-manager/AsyncTaskManager.js.map +1 -0
  4. package/lib/fetch/FetchHandler.d.ts +17 -0
  5. package/lib/fetch/FetchHandler.js +59 -0
  6. package/lib/fetch/FetchHandler.js.map +1 -0
  7. package/lib/fetch/Headers.d.ts +7 -0
  8. package/lib/fetch/Headers.js +53 -0
  9. package/lib/fetch/Headers.js.map +1 -0
  10. package/lib/fetch/IAbortSignal.d.ts +16 -0
  11. package/lib/fetch/IAbortSignal.js +4 -0
  12. package/lib/fetch/IAbortSignal.js.map +1 -0
  13. package/lib/fetch/IBody.d.ts +17 -0
  14. package/lib/{window/IFetchOptions.js → fetch/IBody.js} +1 -1
  15. package/lib/fetch/IBody.js.map +1 -0
  16. package/lib/fetch/IHeaders.d.ts +18 -0
  17. package/lib/fetch/IHeaders.js +3 -0
  18. package/lib/fetch/IHeaders.js.map +1 -0
  19. package/lib/fetch/IHeadersInit.d.ts +5 -0
  20. package/lib/fetch/IHeadersInit.js +3 -0
  21. package/lib/fetch/IHeadersInit.js.map +1 -0
  22. package/lib/fetch/IRequest.d.ts +18 -0
  23. package/lib/fetch/IRequest.js +3 -0
  24. package/lib/fetch/IRequest.js.map +1 -0
  25. package/lib/fetch/IRequestInit.d.ts +15 -0
  26. package/lib/fetch/IRequestInit.js +3 -0
  27. package/lib/fetch/IRequestInit.js.map +1 -0
  28. package/lib/fetch/IResponse.d.ts +20 -0
  29. package/lib/{window → fetch}/IResponse.js +0 -0
  30. package/lib/{window → fetch}/IResponse.js.map +1 -1
  31. package/lib/fetch/IResponseInit.d.ts +9 -0
  32. package/lib/fetch/IResponseInit.js +3 -0
  33. package/lib/fetch/IResponseInit.js.map +1 -0
  34. package/lib/fetch/Request.d.ts +69 -0
  35. package/lib/fetch/Request.js +179 -0
  36. package/lib/fetch/Request.js.map +1 -0
  37. package/lib/fetch/ResourceFetchHandler.d.ts +22 -0
  38. package/lib/fetch/{ResourceFetcher.js → ResourceFetchHandler.js} +19 -26
  39. package/lib/fetch/ResourceFetchHandler.js.map +1 -0
  40. package/lib/fetch/Response.d.ts +69 -0
  41. package/lib/fetch/Response.js +179 -0
  42. package/lib/fetch/Response.js.map +1 -0
  43. package/lib/file/Blob.d.ts +8 -1
  44. package/lib/file/Blob.js +48 -0
  45. package/lib/file/Blob.js.map +1 -1
  46. package/lib/file/IBlob.d.ts +10 -0
  47. package/lib/file/IBlob.js +3 -0
  48. package/lib/file/IBlob.js.map +1 -0
  49. package/lib/form-data/IFormData.d.ts +30 -0
  50. package/lib/form-data/IFormData.js +3 -0
  51. package/lib/form-data/IFormData.js.map +1 -0
  52. package/lib/index.d.ts +3 -5
  53. package/lib/index.js +3 -3
  54. package/lib/index.js.map +1 -1
  55. package/lib/nodes/document/Document.js +9 -0
  56. package/lib/nodes/document/Document.js.map +1 -1
  57. package/lib/nodes/html-link-element/HTMLLinkElement.js +3 -3
  58. package/lib/nodes/html-link-element/HTMLLinkElement.js.map +1 -1
  59. package/lib/nodes/html-script-element/ScriptUtility.js +3 -9
  60. package/lib/nodes/html-script-element/ScriptUtility.js.map +1 -1
  61. package/lib/nodes/node/INode.d.ts +6 -0
  62. package/lib/nodes/node/Node.d.ts +6 -0
  63. package/lib/nodes/node/Node.js +6 -0
  64. package/lib/nodes/node/Node.js.map +1 -1
  65. package/lib/window/IWindow.d.ts +20 -16
  66. package/lib/window/Window.d.ts +45 -10
  67. package/lib/window/Window.js +72 -66
  68. package/lib/window/Window.js.map +1 -1
  69. package/package.json +3 -2
  70. package/src/async-task-manager/AsyncTaskManager.ts +128 -0
  71. package/src/fetch/FetchHandler.ts +54 -0
  72. package/src/fetch/Headers.ts +7 -0
  73. package/src/fetch/IAbortSignal.ts +34 -0
  74. package/src/fetch/IBody.ts +18 -0
  75. package/src/fetch/IHeaders.ts +18 -0
  76. package/src/fetch/IHeadersInit.ts +5 -0
  77. package/src/fetch/IRequest.ts +59 -0
  78. package/src/fetch/IRequestInit.ts +41 -0
  79. package/src/fetch/IResponse.ts +22 -0
  80. package/src/fetch/IResponseInit.ts +10 -0
  81. package/src/fetch/Request.ts +149 -0
  82. package/src/fetch/ResourceFetchHandler.ts +47 -0
  83. package/src/fetch/Response.ts +149 -0
  84. package/src/file/Blob.ts +12 -1
  85. package/src/file/IBlob.ts +10 -0
  86. package/src/form-data/IFormData.ts +33 -0
  87. package/src/index.ts +2 -6
  88. package/src/nodes/document/Document.ts +12 -0
  89. package/src/nodes/html-link-element/HTMLLinkElement.ts +3 -3
  90. package/src/nodes/html-script-element/ScriptUtility.ts +3 -9
  91. package/src/nodes/node/INode.ts +6 -0
  92. package/src/nodes/node/Node.ts +6 -0
  93. package/src/window/IWindow.ts +14 -16
  94. package/src/window/Window.ts +68 -67
  95. package/lib/fetch/ResourceFetcher.d.ts +0 -30
  96. package/lib/fetch/ResourceFetcher.js.map +0 -1
  97. package/lib/url-search-params/URLSearchParams.d.ts +0 -87
  98. package/lib/url-search-params/URLSearchParams.js +0 -196
  99. package/lib/url-search-params/URLSearchParams.js.map +0 -1
  100. package/lib/window/AsyncTaskManager.d.ts +0 -54
  101. package/lib/window/AsyncTaskManager.js.map +0 -1
  102. package/lib/window/AsyncTaskTypeEnum.d.ts +0 -5
  103. package/lib/window/AsyncTaskTypeEnum.js +0 -9
  104. package/lib/window/AsyncTaskTypeEnum.js.map +0 -1
  105. package/lib/window/IFetchOptions.d.ts +0 -13
  106. package/lib/window/IFetchOptions.js.map +0 -1
  107. package/lib/window/IResponse.d.ts +0 -32
  108. package/src/fetch/ResourceFetcher.ts +0 -55
  109. package/src/url-search-params/URLSearchParams.ts +0 -198
  110. package/src/window/AsyncTaskManager.ts +0 -127
  111. package/src/window/AsyncTaskTypeEnum.ts +0 -5
  112. package/src/window/IFetchOptions.ts +0 -11
  113. package/src/window/IResponse.ts +0 -34
@@ -0,0 +1,22 @@
1
+ import IHeaders from './IHeaders';
2
+ import IBody from './IBody';
3
+
4
+ /**
5
+ * Fetch response.
6
+ */
7
+ export default interface IResponse extends IBody {
8
+ readonly headers: IHeaders;
9
+ readonly ok: boolean;
10
+ readonly redirected: boolean;
11
+ readonly status: number;
12
+ readonly statusText: string;
13
+ readonly type: 'basic' | 'cors' | 'default' | 'error' | 'opaque' | 'opaqueredirect';
14
+ readonly url: string;
15
+
16
+ /**
17
+ * Returns a clone.
18
+ *
19
+ * @returns Clone.
20
+ */
21
+ clone(): IResponse;
22
+ }
@@ -0,0 +1,10 @@
1
+ import IHeaders from './IHeaders';
2
+
3
+ /**
4
+ * Response init.
5
+ */
6
+ export default interface IResponseInit {
7
+ headers?: IHeaders | string[][] | Record<string, string>;
8
+ status?: number;
9
+ statusText?: string;
10
+ }
@@ -0,0 +1,149 @@
1
+ import * as NodeFetch from 'node-fetch';
2
+ import IRequest from './IRequest';
3
+ import IBlob from '../file/IBlob';
4
+ import IDocument from '../nodes/document/IDocument';
5
+
6
+ /**
7
+ * Fetch request.
8
+ */
9
+ export default class Request extends NodeFetch.Request implements IRequest {
10
+ public static _ownerDocument: IDocument = null;
11
+
12
+ /**
13
+ * Returns array buffer.
14
+ *
15
+ * @returns Array buffer.
16
+ */
17
+ public arrayBuffer(): Promise<ArrayBuffer> {
18
+ return new Promise((resolve, reject) => {
19
+ const taskID = this._handlePromiseStart();
20
+ super
21
+ .arrayBuffer()
22
+ .then(this._handlePromiseEnd.bind(this, resolve, reject, taskID))
23
+ .catch(this._handlePromiseError.bind(this, reject));
24
+ });
25
+ }
26
+
27
+ /**
28
+ * Returns blob.
29
+ *
30
+ * @returns Blob.
31
+ */
32
+ public blob(): Promise<IBlob> {
33
+ return new Promise((resolve, reject) => {
34
+ const taskID = this._handlePromiseStart();
35
+ super
36
+ .blob()
37
+ .then(this._handlePromiseEnd.bind(this, resolve, reject, taskID))
38
+ .catch(this._handlePromiseError.bind(this, reject));
39
+ });
40
+ }
41
+
42
+ /**
43
+ * Returns buffer.
44
+ *
45
+ * @returns Buffer.
46
+ */
47
+ public buffer(): Promise<Buffer> {
48
+ return new Promise((resolve, reject) => {
49
+ const taskID = this._handlePromiseStart();
50
+ super
51
+ .buffer()
52
+ .then(this._handlePromiseEnd.bind(this, resolve, reject, taskID))
53
+ .catch(this._handlePromiseError.bind(this, reject));
54
+ });
55
+ }
56
+
57
+ /**
58
+ * Returns json.
59
+ *
60
+ * @returns JSON.
61
+ */
62
+ public json(): Promise<unknown> {
63
+ return new Promise((resolve, reject) => {
64
+ const taskID = this._handlePromiseStart();
65
+ super
66
+ .json()
67
+ .then(this._handlePromiseEnd.bind(this, resolve, reject, taskID))
68
+ .catch(this._handlePromiseError.bind(this, reject));
69
+ });
70
+ }
71
+
72
+ /**
73
+ * Returns json.
74
+ *
75
+ * @returns JSON.
76
+ */
77
+ public text(): Promise<string> {
78
+ return new Promise((resolve, reject) => {
79
+ const taskID = this._handlePromiseStart();
80
+ super
81
+ .text()
82
+ .then(this._handlePromiseEnd.bind(this, resolve, reject, taskID))
83
+ .catch(this._handlePromiseError.bind(this, reject));
84
+ });
85
+ }
86
+
87
+ /**
88
+ * Returns json.
89
+ *
90
+ * @returns JSON.
91
+ */
92
+ public textConverted(): Promise<string> {
93
+ return new Promise((resolve, reject) => {
94
+ const taskID = this._handlePromiseStart();
95
+ super
96
+ .textConverted()
97
+ .then(this._handlePromiseEnd.bind(this, resolve, reject, taskID))
98
+ .catch(this._handlePromiseError.bind(this, reject));
99
+ });
100
+ }
101
+
102
+ /**
103
+ * Handles promise start.
104
+ *
105
+ * @returns Task ID.
106
+ */
107
+ private _handlePromiseStart(): number {
108
+ const taskManager = (<typeof Request>this.constructor)._ownerDocument.defaultView.happyDOM
109
+ .asyncTaskManager;
110
+ return taskManager.startTask();
111
+ }
112
+
113
+ /**
114
+ * Handles promise end.
115
+ *
116
+ * @param resolve Resolve.
117
+ * @param reject Reject.
118
+ * @param taskID Task ID.
119
+ * @param response Response.
120
+ */
121
+ private _handlePromiseEnd(
122
+ resolve: (response: unknown) => void,
123
+ reject: (error: Error) => void,
124
+ taskID: number,
125
+ response: unknown
126
+ ): void {
127
+ const taskManager = (<typeof Request>this.constructor)._ownerDocument.defaultView.happyDOM
128
+ .asyncTaskManager;
129
+ if (taskManager.getTaskCount() === 0) {
130
+ reject(new Error('Failed to complete fetch request. Task was canceled.'));
131
+ } else {
132
+ resolve(response);
133
+ taskManager.endTask(taskID);
134
+ }
135
+ }
136
+
137
+ /**
138
+ * Handles promise error.
139
+ *
140
+ * @param error
141
+ * @param reject
142
+ */
143
+ private _handlePromiseError(reject: (error: Error) => void, error: Error): void {
144
+ const taskManager = (<typeof Request>this.constructor)._ownerDocument.defaultView.happyDOM
145
+ .asyncTaskManager;
146
+ reject(error);
147
+ taskManager.cancelAll(error);
148
+ }
149
+ }
@@ -0,0 +1,47 @@
1
+ import RelativeURL from '../location/RelativeURL';
2
+ import DOMException from '../exception/DOMException';
3
+ import IDocument from '../nodes/document/IDocument';
4
+
5
+ /**
6
+ * Helper class for performing fetch of resources.
7
+ */
8
+ export default class ResourceFetchHandler {
9
+ /**
10
+ * Returns resource data asynchonously.
11
+ *
12
+ * @param document Document.
13
+ * @param url URL.
14
+ * @returns Response.
15
+ */
16
+ public static async fetch(document: IDocument, url: string): Promise<string> {
17
+ const response = await document.defaultView.fetch(url);
18
+ if (!response.ok) {
19
+ throw new DOMException(
20
+ `Failed to perform request to "${url}". Status code: ${response.status}`
21
+ );
22
+ }
23
+ return await response.text();
24
+ }
25
+
26
+ /**
27
+ * Returns resource data synchonously.
28
+ *
29
+ * @param document Document.
30
+ * @param url URL.
31
+ * @returns Response.
32
+ */
33
+ public static fetchSync(document: IDocument, url: string): string {
34
+ // We want to only load SyncRequest when it is needed to improve performance and not have direct dependencies to server side packages.
35
+ const syncRequest = require('sync-request');
36
+ const absoluteURL = RelativeURL.getAbsoluteURL(document.defaultView.location, url);
37
+ const response = syncRequest('GET', absoluteURL);
38
+
39
+ if (response.isError()) {
40
+ throw new DOMException(
41
+ `Failed to perform request to "${absoluteURL}". Status code: ${response.statusCode}`
42
+ );
43
+ }
44
+
45
+ return response.getBody();
46
+ }
47
+ }
@@ -0,0 +1,149 @@
1
+ import IResponse from './IResponse';
2
+ import IBlob from '../file/IBlob';
3
+ import IDocument from '../nodes/document/IDocument';
4
+ import * as NodeFetch from 'node-fetch';
5
+
6
+ /**
7
+ * Fetch response.
8
+ */
9
+ export default class Response extends NodeFetch.Response implements IResponse {
10
+ public static _ownerDocument: IDocument = null;
11
+
12
+ /**
13
+ * Returns array buffer.
14
+ *
15
+ * @returns Array buffer.
16
+ */
17
+ public arrayBuffer(): Promise<ArrayBuffer> {
18
+ return new Promise((resolve, reject) => {
19
+ const taskID = this._handlePromiseStart();
20
+ super
21
+ .arrayBuffer()
22
+ .then(this._handlePromiseEnd.bind(this, resolve, reject, taskID))
23
+ .catch(this._handlePromiseError.bind(this, reject));
24
+ });
25
+ }
26
+
27
+ /**
28
+ * Returns blob.
29
+ *
30
+ * @returns Blob.
31
+ */
32
+ public blob(): Promise<IBlob> {
33
+ return new Promise((resolve, reject) => {
34
+ const taskID = this._handlePromiseStart();
35
+ super
36
+ .blob()
37
+ .then(this._handlePromiseEnd.bind(this, resolve, reject, taskID))
38
+ .catch(this._handlePromiseError.bind(this, reject));
39
+ });
40
+ }
41
+
42
+ /**
43
+ * Returns buffer.
44
+ *
45
+ * @returns Buffer.
46
+ */
47
+ public buffer(): Promise<Buffer> {
48
+ return new Promise((resolve, reject) => {
49
+ const taskID = this._handlePromiseStart();
50
+ super
51
+ .buffer()
52
+ .then(this._handlePromiseEnd.bind(this, resolve, reject, taskID))
53
+ .catch(this._handlePromiseError.bind(this, reject));
54
+ });
55
+ }
56
+
57
+ /**
58
+ * Returns json.
59
+ *
60
+ * @returns JSON.
61
+ */
62
+ public json(): Promise<unknown> {
63
+ return new Promise((resolve, reject) => {
64
+ const taskID = this._handlePromiseStart();
65
+ super
66
+ .json()
67
+ .then(this._handlePromiseEnd.bind(this, resolve, reject, taskID))
68
+ .catch(this._handlePromiseError.bind(this, reject));
69
+ });
70
+ }
71
+
72
+ /**
73
+ * Returns json.
74
+ *
75
+ * @returns JSON.
76
+ */
77
+ public text(): Promise<string> {
78
+ return new Promise((resolve, reject) => {
79
+ const taskID = this._handlePromiseStart();
80
+ super
81
+ .text()
82
+ .then(this._handlePromiseEnd.bind(this, resolve, reject, taskID))
83
+ .catch(this._handlePromiseError.bind(this, reject));
84
+ });
85
+ }
86
+
87
+ /**
88
+ * Returns json.
89
+ *
90
+ * @returns JSON.
91
+ */
92
+ public textConverted(): Promise<string> {
93
+ return new Promise((resolve, reject) => {
94
+ const taskID = this._handlePromiseStart();
95
+ super
96
+ .textConverted()
97
+ .then(this._handlePromiseEnd.bind(this, resolve, reject, taskID))
98
+ .catch(this._handlePromiseError.bind(this, reject));
99
+ });
100
+ }
101
+
102
+ /**
103
+ * Handles promise start.
104
+ *
105
+ * @returns Task ID.
106
+ */
107
+ private _handlePromiseStart(): number {
108
+ const taskManager = (<typeof Response>this.constructor)._ownerDocument.defaultView.happyDOM
109
+ .asyncTaskManager;
110
+ return taskManager.startTask();
111
+ }
112
+
113
+ /**
114
+ * Handles promise end.
115
+ *
116
+ * @param resolve Resolve.
117
+ * @param reject Reject.
118
+ * @param taskID Task ID.
119
+ * @param response Response.
120
+ */
121
+ private _handlePromiseEnd(
122
+ resolve: (response: unknown) => void,
123
+ reject: (error: Error) => void,
124
+ taskID: number,
125
+ response: unknown
126
+ ): void {
127
+ const taskManager = (<typeof Response>this.constructor)._ownerDocument.defaultView.happyDOM
128
+ .asyncTaskManager;
129
+ if (taskManager.getTaskCount() === 0) {
130
+ reject(new Error('Failed to complete fetch request. Task was canceled.'));
131
+ } else {
132
+ resolve(response);
133
+ taskManager.endTask(taskID);
134
+ }
135
+ }
136
+
137
+ /**
138
+ * Handles promise error.
139
+ *
140
+ * @param error
141
+ * @param reject
142
+ */
143
+ private _handlePromiseError(reject: (error: Error) => void, error: Error): void {
144
+ const taskManager = (<typeof Response>this.constructor)._ownerDocument.defaultView.happyDOM
145
+ .asyncTaskManager;
146
+ reject(error);
147
+ taskManager.cancelAll(error);
148
+ }
149
+ }
package/src/file/Blob.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import IBlob from './IBlob';
2
+
1
3
  /**
2
4
  * Reference:
3
5
  * https://developer.mozilla.org/en-US/docs/Web/API/Blob.
@@ -5,7 +7,7 @@
5
7
  * Based on:
6
8
  * https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/file-api/Blob-impl.js (MIT licensed).
7
9
  */
8
- export default class Blob {
10
+ export default class Blob implements IBlob {
9
11
  public readonly _buffer: Buffer = null;
10
12
  public readonly type: string = '';
11
13
 
@@ -108,6 +110,15 @@ export default class Blob {
108
110
  return blob;
109
111
  }
110
112
 
113
+ /**
114
+ * Returns a Promise that resolves to a text.
115
+ *
116
+ * @returns Text.
117
+ */
118
+ public async text(): Promise<string> {
119
+ return this._buffer.toString();
120
+ }
121
+
111
122
  /**
112
123
  * Closes the blob.
113
124
  *
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Reference:
3
+ * https://developer.mozilla.org/en-US/docs/Web/API/Blob.
4
+ */
5
+ export default interface IBlob {
6
+ readonly type: string;
7
+ readonly size: number;
8
+ slice(start?: number, end?: number): IBlob;
9
+ text(): Promise<string>;
10
+ }
@@ -0,0 +1,33 @@
1
+ import Stream from 'stream';
2
+ import HTTP from 'http';
3
+
4
+ interface IHeaders {
5
+ [key: string]: unknown;
6
+ }
7
+
8
+ interface IAppendOptions {
9
+ header?: string | IHeaders;
10
+ knownLength?: number;
11
+ filename?: string;
12
+ filepath?: string;
13
+ contentType?: string;
14
+ }
15
+
16
+ interface ISubmitOptions extends HTTP.RequestOptions {
17
+ protocol?: 'https:' | 'http:';
18
+ }
19
+
20
+ export default interface IFormData extends Stream.Readable {
21
+ append(key: string, value: unknown, options?: IAppendOptions | string): void;
22
+ getHeaders(userHeaders?: IHeaders): { [key: string]: IHeaders };
23
+ submit(
24
+ params: string | ISubmitOptions,
25
+ callback?: (error: Error | null, response: HTTP.IncomingMessage) => void
26
+ ): HTTP.ClientRequest;
27
+ getBuffer(): Buffer;
28
+ setBoundary(boundary: string): void;
29
+ getBoundary(): string;
30
+ getLength(callback: (err: Error | null, length: number) => void): void;
31
+ getLengthSync(): number;
32
+ hasKnownLength(): boolean;
33
+ }
package/src/index.ts CHANGED
@@ -14,9 +14,7 @@ import DOMException from './exception/DOMException';
14
14
  import History from './history/History';
15
15
  import CSSStyleDeclaration from './css/CSSStyleDeclaration';
16
16
  import Screen from './screen/Screen';
17
- import AsyncTaskManager from './window/AsyncTaskManager';
18
- import IResponse from './window/IResponse';
19
- import IFetchOptions from './window/IFetchOptions';
17
+ import AsyncTaskManager from './async-task-manager/AsyncTaskManager';
20
18
  import NodeFilter from './tree-walker/NodeFilter';
21
19
  import Event from './event/Event';
22
20
  import EventTarget from './event/EventTarget';
@@ -101,7 +99,7 @@ import XMLParser from './xml-parser/XMLParser';
101
99
  import XMLSerializer from './xml-serializer/XMLSerializer';
102
100
  import CSSStyleSheet from './css/CSSStyleSheet';
103
101
  import Storage from './storage/Storage';
104
- import URLSearchParams from './url-search-params/URLSearchParams';
102
+ import { URLSearchParams } from 'url';
105
103
  import Selection from './selection/Selection';
106
104
 
107
105
  export {
@@ -123,8 +121,6 @@ export {
123
121
  CSSStyleDeclaration,
124
122
  Screen,
125
123
  AsyncTaskManager,
126
- IResponse,
127
- IFetchOptions,
128
124
  NodeFilter,
129
125
  Event,
130
126
  EventTarget,
@@ -37,6 +37,7 @@ import DocumentReadyStateEnum from './DocumentReadyStateEnum';
37
37
  import DocumentReadyStateManager from './DocumentReadyStateManager';
38
38
  import Location from '../../location/Location';
39
39
  import Selection from '../../selection/Selection';
40
+ import IShadowRoot from '../shadow-root/IShadowRoot';
40
41
 
41
42
  /**
42
43
  * Document.
@@ -240,6 +241,17 @@ export default class Document extends Node implements IDocument {
240
241
  * @returns Active element.
241
242
  */
242
243
  public get activeElement(): IHTMLElement {
244
+ if (this._activeElement) {
245
+ let rootNode: IShadowRoot | IDocument = <IShadowRoot | IDocument>(
246
+ this._activeElement.getRootNode()
247
+ );
248
+ let activeElement: IHTMLElement = this._activeElement;
249
+ while (rootNode !== this) {
250
+ activeElement = <IHTMLElement>(<IShadowRoot>rootNode).host;
251
+ rootNode = <IShadowRoot | IDocument>activeElement.getRootNode();
252
+ }
253
+ return activeElement;
254
+ }
243
255
  return this._activeElement || this.body || this.documentElement || null;
244
256
  }
245
257
 
@@ -1,6 +1,6 @@
1
1
  import Attr from '../../attribute/Attr';
2
2
  import CSSStyleSheet from '../../css/CSSStyleSheet';
3
- import ResourceFetcher from '../../fetch/ResourceFetcher';
3
+ import ResourceFetchHandler from '../../fetch/ResourceFetchHandler';
4
4
  import HTMLElement from '../html-element/HTMLElement';
5
5
  import Document from '../document/Document';
6
6
  import IHTMLLinkElement from './IHTMLLinkElement';
@@ -199,7 +199,7 @@ export default class HTMLLinkElement extends HTMLElement implements IHTMLLinkEle
199
199
  this.isConnected
200
200
  ) {
201
201
  (<Document>this.ownerDocument)._readyStateManager.startTask();
202
- ResourceFetcher.fetch({ window: this.ownerDocument.defaultView, url: href })
202
+ ResourceFetchHandler.fetch(this.ownerDocument, href)
203
203
  .then((code) => {
204
204
  const styleSheet = new CSSStyleSheet();
205
205
  styleSheet.replaceSync(code);
@@ -245,7 +245,7 @@ export default class HTMLLinkElement extends HTMLElement implements IHTMLLinkEle
245
245
 
246
246
  if (href !== null && rel && rel.toLowerCase() === 'stylesheet') {
247
247
  (<Document>this.ownerDocument)._readyStateManager.startTask();
248
- ResourceFetcher.fetch({ window: this.ownerDocument.defaultView, url: href })
248
+ ResourceFetchHandler.fetch(this.ownerDocument, href)
249
249
  .then((code) => {
250
250
  const styleSheet = new CSSStyleSheet();
251
251
  styleSheet.replaceSync(code);
@@ -1,7 +1,7 @@
1
1
  import { Document } from '../..';
2
2
  import Event from '../../event/Event';
3
3
  import ErrorEvent from '../../event/events/ErrorEvent';
4
- import ResourceFetcher from '../../fetch/ResourceFetcher';
4
+ import ResourceFetchHandler from '../../fetch/ResourceFetchHandler';
5
5
  import HTMLScriptElement from './HTMLScriptElement';
6
6
 
7
7
  /**
@@ -22,10 +22,7 @@ export default class ScriptUtility {
22
22
  let code = null;
23
23
  (<Document>element.ownerDocument)._readyStateManager.startTask();
24
24
  try {
25
- code = await ResourceFetcher.fetch({
26
- window: element.ownerDocument.defaultView,
27
- url: src
28
- });
25
+ code = await ResourceFetchHandler.fetch(element.ownerDocument, src);
29
26
  } catch (error) {
30
27
  element.dispatchEvent(
31
28
  new ErrorEvent('error', {
@@ -54,10 +51,7 @@ export default class ScriptUtility {
54
51
  } else {
55
52
  let code = null;
56
53
  try {
57
- code = ResourceFetcher.fetchSync({
58
- window: element.ownerDocument.defaultView,
59
- url: src
60
- });
54
+ code = ResourceFetchHandler.fetchSync(element.ownerDocument, src);
61
55
  } catch (error) {
62
56
  element.dispatchEvent(
63
57
  new ErrorEvent('error', {
@@ -4,6 +4,12 @@ import IElement from '../element/IElement';
4
4
  import INodeList from './INodeList';
5
5
 
6
6
  export default interface INode extends IEventTarget {
7
+ readonly ELEMENT_NODE: number;
8
+ readonly TEXT_NODE: number;
9
+ readonly COMMENT_NODE: number;
10
+ readonly DOCUMENT_NODE: number;
11
+ readonly DOCUMENT_TYPE_NODE: number;
12
+ readonly DOCUMENT_FRAGMENT_NODE: number;
7
13
  readonly ownerDocument: IDocument;
8
14
  readonly parentNode: INode;
9
15
  readonly parentElement: IElement;
@@ -22,6 +22,12 @@ export default class Node extends EventTarget implements INode {
22
22
  public static readonly DOCUMENT_TYPE_NODE = 10;
23
23
  public static readonly DOCUMENT_FRAGMENT_NODE = 11;
24
24
  public static ownerDocument: IDocument = null;
25
+ public readonly ELEMENT_NODE = 1;
26
+ public readonly TEXT_NODE = 3;
27
+ public readonly COMMENT_NODE = 8;
28
+ public readonly DOCUMENT_NODE = 9;
29
+ public readonly DOCUMENT_TYPE_NODE = 10;
30
+ public readonly DOCUMENT_FRAGMENT_NODE = 11;
25
31
  public readonly ownerDocument: IDocument = null;
26
32
  public readonly parentNode: INode = null;
27
33
  public readonly nodeType: number;