xbintsc 0.5.36 → 0.5.38
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/dist/src/cli/help.d.ts +1 -1
- package/dist/src/codegen/generator/state.js +1 -0
- package/dist/src/codegen/generator/state.js.map +1 -1
- package/dist/src/codegen/generator/tables.js +1 -0
- package/dist/src/codegen/generator/tables.js.map +1 -1
- package/dist/src/driver/bundler/deferred.d.ts +63 -0
- package/dist/src/driver/bundler/deferred.js +279 -0
- package/dist/src/driver/bundler/deferred.js.map +1 -0
- package/dist/src/driver/bundler/merge.js +214 -2
- package/dist/src/driver/bundler/merge.js.map +1 -1
- package/dist/src/driver/runtime-objects.d.ts +1 -1
- package/dist/src/driver/runtime-objects.js +1 -0
- package/dist/src/driver/runtime-objects.js.map +1 -1
- package/dist/src/driver/version.d.ts +1 -1
- package/dist/src/driver/version.js +1 -1
- package/dist/src/extensions/gui/html.js +89 -13
- package/dist/src/extensions/gui/html.js.map +1 -1
- package/dist/src/extensions/gui/index.js +13 -0
- package/dist/src/extensions/gui/index.js.map +1 -1
- package/dist/src/extensions/gui/three.d.ts +4 -3
- package/dist/src/extensions/gui/three.js +4 -3
- package/dist/src/extensions/gui/three.js.map +1 -1
- package/dist/tests/e2e/gui-browser.test.js +65 -0
- package/dist/tests/e2e/gui-browser.test.js.map +1 -1
- package/dist/tests/e2e/gui-canvas-args.test.d.ts +6 -0
- package/dist/tests/e2e/gui-canvas-args.test.js +217 -0
- package/dist/tests/e2e/gui-canvas-args.test.js.map +1 -0
- package/dist/tests/e2e/gui-canvas.test.js.map +1 -1
- package/dist/tests/e2e/gui-dom.test.js +215 -0
- package/dist/tests/e2e/gui-dom.test.js.map +1 -1
- package/dist/tests/e2e/gui-events.test.js +112 -0
- package/dist/tests/e2e/gui-events.test.js.map +1 -1
- package/dist/tests/e2e/gui-script-import-order.test.d.ts +10 -0
- package/dist/tests/e2e/gui-script-import-order.test.js +161 -0
- package/dist/tests/e2e/gui-script-import-order.test.js.map +1 -0
- package/dist/tests/e2e/gui-webgl2-shadow.test.d.ts +10 -0
- package/dist/tests/e2e/gui-webgl2-shadow.test.js +108 -0
- package/dist/tests/e2e/gui-webgl2-shadow.test.js.map +1 -0
- package/dist/tests/e2e/url.test.d.ts +6 -0
- package/dist/tests/e2e/url.test.js +114 -0
- package/dist/tests/e2e/url.test.js.map +1 -0
- package/dist/tests/extensions/gui.test.js +22 -10
- package/dist/tests/extensions/gui.test.js.map +1 -1
- package/doc/gui/api.md +38 -9
- package/doc/gui/canvas.md +49 -18
- package/doc/gui/dom.md +51 -4
- package/doc/gui/webgl.md +20 -10
- package/doc/gui-scripts.md +19 -19
- package/doc/gui.md +10 -8
- package/doc/implemented/fetch.md +5 -0
- package/doc/implemented/modules.md +13 -0
- package/doc/implemented/stdlib.md +17 -0
- package/doc/unimplemented/deviations.md +1 -0
- package/doc/zh-CN/gui/api.md +33 -4
- package/doc/zh-CN/gui/canvas.md +44 -19
- package/doc/zh-CN/gui/dom.md +45 -3
- package/doc/zh-CN/gui/webgl.md +3 -3
- package/doc/zh-CN/gui-scripts.md +14 -13
- package/doc/zh-CN/gui.md +7 -6
- package/doc/zh-CN/implemented/fetch.md +4 -0
- package/doc/zh-CN/implemented/modules.md +10 -0
- package/doc/zh-CN/implemented/stdlib.md +15 -0
- package/doc/zh-CN/unimplemented/deviations.md +1 -0
- package/package.json +7 -7
- package/runtime/ext_gui/browser.cpp +34 -49
- package/runtime/ext_gui/browser_abort.cpp +249 -0
- package/runtime/ext_gui/browser_dialogs.cpp +76 -0
- package/runtime/ext_gui/browser_media.cpp +176 -0
- package/runtime/ext_gui/browser_navigation.cpp +130 -0
- package/runtime/ext_gui/canvas.cpp +88 -30
- package/runtime/ext_gui/canvas.h +74 -9
- package/runtime/ext_gui/canvas_image_data.cpp +143 -0
- package/runtime/ext_gui/canvas_internal.h +8 -5
- package/runtime/ext_gui/canvas_pattern.cpp +90 -0
- package/runtime/ext_gui/canvas_raster.cpp +31 -9
- package/runtime/ext_gui/canvas_style.cpp +4 -2
- package/runtime/ext_gui/dom.h +4 -0
- package/runtime/ext_gui/dom_api.cpp +1 -0
- package/runtime/ext_gui/dom_api_canvas.cpp +120 -114
- package/runtime/ext_gui/dom_api_canvas_extra.cpp +57 -2
- package/runtime/ext_gui/dom_api_canvas_image.cpp +239 -0
- package/runtime/ext_gui/dom_api_canvas_paths.cpp +179 -0
- package/runtime/ext_gui/dom_api_computed_style.cpp +124 -0
- package/runtime/ext_gui/dom_api_dataset.cpp +154 -0
- package/runtime/ext_gui/dom_api_document.cpp +58 -5
- package/runtime/ext_gui/dom_api_events.cpp +93 -17
- package/runtime/ext_gui/dom_api_internal.h +55 -2
- package/runtime/ext_gui/dom_api_mutation.cpp +159 -0
- package/runtime/ext_gui/dom_api_node.cpp +40 -19
- package/runtime/ext_gui/dom_api_node_read.cpp +37 -1
- package/runtime/ext_gui/dom_api_path2d.cpp +358 -0
- package/runtime/ext_gui/dom_api_proto.cpp +35 -0
- package/runtime/ext_gui/dom_api_style.cpp +223 -13
- package/runtime/ext_gui/dom_api_webgl.cpp +10 -0
- package/runtime/ext_gui/dom_api_webgl2.cpp +33 -1
- package/runtime/ext_gui/gui.cpp +59 -5
- package/runtime/ext_gui/gui_engine.h +49 -0
- package/runtime/ext_gui/gui_events.cpp +80 -9
- package/runtime/ext_gui/listener_options.h +43 -0
- package/runtime/ext_gui/paint.cpp +28 -0
- package/runtime/ext_gui/paint.h +4 -0
- package/runtime/ext_gui/script.cpp +31 -0
- package/runtime/ext_gui/webgl_glsl.h +3 -0
- package/runtime/ext_gui/webgl_glsl_unroll.cpp +283 -0
- package/runtime/ext_gui/webgl_msl.cpp +4 -0
- package/runtime/ext_gui/webgl_shader.cpp +12 -6
- package/runtime/ext_gui/window.cpp +14 -65
- package/runtime/ext_gui/window_events.cpp +125 -0
- package/runtime/rt.h +29 -0
- package/runtime/rt_internal.h +4 -0
- package/runtime/xt_builtins.c +0 -21
- package/runtime/xt_containers/access.inc +94 -2
- package/runtime/xt_containers/objects.inc +29 -31
- package/runtime/xt_fetch/async.inc +60 -0
- package/runtime/xt_url_object.c +463 -0
- package/src/codegen/generator/state.ts +1 -0
- package/src/codegen/generator/tables.ts +1 -0
- package/src/driver/bundler/deferred.ts +351 -0
- package/src/driver/bundler/merge.ts +219 -2
- package/src/driver/runtime-objects.ts +1 -0
- package/src/driver/version.ts +1 -1
- package/src/extensions/gui/html.ts +91 -15
- package/src/extensions/gui/index.ts +13 -0
- package/src/extensions/gui/three.ts +4 -3
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GUI e2e: WebGL 2 identity and three.js-style sampler arrays.
|
|
3
|
+
*
|
|
4
|
+
* A browser reports a WebGL 2 context as `WebGL2RenderingContext` (and *not* as
|
|
5
|
+
* `WebGLRenderingContext`), which is how three.js decides whether to use its
|
|
6
|
+
* WebGL 2 path. Its shadow-map chunks also index sampler arrays with a loop
|
|
7
|
+
* variable; Vulkan GLSL only accepts a constant index, so the rewriter has to
|
|
8
|
+
* expand the pragma-marked loop before compiling.
|
|
9
|
+
*/
|
|
10
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
11
|
+
import { createGuiHarness, guiAvailable } from "./gui-helpers.js";
|
|
12
|
+
const harness = createGuiHarness();
|
|
13
|
+
const PAGE = `
|
|
14
|
+
<html><head><title>webgl2-shadow</title></head>
|
|
15
|
+
<body style="margin:0">
|
|
16
|
+
<canvas id="c" width="64" height="64"></canvas>
|
|
17
|
+
<canvas id="c1" width="32" height="32"></canvas>
|
|
18
|
+
</body></html>`;
|
|
19
|
+
describe.skipIf(!guiAvailable)("gui extension — WebGL 2 identity and sampler arrays", () => {
|
|
20
|
+
beforeAll(() => harness.setup());
|
|
21
|
+
afterAll(() => harness.cleanup());
|
|
22
|
+
it("reports the WebGL 2 constructor/prototype and unrolls shadow loops", () => {
|
|
23
|
+
const { value } = harness.compileAndRun("webgl2-shadow", `
|
|
24
|
+
import { createWindow } from "gui";
|
|
25
|
+
import page from "./page.html";
|
|
26
|
+
|
|
27
|
+
const win = createWindow({ title: "webgl2-shadow", width: 320, height: 240 });
|
|
28
|
+
const label = (name: string, value: any): void => console.log(name + "=" + value);
|
|
29
|
+
|
|
30
|
+
win.on("ready", () => {
|
|
31
|
+
const canvas: any = document.getElementById("c");
|
|
32
|
+
const gl: any = canvas.getContext("webgl2");
|
|
33
|
+
label("webgl2", gl != null);
|
|
34
|
+
if (gl == null) {
|
|
35
|
+
win.close();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
label("constructor", gl.constructor.name);
|
|
39
|
+
label("instanceof-webgl2", gl instanceof WebGL2RenderingContext);
|
|
40
|
+
label("instanceof-webgl1", gl instanceof WebGLRenderingContext);
|
|
41
|
+
label("constructor-after-global", gl.constructor.name);
|
|
42
|
+
label("canvas", gl.canvas === canvas);
|
|
43
|
+
label("drawing-buffer", gl.drawingBufferWidth + "x" + gl.drawingBufferHeight);
|
|
44
|
+
label("shared-prototype",
|
|
45
|
+
gl.constructor.prototype === WebGLRenderingContext.prototype);
|
|
46
|
+
|
|
47
|
+
const canvas1: any = document.getElementById("c1");
|
|
48
|
+
const gl1: any = canvas1.getContext("webgl");
|
|
49
|
+
label("webgl1", gl1 != null);
|
|
50
|
+
if (gl1 != null) {
|
|
51
|
+
label("constructor1", gl1.constructor.name);
|
|
52
|
+
label("gl1-instanceof-webgl2", gl1 instanceof WebGL2RenderingContext);
|
|
53
|
+
label("gl1-instanceof-webgl1", gl1 instanceof WebGLRenderingContext);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const vs: any = gl.createShader(gl.VERTEX_SHADER);
|
|
57
|
+
gl.shaderSource(vs, "#version 300 es\\n" +
|
|
58
|
+
"in vec2 a_pos; void main() { gl_Position = vec4(a_pos, 0.0, 1.0); }");
|
|
59
|
+
gl.compileShader(vs);
|
|
60
|
+
label("vs", gl.getShaderParameter(vs, gl.COMPILE_STATUS));
|
|
61
|
+
|
|
62
|
+
const fs: any = gl.createShader(gl.FRAGMENT_SHADER);
|
|
63
|
+
gl.shaderSource(fs, "#version 300 es\\n" +
|
|
64
|
+
"precision highp float;\\n" +
|
|
65
|
+
"uniform sampler2D u_shadowMap[2];\\n" +
|
|
66
|
+
"out highp vec4 fragColor;\\n" +
|
|
67
|
+
"void main() {\\n" +
|
|
68
|
+
" float shadow = 0.0;\\n" +
|
|
69
|
+
" #pragma unroll_loop_start\\n" +
|
|
70
|
+
" for ( int i = 0; i < 2; i ++ ) {\\n" +
|
|
71
|
+
" #if ( UNROLLED_LOOP_INDEX < 2 )\\n" +
|
|
72
|
+
" shadow += texture( u_shadowMap[ i ], vec2( 0.5 ) ).r;\\n" +
|
|
73
|
+
" #endif\\n" +
|
|
74
|
+
" }\\n" +
|
|
75
|
+
" #pragma unroll_loop_end\\n" +
|
|
76
|
+
" fragColor = vec4( shadow );\\n" +
|
|
77
|
+
"}");
|
|
78
|
+
gl.compileShader(fs);
|
|
79
|
+
const ok = gl.getShaderParameter(fs, gl.COMPILE_STATUS);
|
|
80
|
+
label("fs", ok === true ? "true" : "false:" + gl.getShaderInfoLog(fs));
|
|
81
|
+
|
|
82
|
+
const program: any = gl.createProgram();
|
|
83
|
+
gl.attachShader(program, vs);
|
|
84
|
+
gl.attachShader(program, fs);
|
|
85
|
+
gl.linkProgram(program);
|
|
86
|
+
label("link", gl.getProgramParameter(program, gl.LINK_STATUS));
|
|
87
|
+
win.close();
|
|
88
|
+
});
|
|
89
|
+
win.loadHTML(page);
|
|
90
|
+
`, { files: { "page.html": PAGE } });
|
|
91
|
+
expect(value("webgl2")).toBe("true");
|
|
92
|
+
expect(value("constructor")).toBe("WebGL2RenderingContext");
|
|
93
|
+
expect(value("instanceof-webgl2")).toBe("true");
|
|
94
|
+
expect(value("instanceof-webgl1")).toBe("false");
|
|
95
|
+
expect(value("constructor-after-global")).toBe("WebGL2RenderingContext");
|
|
96
|
+
expect(value("shared-prototype")).toBe("false");
|
|
97
|
+
expect(value("canvas")).toBe("true");
|
|
98
|
+
expect(value("drawing-buffer")).toBe("64x64");
|
|
99
|
+
expect(value("webgl1")).toBe("true");
|
|
100
|
+
expect(value("constructor1")).toBe("WebGLRenderingContext");
|
|
101
|
+
expect(value("gl1-instanceof-webgl2")).toBe("false");
|
|
102
|
+
expect(value("gl1-instanceof-webgl1")).toBe("true");
|
|
103
|
+
expect(value("vs")).toBe("true");
|
|
104
|
+
expect(value("fs")).toBe("true");
|
|
105
|
+
expect(value("link")).toBe("true");
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=gui-webgl2-shadow.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gui-webgl2-shadow.test.js","sourceRoot":"","sources":["../../../tests/e2e/gui-webgl2-shadow.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;AAEnC,MAAM,IAAI,GAAG;;;;;eAKE,CAAC;AAEhB,QAAQ,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,qDAAqD,EAAE,GAAG,EAAE;IACzF,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAElC,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,aAAa,CACrC,eAAe,EACf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmEC,EACD,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CACjC,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC5D,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC5D,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL: relative-reference resolution and the components a compiled program
|
|
3
|
+
* reads. A reference with no scheme is a filesystem path and defaults to the
|
|
4
|
+
* `file:` protocol (resolved against the working directory).
|
|
5
|
+
*/
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { tmpdir } from "node:os";
|
|
8
|
+
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
9
|
+
import { afterAll, expect, it } from "vitest";
|
|
10
|
+
import { describeE2E } from "./harness.js";
|
|
11
|
+
const workdir = mkdtempSync(join(tmpdir(), "xbintsc-url-"));
|
|
12
|
+
afterAll(() => rmSync(workdir, { recursive: true, force: true }));
|
|
13
|
+
describeE2E("URL", (harness) => {
|
|
14
|
+
it("resolves relative references and exposes the components", () => {
|
|
15
|
+
const out = harness.runProgram(`
|
|
16
|
+
const base = new URL("https://example.com/a/b/index.html?x=1#h");
|
|
17
|
+
console.log(base.href);
|
|
18
|
+
console.log(new URL("../img/pic.png", base).href);
|
|
19
|
+
console.log(new URL("/root", base).href);
|
|
20
|
+
console.log(new URL("//cdn.example.com/x", base).href);
|
|
21
|
+
console.log(new URL("./x", "https://example.com/a/b/").href);
|
|
22
|
+
console.log(base.protocol, base.host, base.hostname, base.port);
|
|
23
|
+
console.log(base.pathname, base.search, base.hash);
|
|
24
|
+
console.log(base.toString());
|
|
25
|
+
|
|
26
|
+
const file = new URL("file:///D:/proj/build/app.exe");
|
|
27
|
+
console.log(file.origin, file.protocol, new URL("../../audio/clip.mp3", file).href);
|
|
28
|
+
`);
|
|
29
|
+
expect(out).toBe([
|
|
30
|
+
"https://example.com/a/b/index.html?x=1#h",
|
|
31
|
+
"https://example.com/a/img/pic.png",
|
|
32
|
+
"https://example.com/root",
|
|
33
|
+
"https://cdn.example.com/x",
|
|
34
|
+
"https://example.com/a/b/x",
|
|
35
|
+
"https: example.com example.com ",
|
|
36
|
+
"/a/b/index.html ?x=1 #h",
|
|
37
|
+
"https://example.com/a/b/index.html?x=1#h",
|
|
38
|
+
"null file: file:///D:/audio/clip.mp3",
|
|
39
|
+
].join("\n"));
|
|
40
|
+
});
|
|
41
|
+
it("defaults a scheme-less reference to file://", () => {
|
|
42
|
+
const out = harness.runProgram(`
|
|
43
|
+
const url = new URL("./assets/model.glb?rev=2#top");
|
|
44
|
+
console.log(url.protocol);
|
|
45
|
+
console.log(url.origin);
|
|
46
|
+
console.log(url.href.startsWith("file:///"));
|
|
47
|
+
console.log(url.pathname.endsWith("/assets/model.glb"));
|
|
48
|
+
console.log(url.search, url.searchParams.get("rev"));
|
|
49
|
+
console.log(url.hash);
|
|
50
|
+
console.log(new URL("/tmp/shared.txt").href.startsWith("file:///"));
|
|
51
|
+
console.log(new URL("nested/file.txt").pathname.endsWith("/nested/file.txt"));
|
|
52
|
+
`);
|
|
53
|
+
expect(out).toBe([
|
|
54
|
+
"file:",
|
|
55
|
+
"null",
|
|
56
|
+
"true",
|
|
57
|
+
"true",
|
|
58
|
+
"?rev=2 2",
|
|
59
|
+
"#top",
|
|
60
|
+
"true",
|
|
61
|
+
"true",
|
|
62
|
+
].join("\n"));
|
|
63
|
+
});
|
|
64
|
+
it("canonicalizes the Windows spellings of a file: URL", () => {
|
|
65
|
+
const windowsForm = JSON.stringify("file://C:\\proj\\build\\app.exe");
|
|
66
|
+
const backslashForm = JSON.stringify("file://D:\\assets\\model.glb?rev=2#top");
|
|
67
|
+
const out = harness.runProgram(`
|
|
68
|
+
const drive = new URL(${windowsForm});
|
|
69
|
+
console.log(drive.href);
|
|
70
|
+
console.log(drive.pathname, JSON.stringify(drive.host), drive.origin);
|
|
71
|
+
const backslash = new URL(${backslashForm});
|
|
72
|
+
console.log(backslash.href);
|
|
73
|
+
console.log(backslash.pathname, backslash.search, backslash.hash);
|
|
74
|
+
`);
|
|
75
|
+
expect(out).toBe([
|
|
76
|
+
"file:///C:/proj/build/app.exe",
|
|
77
|
+
"/C:/proj/build/app.exe \"\" null",
|
|
78
|
+
"file:///D:/assets/model.glb?rev=2#top",
|
|
79
|
+
"/D:/assets/model.glb ?rev=2 #top",
|
|
80
|
+
].join("\n"));
|
|
81
|
+
});
|
|
82
|
+
it("reads relative and file: URLs with fetch", async () => {
|
|
83
|
+
const target = join(workdir, "payload.json");
|
|
84
|
+
writeFileSync(target, '{"value":"ok"}');
|
|
85
|
+
const out = harness.runProgram(`
|
|
86
|
+
async function main(): Promise<void> {
|
|
87
|
+
const response = await fetch(${JSON.stringify(target)});
|
|
88
|
+
console.log("status=" + response.status + " ok=" + response.ok);
|
|
89
|
+
const data: any = await response.json();
|
|
90
|
+
console.log("value=" + data.value);
|
|
91
|
+
console.log("file=" + (await fetch(${JSON.stringify("file://" + target)})).status);
|
|
92
|
+
const missing = await fetch(${JSON.stringify(join(workdir, "missing.txt"))}).then(
|
|
93
|
+
() => "resolved",
|
|
94
|
+
(error: any) => "rejected:" + (error instanceof TypeError),
|
|
95
|
+
);
|
|
96
|
+
console.log("missing=" + missing);
|
|
97
|
+
const empty = await fetch("").then(
|
|
98
|
+
() => "resolved",
|
|
99
|
+
(error: any) => "rejected:" + (error instanceof TypeError),
|
|
100
|
+
);
|
|
101
|
+
console.log("empty=" + empty);
|
|
102
|
+
}
|
|
103
|
+
main();
|
|
104
|
+
`);
|
|
105
|
+
expect(out).toBe([
|
|
106
|
+
"status=200 ok=true",
|
|
107
|
+
"value=ok",
|
|
108
|
+
"file=200",
|
|
109
|
+
"missing=rejected:true",
|
|
110
|
+
"empty=rejected:true",
|
|
111
|
+
].join("\n"));
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
//# sourceMappingURL=url.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.test.js","sourceRoot":"","sources":["../../../tests/e2e/url.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -81,14 +81,17 @@ describe("gui .html asset loader", () => {
|
|
|
81
81
|
expect(htmlOf(moduleSource)).toContain(`<script data-xt-id="${id}"></script>`);
|
|
82
82
|
expect(parseDiagnostics(moduleSource)).toBe(0);
|
|
83
83
|
});
|
|
84
|
-
it("
|
|
84
|
+
it("defers a relative import and rewrites it from the HTML dir", () => {
|
|
85
85
|
const directory = writeFiles({
|
|
86
86
|
"scripts/app.ts": 'import { size } from "../lib/util";\nconsole.log(size);',
|
|
87
87
|
"lib/util.ts": "export const size = 1;",
|
|
88
88
|
});
|
|
89
89
|
const htmlPath = join(directory, "page.html");
|
|
90
90
|
const { moduleSource } = loadHtmlAsset(htmlPath, `<script src="./scripts/app.ts"></script>`);
|
|
91
|
-
|
|
91
|
+
/* The loader marks the module, and the generated script loads it at run
|
|
92
|
+
* time instead of hoisting an eager import. */
|
|
93
|
+
expect(moduleSource).toContain('import { __xt_deferred_module as __xt_deferred_0_0 } from "./lib/util"');
|
|
94
|
+
expect(moduleSource).toContain("const { size } = __xt_deferred_0_0();");
|
|
92
95
|
expect(moduleSource).toContain("console.log(size);");
|
|
93
96
|
expect(moduleSource).not.toContain("../lib/util");
|
|
94
97
|
expect(parseDiagnostics(moduleSource)).toBe(0);
|
|
@@ -107,7 +110,9 @@ describe("gui .html asset loader", () => {
|
|
|
107
110
|
const directory = writeFiles({ "page.html": "" });
|
|
108
111
|
expect(() => loadHtmlAsset(join(directory, "page.html"), `<script src="./missing.ts"></script>`)).toThrow(/not found/);
|
|
109
112
|
});
|
|
110
|
-
it("
|
|
113
|
+
it("keeps deferred bindings local to each external script", () => {
|
|
114
|
+
/* Two scripts may import the same name: each prelude destructures into its
|
|
115
|
+
* own script function, so there is no module-scope collision. */
|
|
111
116
|
const directory = writeFiles({
|
|
112
117
|
"a.ts": 'import { x } from "./x";\nconsole.log(x);',
|
|
113
118
|
"b.ts": 'import { x } from "./y";\nconsole.log(x);',
|
|
@@ -115,7 +120,10 @@ describe("gui .html asset loader", () => {
|
|
|
115
120
|
"y.ts": "export const x = 2;",
|
|
116
121
|
});
|
|
117
122
|
const htmlPath = join(directory, "page.html");
|
|
118
|
-
|
|
123
|
+
const { moduleSource } = loadHtmlAsset(htmlPath, `<script src="./a.ts"></script><script src="./b.ts"></script>`);
|
|
124
|
+
expect(moduleSource).toContain("__xt_deferred_0_0");
|
|
125
|
+
expect(moduleSource).toContain("__xt_deferred_1_0");
|
|
126
|
+
expect(parseDiagnostics(moduleSource)).toBe(0);
|
|
119
127
|
});
|
|
120
128
|
it("emits only the HTML string when there are no scripts", () => {
|
|
121
129
|
const { moduleSource } = loadHtmlAsset("page.html", "<h1>hi</h1>");
|
|
@@ -129,7 +137,7 @@ describe("gui .html asset loader", () => {
|
|
|
129
137
|
expect(moduleSource.indexOf(hashString(first))).toBeLessThan(moduleSource.indexOf(hashString(second)));
|
|
130
138
|
expect(parseDiagnostics(moduleSource)).toBe(0);
|
|
131
139
|
});
|
|
132
|
-
it("
|
|
140
|
+
it("defers namespace, side-effect and re-export statements", () => {
|
|
133
141
|
const directory = writeFiles({
|
|
134
142
|
"app.ts": [
|
|
135
143
|
'import * as util from "./util";',
|
|
@@ -146,11 +154,15 @@ describe("gui .html asset loader", () => {
|
|
|
146
154
|
});
|
|
147
155
|
const htmlPath = join(directory, "page.html");
|
|
148
156
|
const { moduleSource } = loadHtmlAsset(htmlPath, `<script src="./app.ts"></script>`);
|
|
149
|
-
expect(moduleSource).toContain('
|
|
150
|
-
expect(moduleSource).toContain('
|
|
151
|
-
expect(moduleSource).toContain('
|
|
152
|
-
expect(moduleSource).toContain(
|
|
153
|
-
expect(moduleSource).toContain(
|
|
157
|
+
expect(moduleSource).toContain('from "./util"');
|
|
158
|
+
expect(moduleSource).toContain('from "./side-effect"');
|
|
159
|
+
expect(moduleSource).toContain('from "./mixed"');
|
|
160
|
+
expect(moduleSource).toContain("const util = __xt_deferred_0_0();");
|
|
161
|
+
expect(moduleSource).toContain("__xt_deferred_0_1();");
|
|
162
|
+
expect(moduleSource).toContain("const defaultExport = __xt_deferred_0_2().default;");
|
|
163
|
+
expect(moduleSource).toContain("const { named } = __xt_deferred_0_2();");
|
|
164
|
+
expect(moduleSource).toContain("__xt_deferred_0_3();");
|
|
165
|
+
expect(moduleSource).toContain("__xt_deferred_0_4();");
|
|
154
166
|
/* The local `export { a }` and `export default` are blanked out. */
|
|
155
167
|
expect(moduleSource).not.toContain("export default 42");
|
|
156
168
|
expect(moduleSource).not.toContain("export default function");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gui.test.js","sourceRoot":"","sources":["../../../tests/extensions/gui.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gui.test.js","sourceRoot":"","sources":["../../../tests/extensions/gui.test.ts"],"names":[],"mappings":"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"}
|
package/doc/gui/api.md
CHANGED
|
@@ -21,13 +21,41 @@ Methods implemented on a window handle: `setTitle` / `setSize` / `loadHTML` /
|
|
|
21
21
|
`getHTML` / `setBackground` / `close` / `isOpen` / `on` / `off`, plus `driver()`,
|
|
22
22
|
which reports the SDL_GPU backend in use (`"vulkan"`, `"direct3d12"`, `"metal"`,
|
|
23
23
|
… — SDL picks the best one the device supports). The Web spellings are available
|
|
24
|
-
too: `addEventListener` / `removeEventListener`
|
|
25
|
-
`
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
`
|
|
24
|
+
too: `addEventListener` / `removeEventListener` take the standard options bag
|
|
25
|
+
(`capture`, `once`, `passive`, `signal`), and `closed` mirrors `isOpen()`, so a
|
|
26
|
+
document written against the browser API runs unchanged.
|
|
27
|
+
|
|
28
|
+
Element listeners accept the same options: `{ once }` drops the listener after
|
|
29
|
+
its first call, `{ passive: true }` makes `preventDefault()` a no-op, and
|
|
30
|
+
`{ signal }` (an `AbortSignal` from `new AbortController()`) removes it on
|
|
31
|
+
abort, including a signal that was already aborted when the listener was added.
|
|
32
|
+
`element.dispatchEvent(event)` dispatches the *same* event object (identity is
|
|
33
|
+
observable), fills in `target` / `currentTarget` / `eventPhase` and records the
|
|
34
|
+
path for `event.composedPath()`. `new Event(...)`, `new CustomEvent(...)`,
|
|
35
|
+
`new MouseEvent(...)`, `new KeyboardEvent(...)`, `new PointerEvent(...)`,
|
|
36
|
+
`new WheelEvent(...)`, `new FocusEvent(...)`, `new InputEvent(...)` and
|
|
37
|
+
`new SubmitEvent(...)` keep every field of their `init` object (`detail`,
|
|
38
|
+
`composed`, the mouse/keyboard members, …). Window listeners take the same bag
|
|
39
|
+
(capture is part of listener identity; window delivery has no capture phase).
|
|
40
|
+
|
|
41
|
+
Window navigation is real: `scrollTo(x, y)` / `scrollTo({ left, top })` /
|
|
42
|
+
`scrollBy(...)` move the page viewport (clamped to the content bounds; painting
|
|
43
|
+
and hit testing follow it), and `scrollX` / `scrollY` / `pageXOffset` /
|
|
44
|
+
`pageYOffset` report it. `focus()` raises the OS window and sets
|
|
45
|
+
`document.hasFocus()`; `blur()` clears it. Events emitted:
|
|
46
|
+
`ready` (after the first presented frame), `load`, `close`, `resize`, `scroll`,
|
|
47
|
+
`focus`, `blur` and the input events `mousemove`, `mousedown`, `mouseup`,
|
|
48
|
+
`click`, `wheel`, `keydown`, `keyup`.
|
|
49
|
+
|
|
50
|
+
`createWindow(options)` honours more than the title and size:
|
|
51
|
+
`{ title, width, height, highDensity, resizable, borderless, alwaysOnTop,
|
|
52
|
+
hidden, fullscreen, x, y, opacity, maximized, minimized }` map to the matching
|
|
53
|
+
SDL window flags/calls instead of being ignored.
|
|
54
|
+
|
|
55
|
+
`window.confirm(message)` / `window.prompt(message, defaultValue)` never drop
|
|
56
|
+
their arguments: with `XT_GUI_DIALOGS=1` and a live window they show a native
|
|
57
|
+
message box; otherwise the message goes to stderr and the documented default is
|
|
58
|
+
returned (`confirm` → `false`, `prompt` → `defaultValue` or `""`).
|
|
31
59
|
|
|
32
60
|
On Windows a GUI program is linked as a **Windows-subsystem** executable, so
|
|
33
61
|
launching it does not flash a console window. That also means stdout/stderr go
|
|
@@ -63,12 +91,13 @@ requestAnimationFrame(frame);
|
|
|
63
91
|
| `navigator` | `userAgent` (a desktop Chrome string ending in `xbintsc`), `platform`, `vendor`, `language(s)`, `hardwareConcurrency`, `maxTouchPoints`, `onLine`, `vibrate()` |
|
|
64
92
|
| `localStorage` | an in-memory `getItem` / `setItem` / `removeItem` / `clear` / `key` / `length` store |
|
|
65
93
|
| `AudioContext`, `webkitAudioContext` | a Web Audio graph with a real mixer and decoder (see below) |
|
|
66
|
-
| `Event`, `CustomEvent`, `ProgressEvent`,
|
|
94
|
+
| `Event`, `CustomEvent`, `ProgressEvent`, `MouseEvent`, `KeyboardEvent`, `PointerEvent`, `WheelEvent`, `FocusEvent`, `InputEvent`, `SubmitEvent` | event constructors; the `init` argument is kept as given (`detail`, `composed`, mouse/keyboard fields, …) |
|
|
95
|
+
| `AbortController`, `AbortSignal` | a real controller/signal pair for `{ signal }` listener removal, with `abort()`, `aborted`, `reason`, `onabort` and `throwIfAborted()` |
|
|
67
96
|
| `HTMLCanvasElement`, `HTMLImageElement`, `WebGLRenderingContext`, `WebGL2RenderingContext`, `WebGLBuffer`/`WebGLTexture`/`WebGLShader`/`WebGLProgram`/`WebGLFramebuffer`/`WebGLRenderbuffer`/`WebGLUniformLocation`/`WebGLActiveInfo`/`WebGLVertexArrayObject`/`WebGLSampler`/`WebGLQuery`/`WebGLSync`/`WebGLTransformFeedback` | real constructor values. `canvas.getContext("webgl")` and `getContext("webgl2")` return GPU contexts (see [WebGL](./webgl.md)). |
|
|
68
97
|
| `ImageBitmap`, `createImageBitmap(source)` | immutable bitmaps backed by decoded pixels (`<img>`, `<canvas>`, `<video>` frames and `ImageData` shapes); the promise resolves immediately and `texImage2D` accepts the result |
|
|
69
98
|
| `ImageData`, `OffscreenCanvas`, `XRWebGL*`, `Request`, `Headers`, `Response`, `ReadableStream`, `DOMParser` | `typeof` probes answer `"undefined"` (no XR/fetch/streaming backend), which lets a page take its "unsupported" branch instead of calling a no-op stub. Three.js pages use its real renderer on this backend (see [Known issues](./known-issues.md)). |
|
|
70
99
|
| `requestAnimationFrame` / `cancelAnimationFrame` | queued on the window's frame list; see [Runtime integration](./runtime.md) |
|
|
71
|
-
| `alert` / `confirm` / `prompt`, `matchMedia`, `getComputedStyle`, `escape` | host implementations (Annex B `escape` encodes per UTF-16 code unit, matching `decodeURIComponent(escape(bytes))`) |
|
|
100
|
+
| `alert` / `confirm` / `prompt`, `matchMedia`, `getComputedStyle`, `escape` | host implementations. `matchMedia` returns a **live** list (cached per query): `matches` is re-evaluated on resize and `change` listeners fire when it flips. `confirm`/`prompt` use a native dialog only with `XT_GUI_DIALOGS=1`; otherwise they report the message on stderr and return the documented default (Annex B `escape` encodes per UTF-16 code unit, matching `decodeURIComponent(escape(bytes))`) |
|
|
72
101
|
|
|
73
102
|
`getElementById` / `querySelector` are answered even before `loadHTML` runs: the
|
|
74
103
|
handle is *pending* and binds to the real node the first time it is used, so a
|
package/doc/gui/canvas.md
CHANGED
|
@@ -36,12 +36,20 @@ a shared prototype. The handle is cached on the element, so every call returns
|
|
|
36
36
|
the **same** object and the drawing state (transform, styles, path) is per
|
|
37
37
|
canvas, not per call. `ctx.canvas` is the owning element handle.
|
|
38
38
|
|
|
39
|
+
`getContext("2d", attributes)` honours `alpha` on the first call: with
|
|
40
|
+
`{ alpha: false }` the bitmap starts (and clears) opaque black. The other
|
|
41
|
+
attributes are reported by `getContextAttributes()` at their specification
|
|
42
|
+
defaults (`antialias: true`, `depth: true`, `stencil: false`,
|
|
43
|
+
`premultipliedAlpha: true`, `preserveDrawingBuffer: false`, `colorSpace:
|
|
44
|
+
"srgb"`, …), so a feature test gets an honest answer.
|
|
45
|
+
|
|
39
46
|
## Drawing model
|
|
40
47
|
|
|
41
48
|
The rasteriser is deliberately small and self-written (no Skia/Cairo). It
|
|
42
49
|
anti-aliases with **4 vertical sub-scanlines** per pixel row and an **analytic
|
|
43
50
|
horizontal coverage** pass, and fills paths with the **non-zero winding rule**
|
|
44
|
-
(so `arc`-shaped holes work when wound the other way)
|
|
51
|
+
(so `arc`-shaped holes work when wound the other way) unless
|
|
52
|
+
`fill("evenodd")` selects the even-odd rule. An axis-aligned rectangle
|
|
45
53
|
(`b == 0 && c == 0` in the transform) takes a direct coverage fast path.
|
|
46
54
|
Blending is non-premultiplied source-over, scaled by `globalAlpha`.
|
|
47
55
|
|
|
@@ -63,10 +71,11 @@ matching GPU texture.
|
|
|
63
71
|
|
|
64
72
|
State and transforms: `save` / `restore` (which restore the transform, line
|
|
65
73
|
width, alpha, font/text settings **and** the fill/stroke styles),
|
|
66
|
-
`translate`, `rotate`, `scale`, `transform(a,b,c,d,e,f)
|
|
67
|
-
`
|
|
68
|
-
|
|
69
|
-
|
|
74
|
+
`translate`, `rotate`, `scale`, `transform(a,b,c,d,e,f)` / `transform(matrix)`,
|
|
75
|
+
`setTransform(a,b,c,d,e,f)` / `setTransform(matrix)`, `resetTransform`,
|
|
76
|
+
`getTransform` (returns an object with `a`…`f` and `is2D`). A matrix is a
|
|
77
|
+
`{ a, b, c, d, e, f }` object or a six-element array. Transforms compose in
|
|
78
|
+
canvas order: `translate(x, y); rotate(a)` rotates around the translated origin.
|
|
70
79
|
|
|
71
80
|
Styles and settings: `fillStyle` / `strokeStyle` (CSS colors understood by the
|
|
72
81
|
cascade's color parser, or a `CanvasGradient`), `lineWidth`, `globalAlpha`,
|
|
@@ -86,10 +95,18 @@ distance from the **outer** circle's centre (`x1, y1`), so `x0`/`y0` are
|
|
|
86
95
|
currently ignored: use concentric circles (`x0 == x1`, `y0 == y1`).
|
|
87
96
|
|
|
88
97
|
Paths: `beginPath`, `closePath`, `moveTo`, `lineTo`, `rect`, `roundRect`,
|
|
89
|
-
`arc`, `ellipse`, `quadraticCurveTo`, `bezierCurveTo`, then
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
98
|
+
`arc`, `ellipse`, `quadraticCurveTo`, `bezierCurveTo`, then
|
|
99
|
+
`fill(fillRule?)` / `fill(path, fillRule?)` (multi-loop; `"nonzero"` or
|
|
100
|
+
`"evenodd"`) or `stroke(path?)`. Bezier and quadratic segments are flattened
|
|
101
|
+
into line segments; arcs and ellipses are flattened too. `roundRect` accepts a
|
|
102
|
+
single radius number or the CSS radius list (`[all]`, `[tl, br]`,
|
|
103
|
+
`[tl, tr, br]`, `[tl, tr, br, bl]`, numbers or `{ x, y }` pairs; corners are
|
|
104
|
+
drawn circular).
|
|
105
|
+
|
|
106
|
+
`Path2D` is implemented with the same path commands (`moveTo`, `lineTo`,
|
|
107
|
+
`closePath`, `rect`, `roundRect`, `arc`, `ellipse`, `quadraticCurveTo`,
|
|
108
|
+
`bezierCurveTo`, `addPath`) and can be passed to `fill`/`stroke`, so a path can
|
|
109
|
+
be built once and replayed under different transforms.
|
|
93
110
|
|
|
94
111
|
Rectangles: `clearRect`, `fillRect`, `strokeRect`.
|
|
95
112
|
|
|
@@ -97,9 +114,12 @@ Dashes: `setLineDash(segments)` / `getLineDash()` / `lineDashOffset` implement
|
|
|
97
114
|
the standard pattern rules (an odd-length list is duplicated, negative or
|
|
98
115
|
non-finite entries are ignored, an all-zero list means a solid line).
|
|
99
116
|
|
|
100
|
-
Text: `measureText(text)` (returns `{ width }`), `fillText(text, x, y
|
|
101
|
-
`strokeText(text, x, y)`. Text is shaped with
|
|
102
|
-
FreeType (the same stack as HTML text) at the
|
|
117
|
+
Text: `measureText(text)` (returns `{ width }`), `fillText(text, x, y,
|
|
118
|
+
maxWidth?)` and `strokeText(text, x, y, maxWidth?)`. Text is shaped with
|
|
119
|
+
HarfBuzz and rasterised with FreeType (the same stack as HTML text) at the
|
|
120
|
+
transform's approximate scale. A positive `maxWidth` condenses advances and
|
|
121
|
+
glyph bitmaps horizontally so the run is at most that wide (as the canvas API
|
|
122
|
+
specifies) instead of being ignored.
|
|
103
123
|
**Only translation and uniform scale are honoured** — a rotated or skewed
|
|
104
124
|
transform still places each glyph at its transformed baseline point but does not
|
|
105
125
|
rotate the glyph bitmaps. `strokeText` currently fills with the stroke style
|
|
@@ -119,14 +139,25 @@ Test hook: `getImageData(x, y, w, h)` copies a region to
|
|
|
119
139
|
`{ width, height, data }` where `data` is a row-major RGBA8 byte array.
|
|
120
140
|
Out-of-bounds pixels are transparent.
|
|
121
141
|
|
|
142
|
+
Patterns: `createPattern(source, repetition?)` accepts an `<img>` or another
|
|
143
|
+
`<canvas>` and tiles it in user space (`repeat`, `repeat-x`, `repeat-y`,
|
|
144
|
+
`no-repeat`), so the tiles follow the current transform. Assign the result to
|
|
145
|
+
`fillStyle`/`strokeStyle`; assigning a colour replaces it.
|
|
146
|
+
|
|
147
|
+
Image data and export: `createImageData(width, height)` allocates a blank
|
|
148
|
+
`{ width, height, data }`, and `putImageData(imageData, dx, dy[, dirtyX, dirtyY,
|
|
149
|
+
dirtyWidth, dirtyHeight])` copies bytes straight into the bitmap (no transform,
|
|
150
|
+
blending or `globalAlpha`). `canvas.toDataURL(type?)` exports a PNG data URL and
|
|
151
|
+
`canvas.toBlob(callback, type?)` delivers a Blob-shaped `{ type, size }` from a
|
|
152
|
+
microtask (the bytes are on `__xt_gui_blob_data`; there is no
|
|
153
|
+
`URL.createObjectURL`).
|
|
154
|
+
|
|
122
155
|
## Not implemented
|
|
123
156
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
`
|
|
127
|
-
|
|
128
|
-
(`OffscreenCanvas`, `transferControlToOffscreen`). `roundRect` takes a single
|
|
129
|
-
radius, and radial gradients ignore the inner circle's offset.
|
|
157
|
+
Shadows, `clip()`, `globalCompositeOperation`, `isPointInPath`, `drawImage` with
|
|
158
|
+
an image smoothing toggle, `<canvas>` as a CSS `background-image`, and offscreen
|
|
159
|
+
canvases (`OffscreenCanvas`, `transferControlToOffscreen`).
|
|
160
|
+
Radial gradients ignore the inner circle's offset.
|
|
130
161
|
|
|
131
162
|
See also [Media](./media.md) for the image/video/audio decode stack that
|
|
132
163
|
`drawImage` and the texture upload share.
|
package/doc/gui/dom.md
CHANGED
|
@@ -72,18 +72,65 @@ created.textContent = "added";
|
|
|
72
72
|
box.appendChild(created);
|
|
73
73
|
box.removeChild(created);
|
|
74
74
|
|
|
75
|
+
// Parent/child helpers accept nodes and strings in one call.
|
|
76
|
+
box.append("text", doc.createElement("span"));
|
|
77
|
+
box.prepend(doc.createElement("b"));
|
|
78
|
+
box.insertAdjacentHTML("beforeend", "<i>tail</i>"); // beforebegin/afterbegin/beforeend/afterend
|
|
79
|
+
box.replaceChildren("fresh", doc.createElement("em"));
|
|
80
|
+
|
|
81
|
+
// Namespaces are recorded; foreign (SVG) element names keep their case.
|
|
82
|
+
const gradient = doc.createElementNS("http://www.w3.org/2000/svg", "svg:linearGradient");
|
|
83
|
+
console.log(gradient.namespaceURI, gradient.localName, gradient.prefix);
|
|
84
|
+
|
|
75
85
|
inner.addEventListener("click", (e) => console.log(e.target.id, e.currentTarget.id));
|
|
76
86
|
inner.click(); // synthesise a click at the element
|
|
77
87
|
console.log(box.offsetWidth, box.offsetHeight); // rounded border box
|
|
78
88
|
console.log(box.contains(inner)); // descendant test
|
|
79
89
|
```
|
|
80
90
|
|
|
91
|
+
### Style properties, dataset, computed style and geometry
|
|
92
|
+
|
|
93
|
+
The inline `style` object is a CSSOM declaration block. Named access reads and
|
|
94
|
+
writes the same block as `setProperty` (`el.style.display = "none"`,
|
|
95
|
+
`el.style.backgroundColor = "#f00"`, camelCase mapped to the CSS spelling, and
|
|
96
|
+
`el.style["--accent"]` for custom properties); `setProperty(name, value,
|
|
97
|
+
priority)` stores `!important` when `priority` is `"important"` (any other
|
|
98
|
+
priority makes the call a no-op, and an empty value removes the property).
|
|
99
|
+
`getPropertyValue` / `getPropertyPriority` read it back, `removeProperty`
|
|
100
|
+
returns the previous value, `cssText` gets or replaces the whole block,
|
|
101
|
+
`style.length` / `style.item(i)` enumerate it, and an unset property answers
|
|
102
|
+
`""`.
|
|
103
|
+
|
|
104
|
+
`el.dataset` is a live `DOMStringMap` over the element's `data-*` attributes:
|
|
105
|
+
`dataset.fooBar` reads `data-foo-bar`, assignment writes the attribute, `delete`
|
|
106
|
+
removes it, and `Object.keys(dataset)` / `for...in` list only the data keys.
|
|
107
|
+
|
|
108
|
+
`getComputedStyle(el, pseudoElt)` answers from the **cascade** — the UA sheet,
|
|
109
|
+
author rules, inheritance and the inline declarations — rather than echoing the
|
|
110
|
+
inline block, so a stylesheet rule is visible. It exposes `getPropertyValue`,
|
|
111
|
+
`getPropertyPriority` and named properties (`cs.width`, `cs.backgroundColor`,
|
|
112
|
+
`cs["--accent"]`). Pass `"::before"`/`"::after"` to read generated content; any
|
|
113
|
+
other pseudo-element answers empty values. Every read flushes a pending restyle,
|
|
114
|
+
so a handle created early stays live after later mutations.
|
|
115
|
+
|
|
116
|
+
`getBoundingClientRect()` carries the legacy `top` / `right` / `bottom` / `left`
|
|
117
|
+
members next to `x` / `y` / `width` / `height`, and `document.title = …` writes
|
|
118
|
+
the document's `<title>` (creating the element, and a `<head>`, when the page
|
|
119
|
+
has none).
|
|
120
|
+
|
|
81
121
|
Mutations mark the document dirty; the engine restyles + relayouts lazily (before
|
|
82
122
|
the next read or frame). `inner = …`/`innerHTML = …` do **not** run scripts.
|
|
83
|
-
Element events support capture and bubble phases, `stopPropagation`, `once`,
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
123
|
+
Element events support capture and bubble phases, `stopPropagation`, `once`,
|
|
124
|
+
`passive` and `signal` (an `AbortController`'s signal removes the listener), and
|
|
125
|
+
bubble up to `document`/`window`. `dispatchEvent` dispatches the same event
|
|
126
|
+
object and fills in `target`/`currentTarget`/`eventPhase`/`composedPath()`. The
|
|
127
|
+
legacy `win.on(type, fn)` payload keeps its **string** `e.target`
|
|
128
|
+
(`div#id.class`); the element `Event.target` is a handle whose descriptor
|
|
129
|
+
matches the same string.
|
|
130
|
+
|
|
131
|
+
`element.focus()` scrolls the element into view (pass `{ preventScroll: true }`
|
|
132
|
+
to keep the page offset), and `document.hasFocus()` reports the window state
|
|
133
|
+
toggled by `window.focus()` / `window.blur()`.
|
|
87
134
|
|
|
88
135
|
### Node lifetime
|
|
89
136
|
|