From 2844fd25c3aec392483fbc492b8fcd2229bff466 Mon Sep 17 00:00:00 2001 From: wangdequan Date: Sun, 14 Jun 2026 23:02:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A8=E8=BF=9B=20INI=20=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=20control=20page=20entry?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- text11.txt | 60 +++++++ wasm-port/docs/ui-panel-state-summary.md | 3 + .../runtime/ui/ini-panel/control-page.html | 106 ++++++++++++ .../runtime/ui/ini-panel/control-page.js | 58 +++++++ .../browser/ini_panel_control_page_smoke.html | 162 ++++++++++++++++++ .../tests/browser/verify_ini_panel_browser.sh | 19 ++ 6 files changed, 408 insertions(+) create mode 100644 wasm-port/runtime/ui/ini-panel/control-page.html create mode 100644 wasm-port/runtime/ui/ini-panel/control-page.js create mode 100644 wasm-port/tests/browser/ini_panel_control_page_smoke.html diff --git a/text11.txt b/text11.txt index 3a0b934..ff3701d 100644 --- a/text11.txt +++ b/text11.txt @@ -1143,3 +1143,63 @@ host_wasm_opfs_browser_smokes=ok 小型控制页入口或 example page:只读取 `linuxCncIniPanelApi`,展示当前 machine/session/run 状态,不新增控制按钮,不解析 G-code。若要优先 SDK/API surface,也可以先把当前 state bundle/control view renderer 的导出面整理进一个明确的 UI module 文档入口。 + +十三、2026-06-14 继续执行记录:INI panel control page entry + +本轮按“加快实质性推进”继续把只读 control view 从 renderer 推到可直接打开的页面入口, +新增一个独立的控制页 example,并把 browser smoke 扩展为双入口验证。 + +完成内容: + +- 新增 `wasm-port/runtime/ui/ini-panel/control-page.html`; +- 新增 `wasm-port/runtime/ui/ini-panel/control-page.js`; +- control page 通过隐藏 iframe 载入真实 `runtime/ui/ini-panel/index.html`,只读读取 + `window.linuxCncIniPanelApi.getMachineSessionControlView()`; +- control page 把当前 status 与 sections 镜像到可见页面; +- 继续沿用现有 `renderMachineSessionControlView(container, view)`,没有新增控制按钮; +- 新增 `wasm-port/tests/browser/ini_panel_control_page_smoke.html`,覆盖 control page 入口、 + iframe 内面板 API、渲染轮询和 DOM 输出; +- `wasm-port/tests/browser/verify_ini_panel_browser.sh` 现同时验证: + - `browser_ini_opfs_smoke=ok` + - `browser_ini_control_page_smoke=ok` +- `wasm-port/docs/ui-panel-state-summary.md` 增加 control page 入口说明; +- 未解析 G-code; +- 未解释 canonical events; +- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或 + LinuxCNC-owned runtime semantics。 + +验证已通过: + +```bash +git diff --check +wasm-port/tests/browser/verify_ini_panel_browser.sh +wasm-port/tests/ui/node/verify_ui_node_smokes.sh +wasm-port/tools/verify_vendor_sync.sh +wasm-port/tools/verify_no_standalone_cnc_semantics.sh +SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh +SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh +wasm-port/tests/host/verify_host_smokes.sh +``` + +关键输出: + +```text +browser_ini_opfs_smoke=ok +browser_ini_control_page_smoke=ok +ui_node_smokes=ok +vendor sync up to date +standalone CNC semantics guard complete +interp_wasm_node_smoke=ok +sim_configs_wasm_node_inventory_executed=28 +sim_configs_wasm_node_inventory_passed=28 +sim_configs_wasm_node_inventory_skipped=131 +sim_configs_wasm_node_inventory_unexpected_fail=0 +host_wasm_opfs_browser_smokes=ok +``` + +下一步建议: + +继续把这个控制页入口向“可复用上层入口”推进。下一批建议把 +`control-page.html/js` 的页面消费逻辑抽成更小的页面 controller helper,或者直接加一个 +只读导航入口页,把 `index.html` 与 `control-page.html` 作为并列入口统一暴露;仍保持 +只读,不新增控制按钮,不解析 G-code。 diff --git a/wasm-port/docs/ui-panel-state-summary.md b/wasm-port/docs/ui-panel-state-summary.md index 0698e04..e94332d 100644 --- a/wasm-port/docs/ui-panel-state-summary.md +++ b/wasm-port/docs/ui-panel-state-summary.md @@ -26,6 +26,9 @@ For direct rendering, use `window.linuxCncIniPanelApi.getMachineSessionControlVi The panel also exposes `window.linuxCncIniPanelApi.renderMachineSessionControlView(container)`, which renders the current view into a supplied DOM container. +For a ready-made read-only page, open +`runtime/ui/ini-panel/control-page.html`. It embeds the panel in a hidden iframe +and mirrors the same control view into the visible page. ## `createIniPanelStateSummary(input)` diff --git a/wasm-port/runtime/ui/ini-panel/control-page.html b/wasm-port/runtime/ui/ini-panel/control-page.html new file mode 100644 index 0000000..0cf9e3f --- /dev/null +++ b/wasm-port/runtime/ui/ini-panel/control-page.html @@ -0,0 +1,106 @@ + + + + + + LinuxCNC INI Control View + + + +
+
+

LinuxCNC INI Control View

+
waiting for panel
+
+
+
+ + + + diff --git a/wasm-port/runtime/ui/ini-panel/control-page.js b/wasm-port/runtime/ui/ini-panel/control-page.js new file mode 100644 index 0000000..1840de6 --- /dev/null +++ b/wasm-port/runtime/ui/ini-panel/control-page.js @@ -0,0 +1,58 @@ +import { + renderMachineSessionControlView, +} from "./control-view-renderer.js"; + +const panelFrameNode = document.getElementById("panel-frame"); +const statusNode = document.getElementById("control-page-status"); +const viewNode = document.getElementById("control-page-view"); + +let refreshTimer = null; + +function getPanelWindow() { + return panelFrameNode?.contentWindow ?? null; +} + +function getPanelApi() { + return getPanelWindow()?.linuxCncIniPanelApi ?? null; +} + +function getControlView() { + return getPanelApi()?.getMachineSessionControlView?.() ?? null; +} + +function renderControlPage() { + const view = getControlView(); + if (!view) { + statusNode.textContent = "waiting for panel"; + viewNode.textContent = ""; + return null; + } + + statusNode.textContent = [ + view.status.lastAction ?? "-", + view.status.runStatus ?? "-", + view.status.error ?? "-", + ].join(" | "); + return renderMachineSessionControlView(viewNode, view); +} + +function startPolling() { + if (!refreshTimer) { + refreshTimer = setInterval(renderControlPage, 200); + } +} + +panelFrameNode.addEventListener("load", () => { + renderControlPage(); + startPolling(); +}); + +panelFrameNode.src = "./index.html"; +renderControlPage(); +startPolling(); + +window.linuxCncIniPanelControlPageApi = { + getControlView, + getPanelApi, + renderControlPage, +}; diff --git a/wasm-port/tests/browser/ini_panel_control_page_smoke.html b/wasm-port/tests/browser/ini_panel_control_page_smoke.html new file mode 100644 index 0000000..4de8125 --- /dev/null +++ b/wasm-port/tests/browser/ini_panel_control_page_smoke.html @@ -0,0 +1,162 @@ + + + + + LinuxCNC INI Control Page Smoke + + +
running
+ + + diff --git a/wasm-port/tests/browser/verify_ini_panel_browser.sh b/wasm-port/tests/browser/verify_ini_panel_browser.sh index 5bc985e..8de1b3e 100755 --- a/wasm-port/tests/browser/verify_ini_panel_browser.sh +++ b/wasm-port/tests/browser/verify_ini_panel_browser.sh @@ -61,7 +61,9 @@ fi PORT="$(cat "$PORT_FILE")" URL="http://127.0.0.1:$PORT/tests/browser/ini_panel_smoke.html" +CONTROL_URL="http://127.0.0.1:$PORT/tests/browser/ini_panel_control_page_smoke.html" OUT="$TMP_DIR/chromium.out" +CONTROL_OUT="$TMP_DIR/chromium-control.out" "$CHROMIUM" \ --headless=new \ @@ -79,3 +81,20 @@ if ! grep -Fq "browser_ini_opfs_smoke=ok" "$OUT"; then fi echo "browser_ini_opfs_smoke=ok" + +"$CHROMIUM" \ + --headless=new \ + --disable-gpu \ + --no-sandbox \ + --user-data-dir="$CHROME_PROFILE" \ + --virtual-time-budget=10000 \ + --dump-dom \ + "$CONTROL_URL" >"$CONTROL_OUT" 2>&1 + +if ! grep -Fq "browser_ini_control_page_smoke=ok" "$CONTROL_OUT"; then + echo "browser INI control page smoke failed" >&2 + sed -n '1,220p' "$CONTROL_OUT" >&2 + exit 1 +fi + +echo "browser_ini_control_page_smoke=ok"