| <!DOCTYPE html> |
| <script src="../../../resources/testharness.js"></script> |
| <script src="../../../resources/testharnessreport.js"></script> |
| <script> |
| // Waits for a message in the isolated world, posts its string representation |
| // back to the main world, and resolves the promise with it. Not durable to |
| // multiple such messages being in-flight at once. |
| function awaitMessageInIsolatedWorld() { |
| testRunner.evaluateScriptInIsolatedWorld(1, |
| `window.addEventListener('message', function listener({ data: { origin, data }}) { |
| if (origin == 'main') { |
| window.postMessage({ origin: 'isolated', data: data.toString() }, '*'); |
| window.removeEventListener('message', listener); |
| } |
| });`); |
| |
| return new Promise((resolve, reject) => { |
| window.addEventListener('message', function listener({ data: { origin, data }}) { |
| if (origin == 'isolated') { |
| resolve(data); |
| window.removeEventListener('message', listener); |
| } |
| }); |
| }); |
| } |
| |
| // Like awaitMessageInIsolatedWorld, but listens in the main world. |
| function awaitMessageInMainWorld() { |
| return new Promise((resolve, reject) => { |
| window.addEventListener('message', function listener({ data: { origin, data }}) { |
| if (origin == 'main') { |
| resolve(data.toString()); |
| window.removeEventListener('message', listener); |
| } |
| }); |
| }); |
| } |
| |
| promise_test(async () => { |
| let mainPromise = awaitMessageInMainWorld(); |
| let isolatedPromise = awaitMessageInIsolatedWorld(); |
| |
| let typedArray = new Uint8Array([1, 2, 3, 4]); |
| let typedArrayAsString = typedArray.toString(); |
| window.postMessage({ origin: 'main', data: typedArray }, '*', [typedArray.buffer]); |
| |
| assert_equals(await mainPromise, typedArrayAsString); |
| assert_equals(await isolatedPromise, typedArrayAsString); |
| }, "Transferred array buffers can be read from messages in multiple worlds."); |
| |
| promise_test(async () => { |
| let mainPromise = awaitMessageInMainWorld(); |
| let isolatedPromise = awaitMessageInIsolatedWorld(); |
| |
| let imageBitmap = await createImageBitmap(new ImageData(2, 2)); |
| let imageBitmapAsString = imageBitmap.toString(); |
| window.postMessage({ origin: 'main', data: imageBitmap }, '*', [imageBitmap]); |
| |
| assert_equals(await mainPromise, imageBitmapAsString); |
| assert_equals(await isolatedPromise, imageBitmapAsString); |
| }, "Transferred image bitmaps can be read from messages in multiple worlds."); |
| </script> |