Files

32 lines
3.0 KiB
JavaScript
Raw Permalink Normal View History

import test from 'node:test';
import assert from 'node:assert/strict';
import vm from 'node:vm';
import {readFileSync} from 'node:fs';
import {createRequire} from 'node:module';
import {defaultPolicy} from '../packages/core/policy.mjs';
const require=createRequire(import.meta.url),source=readFileSync(new URL('../apps/browser/main.cjs',import.meta.url),'utf8');
const hook=source.slice(source.indexOf(" browserSession.webRequest.onBeforeRequest("),source.indexOf(" browserSession.webRequest.onBeforeSendHeaders("));
function fixture(){
let listener,completeDNS,enteredDNS;const dnsReady=new Promise(resolve=>enteredDNS=resolve);const timers=[],events=[],callbacks=[],policy=defaultPolicy();
const context=vm.createContext({require:specifier=>require('../apps/browser/'+specifier.slice(2)),URL,Date,ready:true,policy,
browserSession:{webRequest:{onBeforeRequest(_filter,fn){listener=fn;}}},tabs:{all:()=>[]},credentialBroker:undefined,credentialRequestCorrelations:new Map(),currentTabContext:()=>true,
developerAssetRequestAllowed:()=>false,diagnosticSpan:(_name,_attrs,fn)=>fn(),core:{destinationAllowed:()=>true,inspect:()=>({decision:'allow'})},
audit:async(...args)=>events.push(args),recentRequests:new Map(),dnsGate:()=>new Promise(resolve=>{completeDNS=resolve;enteredDNS();}),localInspector:undefined,scanEnterprise:async()=>({decision:'allow',coverage:{complete:true}}),
setTimeout:fn=>{timers.push(fn);return timers.length;},clearTimeout(){},Buffer,
});
vm.runInContext(source.slice(source.indexOf('function agentRequestOwnerAllowed(source)'),source.indexOf('function actorDestinationAllowed')),context);
vm.runInContext(source.slice(source.indexOf('function requestDiagnostic('),source.indexOf('function credentialContext(')),context);
vm.runInContext(source.slice(source.indexOf('function inspectOutgoingText('),source.indexOf('function responsePolicyHeaders(')),context);
vm.runInContext(hook,context);listener({id:1,url:'https://example.test/',webContentsId:0,resourceType:'mainFrame',method:'GET'},r=>callbacks.push(r));
return {timers,events,callbacks,dnsReady,complete:()=>completeDNS()};
}
const settle=async()=>{for(let n=0;n<8;n++)await Promise.resolve();};
test('native request deadline records a fixed reason and never authorizes a late result',async()=>{
const f=fixture();await f.dnsReady;await settle();f.timers[0]();await settle();assert.equal(f.callbacks.length,1);assert.equal(f.callbacks[0].cancel,true);
assert.deepEqual(f.events,[['navigation.block','request-inspection-timeout','example.test']]);f.complete();await settle();f.timers[0]();await settle();
assert.equal(f.callbacks.length,1);assert.equal(f.events.length,1);
});
test('a completed native request cannot subsequently produce a timeout event',async()=>{
const f=fixture();await f.dnsReady;await settle();f.complete();await settle();assert.equal(f.callbacks.length,1);assert.equal(f.callbacks[0].cancel,false);
f.timers[0]();await settle();assert.equal(f.callbacks.length,1);assert.equal(f.events.length,0);
});