28 lines
3.0 KiB
JavaScript
28 lines
3.0 KiB
JavaScript
import test from 'node:test';
|
|||
|
|
import assert from 'node:assert/strict';
|
||
|
|
import {readFileSync} from 'node:fs';
|
||
|
|
import vm from 'node:vm';
|
||
|
|
const source=readFileSync(new URL('../apps/browser/main.cjs',import.meta.url),'utf8');
|
||
|
|
const start=source.indexOf('function installTransportObserver(tab){'),end=source.indexOf('function createNativeTab(input={})',start);
|
||
|
|
assert.ok(start>=0&&end>start);
|
||
|
|
const id='00000000-0000-4000-8000-000000000001';
|
||
|
|
function fixture(auditImplementation=async()=>id){
|
||
|
|
let callbacks;const actions=[],contents={id:1,isDestroyed:()=>false},tab={id,contents,security:{interactionDocumentGeneration:1}};
|
||
|
|
const context={device:{id},policy:{version:1,expiresAt:new Date(Date.now()+60000).toISOString()},localRelay:{},ready:true,clipboardFatal:false,tabs:{fromContents:()=>tab},Object,Date,
|
||
|
|
require:specifier=>specifier.endsWith('page-clipboard-guard.cjs')?{createNativeTransportChannel:()=>({private:true})}:{createNativeTransportObserver:value=>{callbacks=value;return {install:async()=>true};}},quarantine:()=>actions.push('quarantine'),
|
||
|
|
diagnosticSpan:async(_name,_attributes,fn)=>fn(),audit:async(...args)=>{actions.push(args[0]);return auditImplementation(...args);}};
|
||
|
|
vm.runInNewContext(source.slice(start,end)+'\nthis.install=installTransportObserver;',context);
|
||
|
|
return {context,actions,install:()=>context.install(tab),callbacks:()=>callbacks,tab};
|
||
|
|
}
|
||
|
|
test('actual main quarantines unexpected establishment before asynchronous persistence, without repeating the effect',async()=>{
|
||
|
|
let release;const gate=new Promise(resolve=>{release=resolve;});const f=fixture(async(kind)=>{if(kind==='transport.established')await gate;return id;});await f.install();
|
||
|
|
const callback=f.callbacks(),owner=callback.getContext();callback.onEstablished(owner);const pending=callback.audit({transportId:id,protocol:'webtransport',phase:'established',realm:'worker',sessionId:id,connectionEstablished:true,host:'receiver.example'},owner);
|
||
|
|
assert.equal(f.context.clipboardFatal,true);assert.deepEqual(f.actions,['quarantine','transport.established']);release();await pending;
|
||
|
|
assert.deepEqual(f.actions,['quarantine','transport.established','quarantine','transport.monitor-unavailable']);
|
||
|
|
});
|
||
|
|
test('actual main retains creation policy in lifecycle metadata while current owner remains bound',async()=>{
|
||
|
|
const records=[],f=fixture(async(...args)=>{records.push(args);return id;});await f.install();const callback=f.callbacks(),owner=callback.getContext();f.context.policy={...f.context.policy,version:2};
|
||
|
|
await callback.audit({transportId:id,protocol:'webtransport',phase:'closed',realm:'window',sessionId:id,connectionEstablished:false,host:'receiver.example'},owner);
|
||
|
|
assert.equal(records.length,1);assert.equal(records[0][8].policyVersion,1);assert.equal(records[0][9].phase,'closed');assert.equal(f.context.clipboardFatal,false);
|
||
|
|
f.context.device={id:'00000000-0000-4000-8000-000000000002'};await callback.audit({phase:'created'},owner);assert.equal(records.length,1,'Old device owner gained a new audit record');
|
||
|
|
});
|