| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| </head> |
| <body> |
| <script> |
| // A nested blob: worker (a blob: worker created by another blob: worker) |
| // should inherit Document-Policy transitively from the creator document. |
| promise_test(async t => { |
| const innerScript = ` |
| try { |
| new Profiler({ sampleInterval: 10, maxBufferSize: Number.MAX_SAFE_INTEGER }); |
| self.postMessage({ success: true, message: 'Profiler created in inner worker' }); |
| } catch (e) { |
| self.postMessage({ success: false, error: e.name, message: e.message }); |
| } |
| `; |
| // The outer worker creates the inner blob: worker and relays its result. |
| const outerScript = ` |
| const innerSource = ${JSON.stringify(innerScript)}; |
| const innerBlob = new Blob([innerSource], { type: 'text/javascript' }); |
| const innerUrl = URL.createObjectURL(innerBlob); |
| const inner = new Worker(innerUrl); |
| inner.onmessage = e => { |
| self.postMessage(e.data); |
| inner.terminate(); |
| URL.revokeObjectURL(innerUrl); |
| }; |
| inner.onerror = e => { |
| self.postMessage({ success: false, error: 'InnerWorkerError', message: e.message }); |
| }; |
| `; |
| const outerBlob = new Blob([outerScript], { type: 'text/javascript' }); |
| const outerUrl = URL.createObjectURL(outerBlob); |
| const outer = new Worker(outerUrl); |
| const result = await new Promise((resolve, reject) => { |
| outer.onmessage = e => resolve(e.data); |
| outer.onerror = e => reject(new Error(e.message)); |
| }); |
| assert_true(result.success, |
| 'profiling should succeed in nested blob: dedicated worker with transitively inherited document policy'); |
| outer.terminate(); |
| URL.revokeObjectURL(outerUrl); |
| }, 'nested blob: dedicated worker should inherit js-profiling policy transitively from creator document'); |
| </script> |
| </body> |
| </html> |