推进 INI 面板 workflow overview embedding contract
This commit is contained in:
@@ -23,9 +23,9 @@
|
||||
}
|
||||
}
|
||||
|
||||
async function loadLaunchFrame() {
|
||||
async function loadFrame(src) {
|
||||
const frame = document.createElement("iframe");
|
||||
frame.src = "../../runtime/ui/ini-panel/launch.html";
|
||||
frame.src = src;
|
||||
document.body.appendChild(frame);
|
||||
await new Promise((resolve, reject) => {
|
||||
frame.addEventListener("load", resolve, { once: true });
|
||||
@@ -34,6 +34,10 @@
|
||||
return frame.contentDocument;
|
||||
}
|
||||
|
||||
async function loadLaunchFrame() {
|
||||
return loadFrame("../../runtime/ui/ini-panel/launch.html");
|
||||
}
|
||||
|
||||
try {
|
||||
const visibleEntries = getVisibleIniPanelEntries();
|
||||
assertEqual(visibleEntries.length, 3, "launch visible entry length");
|
||||
@@ -96,6 +100,9 @@
|
||||
!launchApi?.getShellSessionHandoffPackageMountDisplayViewModel ||
|
||||
!launchApi?.getShellSessionHandoffPackageMountRenderState ||
|
||||
!launchApi?.renderShellSessionHandoffMountState ||
|
||||
!launchApi?.getWorkflowOverviewContract ||
|
||||
!launchApi?.getWorkflowOverviewReadiness ||
|
||||
!launchApi?.mountWorkflowOverviewEmbedding ||
|
||||
!launchApi?.isSupportedShellSessionHandoffPackage ||
|
||||
!launchApi?.getLauncherLinks ||
|
||||
!launchApi?.getControlPageApiMethods
|
||||
@@ -158,6 +165,7 @@
|
||||
const shellSessionHandoffPackageMountState = launchApi.getShellSessionHandoffPackageMountState();
|
||||
const shellSessionHandoffPackageMountDisplayViewModel = launchApi.getShellSessionHandoffPackageMountDisplayViewModel();
|
||||
const shellSessionHandoffPackageMountRenderState = launchApi.getShellSessionHandoffPackageMountRenderState();
|
||||
const workflowOverviewContract = launchApi.getWorkflowOverviewContract();
|
||||
assertEqual(
|
||||
shellIntegrationSchema.manifestVersion,
|
||||
1,
|
||||
@@ -403,6 +411,21 @@
|
||||
"Blocked: session-load-state",
|
||||
"shell session handoff package mount render-state status",
|
||||
);
|
||||
assertEqual(
|
||||
workflowOverviewContract.pageHref,
|
||||
"./workflow-overview.html",
|
||||
"workflow overview contract page",
|
||||
);
|
||||
assertEqual(
|
||||
workflowOverviewContract.apiName,
|
||||
"linuxCncIniPanelWorkflowOverviewApi",
|
||||
"workflow overview contract API name",
|
||||
);
|
||||
assertEqual(
|
||||
workflowOverviewContract.methodNames.includes("mountWorkflowOverview"),
|
||||
true,
|
||||
"workflow overview contract mount method",
|
||||
);
|
||||
assertEqual(
|
||||
shellSessionHandoffPackage.ready,
|
||||
true,
|
||||
@@ -598,6 +621,32 @@
|
||||
createControlPageBrowserApiMethods().join(","),
|
||||
"launch API control-page browser methods",
|
||||
);
|
||||
const workflowOverviewDoc = await loadFrame("../../runtime/ui/ini-panel/workflow-overview.html");
|
||||
const workflowOverviewApi = workflowOverviewDoc.defaultView.linuxCncIniPanelWorkflowOverviewApi;
|
||||
if (
|
||||
!workflowOverviewApi?.getWorkflowOverviewRenderState ||
|
||||
!workflowOverviewApi?.getWorkflowOverviewContract ||
|
||||
!workflowOverviewApi?.getWorkflowOverviewReadinessFromApi ||
|
||||
!workflowOverviewApi?.mountWorkflowOverviewEmbedding
|
||||
) {
|
||||
throw new Error("workflow overview API namespace did not expose shell helpers");
|
||||
}
|
||||
const workflowOverviewReadiness = launchApi.getWorkflowOverviewReadiness({
|
||||
overviewApi: workflowOverviewApi,
|
||||
});
|
||||
const workflowOverviewEmbedding = launchApi.mountWorkflowOverviewEmbedding({
|
||||
overviewApi: workflowOverviewApi,
|
||||
});
|
||||
assertEqual(workflowOverviewApi.getWorkflowOverviewContract().pageHref, "./workflow-overview.html", "workflow overview page contract");
|
||||
assertEqual(workflowOverviewReadiness.ready, true, "workflow overview readiness");
|
||||
assertEqual(workflowOverviewReadiness.missing.join(","), "", "workflow overview readiness missing");
|
||||
assertEqual(workflowOverviewApi.getWorkflowOverviewReadinessFromApi().ready, true, "workflow overview self readiness");
|
||||
assertEqual(workflowOverviewEmbedding.apiName, "ini-panel-shell-workflow-overview-embedding", "workflow overview embedding API name");
|
||||
assertEqual(workflowOverviewEmbedding.pageHref, "./workflow-overview.html", "workflow overview embedding page");
|
||||
assertEqual(workflowOverviewEmbedding.ready, false, "workflow overview embedding default readiness");
|
||||
assertEqual(workflowOverviewEmbedding.renderState.dataset.handoffScope, "workflow", "workflow overview embedding scope");
|
||||
assertEqual(workflowOverviewEmbedding.mountResult.renderResult.rowCount, 5, "workflow overview embedding rows");
|
||||
assertEqual(workflowOverviewEmbedding.error, null, "workflow overview embedding error");
|
||||
status.textContent = "browser_ini_launch_smoke=ok";
|
||||
console.log("browser_ini_launch_smoke=ok");
|
||||
} catch (error) {
|
||||
|
||||
@@ -102,12 +102,16 @@ TOOL_TABLE = browser-shell-tool.tbl
|
||||
!launchApi?.getShellSessionHandoffWorkflowDomReadiness ||
|
||||
!launchApi?.renderShellSessionHandoffWorkflowState ||
|
||||
!launchApi?.mountShellSessionHandoffWorkflow ||
|
||||
!launchApi?.getWorkflowOverviewContract ||
|
||||
!launchApi?.getWorkflowOverviewReadiness ||
|
||||
!launchApi?.mountWorkflowOverviewEmbedding ||
|
||||
!launchApi?.isSupportedShellSessionHandoffPackage
|
||||
) {
|
||||
throw new Error("launch API namespace did not expose shell integration helpers");
|
||||
}
|
||||
|
||||
const integrationManifest = launchApi.getShellIntegrationManifest();
|
||||
const workflowOverviewContract = launchApi.getWorkflowOverviewContract();
|
||||
const readiness = launchApi.getShellIntegrationReadiness();
|
||||
const handoffSummarySchema = launchApi.getShellSessionHandoffSummarySchema();
|
||||
const handoffSummary = launchApi.getShellSessionHandoffSummary();
|
||||
@@ -264,12 +268,32 @@ TOOL_TABLE = browser-shell-tool.tbl
|
||||
true,
|
||||
"shell integration control-page compatibility",
|
||||
);
|
||||
assertEqual(workflowOverviewContract.pageHref, "./workflow-overview.html", "shell workflow overview contract page");
|
||||
assertEqual(
|
||||
workflowOverviewContract.methodNames.includes("getWorkflowOverviewRenderState"),
|
||||
true,
|
||||
"shell workflow overview contract render method",
|
||||
);
|
||||
|
||||
const controlTarget = integrationManifest.launchApiManifest.targetPages.find(
|
||||
(page) => page.entryId === "control-view",
|
||||
);
|
||||
assertEqual(controlTarget.href, "./control-page.html", "shell integration control target");
|
||||
assertEqual(handoffSummary.targetPage.href, controlTarget.href, "shell handoff summary target");
|
||||
const workflowOverviewDoc = await loadFrame(`../../runtime/ui/ini-panel/${workflowOverviewContract.pageHref.slice(2)}`);
|
||||
const workflowOverviewApi = workflowOverviewDoc.defaultView.linuxCncIniPanelWorkflowOverviewApi;
|
||||
const workflowOverviewReadiness = launchApi.getWorkflowOverviewReadiness({
|
||||
overviewApi: workflowOverviewApi,
|
||||
});
|
||||
const workflowOverviewEmbedding = launchApi.mountWorkflowOverviewEmbedding({
|
||||
overviewApi: workflowOverviewApi,
|
||||
});
|
||||
assertEqual(workflowOverviewReadiness.ready, true, "shell workflow overview iframe readiness");
|
||||
assertEqual(workflowOverviewReadiness.missing.join(","), "", "shell workflow overview iframe missing methods");
|
||||
assertEqual(workflowOverviewEmbedding.apiName, "ini-panel-shell-workflow-overview-embedding", "shell workflow overview embedding API");
|
||||
assertEqual(workflowOverviewEmbedding.renderState.dataset.handoffScope, "workflow", "shell workflow overview embedding scope");
|
||||
assertEqual(workflowOverviewEmbedding.mountResult.renderResult.rowCount, 5, "shell workflow overview embedding rows");
|
||||
assertEqual(workflowOverviewEmbedding.error, null, "shell workflow overview embedding error");
|
||||
|
||||
const controlDoc = await loadFrame(`../../runtime/ui/ini-panel/${controlTarget.href.slice(2)}`);
|
||||
const controlPageApi = controlDoc.defaultView.linuxCncIniPanelControlPageApi;
|
||||
|
||||
@@ -37,6 +37,9 @@ import {
|
||||
createIniPanelShellSessionHandoffWorkflowRenderState,
|
||||
createIniPanelShellSessionHandoffWorkflowDomContract,
|
||||
createIniPanelShellSessionHandoffWorkflowDomReadiness,
|
||||
createIniPanelShellWorkflowOverviewContract,
|
||||
createIniPanelShellWorkflowOverviewReadiness,
|
||||
mountIniPanelShellWorkflowOverviewEmbedding,
|
||||
renderIniPanelShellSessionHandoffWorkflowState,
|
||||
mountIniPanelShellSessionHandoffWorkflow,
|
||||
renderIniPanelShellSessionHandoffMountState,
|
||||
@@ -115,6 +118,9 @@ const requiredShellExports = [
|
||||
"createIniPanelShellSessionHandoffWorkflowRenderState",
|
||||
"createIniPanelShellSessionHandoffWorkflowDomContract",
|
||||
"createIniPanelShellSessionHandoffWorkflowDomReadiness",
|
||||
"createIniPanelShellWorkflowOverviewContract",
|
||||
"createIniPanelShellWorkflowOverviewReadiness",
|
||||
"mountIniPanelShellWorkflowOverviewEmbedding",
|
||||
"renderIniPanelShellSessionHandoffWorkflowState",
|
||||
"mountIniPanelShellSessionHandoffWorkflow",
|
||||
"renderIniPanelShellSessionHandoffMountState",
|
||||
|
||||
@@ -76,6 +76,9 @@ assert.deepEqual(manifest, {
|
||||
"getShellSessionHandoffWorkflowDomReadiness",
|
||||
"renderShellSessionHandoffWorkflowState",
|
||||
"mountShellSessionHandoffWorkflow",
|
||||
"getWorkflowOverviewContract",
|
||||
"getWorkflowOverviewReadiness",
|
||||
"mountWorkflowOverviewEmbedding",
|
||||
"isSupportedShellSessionHandoffPackage",
|
||||
"getLauncherLinks",
|
||||
"getControlPageApiMethods",
|
||||
@@ -216,6 +219,9 @@ assert.match(launchText, /\bgetShellSessionHandoffWorkflowDomContract\b/);
|
||||
assert.match(launchText, /\bgetShellSessionHandoffWorkflowDomReadiness\b/);
|
||||
assert.match(launchText, /\brenderShellSessionHandoffWorkflowState\b/);
|
||||
assert.match(launchText, /\bmountShellSessionHandoffWorkflow\b/);
|
||||
assert.match(launchText, /\bgetWorkflowOverviewContract\b/);
|
||||
assert.match(launchText, /\bgetWorkflowOverviewReadiness\b/);
|
||||
assert.match(launchText, /\bmountWorkflowOverviewEmbedding\b/);
|
||||
assert.match(launchText, /\bisSupportedShellSessionHandoffPackage\b/);
|
||||
assert.match(launchText, /\bdata-handoff-workflow\b/);
|
||||
assert.match(launchText, /\bdata-handoff-workflow-status\b/);
|
||||
|
||||
@@ -33,6 +33,9 @@ import {
|
||||
createIniPanelShellSessionHandoffWorkflowRenderState,
|
||||
createIniPanelShellSessionHandoffWorkflowDomContract,
|
||||
createIniPanelShellSessionHandoffWorkflowDomReadiness,
|
||||
createIniPanelShellWorkflowOverviewContract,
|
||||
createIniPanelShellWorkflowOverviewReadiness,
|
||||
mountIniPanelShellWorkflowOverviewEmbedding,
|
||||
renderIniPanelShellSessionHandoffWorkflowState,
|
||||
mountIniPanelShellSessionHandoffWorkflow,
|
||||
createIniPanelShellSessionHandoffPackageReport,
|
||||
@@ -161,7 +164,7 @@ assert.deepEqual(readiness, {
|
||||
counts: {
|
||||
pages: 3,
|
||||
launcherLinks: 3,
|
||||
launchMethods: 39,
|
||||
launchMethods: 42,
|
||||
controlPageMethods: 11,
|
||||
persistenceCapabilities: 3,
|
||||
},
|
||||
@@ -223,7 +226,7 @@ assert.deepEqual(handoffSummary, {
|
||||
counts: {
|
||||
pages: 3,
|
||||
launcherLinks: 3,
|
||||
launchMethods: 39,
|
||||
launchMethods: 42,
|
||||
controlPageMethods: 11,
|
||||
persistenceCapabilities: 3,
|
||||
},
|
||||
@@ -747,6 +750,39 @@ assert.equal(
|
||||
mountIniPanelShellSessionHandoffWorkflow().phase,
|
||||
"blocked",
|
||||
);
|
||||
assert.deepEqual(createIniPanelShellWorkflowOverviewContract(), {
|
||||
pageHref: "./workflow-overview.html",
|
||||
entryId: "workflow-overview",
|
||||
apiName: "linuxCncIniPanelWorkflowOverviewApi",
|
||||
methodNames: [
|
||||
"getWorkflowOverviewRenderState",
|
||||
"getWorkflowOverviewDisplayViewModel",
|
||||
"getWorkflowOverviewSummary",
|
||||
"getWorkflowOverviewDomContract",
|
||||
"getWorkflowOverviewDomReadiness",
|
||||
"renderWorkflowOverview",
|
||||
"mountWorkflowOverview",
|
||||
"createWorkflowOverviewRenderState",
|
||||
],
|
||||
});
|
||||
assert.equal(createIniPanelShellWorkflowOverviewReadiness().ready, false);
|
||||
assert.deepEqual(
|
||||
createIniPanelShellWorkflowOverviewReadiness({
|
||||
overviewApi: {
|
||||
getWorkflowOverviewRenderState: () => handoffPackageRenderState,
|
||||
},
|
||||
}).missing,
|
||||
[
|
||||
"getWorkflowOverviewDisplayViewModel",
|
||||
"getWorkflowOverviewSummary",
|
||||
"getWorkflowOverviewDomContract",
|
||||
"getWorkflowOverviewDomReadiness",
|
||||
"renderWorkflowOverview",
|
||||
"mountWorkflowOverview",
|
||||
"createWorkflowOverviewRenderState",
|
||||
],
|
||||
);
|
||||
assert.equal(mountIniPanelShellWorkflowOverviewEmbedding().phase, "blocked");
|
||||
assert.deepEqual(
|
||||
createIniPanelShellSessionHandoffPackageMountState({
|
||||
handoffPackage,
|
||||
@@ -1158,7 +1194,7 @@ assert.deepEqual(createIniPanelShellIntegrationReadiness(blockedManifest), {
|
||||
counts: {
|
||||
pages: 3,
|
||||
launcherLinks: 3,
|
||||
launchMethods: 39,
|
||||
launchMethods: 42,
|
||||
controlPageMethods: 11,
|
||||
persistenceCapabilities: 3,
|
||||
},
|
||||
|
||||
@@ -33,6 +33,9 @@ import {
|
||||
createIniPanelShellSessionHandoffWorkflowRenderState,
|
||||
createIniPanelShellSessionHandoffWorkflowDomContract,
|
||||
createIniPanelShellSessionHandoffWorkflowDomReadiness,
|
||||
createIniPanelShellWorkflowOverviewContract,
|
||||
createIniPanelShellWorkflowOverviewReadiness,
|
||||
mountIniPanelShellWorkflowOverviewEmbedding,
|
||||
renderIniPanelShellSessionHandoffWorkflowState,
|
||||
mountIniPanelShellSessionHandoffWorkflow,
|
||||
renderIniPanelShellSessionHandoffMountState,
|
||||
@@ -116,6 +119,9 @@ assert.equal(typeof createIniPanelShellSessionHandoffWorkflowDisplayViewModel, "
|
||||
assert.equal(typeof createIniPanelShellSessionHandoffWorkflowRenderState, "function");
|
||||
assert.equal(typeof createIniPanelShellSessionHandoffWorkflowDomContract, "function");
|
||||
assert.equal(typeof createIniPanelShellSessionHandoffWorkflowDomReadiness, "function");
|
||||
assert.equal(typeof createIniPanelShellWorkflowOverviewContract, "function");
|
||||
assert.equal(typeof createIniPanelShellWorkflowOverviewReadiness, "function");
|
||||
assert.equal(typeof mountIniPanelShellWorkflowOverviewEmbedding, "function");
|
||||
assert.equal(typeof renderIniPanelShellSessionHandoffWorkflowState, "function");
|
||||
assert.equal(typeof mountIniPanelShellSessionHandoffWorkflow, "function");
|
||||
assert.equal(typeof renderIniPanelShellSessionHandoffMountState, "function");
|
||||
@@ -621,6 +627,21 @@ assert.deepEqual(shellViewModel.shellSessionHandoffMountDomContract, {
|
||||
},
|
||||
renderResultFields: ["rendered", "statusLine", "rowCount", "rowIds", "dataset"],
|
||||
});
|
||||
assert.deepEqual(shellViewModel.shellWorkflowOverviewContract, {
|
||||
pageHref: "./workflow-overview.html",
|
||||
entryId: "workflow-overview",
|
||||
apiName: "linuxCncIniPanelWorkflowOverviewApi",
|
||||
methodNames: [
|
||||
"getWorkflowOverviewRenderState",
|
||||
"getWorkflowOverviewDisplayViewModel",
|
||||
"getWorkflowOverviewSummary",
|
||||
"getWorkflowOverviewDomContract",
|
||||
"getWorkflowOverviewDomReadiness",
|
||||
"renderWorkflowOverview",
|
||||
"mountWorkflowOverview",
|
||||
"createWorkflowOverviewRenderState",
|
||||
],
|
||||
});
|
||||
assert.equal(
|
||||
createIniPanelShellSessionHandoffPackageMountState({
|
||||
handoffPackage: shellViewModel.shellSessionHandoffPackage,
|
||||
@@ -766,6 +787,9 @@ assert.equal(
|
||||
shellViewModel.mountShellSessionHandoffWorkflow,
|
||||
mountIniPanelShellSessionHandoffWorkflow,
|
||||
);
|
||||
assert.equal(shellViewModel.createWorkflowOverviewContract, createIniPanelShellWorkflowOverviewContract);
|
||||
assert.equal(shellViewModel.createWorkflowOverviewReadiness, createIniPanelShellWorkflowOverviewReadiness);
|
||||
assert.equal(shellViewModel.mountWorkflowOverviewEmbedding, mountIniPanelShellWorkflowOverviewEmbedding);
|
||||
assert.equal(shellViewModel.createShellSessionHandoffPackageReport, createIniPanelShellSessionHandoffPackageReport);
|
||||
assert.equal(shellViewModel.createShellSessionHandoffPackageSchema, createIniPanelShellSessionHandoffPackageSchema);
|
||||
assert.equal(shellViewModel.isSupportedShellSessionHandoffPackage, isSupportedIniPanelShellSessionHandoffPackage);
|
||||
@@ -1105,6 +1129,68 @@ assert.equal(workflowDomMountResult.phase, "blocked");
|
||||
assert.equal(workflowDomMountResult.ready, false);
|
||||
assert.equal(workflowDomMountResult.renderResult.rowCount, 5);
|
||||
assert.equal(workflowDomMountResult.renderResult.dataset.handoffScope, "workflow");
|
||||
assert.deepEqual(createIniPanelShellWorkflowOverviewContract(), shellViewModel.shellWorkflowOverviewContract);
|
||||
assert.deepEqual(createIniPanelShellWorkflowOverviewReadiness(), {
|
||||
apiName: "ini-panel-shell-workflow-overview-readiness",
|
||||
readinessVersion: 1,
|
||||
phase: "blocked",
|
||||
ready: false,
|
||||
missing: shellViewModel.shellWorkflowOverviewContract.methodNames,
|
||||
contract: shellViewModel.shellWorkflowOverviewContract,
|
||||
});
|
||||
const workflowOverviewApi = {
|
||||
getWorkflowOverviewRenderState: () => workflowRenderState,
|
||||
getWorkflowOverviewDisplayViewModel: () => workflowDisplayViewModel,
|
||||
getWorkflowOverviewSummary: () => workflowSummaryResult,
|
||||
getWorkflowOverviewDomContract: createIniPanelShellSessionHandoffWorkflowDomContract,
|
||||
getWorkflowOverviewDomReadiness: createIniPanelShellSessionHandoffWorkflowDomReadiness,
|
||||
renderWorkflowOverview: renderIniPanelShellSessionHandoffWorkflowState,
|
||||
mountWorkflowOverview: (options) => mountIniPanelShellSessionHandoffWorkflow({
|
||||
renderState: workflowRenderState,
|
||||
...options,
|
||||
}),
|
||||
createWorkflowOverviewRenderState: createIniPanelShellSessionHandoffWorkflowRenderState,
|
||||
};
|
||||
assert.deepEqual(createIniPanelShellWorkflowOverviewReadiness({
|
||||
overviewApi: workflowOverviewApi,
|
||||
}), {
|
||||
apiName: "ini-panel-shell-workflow-overview-readiness",
|
||||
readinessVersion: 1,
|
||||
phase: "ready",
|
||||
ready: true,
|
||||
missing: [],
|
||||
contract: shellViewModel.shellWorkflowOverviewContract,
|
||||
});
|
||||
const workflowOverviewEmbedding = mountIniPanelShellWorkflowOverviewEmbedding({
|
||||
overviewApi: workflowOverviewApi,
|
||||
mountOptions: {
|
||||
documentRef: mountDocument,
|
||||
mountNode,
|
||||
statusNode: mountStatusNode,
|
||||
rowsNode: mountRowsNode,
|
||||
},
|
||||
});
|
||||
assert.equal(workflowOverviewEmbedding.apiName, "ini-panel-shell-workflow-overview-embedding");
|
||||
assert.equal(workflowOverviewEmbedding.embeddingVersion, 1);
|
||||
assert.equal(workflowOverviewEmbedding.ready, false);
|
||||
assert.equal(workflowOverviewEmbedding.renderState.statusLine, "Blocked: mount:blocked");
|
||||
assert.equal(workflowOverviewEmbedding.mountResult.renderResult.rowCount, 5);
|
||||
assert.equal(workflowOverviewEmbedding.error, null);
|
||||
assert.deepEqual(
|
||||
mountIniPanelShellWorkflowOverviewEmbedding({ overviewApi: null }).readiness.missing,
|
||||
shellViewModel.shellWorkflowOverviewContract.methodNames,
|
||||
);
|
||||
assert.equal(
|
||||
mountIniPanelShellWorkflowOverviewEmbedding({
|
||||
overviewApi: {
|
||||
...workflowOverviewApi,
|
||||
mountWorkflowOverview: () => {
|
||||
throw new Error("mount failed");
|
||||
},
|
||||
},
|
||||
}).error,
|
||||
"mount failed",
|
||||
);
|
||||
assert.equal(
|
||||
mountIniPanelShellSessionHandoffWorkflow({ documentRef: mountDocument }).renderResult,
|
||||
null,
|
||||
|
||||
Reference in New Issue
Block a user