Index: third_party/WebKit/LayoutTests/fast/events/message-port-transferables.html |
diff --git a/third_party/WebKit/LayoutTests/fast/events/message-port-transferables.html b/third_party/WebKit/LayoutTests/fast/events/message-port-transferables.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e0c13ebe3dd805d190ebb50a9abe97e9ab44efcb |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/fast/events/message-port-transferables.html |
@@ -0,0 +1,176 @@ |
+<!DOCTYPE html> |
+<script src="../../resources/testharness.js"></script> |
+<script src="../../resources/testharnessreport.js"></script> |
+<body> |
+<script id="worker" type="javascript/worker"> |
+ |
+var messageHandler = function(port, e) { |
+ var text_decoder = new TextDecoder; |
+ port.postMessage({ |
+ content: text_decoder.decode(e.data), |
+ byteLength: e.data.byteLength |
+ }); |
+ |
+ // Send back the array buffer. |
+ port.postMessage(e.data, [e.data.buffer]); |
+ |
+ port.postMessage({ |
+ content: text_decoder.decode(e.data), |
+ byteLength: e.data.byteLength |
+ }); |
+}; |
+ |
+// For Worker. |
+self.addEventListener('message', e => { |
+ var port = e.ports[0]; |
+ port.onmessage = messageHandler.bind(null, port); |
+}); |
+ |
+// For SharedWorker. |
+self.addEventListener('connect', e => { |
+ var port = e.ports[0]; |
+ port.onmessage = messageHandler.bind(null, port); |
+}); |
+ |
+</script> |
+ |
+<script> |
+ |
+async_test(t => { |
+ var message = 'Hello, world!'; |
+ var text_encoder = new TextEncoder; |
+ var text_decoder = new TextDecoder; |
+ |
+ var channel = new MessageChannel; |
+ channel.port1.onmessage = function(e) { |
+ assert_equals(e.data.byteLength, message.length); |
+ assert_equals(text_decoder.decode(e.data), message); |
+ t.done(); |
+ }; |
+ channel.port2.onmessage = function(e) { |
+ assert_equals(e.data.byteLength, message.length); |
+ assert_equals(text_decoder.decode(e.data), message); |
+ channel.port2.postMessage(e.data, [e.data.buffer]); |
+ assert_equals(e.data.byteLength, 0); |
+ assert_equals(text_decoder.decode(e.data), ''); |
+ }; |
+ |
+ var ab = text_encoder.encode(message); |
+ assert_equals(ab.byteLength, message.length); |
+ channel.port1.postMessage(ab, [ab.buffer]); |
+ assert_equals(ab.byteLength, 0); |
+ assert_equals(text_decoder.decode(ab.data), ''); |
+}, 'Send a transferable ArrayBuffer within a same frame'); |
+ |
+async_test(t => { |
+ var message = 'Hello, world!'; |
+ var text_encoder = new TextEncoder; |
+ var text_decoder = new TextDecoder; |
+ |
+ var frame = document.createElement('iframe'); |
+ frame.src = 'resources/empty.html'; |
+ frame.onload = function() { |
+ frame.contentWindow.onmessage = function(evt) { |
+ var port = evt.data; |
+ port.onmessage = function(e) { |
+ assert_equals(e.data.byteLength, message.length); |
+ assert_equals(text_decoder.decode(e.data), message); |
+ port.postMessage(e.data, [e.data.buffer]); |
+ assert_equals(e.data.byteLength, 0); |
+ assert_equals(text_decoder.decode(e.data), ''); |
+ }; |
+ }; |
+ |
+ var channel = new MessageChannel; |
+ channel.port1.onmessage = function(e) { |
+ assert_equals(e.data.byteLength, message.length); |
+ assert_equals(text_decoder.decode(e.data), message); |
+ t.done(); |
+ }; |
+ frame.contentWindow.postMessage(channel.port2, '*', [channel.port2]); |
+ |
+ var ab = text_encoder.encode(message); |
+ assert_equals(ab.byteLength, message.length); |
+ channel.port1.postMessage(ab, [ab.buffer]); |
+ assert_equals(ab.byteLength, 0); |
+ assert_equals(text_decoder.decode(ab), ''); |
+ }; |
+ document.body.appendChild(frame); |
+}, 'Send a transferable ArrayBuffer over frames'); |
+ |
+promise_test(t => { |
+ var message = 'Hello, world!'; |
+ var text_encoder = new TextEncoder; |
+ var text_decoder = new TextDecoder; |
+ var channel = new MessageChannel; |
+ |
+ var blob = new Blob([document.querySelector('#worker').textContent]); |
+ var worker = new Worker(URL.createObjectURL(blob)); |
+ worker.postMessage(undefined, [channel.port2]); |
+ |
+ var ab = text_encoder.encode(message); |
+ assert_equals(ab.byteLength, message.length); |
+ channel.port1.postMessage(ab, [ab.buffer]); |
+ assert_equals( |
+ ab.byteLength, 0, |
+ 'Byte length of a neutered buffer should be zero.'); |
+ |
+ return new Promise(resolve => { channel.port1.onmessage = resolve; }) |
+ .then(e => { |
+ // Verify the integrity of the transferred array buffer. |
+ assert_equals(e.data.content, message); |
+ assert_equals(e.data.byteLength, message.length); |
+ return new Promise(resolve => { channel.port1.onmessage = resolve; }) |
+ }) |
+ .then(e => { |
+ // Verify the integrity of the array buffer sent back from Worker via |
+ // MessagePort. |
+ assert_equals(text_decoder.decode(e.data), message); |
+ assert_equals(e.data.byteLength, message.length); |
+ return new Promise(resolve => { channel.port1.onmessage = resolve; }) |
+ }) |
+ .then(e => { |
+ // Verify that the array buffer on ServiceWorker is neutered. |
+ assert_equals(e.data.content, ''); |
+ assert_equals(e.data.byteLength, 0); |
+ }); |
+}, 'Send a transferable ArrayBuffer to Worker'); |
+ |
+promise_test(t => { |
+ var message = 'Hello, world!'; |
+ var text_encoder = new TextEncoder; |
+ var text_decoder = new TextDecoder; |
+ |
+ var blob = new Blob([document.querySelector('#worker').textContent]); |
+ var worker = new SharedWorker(URL.createObjectURL(blob)); |
+ |
+ var ab = text_encoder.encode(message); |
+ assert_equals(ab.byteLength, message.length); |
+ worker.port.postMessage(ab, [ab.buffer]); |
+ assert_equals( |
+ ab.byteLength, 0, |
+ 'Byte length of a neutered buffer should be zero.'); |
+ |
+ return new Promise(resolve => { worker.port.onmessage = resolve; }) |
+ .then(e => { |
+ // Verify the integrity of the transferred array buffer. |
+ assert_equals(e.data.content, message); |
+ assert_equals(e.data.byteLength, message.length); |
+ return new Promise(resolve => { worker.port.onmessage = resolve; }) |
+ }) |
+ .then(e => { |
+ // Verify the integrity of the array buffer sent back from Worker via |
+ // MessagePort. |
+ assert_equals(text_decoder.decode(e.data), message); |
+ assert_equals(e.data.byteLength, message.length); |
+ return new Promise(resolve => { worker.port.onmessage = resolve; }) |
+ }) |
+ .then(e => { |
+ // Verify that the array buffer on ServiceWorker is neutered. |
+ assert_equals(e.data.content, ''); |
+ assert_equals(e.data.byteLength, 0); |
+ }); |
+}, 'Send a transferable ArrayBuffer to SharedWorker'); |
+ |
+</script> |
+</body> |