@salve-software/react-native-nitro-jsdom 1.0.1 → 2.0.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.
- package/android/CMakeLists.txt +18 -0
- package/cpp/HybridHtmlSandbox.cpp +20 -3
- package/cpp/HybridHtmlSandbox.hpp +1 -1
- package/cpp/lexbor/LexborDocument.cpp +279 -67
- package/cpp/lexbor/LexborDocument.hpp +43 -10
- package/cpp/quickjs/DOMBindings.cpp +37 -1
- package/cpp/quickjs/DOMBindingsInternal.cpp +101 -2
- package/cpp/quickjs/DOMBindingsInternal.hpp +56 -1
- package/cpp/quickjs/QuickJSRuntime.cpp +32 -4
- package/cpp/quickjs/QuickJSRuntime.hpp +50 -1
- package/cpp/quickjs/bindings/AbortBindings.cpp +128 -0
- package/cpp/quickjs/bindings/AbortBindings.hpp +12 -0
- package/cpp/quickjs/bindings/BlobBindings.cpp +164 -0
- package/cpp/quickjs/bindings/BlobBindings.hpp +14 -0
- package/cpp/quickjs/bindings/CSSOMBindings.cpp +290 -0
- package/cpp/quickjs/bindings/CSSOMBindings.hpp +25 -0
- package/cpp/quickjs/bindings/ClassListBindings.cpp +3 -2
- package/cpp/quickjs/bindings/CookieBindings.cpp +118 -0
- package/cpp/quickjs/bindings/CookieBindings.hpp +23 -0
- package/cpp/quickjs/bindings/CustomElementsBindings.cpp +341 -0
- package/cpp/quickjs/bindings/CustomElementsBindings.hpp +50 -0
- package/cpp/quickjs/bindings/DOMExceptionBindings.cpp +111 -0
- package/cpp/quickjs/bindings/DOMExceptionBindings.hpp +20 -0
- package/cpp/quickjs/bindings/DOMParserBindings.cpp +299 -0
- package/cpp/quickjs/bindings/DOMParserBindings.hpp +45 -0
- package/cpp/quickjs/bindings/DocumentBindings.cpp +239 -4
- package/cpp/quickjs/bindings/ElementBindings.cpp +556 -44
- package/cpp/quickjs/bindings/EventBindings.cpp +414 -8
- package/cpp/quickjs/bindings/EventBindings.hpp +3 -0
- package/cpp/quickjs/bindings/EventTargetBindings.cpp +75 -0
- package/cpp/quickjs/bindings/EventTargetBindings.hpp +24 -0
- package/cpp/quickjs/bindings/FetchBindings.cpp +45 -6
- package/cpp/quickjs/bindings/FormBindings.cpp +365 -0
- package/cpp/quickjs/bindings/FormBindings.hpp +20 -0
- package/cpp/quickjs/bindings/LayoutStubBindings.cpp +104 -0
- package/cpp/quickjs/bindings/LayoutStubBindings.hpp +28 -0
- package/cpp/quickjs/bindings/LiveCollectionBindings.cpp +228 -0
- package/cpp/quickjs/bindings/LiveCollectionBindings.hpp +16 -0
- package/cpp/quickjs/bindings/ShadowRootBindings.cpp +171 -0
- package/cpp/quickjs/bindings/ShadowRootBindings.hpp +27 -0
- package/cpp/quickjs/bindings/SlotBindings.cpp +161 -0
- package/cpp/quickjs/bindings/SlotBindings.hpp +44 -0
- package/cpp/quickjs/bindings/TemplateBindings.cpp +42 -0
- package/cpp/quickjs/bindings/TemplateBindings.hpp +29 -0
- package/cpp/quickjs/bindings/TextEncodingBindings.cpp +117 -0
- package/cpp/quickjs/bindings/TextEncodingBindings.hpp +14 -0
- package/cpp/quickjs/bindings/TimerBindings.cpp +120 -0
- package/cpp/quickjs/bindings/TreeWalkerBindings.cpp +306 -0
- package/cpp/quickjs/bindings/TreeWalkerBindings.hpp +28 -0
- package/cpp/quickjs/bindings/UrlBindings.cpp +295 -0
- package/cpp/quickjs/bindings/UrlBindings.hpp +12 -0
- package/cpp/quickjs/bindings/WindowBindings.cpp +552 -0
- package/cpp/quickjs/bindings/WindowBindings.hpp +3 -2
- package/cpp/quickjs/bindings/XmlSerializerBindings.cpp +44 -0
- package/cpp/quickjs/bindings/XmlSerializerBindings.hpp +24 -0
- package/lib/commonjs/classes/JSDOM/JSDOM.class.js +1 -1
- package/lib/commonjs/classes/JSDOM/JSDOM.class.js.map +1 -1
- package/lib/module/classes/JSDOM/JSDOM.class.js +1 -1
- package/lib/module/classes/JSDOM/JSDOM.class.js.map +1 -1
- package/lib/typescript/src/classes/JSDOM/JSDOM.class.d.ts.map +1 -1
- package/lib/typescript/src/specs/HtmlSandbox.nitro.d.ts +1 -1
- package/lib/typescript/src/specs/HtmlSandbox.nitro.d.ts.map +1 -1
- package/nitrogen/generated/shared/c++/HybridHtmlSandboxSpec.hpp +1 -1
- package/package.json +17 -2
- package/src/classes/JSDOM/JSDOM.class.ts +1 -0
- package/src/specs/HtmlSandbox.nitro.ts +1 -1
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
#include "UrlBindings.hpp"
|
|
2
|
+
#include <cstring>
|
|
3
|
+
|
|
4
|
+
namespace margelo::nitro::nitrojsdom {
|
|
5
|
+
|
|
6
|
+
namespace {
|
|
7
|
+
|
|
8
|
+
const char* kUrlBootstrapScript = R"JS(
|
|
9
|
+
(function() {
|
|
10
|
+
function encodeComponent(str) {
|
|
11
|
+
return encodeURIComponent(str).replace(/%20/g, '+').replace(/[!'()*]/g, function(c) {
|
|
12
|
+
return '%' + c.charCodeAt(0).toString(16).toUpperCase();
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function decodeComponent(str) {
|
|
16
|
+
return decodeURIComponent(str.replace(/\+/g, ' '));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function parsePairs(search) {
|
|
20
|
+
var pairs = [];
|
|
21
|
+
var s = search && search.charAt(0) === '?' ? search.slice(1) : (search || '');
|
|
22
|
+
if (!s) return pairs;
|
|
23
|
+
var parts = s.split('&');
|
|
24
|
+
for (var i = 0; i < parts.length; i++) {
|
|
25
|
+
var part = parts[i];
|
|
26
|
+
if (!part) continue;
|
|
27
|
+
var eq = part.indexOf('=');
|
|
28
|
+
var k, v;
|
|
29
|
+
if (eq === -1) { k = part; v = ''; } else { k = part.slice(0, eq); v = part.slice(eq + 1); }
|
|
30
|
+
pairs.push([decodeComponent(k), decodeComponent(v)]);
|
|
31
|
+
}
|
|
32
|
+
return pairs;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function URLSearchParams(init) {
|
|
36
|
+
this._pairs = [];
|
|
37
|
+
this._onChange = null;
|
|
38
|
+
if (init === undefined || init === null || init === '') {
|
|
39
|
+
} else if (typeof init === 'string') {
|
|
40
|
+
this._pairs = parsePairs(init);
|
|
41
|
+
} else if (init instanceof URLSearchParams) {
|
|
42
|
+
for (var i = 0; i < init._pairs.length; i++) this._pairs.push(init._pairs[i].slice());
|
|
43
|
+
} else if (Array.isArray(init)) {
|
|
44
|
+
for (var i = 0; i < init.length; i++) this._pairs.push([String(init[i][0]), String(init[i][1])]);
|
|
45
|
+
} else if (typeof init === 'object') {
|
|
46
|
+
for (var k in init) {
|
|
47
|
+
if (Object.prototype.hasOwnProperty.call(init, k)) this._pairs.push([String(k), String(init[k])]);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
URLSearchParams.prototype._notify = function() { if (this._onChange) this._onChange(); };
|
|
53
|
+
|
|
54
|
+
URLSearchParams.prototype.append = function(name, value) {
|
|
55
|
+
this._pairs.push([String(name), String(value)]);
|
|
56
|
+
this._notify();
|
|
57
|
+
};
|
|
58
|
+
URLSearchParams.prototype.delete = function(name, value) {
|
|
59
|
+
name = String(name);
|
|
60
|
+
var hasValue = value !== undefined;
|
|
61
|
+
var v = hasValue ? String(value) : null;
|
|
62
|
+
var out = [];
|
|
63
|
+
for (var i = 0; i < this._pairs.length; i++) {
|
|
64
|
+
var p = this._pairs[i];
|
|
65
|
+
if (p[0] === name && (!hasValue || p[1] === v)) continue;
|
|
66
|
+
out.push(p);
|
|
67
|
+
}
|
|
68
|
+
this._pairs = out;
|
|
69
|
+
this._notify();
|
|
70
|
+
};
|
|
71
|
+
URLSearchParams.prototype.get = function(name) {
|
|
72
|
+
name = String(name);
|
|
73
|
+
for (var i = 0; i < this._pairs.length; i++) if (this._pairs[i][0] === name) return this._pairs[i][1];
|
|
74
|
+
return null;
|
|
75
|
+
};
|
|
76
|
+
URLSearchParams.prototype.getAll = function(name) {
|
|
77
|
+
name = String(name);
|
|
78
|
+
var out = [];
|
|
79
|
+
for (var i = 0; i < this._pairs.length; i++) if (this._pairs[i][0] === name) out.push(this._pairs[i][1]);
|
|
80
|
+
return out;
|
|
81
|
+
};
|
|
82
|
+
URLSearchParams.prototype.has = function(name, value) {
|
|
83
|
+
name = String(name);
|
|
84
|
+
var hasValue = value !== undefined;
|
|
85
|
+
var v = hasValue ? String(value) : null;
|
|
86
|
+
for (var i = 0; i < this._pairs.length; i++) {
|
|
87
|
+
if (this._pairs[i][0] === name && (!hasValue || this._pairs[i][1] === v)) return true;
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
};
|
|
91
|
+
URLSearchParams.prototype.set = function(name, value) {
|
|
92
|
+
name = String(name); value = String(value);
|
|
93
|
+
var found = false;
|
|
94
|
+
var out = [];
|
|
95
|
+
for (var i = 0; i < this._pairs.length; i++) {
|
|
96
|
+
var p = this._pairs[i];
|
|
97
|
+
if (p[0] !== name) { out.push(p); continue; }
|
|
98
|
+
if (!found) { out.push([name, value]); found = true; }
|
|
99
|
+
}
|
|
100
|
+
if (!found) out.push([name, value]);
|
|
101
|
+
this._pairs = out;
|
|
102
|
+
this._notify();
|
|
103
|
+
};
|
|
104
|
+
URLSearchParams.prototype.sort = function() {
|
|
105
|
+
this._pairs.sort(function(a, b) { return a[0] < b[0] ? -1 : (a[0] > b[0] ? 1 : 0); });
|
|
106
|
+
this._notify();
|
|
107
|
+
};
|
|
108
|
+
URLSearchParams.prototype.forEach = function(cb, thisArg) {
|
|
109
|
+
for (var i = 0; i < this._pairs.length; i++) cb.call(thisArg, this._pairs[i][1], this._pairs[i][0], this);
|
|
110
|
+
};
|
|
111
|
+
URLSearchParams.prototype.keys = function() {
|
|
112
|
+
var out = [];
|
|
113
|
+
for (var i = 0; i < this._pairs.length; i++) out.push(this._pairs[i][0]);
|
|
114
|
+
return out[Symbol.iterator]();
|
|
115
|
+
};
|
|
116
|
+
URLSearchParams.prototype.values = function() {
|
|
117
|
+
var out = [];
|
|
118
|
+
for (var i = 0; i < this._pairs.length; i++) out.push(this._pairs[i][1]);
|
|
119
|
+
return out[Symbol.iterator]();
|
|
120
|
+
};
|
|
121
|
+
URLSearchParams.prototype.entries = function() {
|
|
122
|
+
var out = [];
|
|
123
|
+
for (var i = 0; i < this._pairs.length; i++) out.push(this._pairs[i].slice());
|
|
124
|
+
return out[Symbol.iterator]();
|
|
125
|
+
};
|
|
126
|
+
URLSearchParams.prototype[Symbol.iterator] = function() { return this.entries(); };
|
|
127
|
+
URLSearchParams.prototype.toString = function() {
|
|
128
|
+
var out = [];
|
|
129
|
+
for (var i = 0; i < this._pairs.length; i++) out.push(encodeComponent(this._pairs[i][0]) + '=' + encodeComponent(this._pairs[i][1]));
|
|
130
|
+
return out.join('&');
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
globalThis.URLSearchParams = URLSearchParams;
|
|
134
|
+
|
|
135
|
+
function parseUrlFull(str) {
|
|
136
|
+
str = String(str === undefined || str === null ? '' : str);
|
|
137
|
+
var m = /^([^:\/?#]+:)(?:\/\/(?:([^\/?#@]*)@)?([^\/?#:]*)(?::(\d+))?)?([^?#]*)(\?[^#]*)?(#.*)?$/.exec(str);
|
|
138
|
+
if (!m) return null;
|
|
139
|
+
var protocol = m[1] || '';
|
|
140
|
+
var userinfo = m[2] || '';
|
|
141
|
+
var hostname = m[3] || '';
|
|
142
|
+
var port = m[4] || '';
|
|
143
|
+
var pathname = m[5] || '';
|
|
144
|
+
var search = m[6] || '';
|
|
145
|
+
var hash = m[7] || '';
|
|
146
|
+
if (!pathname && hostname) pathname = '/';
|
|
147
|
+
var username = '', password = '';
|
|
148
|
+
if (userinfo) {
|
|
149
|
+
var idx = userinfo.indexOf(':');
|
|
150
|
+
if (idx === -1) { username = userinfo; } else { username = userinfo.slice(0, idx); password = userinfo.slice(idx + 1); }
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
protocol: protocol, username: username, password: password,
|
|
154
|
+
hostname: hostname, port: port, pathname: pathname, search: search, hash: hash,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function serializeUrl(p) {
|
|
159
|
+
var auth = '';
|
|
160
|
+
if (p.username || p.password) auth = p.username + (p.password ? ':' + p.password : '') + '@';
|
|
161
|
+
var host = p.hostname ? ('//' + auth + p.hostname + (p.port ? ':' + p.port : '')) : '';
|
|
162
|
+
return (p.protocol || '') + host + (p.pathname || '') + (p.search || '') + (p.hash || '');
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function resolveUrlFull(base, next) {
|
|
166
|
+
next = String(next);
|
|
167
|
+
if (/^[a-zA-Z][a-zA-Z0-9+\-.]*:/.test(next)) return next;
|
|
168
|
+
var p = parseUrlFull(base) || {};
|
|
169
|
+
var origin = p.hostname
|
|
170
|
+
? serializeUrl({ protocol: p.protocol, username: p.username, password: p.password, hostname: p.hostname, port: p.port, pathname: '', search: '', hash: '' })
|
|
171
|
+
: (p.protocol || '');
|
|
172
|
+
if (next.charAt(0) === '/') return origin + next;
|
|
173
|
+
if (next.charAt(0) === '#') return base.split('#')[0] + next;
|
|
174
|
+
if (next.charAt(0) === '?') return base.split('?')[0].split('#')[0] + next;
|
|
175
|
+
var dir = (p.pathname || '/').replace(/\/[^\/]*$/, '/');
|
|
176
|
+
return origin + dir + next;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function URL(url, base) {
|
|
180
|
+
var href = (base !== undefined && base !== null) ? resolveUrlFull(String(base), url) : String(url);
|
|
181
|
+
if (!/^[a-zA-Z][a-zA-Z0-9+\-.]*:/.test(href)) {
|
|
182
|
+
throw new TypeError('Invalid URL: ' + href);
|
|
183
|
+
}
|
|
184
|
+
this._href = href;
|
|
185
|
+
var self = this;
|
|
186
|
+
var initialSearch = (parseUrlFull(this._href) || {}).search || '';
|
|
187
|
+
this._searchParams = new URLSearchParams(initialSearch);
|
|
188
|
+
this._searchParams._onChange = function() { self._syncSearchFromParams(); };
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
URL.prototype._syncSearchFromParams = function() {
|
|
192
|
+
var s = this._searchParams.toString();
|
|
193
|
+
this._setPart('search', s ? '?' + s : '');
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
URL.prototype._setPart = function(part, value) {
|
|
197
|
+
var p = parseUrlFull(this._href) || {};
|
|
198
|
+
p[part] = value;
|
|
199
|
+
this._href = serializeUrl(p);
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
URL.prototype._resyncSearchParams = function() {
|
|
203
|
+
var s = (parseUrlFull(this._href) || {}).search || '';
|
|
204
|
+
this._searchParams._pairs = parsePairs(s);
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
['protocol', 'username', 'password', 'hostname', 'port', 'pathname', 'hash'].forEach(function(name) {
|
|
208
|
+
Object.defineProperty(URL.prototype, name, {
|
|
209
|
+
get: function() { return (parseUrlFull(this._href) || {})[name] || ''; },
|
|
210
|
+
set: function(v) { this._setPart(name, String(v)); },
|
|
211
|
+
enumerable: true,
|
|
212
|
+
configurable: true,
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
Object.defineProperty(URL.prototype, 'search', {
|
|
217
|
+
get: function() { return (parseUrlFull(this._href) || {}).search || ''; },
|
|
218
|
+
set: function(v) {
|
|
219
|
+
var s = String(v);
|
|
220
|
+
this._setPart('search', s ? (s.charAt(0) === '?' ? s : '?' + s) : '');
|
|
221
|
+
this._resyncSearchParams();
|
|
222
|
+
},
|
|
223
|
+
enumerable: true,
|
|
224
|
+
configurable: true,
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
Object.defineProperty(URL.prototype, 'searchParams', {
|
|
228
|
+
get: function() { return this._searchParams; },
|
|
229
|
+
enumerable: true,
|
|
230
|
+
configurable: true,
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
Object.defineProperty(URL.prototype, 'host', {
|
|
234
|
+
get: function() {
|
|
235
|
+
var p = parseUrlFull(this._href) || {};
|
|
236
|
+
return p.hostname + (p.port ? ':' + p.port : '');
|
|
237
|
+
},
|
|
238
|
+
set: function(v) {
|
|
239
|
+
var s = String(v);
|
|
240
|
+
var idx = s.indexOf(':');
|
|
241
|
+
if (idx === -1) { this._setPart('hostname', s); this._setPart('port', ''); }
|
|
242
|
+
else { this._setPart('hostname', s.slice(0, idx)); this._setPart('port', s.slice(idx + 1)); }
|
|
243
|
+
},
|
|
244
|
+
enumerable: true,
|
|
245
|
+
configurable: true,
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
Object.defineProperty(URL.prototype, 'origin', {
|
|
249
|
+
get: function() {
|
|
250
|
+
var p = parseUrlFull(this._href) || {};
|
|
251
|
+
if (!p.hostname) return 'null';
|
|
252
|
+
return p.protocol + '//' + p.hostname + (p.port ? ':' + p.port : '');
|
|
253
|
+
},
|
|
254
|
+
enumerable: true,
|
|
255
|
+
configurable: true,
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
Object.defineProperty(URL.prototype, 'href', {
|
|
259
|
+
get: function() { return this._href; },
|
|
260
|
+
set: function(v) {
|
|
261
|
+
this._href = String(v);
|
|
262
|
+
this._resyncSearchParams();
|
|
263
|
+
},
|
|
264
|
+
enumerable: true,
|
|
265
|
+
configurable: true,
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
URL.prototype.toString = function() { return this._href; };
|
|
269
|
+
URL.prototype.toJSON = function() { return this._href; };
|
|
270
|
+
|
|
271
|
+
URL.canParse = function(url, base) {
|
|
272
|
+
try {
|
|
273
|
+
new URL(url, base);
|
|
274
|
+
return true;
|
|
275
|
+
} catch (e) {
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
globalThis.URL = URL;
|
|
281
|
+
})();
|
|
282
|
+
)JS";
|
|
283
|
+
|
|
284
|
+
} // namespace
|
|
285
|
+
|
|
286
|
+
void UrlBindings::install(JSContext* ctx) {
|
|
287
|
+
JSValue result = JS_Eval(ctx, kUrlBootstrapScript, strlen(kUrlBootstrapScript),
|
|
288
|
+
"<url-bootstrap>", JS_EVAL_TYPE_GLOBAL);
|
|
289
|
+
if (JS_IsException(result)) {
|
|
290
|
+
JS_FreeValue(ctx, JS_GetException(ctx));
|
|
291
|
+
}
|
|
292
|
+
JS_FreeValue(ctx, result);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
} // namespace margelo::nitro::nitrojsdom
|