@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.
Files changed (66) hide show
  1. package/android/CMakeLists.txt +18 -0
  2. package/cpp/HybridHtmlSandbox.cpp +20 -3
  3. package/cpp/HybridHtmlSandbox.hpp +1 -1
  4. package/cpp/lexbor/LexborDocument.cpp +279 -67
  5. package/cpp/lexbor/LexborDocument.hpp +43 -10
  6. package/cpp/quickjs/DOMBindings.cpp +37 -1
  7. package/cpp/quickjs/DOMBindingsInternal.cpp +101 -2
  8. package/cpp/quickjs/DOMBindingsInternal.hpp +56 -1
  9. package/cpp/quickjs/QuickJSRuntime.cpp +32 -4
  10. package/cpp/quickjs/QuickJSRuntime.hpp +50 -1
  11. package/cpp/quickjs/bindings/AbortBindings.cpp +128 -0
  12. package/cpp/quickjs/bindings/AbortBindings.hpp +12 -0
  13. package/cpp/quickjs/bindings/BlobBindings.cpp +164 -0
  14. package/cpp/quickjs/bindings/BlobBindings.hpp +14 -0
  15. package/cpp/quickjs/bindings/CSSOMBindings.cpp +290 -0
  16. package/cpp/quickjs/bindings/CSSOMBindings.hpp +25 -0
  17. package/cpp/quickjs/bindings/ClassListBindings.cpp +3 -2
  18. package/cpp/quickjs/bindings/CookieBindings.cpp +118 -0
  19. package/cpp/quickjs/bindings/CookieBindings.hpp +23 -0
  20. package/cpp/quickjs/bindings/CustomElementsBindings.cpp +341 -0
  21. package/cpp/quickjs/bindings/CustomElementsBindings.hpp +50 -0
  22. package/cpp/quickjs/bindings/DOMExceptionBindings.cpp +111 -0
  23. package/cpp/quickjs/bindings/DOMExceptionBindings.hpp +20 -0
  24. package/cpp/quickjs/bindings/DOMParserBindings.cpp +299 -0
  25. package/cpp/quickjs/bindings/DOMParserBindings.hpp +45 -0
  26. package/cpp/quickjs/bindings/DocumentBindings.cpp +239 -4
  27. package/cpp/quickjs/bindings/ElementBindings.cpp +556 -44
  28. package/cpp/quickjs/bindings/EventBindings.cpp +414 -8
  29. package/cpp/quickjs/bindings/EventBindings.hpp +3 -0
  30. package/cpp/quickjs/bindings/EventTargetBindings.cpp +75 -0
  31. package/cpp/quickjs/bindings/EventTargetBindings.hpp +24 -0
  32. package/cpp/quickjs/bindings/FetchBindings.cpp +45 -6
  33. package/cpp/quickjs/bindings/FormBindings.cpp +365 -0
  34. package/cpp/quickjs/bindings/FormBindings.hpp +20 -0
  35. package/cpp/quickjs/bindings/LayoutStubBindings.cpp +104 -0
  36. package/cpp/quickjs/bindings/LayoutStubBindings.hpp +28 -0
  37. package/cpp/quickjs/bindings/LiveCollectionBindings.cpp +228 -0
  38. package/cpp/quickjs/bindings/LiveCollectionBindings.hpp +16 -0
  39. package/cpp/quickjs/bindings/ShadowRootBindings.cpp +171 -0
  40. package/cpp/quickjs/bindings/ShadowRootBindings.hpp +27 -0
  41. package/cpp/quickjs/bindings/SlotBindings.cpp +161 -0
  42. package/cpp/quickjs/bindings/SlotBindings.hpp +44 -0
  43. package/cpp/quickjs/bindings/TemplateBindings.cpp +42 -0
  44. package/cpp/quickjs/bindings/TemplateBindings.hpp +29 -0
  45. package/cpp/quickjs/bindings/TextEncodingBindings.cpp +117 -0
  46. package/cpp/quickjs/bindings/TextEncodingBindings.hpp +14 -0
  47. package/cpp/quickjs/bindings/TimerBindings.cpp +120 -0
  48. package/cpp/quickjs/bindings/TreeWalkerBindings.cpp +306 -0
  49. package/cpp/quickjs/bindings/TreeWalkerBindings.hpp +28 -0
  50. package/cpp/quickjs/bindings/UrlBindings.cpp +295 -0
  51. package/cpp/quickjs/bindings/UrlBindings.hpp +12 -0
  52. package/cpp/quickjs/bindings/WindowBindings.cpp +552 -0
  53. package/cpp/quickjs/bindings/WindowBindings.hpp +3 -2
  54. package/cpp/quickjs/bindings/XmlSerializerBindings.cpp +44 -0
  55. package/cpp/quickjs/bindings/XmlSerializerBindings.hpp +24 -0
  56. package/lib/commonjs/classes/JSDOM/JSDOM.class.js +1 -1
  57. package/lib/commonjs/classes/JSDOM/JSDOM.class.js.map +1 -1
  58. package/lib/module/classes/JSDOM/JSDOM.class.js +1 -1
  59. package/lib/module/classes/JSDOM/JSDOM.class.js.map +1 -1
  60. package/lib/typescript/src/classes/JSDOM/JSDOM.class.d.ts.map +1 -1
  61. package/lib/typescript/src/specs/HtmlSandbox.nitro.d.ts +1 -1
  62. package/lib/typescript/src/specs/HtmlSandbox.nitro.d.ts.map +1 -1
  63. package/nitrogen/generated/shared/c++/HybridHtmlSandboxSpec.hpp +1 -1
  64. package/package.json +17 -2
  65. package/src/classes/JSDOM/JSDOM.class.ts +1 -0
  66. 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
@@ -0,0 +1,12 @@
1
+ #pragma once
2
+
3
+ #include "quickjs.h"
4
+
5
+ namespace margelo::nitro::nitrojsdom {
6
+
7
+ class UrlBindings {
8
+ public:
9
+ static void install(JSContext* ctx);
10
+ };
11
+
12
+ } // namespace margelo::nitro::nitrojsdom