'use strict'; function postInheritPriorityTestTask(config) { const ids = []; const task = scheduler.postTask(async () => { await new Promise(resolve => setTimeout(resolve)); await fetch('/common/blank.html'); await new Promise(resolve => setTimeout(resolve)); const subtask = scheduler.postTask(() => { ids.push('subtask'); }, {priority: config.subTaskPriority}); await scheduler.yield(config.yieldOptions); ids.push('yield'); await subtask; }, config.taskOptions); return {task, ids} } for (let priority of ['user-blocking', 'background']) { const expected = priority == 'user-blocking' ? 'yield,subtask' : 'subtask,yield'; promise_test(async t => { const config = { taskOptions: {priority}, subTaskPriority: 'user-blocking', yieldOptions: {priority: 'inherit'}, }; const {task, ids} = postInheritPriorityTestTask(config); await task; assert_equals(ids.join(), expected); }, `yield() inherits priority (string) across promises (${priority})`); promise_test(async t => { const signal = (new TaskController({priority})).signal; const config = { taskOptions: {signal}, subTaskPriority: 'user-blocking', yieldOptions: {signal: 'inherit'}, }; const {task, ids} = postInheritPriorityTestTask(config); await task; assert_equals(ids.join(), expected); }, `yield() inherits priority (signal) across promises (${priority})`); promise_test(async t => { const config = { taskOptions: {priority}, subTaskPriority: 'user-blocking', yieldOptions: {signal: 'inherit'}, }; const {task, ids} = postInheritPriorityTestTask(config); await task; assert_equals(ids.join(), expected); }, `yield() inherits priority (priority string with signal inherit) across promises (${priority})`); } promise_test(async t => { const controller = new TaskController(); const signal = controller.signal; return scheduler.postTask(async () => { await new Promise(resolve => setTimeout(resolve)); await fetch('/common/blank.html'); await new Promise(resolve => setTimeout(resolve)); controller.abort(); const p = scheduler.yield({signal: 'inherit'}); await promise_rejects_dom(t, 'AbortError', p); }, {signal}); }, `yield() inherits abort across promises`);