Let a shell without its navigation owner report no camera handoffs

The voice runner subscribes to camera handoffs as it is created. The Cyber sonar test builds its runner on a StyleManager made from the prototype, which has no navigation owner, so the facade's delegation threw and both Node jobs failed. The facade now returns nothing there, like its other optional owners; the real shell builds its navigation owner before voice creates a runner.
This commit is contained in:
Sameh Khamis committed 2026-11-05 16:55:54 -08:00
1 parent 3438a88cc7
commit 6d7fe53570
3 files changed
+35 -1

No files matched your search

+1
View File
@@ -1128,6 +1128,7 @@
"src/dockerTrustedPeers.test.mjs",
"src/cameraGlobeRotation.test.mjs",
"src/cameraTilt.test.mjs",
"src/ui/shellFacade.test.mjs",
"src/voice/globeResetConfirmation.test.mjs",
"src/hudDms.test.mjs",
"src/hudSummaryGate.test.mjs",
+1 -1
View File
@@ -6,7 +6,7 @@
export class ShellFacade {
/** Observe camera ownership transfers through the navigation owner. */
subscribeCameraHandoff(listener) {
return this._navigation.subscribeCameraHandoff(listener);
return this._navigation?.subscribeCameraHandoff(listener);
}
get _models3dEnabled() {
+33
View File
@@ -0,0 +1,33 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import { ShellFacade } from './shellFacade.js';
// A shell assembled without its navigation owner (as unit tests build one
// from the prototype) has no handoffs to report, like the facade's other
// optional owners; the voice runner subscribes as it is created.
test('camera handoffs without a navigation owner subscribe to nothing', () => {
const shell = Object.create(ShellFacade.prototype);
assert.equal(
shell.subscribeCameraHandoff(() => {}),
undefined,
);
});
test('camera handoffs reach listeners through the navigation owner', () => {
const listeners = new Set();
const shell = Object.create(ShellFacade.prototype);
shell._navigation = {
subscribeCameraHandoff(listener) {
listeners.add(listener);
return () => listeners.delete(listener);
},
};
let handoffs = 0;
const unsubscribe = shell.subscribeCameraHandoff(() => {
handoffs += 1;
});
for (const listener of listeners) listener();
assert.equal(handoffs, 1);
unsubscribe();
assert.equal(listeners.size, 0);
});