mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-06 03:14:00 +00:00
fix: scope Nepal media playback to explicit scene actions
This commit is contained in:
1 parent
cf0b9927de
commit
621d186de1
10 files changed
+482
-5
No files matched your search
@@ -731,6 +731,73 @@ function makeDirector(options = {}) {
|
||||
return { director, viewer, styleManager, dataManager, restore };
|
||||
}
|
||||
|
||||
test('only Play Shot or a scene run grants transient media authority; LOAD, Stop and replacement revoke it', async () => {
|
||||
const { director, dataManager, restore } = makeDirector();
|
||||
let owner = null;
|
||||
const owners = [];
|
||||
dataManager.layers = new Map([['flights', { module: {
|
||||
setSceneMediaPlayback(value = null) { owner = value; if (value) owners.push(value.shotId); },
|
||||
} }]]);
|
||||
try {
|
||||
await director.loadShot('scene-1', 'shot-a', { flyDuration: 0 });
|
||||
assert.equal(owner, null, 'passive LOAD is not playback');
|
||||
await director.replayShot('scene-1', 'shot-a');
|
||||
assert.equal(owner?.shotId, 'shot-a');
|
||||
assert.equal(owner.token.cancelled, false);
|
||||
await director.loadShot('missing-scene', 'missing-shot');
|
||||
assert.equal(owner?.shotId, 'shot-a', 'rejected navigation does not revoke another action');
|
||||
director._running = true;
|
||||
await director.loadShot('scene-1', 'shot-b');
|
||||
assert.equal(owner?.shotId, 'shot-a', 'LOAD refused during a run cannot stop its media');
|
||||
director._running = false;
|
||||
await director.loadShot('scene-1', 'shot-b', { flyDuration: 0 });
|
||||
assert.equal(owner, null, 'replacement LOAD revokes the prior replay');
|
||||
await director.replayShot('scene-1', 'shot-a');
|
||||
director.stopScene();
|
||||
assert.equal(owner, null);
|
||||
director._sleep = async () => {};
|
||||
owners.length = 0;
|
||||
await director.startScene('scene-1', { single: true, preview: false });
|
||||
assert.deepEqual(owners, ['shot-a'], 'only enabled opt-in layers receive playback authority');
|
||||
assert.equal(owner, null, 'run completion releases the last shot owner');
|
||||
} finally { await director.destroy(); restore(); }
|
||||
});
|
||||
|
||||
test('cross-scene replay grants media ownership only after the previous scene releases its layers', async () => {
|
||||
const { director, dataManager, restore } = makeDirector();
|
||||
let owner = null;
|
||||
const events = [];
|
||||
const media = { setSceneMediaPlayback(value = null) { owner = value; } };
|
||||
dataManager.layers = new Map([['flights', { module: media }]]);
|
||||
const setEnabled = dataManager.setEnabled.bind(dataManager);
|
||||
dataManager.setEnabled = async (id, enabled, options) => {
|
||||
if (id === 'flights') {
|
||||
events.push({ enabled, owner: owner?.shotId ?? null });
|
||||
if (!enabled) media.setSceneMediaPlayback();
|
||||
}
|
||||
return setEnabled(id, enabled, options);
|
||||
};
|
||||
try {
|
||||
const previous = director._project.scenes[0];
|
||||
previous.releaseLayerIds = ['flights'];
|
||||
const target = structuredClone(previous);
|
||||
target.id = 'other-media-scene';
|
||||
director._project.scenes.push(target);
|
||||
await director.loadShot(previous.id, 'shot-a', { flyDuration: 0 });
|
||||
events.length = 0;
|
||||
const result = await director.replayShot(target.id, 'shot-a');
|
||||
assert.equal(result.started, true);
|
||||
assert.deepEqual(events.slice(0, 2), [
|
||||
{ enabled: false, owner: null },
|
||||
{ enabled: true, owner: 'shot-a' },
|
||||
], 'old-scene disable must finish before granting the new owner');
|
||||
assert.equal(owner?.sceneId, target.id);
|
||||
assert.equal(owner?.token.cancelled, false);
|
||||
director.stopScene();
|
||||
assert.equal(owner, null);
|
||||
} finally { await director.destroy(); restore(); }
|
||||
});
|
||||
|
||||
test('scene camera waits for provider completion and fade rather than the saved media hold', async () => {
|
||||
const { director, viewer, dataManager, restore } = makeDirector();
|
||||
let release;
|
||||
|
||||
Reference in new issue
Block a user