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.
- package/lib/async-task-manager/AsyncTaskManager.d.ts +65 -0
- package/lib/{window → async-task-manager}/AsyncTaskManager.js +52 -55
- package/lib/async-task-manager/AsyncTaskManager.js.map +1 -0
- package/lib/fetch/FetchHandler.d.ts +17 -0
- package/lib/fetch/FetchHandler.js +59 -0
- package/lib/fetch/FetchHandler.js.map +1 -0
- package/lib/fetch/Headers.d.ts +7 -0
- package/lib/fetch/Headers.js +53 -0
- package/lib/fetch/Headers.js.map +1 -0
- package/lib/fetch/IAbortSignal.d.ts +16 -0
- package/lib/fetch/IAbortSignal.js +4 -0
- package/lib/fetch/IAbortSignal.js.map +1 -0
- package/lib/fetch/IBody.d.ts +17 -0
- package/lib/{window/IFetchOptions.js → fetch/IBody.js} +1 -1
- package/lib/fetch/IBody.js.map +1 -0
- package/lib/fetch/IHeaders.d.ts +18 -0
- package/lib/fetch/IHeaders.js +3 -0
- package/lib/fetch/IHeaders.js.map +1 -0
- package/lib/fetch/IHeadersInit.d.ts +5 -0
- package/lib/fetch/IHeadersInit.js +3 -0
- package/lib/fetch/IHeadersInit.js.map +1 -0
- package/lib/fetch/IRequest.d.ts +18 -0
- package/lib/fetch/IRequest.js +3 -0
- package/lib/fetch/IRequest.js.map +1 -0
- package/lib/fetch/IRequestInit.d.ts +15 -0
- package/lib/fetch/IRequestInit.js +3 -0
- package/lib/fetch/IRequestInit.js.map +1 -0
- package/lib/fetch/IResponse.d.ts +20 -0
- package/lib/{window → fetch}/IResponse.js +0 -0
- package/lib/{window → fetch}/IResponse.js.map +1 -1
- package/lib/fetch/IResponseInit.d.ts +9 -0
- package/lib/fetch/IResponseInit.js +3 -0
- package/lib/fetch/IResponseInit.js.map +1 -0
- package/lib/fetch/Request.d.ts +69 -0
- package/lib/fetch/Request.js +179 -0
- package/lib/fetch/Request.js.map +1 -0
- package/lib/fetch/ResourceFetchHandler.d.ts +22 -0
- package/lib/fetch/{ResourceFetcher.js → ResourceFetchHandler.js} +19 -26
- package/lib/fetch/ResourceFetchHandler.js.map +1 -0
- package/lib/fetch/Response.d.ts +69 -0
- package/lib/fetch/Response.js +179 -0
- package/lib/fetch/Response.js.map +1 -0
- package/lib/file/Blob.d.ts +8 -1
- package/lib/file/Blob.js +48 -0
- package/lib/file/Blob.js.map +1 -1
- package/lib/file/IBlob.d.ts +10 -0
- package/lib/file/IBlob.js +3 -0
- package/lib/file/IBlob.js.map +1 -0
- package/lib/form-data/IFormData.d.ts +30 -0
- package/lib/form-data/IFormData.js +3 -0
- package/lib/form-data/IFormData.js.map +1 -0
- package/lib/index.d.ts +3 -5
- package/lib/index.js +3 -3
- package/lib/index.js.map +1 -1
- package/lib/nodes/document/Document.js +9 -0
- package/lib/nodes/document/Document.js.map +1 -1
- package/lib/nodes/html-link-element/HTMLLinkElement.js +3 -3
- package/lib/nodes/html-link-element/HTMLLinkElement.js.map +1 -1
- package/lib/nodes/html-script-element/ScriptUtility.js +3 -9
- package/lib/nodes/html-script-element/ScriptUtility.js.map +1 -1
- package/lib/nodes/node/INode.d.ts +6 -0
- package/lib/nodes/node/Node.d.ts +6 -0
- package/lib/nodes/node/Node.js +6 -0
- package/lib/nodes/node/Node.js.map +1 -1
- package/lib/window/IWindow.d.ts +20 -16
- package/lib/window/Window.d.ts +45 -10
- package/lib/window/Window.js +72 -66
- package/lib/window/Window.js.map +1 -1
- package/package.json +3 -2
- package/src/async-task-manager/AsyncTaskManager.ts +128 -0
- package/src/fetch/FetchHandler.ts +54 -0
- package/src/fetch/Headers.ts +7 -0
- package/src/fetch/IAbortSignal.ts +34 -0
- package/src/fetch/IBody.ts +18 -0
- package/src/fetch/IHeaders.ts +18 -0
- package/src/fetch/IHeadersInit.ts +5 -0
- package/src/fetch/IRequest.ts +59 -0
- package/src/fetch/IRequestInit.ts +41 -0
- package/src/fetch/IResponse.ts +22 -0
- package/src/fetch/IResponseInit.ts +10 -0
- package/src/fetch/Request.ts +149 -0
- package/src/fetch/ResourceFetchHandler.ts +47 -0
- package/src/fetch/Response.ts +149 -0
- package/src/file/Blob.ts +12 -1
- package/src/file/IBlob.ts +10 -0
- package/src/form-data/IFormData.ts +33 -0
- package/src/index.ts +2 -6
- package/src/nodes/document/Document.ts +12 -0
- package/src/nodes/html-link-element/HTMLLinkElement.ts +3 -3
- package/src/nodes/html-script-element/ScriptUtility.ts +3 -9
- package/src/nodes/node/INode.ts +6 -0
- package/src/nodes/node/Node.ts +6 -0
- package/src/window/IWindow.ts +14 -16
- package/src/window/Window.ts +68 -67
- package/lib/fetch/ResourceFetcher.d.ts +0 -30
- package/lib/fetch/ResourceFetcher.js.map +0 -1
- package/lib/url-search-params/URLSearchParams.d.ts +0 -87
- package/lib/url-search-params/URLSearchParams.js +0 -196
- package/lib/url-search-params/URLSearchParams.js.map +0 -1
- package/lib/window/AsyncTaskManager.d.ts +0 -54
- package/lib/window/AsyncTaskManager.js.map +0 -1
- package/lib/window/AsyncTaskTypeEnum.d.ts +0 -5
- package/lib/window/AsyncTaskTypeEnum.js +0 -9
- package/lib/window/AsyncTaskTypeEnum.js.map +0 -1
- package/lib/window/IFetchOptions.d.ts +0 -13
- package/lib/window/IFetchOptions.js.map +0 -1
- package/lib/window/IResponse.d.ts +0 -32
- package/src/fetch/ResourceFetcher.ts +0 -55
- package/src/url-search-params/URLSearchParams.ts +0 -198
- package/src/window/AsyncTaskManager.ts +0 -127
- package/src/window/AsyncTaskTypeEnum.ts +0 -5
- package/src/window/IFetchOptions.ts +0 -11
- 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,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,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 './
|
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 '
|
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
|
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
|
-
|
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
|
-
|
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
|
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
|
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 =
|
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', {
|
package/src/nodes/node/INode.ts
CHANGED
@@ -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;
|
package/src/nodes/node/Node.ts
CHANGED
@@ -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;
|