推进 INI 面板 shell handoff package mount-state

This commit is contained in:
2026-06-15 11:16:35 +08:00
parent 1d06fd4cd4
commit f548f24fb8
10 changed files with 427 additions and 4 deletions

View File

@@ -24,6 +24,7 @@ import {
createIniPanelShellSessionHandoffDisplayViewModel,
createIniPanelShellSessionHandoffPackage,
createIniPanelShellSessionHandoffPackageDisplayViewModel,
createIniPanelShellSessionHandoffPackageMountState,
createIniPanelShellSessionHandoffPackageReport,
createIniPanelShellSessionHandoffPackageRenderState,
createIniPanelShellSessionHandoffPackageSchema,
@@ -86,6 +87,7 @@ const requiredShellExports = [
"createIniPanelShellSessionHandoffDisplayViewModel",
"createIniPanelShellSessionHandoffPackage",
"createIniPanelShellSessionHandoffPackageDisplayViewModel",
"createIniPanelShellSessionHandoffPackageMountState",
"createIniPanelShellSessionHandoffPackageReport",
"createIniPanelShellSessionHandoffPackageRenderState",
"createIniPanelShellSessionHandoffPackageSchema",
@@ -252,6 +254,13 @@ assert.deepEqual(
createIniPanelShellViewModel().shellSessionHandoffPackageDisplayViewModel,
),
);
assert.deepEqual(
createIniPanelShellViewModel().shellSessionHandoffPackageMountState,
createIniPanelShellSessionHandoffPackageMountState({
handoffPackage: createIniPanelShellViewModel().shellSessionHandoffPackage,
packageRenderState: createIniPanelShellViewModel().shellSessionHandoffPackageRenderState,
}),
);
assert.equal(isSupportedIniPanelShellSessionHandoffPackage(createIniPanelShellViewModel().shellSessionHandoffPackage), true);
assert.equal(isSupportedIniPanelShellIntegrationManifest(createIniPanelShellViewModel().shellIntegrationManifest), true);
assert.deepEqual(createIniPanelShellViewModel().launchApiSchema, createIniPanelLaunchApiSchema());

View File

@@ -60,6 +60,7 @@ assert.deepEqual(manifest, {
"getShellSessionHandoffPackageReport",
"getShellSessionHandoffPackageDisplayViewModel",
"getShellSessionHandoffPackageRenderState",
"getShellSessionHandoffPackageMountState",
"isSupportedShellSessionHandoffPackage",
"getLauncherLinks",
"getControlPageApiMethods",
@@ -175,6 +176,7 @@ assert.match(launchText, /\bgetShellSessionHandoffPackage\b/);
assert.match(launchText, /\bgetShellSessionHandoffPackageReport\b/);
assert.match(launchText, /\bgetShellSessionHandoffPackageDisplayViewModel\b/);
assert.match(launchText, /\bgetShellSessionHandoffPackageRenderState\b/);
assert.match(launchText, /\bgetShellSessionHandoffPackageMountState\b/);
assert.match(launchText, /\bisSupportedShellSessionHandoffPackage\b/);
assert.match(launchText, /\blinuxCncIniPanelLaunchApi\b/);

View File

@@ -20,6 +20,7 @@ import {
createIniPanelShellSessionHandoffDisplayViewModel,
createIniPanelShellSessionHandoffPackage,
createIniPanelShellSessionHandoffPackageDisplayViewModel,
createIniPanelShellSessionHandoffPackageMountState,
createIniPanelShellSessionHandoffPackageReport,
createIniPanelShellSessionHandoffPackageRenderState,
createIniPanelShellSessionHandoffPackageSchema,
@@ -27,6 +28,7 @@ import {
createIniPanelShellSessionHandoffSnapshot,
createIniPanelShellSessionHandoffSummary,
createIniPanelShellSessionHandoffSummarySchema,
createControlPageSessionLoadState,
getVisibleIniPanelEntries,
isSupportedIniPanelShellIntegrationManifest,
isSupportedIniPanelShellSessionHandoffPackage,
@@ -79,6 +81,10 @@ const handoffPackageDisplayViewModel = createIniPanelShellSessionHandoffPackageD
const handoffPackageRenderState = createIniPanelShellSessionHandoffPackageRenderState(
handoffPackageDisplayViewModel,
);
const handoffPackageMountState = createIniPanelShellSessionHandoffPackageMountState({
handoffPackage,
packageRenderState: handoffPackageRenderState,
});
assert.deepEqual(schema, {
apiName: "ini-panel-shell-integration",
@@ -134,7 +140,7 @@ assert.deepEqual(readiness, {
counts: {
pages: 2,
launcherLinks: 2,
launchMethods: 23,
launchMethods: 24,
controlPageMethods: 11,
persistenceCapabilities: 3,
},
@@ -196,7 +202,7 @@ assert.deepEqual(handoffSummary, {
counts: {
pages: 2,
launcherLinks: 2,
launchMethods: 23,
launchMethods: 24,
controlPageMethods: 11,
persistenceCapabilities: 3,
},
@@ -575,6 +581,100 @@ assert.deepEqual(handoffPackageRenderState, {
handoffScope: "package",
},
});
assert.deepEqual(handoffPackageMountState, {
apiName: "ini-panel-shell-session-handoff-package-mount-state",
mountStateVersion: 1,
phase: "blocked",
ready: false,
packageReady: true,
targetReady: true,
methodsReady: true,
sessionReady: false,
statusLine: "Blocked: waiting-panel",
packageRenderState: handoffPackageRenderState,
targetPage: {
entryId: "control-view",
href: "./control-page.html",
},
requiredMethods: {
loadSessionState: "loadControlPageSessionState",
readStatus: "readControlPageStatus",
},
sessionLoadState: createControlPageSessionLoadState({ phase: "waiting-panel" }),
blockingReasons: [],
checks: [
{
id: "package-render-state",
label: "Package render state",
status: "pass",
value: "Ready: No blocking reasons",
},
{
id: "target-page",
label: "Control target",
status: "pass",
value: "./control-page.html",
},
{
id: "required-methods",
label: "Readonly methods",
status: "pass",
value: "loadControlPageSessionState, readControlPageStatus",
},
{
id: "session-load-state",
label: "Session load state",
status: "blocked",
value: "waiting-panel",
},
{
id: "blocking-reasons",
label: "Blocking reasons",
status: "pass",
value: "none",
},
],
});
assert.deepEqual(
createIniPanelShellSessionHandoffPackageMountState({
handoffPackage,
packageRenderState: handoffPackageRenderState,
sessionLoadState: createControlPageSessionLoadState({
phase: "ready",
panelReady: true,
apiReady: true,
controlViewReady: true,
controlView: { status: { runStatus: "not-run" } },
}),
}).checks.map(({ id, status, value }) => ({ id, status, value })),
[
{
id: "package-render-state",
status: "pass",
value: "Ready: No blocking reasons",
},
{
id: "target-page",
status: "pass",
value: "./control-page.html",
},
{
id: "required-methods",
status: "pass",
value: "loadControlPageSessionState, readControlPageStatus",
},
{
id: "session-load-state",
status: "pass",
value: "ready",
},
{
id: "blocking-reasons",
status: "pass",
value: "none",
},
],
);
assert.equal(isSupportedIniPanelShellSessionHandoffPackage(handoffPackage), true);
assert.equal(
isSupportedIniPanelShellSessionHandoffPackage({ ...handoffPackage, packageVersion: 2 }),
@@ -673,6 +773,16 @@ assert.deepEqual(
},
},
);
assert.deepEqual(
createIniPanelShellSessionHandoffPackageMountState({
handoffPackage: { ...handoffPackage, ready: false },
packageRenderState: createIniPanelShellSessionHandoffPackageRenderState(createIniPanelShellSessionHandoffPackageDisplayViewModel(
createIniPanelShellSessionHandoffPackageReport({ ...handoffPackage, packageVersion: 2 }),
)),
sessionLoadState: createControlPageSessionLoadState({ phase: "error", error: "boom" }),
}).blockingReasons,
["controlPageSessionError"],
);
assert.deepEqual(
createIniPanelShellSessionHandoffPackageReport(missingManifestField).missingManifestFields,
["controlPageMethods"],
@@ -904,7 +1014,7 @@ assert.deepEqual(createIniPanelShellIntegrationReadiness(blockedManifest), {
counts: {
pages: 2,
launcherLinks: 2,
launchMethods: 23,
launchMethods: 24,
controlPageMethods: 11,
persistenceCapabilities: 3,
},
@@ -1070,6 +1180,7 @@ assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffComp
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffDisplayViewModel\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackage\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageDisplayViewModel\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageMountState\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageReport\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageRenderState\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageSchema\b/);
@@ -1092,6 +1203,7 @@ assert.match(docText, /\bcreateIniPanelShellSessionHandoffCompatibilityReport\b/
assert.match(docText, /\bcreateIniPanelShellSessionHandoffDisplayViewModel\b/);
assert.match(docText, /\bcreateIniPanelShellSessionHandoffPackage\b/);
assert.match(docText, /\bcreateIniPanelShellSessionHandoffPackageDisplayViewModel\b/);
assert.match(docText, /\bcreateIniPanelShellSessionHandoffPackageMountState\b/);
assert.match(docText, /\bcreateIniPanelShellSessionHandoffPackageReport\b/);
assert.match(docText, /\bcreateIniPanelShellSessionHandoffPackageRenderState\b/);
assert.match(docText, /\bcreateIniPanelShellSessionHandoffPackageSchema\b/);

View File

@@ -20,6 +20,7 @@ import {
createIniPanelShellSessionHandoffDisplayViewModel,
createIniPanelShellSessionHandoffPackage,
createIniPanelShellSessionHandoffPackageDisplayViewModel,
createIniPanelShellSessionHandoffPackageMountState,
createIniPanelShellSessionHandoffPackageReport,
createIniPanelShellSessionHandoffPackageRenderState,
createIniPanelShellSessionHandoffPackageSchema,
@@ -87,6 +88,7 @@ assert.equal(typeof createIniPanelShellSessionHandoffCompatibilityReport, "funct
assert.equal(typeof createIniPanelShellSessionHandoffDisplayViewModel, "function");
assert.equal(typeof createIniPanelShellSessionHandoffPackage, "function");
assert.equal(typeof createIniPanelShellSessionHandoffPackageDisplayViewModel, "function");
assert.equal(typeof createIniPanelShellSessionHandoffPackageMountState, "function");
assert.equal(typeof createIniPanelShellSessionHandoffPackageReport, "function");
assert.equal(typeof createIniPanelShellSessionHandoffPackageRenderState, "function");
assert.equal(typeof createIniPanelShellSessionHandoffPackageSchema, "function");
@@ -222,6 +224,13 @@ assert.deepEqual(
shellViewModel.shellSessionHandoffPackageRenderState,
createIniPanelShellSessionHandoffPackageRenderState(shellViewModel.shellSessionHandoffPackageDisplayViewModel),
);
assert.deepEqual(
shellViewModel.shellSessionHandoffPackageMountState,
createIniPanelShellSessionHandoffPackageMountState({
handoffPackage: shellViewModel.shellSessionHandoffPackage,
packageRenderState: shellViewModel.shellSessionHandoffPackageRenderState,
}),
);
assert.equal(isSupportedIniPanelShellSessionHandoffPackage(shellViewModel.shellSessionHandoffPackage), true);
assert.deepEqual(shellViewModel.shellSessionHandoffDisplayViewModel, {
phase: "ready",
@@ -464,6 +473,74 @@ assert.deepEqual(shellViewModel.shellSessionHandoffPackageRenderState, {
handoffScope: "package",
},
});
assert.deepEqual(shellViewModel.shellSessionHandoffPackageMountState, {
apiName: "ini-panel-shell-session-handoff-package-mount-state",
mountStateVersion: 1,
phase: "blocked",
ready: false,
packageReady: true,
targetReady: true,
methodsReady: true,
sessionReady: false,
statusLine: "Blocked: waiting-panel",
packageRenderState: shellViewModel.shellSessionHandoffPackageRenderState,
targetPage: {
entryId: "control-view",
href: "./control-page.html",
},
requiredMethods: {
loadSessionState: "loadControlPageSessionState",
readStatus: "readControlPageStatus",
},
sessionLoadState: createControlPageSessionLoadState({ phase: "waiting-panel" }),
blockingReasons: [],
checks: [
{
id: "package-render-state",
label: "Package render state",
status: "pass",
value: "Ready: No blocking reasons",
},
{
id: "target-page",
label: "Control target",
status: "pass",
value: "./control-page.html",
},
{
id: "required-methods",
label: "Readonly methods",
status: "pass",
value: "loadControlPageSessionState, readControlPageStatus",
},
{
id: "session-load-state",
label: "Session load state",
status: "blocked",
value: "waiting-panel",
},
{
id: "blocking-reasons",
label: "Blocking reasons",
status: "pass",
value: "none",
},
],
});
assert.equal(
createIniPanelShellSessionHandoffPackageMountState({
handoffPackage: shellViewModel.shellSessionHandoffPackage,
packageRenderState: shellViewModel.shellSessionHandoffPackageRenderState,
sessionLoadState: createControlPageSessionLoadState({
phase: "ready",
panelReady: true,
apiReady: true,
controlViewReady: true,
controlView: { status: { runStatus: "not-run" } },
}),
}).ready,
true,
);
assert.equal(
isSupportedIniPanelShellIntegrationManifest(shellViewModel.shellIntegrationManifest),
true,
@@ -520,6 +597,10 @@ assert.equal(
shellViewModel.createShellSessionHandoffPackageRenderState,
createIniPanelShellSessionHandoffPackageRenderState,
);
assert.equal(
shellViewModel.createShellSessionHandoffPackageMountState,
createIniPanelShellSessionHandoffPackageMountState,
);
assert.equal(shellViewModel.createShellSessionHandoffPackageReport, createIniPanelShellSessionHandoffPackageReport);
assert.equal(shellViewModel.createShellSessionHandoffPackageSchema, createIniPanelShellSessionHandoffPackageSchema);
assert.equal(shellViewModel.isSupportedShellSessionHandoffPackage, isSupportedIniPanelShellSessionHandoffPackage);