test_headless_content_process.js (1560B)
1 "use strict"; 2 3 const TEST_REMOTE_TYPE = "test"; 4 5 function allTestProcs() { 6 return ChromeUtils.getAllDOMProcesses().filter( 7 p => p.remoteType == TEST_REMOTE_TYPE 8 ); 9 } 10 11 add_task(async function headlessContentProcessKeepAlive() { 12 let testProcesses = allTestProcs(); 13 equal(testProcesses.length, 0); 14 15 // Start the process, it should appear in the list. 16 let keepAlive = 17 await ChromeUtils.ensureHeadlessContentProcess(TEST_REMOTE_TYPE); 18 let domProcess = keepAlive.domProcess; 19 20 testProcesses = allTestProcs(); 21 equal(testProcesses.length, 1); 22 equal(testProcesses[0], domProcess); 23 ok(domProcess.canSend); 24 25 // The process should be properly kept alive, so `releaseCachedProcesses()` 26 // should not shut it down. 27 Services.ppmm.releaseCachedProcesses(); 28 29 testProcesses = allTestProcs(); 30 equal(testProcesses.length, 1); 31 equal(testProcesses[0], domProcess); 32 ok(domProcess.canSend); 33 34 // Invalidating the keep alive should lead to the process being shut down. 35 keepAlive.invalidateKeepAlive(); 36 37 // Wait for the process to be shut down. 38 await new Promise(resolve => { 39 Services.obs.addObserver(function obs(subject, topic) { 40 equal(topic, "ipc:content-shutdown"); 41 if ( 42 subject.QueryInterface(Ci.nsIPropertyBag2).getProperty("childID") == 43 domProcess.childID 44 ) { 45 Services.obs.removeObserver(obs, "ipc:content-shutdown"); 46 resolve(); 47 } 48 }, "ipc:content-shutdown"); 49 }); 50 51 testProcesses = allTestProcs(); 52 equal(testProcesses.length, 0); 53 ok(!domProcess.canSend); 54 });