Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Side by Side Diff: third_party/WebKit/LayoutTests/fast/events/message-port-transferables.html

Issue 2414333003: WebMessaging: Send transferable ArrayBuffers by copy-and-neuter semantics (Closed)
Patch Set: fix tests Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 <!DOCTYPE html>
2 <script src="../../resources/testharness.js"></script>
3 <script src="../../resources/testharnessreport.js"></script>
4 <body>
5 <script id="worker" type="javascript/worker">
6
7 var messageHandler = function(port, e) {
8 var text_decoder = new TextDecoder;
9 port.postMessage({
10 content: text_decoder.decode(e.data),
11 byteLength: e.data.byteLength
12 });
13
14 // Send back the array buffer.
15 port.postMessage(e.data, [e.data.buffer]);
16
17 port.postMessage({
18 content: text_decoder.decode(e.data),
19 byteLength: e.data.byteLength
20 });
21 };
22
23 // For Worker.
24 self.addEventListener('message', e => {
25 var port = e.ports[0];
26 port.onmessage = messageHandler.bind(null, port);
27 });
28
29 // For SharedWorker.
30 self.addEventListener('connect', e => {
31 var port = e.ports[0];
32 port.onmessage = messageHandler.bind(null, port);
33 });
34
35 </script>
36
37 <script>
38
39 async_test(t => {
40 var message = 'Hello, world!';
41 var text_encoder = new TextEncoder;
42 var text_decoder = new TextDecoder;
43
44 var channel = new MessageChannel;
45 channel.port1.onmessage = function(e) {
46 assert_equals(e.data.byteLength, message.length);
47 assert_equals(text_decoder.decode(e.data), message);
48 t.done();
49 };
50 channel.port2.onmessage = function(e) {
51 assert_equals(e.data.byteLength, message.length);
52 assert_equals(text_decoder.decode(e.data), message);
53 channel.port2.postMessage(e.data, [e.data.buffer]);
54 assert_equals(e.data.byteLength, 0);
55 assert_equals(text_decoder.decode(e.data), '');
56 };
57
58 var ab = text_encoder.encode(message);
59 assert_equals(ab.byteLength, message.length);
60 channel.port1.postMessage(ab, [ab.buffer]);
61 assert_equals(ab.byteLength, 0);
62 assert_equals(text_decoder.decode(ab.data), '');
63 }, 'Send a transferable ArrayBuffer within a same frame');
64
65 async_test(t => {
66 var message = 'Hello, world!';
67 var text_encoder = new TextEncoder;
68 var text_decoder = new TextDecoder;
69
70 var frame = document.createElement('iframe');
71 frame.src = 'resources/empty.html';
72 frame.onload = function() {
73 frame.contentWindow.onmessage = function(evt) {
74 var port = evt.data;
75 port.onmessage = function(e) {
76 assert_equals(e.data.byteLength, message.length);
77 assert_equals(text_decoder.decode(e.data), message);
78 port.postMessage(e.data, [e.data.buffer]);
79 assert_equals(e.data.byteLength, 0);
80 assert_equals(text_decoder.decode(e.data), '');
81 };
82 };
83
84 var channel = new MessageChannel;
85 channel.port1.onmessage = function(e) {
86 assert_equals(e.data.byteLength, message.length);
87 assert_equals(text_decoder.decode(e.data), message);
88 t.done();
89 };
90 frame.contentWindow.postMessage(channel.port2, '*', [channel.port2]);
91
92 var ab = text_encoder.encode(message);
93 assert_equals(ab.byteLength, message.length);
94 channel.port1.postMessage(ab, [ab.buffer]);
95 assert_equals(ab.byteLength, 0);
96 assert_equals(text_decoder.decode(ab), '');
97 };
98 document.body.appendChild(frame);
99 }, 'Send a transferable ArrayBuffer over frames');
100
101 promise_test(t => {
102 var message = 'Hello, world!';
103 var text_encoder = new TextEncoder;
104 var text_decoder = new TextDecoder;
105 var channel = new MessageChannel;
106
107 var blob = new Blob([document.querySelector('#worker').textContent]);
108 var worker = new Worker(URL.createObjectURL(blob));
109 worker.postMessage(undefined, [channel.port2]);
110
111 var ab = text_encoder.encode(message);
112 assert_equals(ab.byteLength, message.length);
113 channel.port1.postMessage(ab, [ab.buffer]);
114 assert_equals(
115 ab.byteLength, 0,
116 'Byte length of a neutered buffer should be zero.');
117
118 return new Promise(resolve => { channel.port1.onmessage = resolve; })
119 .then(e => {
120 // Verify the integrity of the transferred array buffer.
121 assert_equals(e.data.content, message);
122 assert_equals(e.data.byteLength, message.length);
123 return new Promise(resolve => { channel.port1.onmessage = resolve; })
124 })
125 .then(e => {
126 // Verify the integrity of the array buffer sent back from Worker via
127 // MessagePort.
128 assert_equals(text_decoder.decode(e.data), message);
129 assert_equals(e.data.byteLength, message.length);
130 return new Promise(resolve => { channel.port1.onmessage = resolve; })
131 })
132 .then(e => {
133 // Verify that the array buffer on ServiceWorker is neutered.
134 assert_equals(e.data.content, '');
135 assert_equals(e.data.byteLength, 0);
136 });
137 }, 'Send a transferable ArrayBuffer to Worker');
138
139 promise_test(t => {
140 var message = 'Hello, world!';
141 var text_encoder = new TextEncoder;
142 var text_decoder = new TextDecoder;
143
144 var blob = new Blob([document.querySelector('#worker').textContent]);
145 var worker = new SharedWorker(URL.createObjectURL(blob));
146
147 var ab = text_encoder.encode(message);
148 assert_equals(ab.byteLength, message.length);
149 worker.port.postMessage(ab, [ab.buffer]);
150 assert_equals(
151 ab.byteLength, 0,
152 'Byte length of a neutered buffer should be zero.');
153
154 return new Promise(resolve => { worker.port.onmessage = resolve; })
155 .then(e => {
156 // Verify the integrity of the transferred array buffer.
157 assert_equals(e.data.content, message);
158 assert_equals(e.data.byteLength, message.length);
159 return new Promise(resolve => { worker.port.onmessage = resolve; })
160 })
161 .then(e => {
162 // Verify the integrity of the array buffer sent back from Worker via
163 // MessagePort.
164 assert_equals(text_decoder.decode(e.data), message);
165 assert_equals(e.data.byteLength, message.length);
166 return new Promise(resolve => { worker.port.onmessage = resolve; })
167 })
168 .then(e => {
169 // Verify that the array buffer on ServiceWorker is neutered.
170 assert_equals(e.data.content, '');
171 assert_equals(e.data.byteLength, 0);
172 });
173 }, 'Send a transferable ArrayBuffer to SharedWorker');
174
175 </script>
176 </body>
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698