OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.android_webview.test; | 5 package org.chromium.android_webview.test; |
6 | 6 |
7 import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout; | 7 import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout; |
8 | 8 |
9 import android.os.Handler; | 9 import android.os.Handler; |
10 import android.test.suitebuilder.annotation.SmallTest; | 10 import android.test.suitebuilder.annotation.SmallTest; |
11 import android.webkit.JavascriptInterface; | 11 import android.webkit.JavascriptInterface; |
12 | 12 |
13 import org.chromium.android_webview.AwContents; | 13 import org.chromium.android_webview.AwContents; |
14 import org.chromium.android_webview.AwMessagePort; | |
15 import org.chromium.android_webview.AwMessagePortService; | |
16 import org.chromium.android_webview.test.util.CommonResources; | 14 import org.chromium.android_webview.test.util.CommonResources; |
17 import org.chromium.base.ThreadUtils; | 15 import org.chromium.base.ThreadUtils; |
18 import org.chromium.base.annotations.SuppressFBWarnings; | 16 import org.chromium.base.annotations.SuppressFBWarnings; |
19 import org.chromium.base.test.util.DisabledTest; | 17 import org.chromium.base.test.util.DisabledTest; |
20 import org.chromium.base.test.util.Feature; | 18 import org.chromium.base.test.util.Feature; |
21 import org.chromium.base.test.util.RetryOnFailure; | 19 import org.chromium.base.test.util.RetryOnFailure; |
| 20 import org.chromium.content.browser.AppWebMessagePort; |
| 21 import org.chromium.content.browser.AppWebMessagePortService; |
22 import org.chromium.content.browser.test.util.Criteria; | 22 import org.chromium.content.browser.test.util.Criteria; |
23 import org.chromium.content.browser.test.util.CriteriaHelper; | 23 import org.chromium.content.browser.test.util.CriteriaHelper; |
24 import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPage
FinishedHelper; | 24 import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPage
FinishedHelper; |
25 import org.chromium.net.test.util.TestWebServer; | 25 import org.chromium.net.test.util.TestWebServer; |
26 | 26 |
27 import java.util.concurrent.Callable; | 27 import java.util.concurrent.Callable; |
28 import java.util.concurrent.CountDownLatch; | 28 import java.util.concurrent.CountDownLatch; |
29 | 29 |
30 /** | 30 /** |
31 * The tests for content postMessage API. | 31 * The tests for content postMessage API. |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 } | 192 } |
193 | 193 |
194 @SmallTest | 194 @SmallTest |
195 @Feature({"AndroidWebView", "Android-PostMessage"}) | 195 @Feature({"AndroidWebView", "Android-PostMessage"}) |
196 public void testTransferringSamePortTwiceViaPostMessageToFrameNotAllowed() t
hrows Throwable { | 196 public void testTransferringSamePortTwiceViaPostMessageToFrameNotAllowed() t
hrows Throwable { |
197 loadPage(TEST_PAGE); | 197 loadPage(TEST_PAGE); |
198 final CountDownLatch latch = new CountDownLatch(1); | 198 final CountDownLatch latch = new CountDownLatch(1); |
199 runTestOnUiThread(new Runnable() { | 199 runTestOnUiThread(new Runnable() { |
200 @Override | 200 @Override |
201 public void run() { | 201 public void run() { |
202 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 202 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
203 mAwContents.postMessageToFrame(null, "1", mWebServer.getBaseUrl(
), | 203 mAwContents.postMessageToFrame(null, "1", mWebServer.getBaseUrl(
), |
204 new AwMessagePort[]{channel[1]}); | 204 new AppWebMessagePort[]{channel[1]}); |
205 // Retransfer the port. This should fail with an exception. | 205 // Retransfer the port. This should fail with an exception. |
206 try { | 206 try { |
207 mAwContents.postMessageToFrame(null, "2", mWebServer.getBase
Url(), | 207 mAwContents.postMessageToFrame(null, "2", mWebServer.getBase
Url(), |
208 new AwMessagePort[]{channel[1]}); | 208 new AppWebMessagePort[]{channel[1]}); |
209 } catch (IllegalStateException ex) { | 209 } catch (IllegalStateException ex) { |
210 latch.countDown(); | 210 latch.countDown(); |
211 return; | 211 return; |
212 } | 212 } |
213 fail(); | 213 fail(); |
214 } | 214 } |
215 }); | 215 }); |
216 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); | 216 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); |
217 } | 217 } |
218 | 218 |
219 // There are two cases that put a port in a started state. | 219 // There are two cases that put a port in a started state. |
220 // 1. posting a message | 220 // 1. posting a message |
221 // 2. setting an event handler. | 221 // 2. setting an event handler. |
222 // A started port cannot return to "non-started" state. The four tests below
verifies | 222 // A started port cannot return to "non-started" state. The four tests below
verifies |
223 // these conditions for both conditions, using message ports and message cha
nnels. | 223 // these conditions for both conditions, using message ports and message cha
nnels. |
224 @SmallTest | 224 @SmallTest |
225 @Feature({"AndroidWebView", "Android-PostMessage"}) | 225 @Feature({"AndroidWebView", "Android-PostMessage"}) |
226 public void testStartedPortCannotBeTransferredUsingPostMessageToFrame1() thr
ows Throwable { | 226 public void testStartedPortCannotBeTransferredUsingPostMessageToFrame1() thr
ows Throwable { |
227 loadPage(TEST_PAGE); | 227 loadPage(TEST_PAGE); |
228 final CountDownLatch latch = new CountDownLatch(1); | 228 final CountDownLatch latch = new CountDownLatch(1); |
229 runTestOnUiThread(new Runnable() { | 229 runTestOnUiThread(new Runnable() { |
230 @Override | 230 @Override |
231 public void run() { | 231 public void run() { |
232 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 232 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
233 channel[1].postMessage("1", null); | 233 channel[1].postMessage("1", null); |
234 try { | 234 try { |
235 mAwContents.postMessageToFrame(null, "2", mWebServer.getBase
Url(), | 235 mAwContents.postMessageToFrame(null, "2", mWebServer.getBase
Url(), |
236 new AwMessagePort[]{channel[1]}); | 236 new AppWebMessagePort[]{channel[1]}); |
237 } catch (IllegalStateException ex) { | 237 } catch (IllegalStateException ex) { |
238 latch.countDown(); | 238 latch.countDown(); |
239 return; | 239 return; |
240 } | 240 } |
241 fail(); | 241 fail(); |
242 } | 242 } |
243 }); | 243 }); |
244 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); | 244 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); |
245 } | 245 } |
246 | 246 |
247 // see documentation in testStartedPortCannotBeTransferredUsingPostMessageTo
Frame1 | 247 // see documentation in testStartedPortCannotBeTransferredUsingPostMessageTo
Frame1 |
248 @SmallTest | 248 @SmallTest |
249 @Feature({"AndroidWebView", "Android-PostMessage"}) | 249 @Feature({"AndroidWebView", "Android-PostMessage"}) |
250 public void testStartedPortCannotBeTransferredUsingPostMessageToFrame2() thr
ows Throwable { | 250 public void testStartedPortCannotBeTransferredUsingPostMessageToFrame2() thr
ows Throwable { |
251 loadPage(TEST_PAGE); | 251 loadPage(TEST_PAGE); |
252 final CountDownLatch latch = new CountDownLatch(1); | 252 final CountDownLatch latch = new CountDownLatch(1); |
253 runTestOnUiThread(new Runnable() { | 253 runTestOnUiThread(new Runnable() { |
254 @Override | 254 @Override |
255 public void run() { | 255 public void run() { |
256 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 256 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
257 // set a web event handler, this puts the port in a started stat
e. | 257 // set a web event handler, this puts the port in a started stat
e. |
258 channel[1].setMessageCallback(new AwMessagePort.MessageCallback(
) { | 258 channel[1].setMessageCallback(new AppWebMessagePort.MessageCallb
ack() { |
259 @Override | 259 @Override |
260 public void onMessage(String message, AwMessagePort[] sentPo
rts) { } | 260 public void onMessage(String message, AppWebMessagePort[] se
ntPorts) { } |
261 }, null); | 261 }, null); |
262 try { | 262 try { |
263 mAwContents.postMessageToFrame(null, "2", mWebServer.getBase
Url(), | 263 mAwContents.postMessageToFrame(null, "2", mWebServer.getBase
Url(), |
264 new AwMessagePort[]{channel[1]}); | 264 new AppWebMessagePort[]{channel[1]}); |
265 } catch (IllegalStateException ex) { | 265 } catch (IllegalStateException ex) { |
266 latch.countDown(); | 266 latch.countDown(); |
267 return; | 267 return; |
268 } | 268 } |
269 fail(); | 269 fail(); |
270 } | 270 } |
271 }); | 271 }); |
272 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); | 272 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); |
273 } | 273 } |
274 | 274 |
275 // see documentation in testStartedPortCannotBeTransferredUsingPostMessageTo
Frame1 | 275 // see documentation in testStartedPortCannotBeTransferredUsingPostMessageTo
Frame1 |
276 @SmallTest | 276 @SmallTest |
277 @Feature({"AndroidWebView", "Android-PostMessage"}) | 277 @Feature({"AndroidWebView", "Android-PostMessage"}) |
278 @RetryOnFailure | 278 @RetryOnFailure |
279 public void testStartedPortCannotBeTransferredUsingMessageChannel1() throws
Throwable { | 279 public void testStartedPortCannotBeTransferredUsingMessageChannel1() throws
Throwable { |
280 loadPage(TEST_PAGE); | 280 loadPage(TEST_PAGE); |
281 final CountDownLatch latch = new CountDownLatch(1); | 281 final CountDownLatch latch = new CountDownLatch(1); |
282 runTestOnUiThread(new Runnable() { | 282 runTestOnUiThread(new Runnable() { |
283 @Override | 283 @Override |
284 public void run() { | 284 public void run() { |
285 AwMessagePort[] channel1 = mAwContents.createMessageChannel(); | 285 AppWebMessagePort[] channel1 = mAwContents.createMessageChannel(
); |
286 channel1[1].postMessage("1", null); | 286 channel1[1].postMessage("1", null); |
287 AwMessagePort[] channel2 = mAwContents.createMessageChannel(); | 287 AppWebMessagePort[] channel2 = mAwContents.createMessageChannel(
); |
288 try { | 288 try { |
289 channel2[0].postMessage("2", new AwMessagePort[]{channel1[1]
}); | 289 channel2[0].postMessage("2", new AppWebMessagePort[]{channel
1[1]}); |
290 } catch (IllegalStateException ex) { | 290 } catch (IllegalStateException ex) { |
291 latch.countDown(); | 291 latch.countDown(); |
292 return; | 292 return; |
293 } | 293 } |
294 fail(); | 294 fail(); |
295 } | 295 } |
296 }); | 296 }); |
297 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); | 297 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); |
298 } | 298 } |
299 | 299 |
300 // see documentation in testStartedPortCannotBeTransferredUsingPostMessageTo
Frame1 | 300 // see documentation in testStartedPortCannotBeTransferredUsingPostMessageTo
Frame1 |
301 @SmallTest | 301 @SmallTest |
302 @Feature({"AndroidWebView", "Android-PostMessage"}) | 302 @Feature({"AndroidWebView", "Android-PostMessage"}) |
303 public void testStartedPortCannotBeTransferredUsingMessageChannel2() throws
Throwable { | 303 public void testStartedPortCannotBeTransferredUsingMessageChannel2() throws
Throwable { |
304 loadPage(TEST_PAGE); | 304 loadPage(TEST_PAGE); |
305 final CountDownLatch latch = new CountDownLatch(1); | 305 final CountDownLatch latch = new CountDownLatch(1); |
306 runTestOnUiThread(new Runnable() { | 306 runTestOnUiThread(new Runnable() { |
307 @Override | 307 @Override |
308 public void run() { | 308 public void run() { |
309 AwMessagePort[] channel1 = mAwContents.createMessageChannel(); | 309 AppWebMessagePort[] channel1 = mAwContents.createMessageChannel(
); |
310 // set a web event handler, this puts the port in a started stat
e. | 310 // set a web event handler, this puts the port in a started stat
e. |
311 channel1[1].setMessageCallback(new AwMessagePort.MessageCallback
() { | 311 channel1[1].setMessageCallback(new AppWebMessagePort.MessageCall
back() { |
312 @Override | 312 @Override |
313 public void onMessage(String message, AwMessagePort[] sentPo
rts) { } | 313 public void onMessage(String message, AppWebMessagePort[] se
ntPorts) { } |
314 }, null); | 314 }, null); |
315 AwMessagePort[] channel2 = mAwContents.createMessageChannel(); | 315 AppWebMessagePort[] channel2 = mAwContents.createMessageChannel(
); |
316 try { | 316 try { |
317 channel2[0].postMessage("1", new AwMessagePort[]{channel1[1]
}); | 317 channel2[0].postMessage("1", new AppWebMessagePort[]{channel
1[1]}); |
318 } catch (IllegalStateException ex) { | 318 } catch (IllegalStateException ex) { |
319 latch.countDown(); | 319 latch.countDown(); |
320 return; | 320 return; |
321 } | 321 } |
322 fail(); | 322 fail(); |
323 } | 323 } |
324 }); | 324 }); |
325 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); | 325 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); |
326 } | 326 } |
327 | 327 |
328 | 328 |
329 // channel[0] and channel[1] are entangled ports, establishing a channel. Ve
rify | 329 // channel[0] and channel[1] are entangled ports, establishing a channel. Ve
rify |
330 // it is not allowed to transfer channel[0] on channel[0].postMessage. | 330 // it is not allowed to transfer channel[0] on channel[0].postMessage. |
331 // TODO(sgurun) Note that the related case of posting channel[1] via | 331 // TODO(sgurun) Note that the related case of posting channel[1] via |
332 // channel[0].postMessage does not throw a JS exception at present. We do no
t throw | 332 // channel[0].postMessage does not throw a JS exception at present. We do no
t throw |
333 // an exception in this case either since the information of entangled port
is not | 333 // an exception in this case either since the information of entangled port
is not |
334 // available at the source port. We need a new mechanism to implement to pre
vent | 334 // available at the source port. We need a new mechanism to implement to pre
vent |
335 // this case. | 335 // this case. |
336 @SmallTest | 336 @SmallTest |
337 @Feature({"AndroidWebView", "Android-PostMessage"}) | 337 @Feature({"AndroidWebView", "Android-PostMessage"}) |
338 public void testTransferringSourcePortViaMessageChannelNotAllowed() throws T
hrowable { | 338 public void testTransferringSourcePortViaMessageChannelNotAllowed() throws T
hrowable { |
339 loadPage(TEST_PAGE); | 339 loadPage(TEST_PAGE); |
340 final CountDownLatch latch = new CountDownLatch(1); | 340 final CountDownLatch latch = new CountDownLatch(1); |
341 runTestOnUiThread(new Runnable() { | 341 runTestOnUiThread(new Runnable() { |
342 @Override | 342 @Override |
343 public void run() { | 343 public void run() { |
344 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 344 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
345 try { | 345 try { |
346 channel[0].postMessage("1", new AwMessagePort[]{channel[0]})
; | 346 channel[0].postMessage("1", new AppWebMessagePort[]{channel[
0]}); |
347 } catch (IllegalStateException ex) { | 347 } catch (IllegalStateException ex) { |
348 latch.countDown(); | 348 latch.countDown(); |
349 return; | 349 return; |
350 } | 350 } |
351 fail(); | 351 fail(); |
352 } | 352 } |
353 }); | 353 }); |
354 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); | 354 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); |
355 } | 355 } |
356 | 356 |
357 // Verify a closed port cannot be transferred to a frame. | 357 // Verify a closed port cannot be transferred to a frame. |
358 @SmallTest | 358 @SmallTest |
359 @Feature({"AndroidWebView", "Android-PostMessage"}) | 359 @Feature({"AndroidWebView", "Android-PostMessage"}) |
360 public void testSendClosedPortToFrameNotAllowed() throws Throwable { | 360 public void testSendClosedPortToFrameNotAllowed() throws Throwable { |
361 loadPage(TEST_PAGE); | 361 loadPage(TEST_PAGE); |
362 final CountDownLatch latch = new CountDownLatch(1); | 362 final CountDownLatch latch = new CountDownLatch(1); |
363 runTestOnUiThread(new Runnable() { | 363 runTestOnUiThread(new Runnable() { |
364 @Override | 364 @Override |
365 public void run() { | 365 public void run() { |
366 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 366 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
367 channel[1].close(); | 367 channel[1].close(); |
368 try { | 368 try { |
369 mAwContents.postMessageToFrame(null, "1", mWebServer.getBase
Url(), | 369 mAwContents.postMessageToFrame(null, "1", mWebServer.getBase
Url(), |
370 new AwMessagePort[]{channel[1]}); | 370 new AppWebMessagePort[]{channel[1]}); |
371 } catch (IllegalStateException ex) { | 371 } catch (IllegalStateException ex) { |
372 latch.countDown(); | 372 latch.countDown(); |
373 return; | 373 return; |
374 } | 374 } |
375 fail(); | 375 fail(); |
376 } | 376 } |
377 }); | 377 }); |
378 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); | 378 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); |
379 } | 379 } |
380 | 380 |
381 // Verify a closed port cannot be transferred to a port. | 381 // Verify a closed port cannot be transferred to a port. |
382 @SmallTest | 382 @SmallTest |
383 @Feature({"AndroidWebView", "Android-PostMessage"}) | 383 @Feature({"AndroidWebView", "Android-PostMessage"}) |
384 public void testSendClosedPortToPortNotAllowed() throws Throwable { | 384 public void testSendClosedPortToPortNotAllowed() throws Throwable { |
385 loadPage(TEST_PAGE); | 385 loadPage(TEST_PAGE); |
386 final CountDownLatch latch = new CountDownLatch(1); | 386 final CountDownLatch latch = new CountDownLatch(1); |
387 runTestOnUiThread(new Runnable() { | 387 runTestOnUiThread(new Runnable() { |
388 @Override | 388 @Override |
389 public void run() { | 389 public void run() { |
390 AwMessagePort[] channel1 = mAwContents.createMessageChannel(); | 390 AppWebMessagePort[] channel1 = mAwContents.createMessageChannel(
); |
391 AwMessagePort[] channel2 = mAwContents.createMessageChannel(); | 391 AppWebMessagePort[] channel2 = mAwContents.createMessageChannel(
); |
392 channel2[1].close(); | 392 channel2[1].close(); |
393 try { | 393 try { |
394 channel1[0].postMessage("1", new AwMessagePort[]{channel2[1]
}); | 394 channel1[0].postMessage("1", new AppWebMessagePort[]{channel
2[1]}); |
395 } catch (IllegalStateException ex) { | 395 } catch (IllegalStateException ex) { |
396 latch.countDown(); | 396 latch.countDown(); |
397 return; | 397 return; |
398 } | 398 } |
399 fail(); | 399 fail(); |
400 } | 400 } |
401 }); | 401 }); |
402 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); | 402 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); |
403 } | 403 } |
404 | 404 |
405 // Verify messages cannot be posted to closed ports. | 405 // Verify messages cannot be posted to closed ports. |
406 @SmallTest | 406 @SmallTest |
407 @Feature({"AndroidWebView", "Android-PostMessage"}) | 407 @Feature({"AndroidWebView", "Android-PostMessage"}) |
408 public void testPostMessageToClosedPortNotAllowed() throws Throwable { | 408 public void testPostMessageToClosedPortNotAllowed() throws Throwable { |
409 loadPage(TEST_PAGE); | 409 loadPage(TEST_PAGE); |
410 final CountDownLatch latch = new CountDownLatch(1); | 410 final CountDownLatch latch = new CountDownLatch(1); |
411 runTestOnUiThread(new Runnable() { | 411 runTestOnUiThread(new Runnable() { |
412 @Override | 412 @Override |
413 public void run() { | 413 public void run() { |
414 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 414 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
415 channel[0].close(); | 415 channel[0].close(); |
416 try { | 416 try { |
417 channel[0].postMessage("1", null); | 417 channel[0].postMessage("1", null); |
418 } catch (IllegalStateException ex) { | 418 } catch (IllegalStateException ex) { |
419 latch.countDown(); | 419 latch.countDown(); |
420 return; | 420 return; |
421 } | 421 } |
422 fail(); | 422 fail(); |
423 } | 423 } |
424 }); | 424 }); |
425 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); | 425 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); |
426 } | 426 } |
427 | 427 |
428 // Verify messages posted before closing a port is received at the destinati
on port. | 428 // Verify messages posted before closing a port is received at the destinati
on port. |
429 @SmallTest | 429 @SmallTest |
430 @Feature({"AndroidWebView", "Android-PostMessage"}) | 430 @Feature({"AndroidWebView", "Android-PostMessage"}) |
431 public void testMessagesPostedBeforeClosingPortAreTransferred() throws Throw
able { | 431 public void testMessagesPostedBeforeClosingPortAreTransferred() throws Throw
able { |
432 loadPage(TITLE_FROM_POSTMESSAGE_TO_CHANNEL); | 432 loadPage(TITLE_FROM_POSTMESSAGE_TO_CHANNEL); |
433 runTestOnUiThread(new Runnable() { | 433 runTestOnUiThread(new Runnable() { |
434 @Override | 434 @Override |
435 public void run() { | 435 public void run() { |
436 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 436 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
437 mAwContents.postMessageToFrame(null, "1", mWebServer.getBaseUrl(
), | 437 mAwContents.postMessageToFrame(null, "1", mWebServer.getBaseUrl(
), |
438 new AwMessagePort[]{channel[1]}); | 438 new AppWebMessagePort[]{channel[1]}); |
439 channel[0].postMessage("2", null); | 439 channel[0].postMessage("2", null); |
440 channel[0].postMessage("3", null); | 440 channel[0].postMessage("3", null); |
441 channel[0].close(); | 441 channel[0].close(); |
442 } | 442 } |
443 }); | 443 }); |
444 expectTitle("23"); | 444 expectTitle("23"); |
445 } | 445 } |
446 | 446 |
447 // Verify a transferred port using postmessagetoframe cannot be closed. | 447 // Verify a transferred port using postmessagetoframe cannot be closed. |
448 @SmallTest | 448 @SmallTest |
449 @Feature({"AndroidWebView", "Android-PostMessage"}) | 449 @Feature({"AndroidWebView", "Android-PostMessage"}) |
450 public void testClosingTransferredPortToFrameThrowsAnException() throws Thro
wable { | 450 public void testClosingTransferredPortToFrameThrowsAnException() throws Thro
wable { |
451 loadPage(TEST_PAGE); | 451 loadPage(TEST_PAGE); |
452 final CountDownLatch latch = new CountDownLatch(1); | 452 final CountDownLatch latch = new CountDownLatch(1); |
453 runTestOnUiThread(new Runnable() { | 453 runTestOnUiThread(new Runnable() { |
454 @Override | 454 @Override |
455 public void run() { | 455 public void run() { |
456 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 456 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
457 mAwContents.postMessageToFrame(null, "1", mWebServer.getBaseUrl(
), | 457 mAwContents.postMessageToFrame(null, "1", mWebServer.getBaseUrl(
), |
458 new AwMessagePort[]{channel[1]}); | 458 new AppWebMessagePort[]{channel[1]}); |
459 try { | 459 try { |
460 channel[1].close(); | 460 channel[1].close(); |
461 } catch (IllegalStateException ex) { | 461 } catch (IllegalStateException ex) { |
462 latch.countDown(); | 462 latch.countDown(); |
463 return; | 463 return; |
464 } | 464 } |
465 fail(); | 465 fail(); |
466 } | 466 } |
467 }); | 467 }); |
468 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); | 468 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); |
469 } | 469 } |
470 | 470 |
471 // Verify a transferred port using postmessagetoframe cannot be closed. | 471 // Verify a transferred port using postmessagetoframe cannot be closed. |
472 @SmallTest | 472 @SmallTest |
473 @Feature({"AndroidWebView", "Android-PostMessage"}) | 473 @Feature({"AndroidWebView", "Android-PostMessage"}) |
474 public void testClosingTransferredPortToChannelThrowsAnException() throws Th
rowable { | 474 public void testClosingTransferredPortToChannelThrowsAnException() throws Th
rowable { |
475 loadPage(TEST_PAGE); | 475 loadPage(TEST_PAGE); |
476 final CountDownLatch latch = new CountDownLatch(1); | 476 final CountDownLatch latch = new CountDownLatch(1); |
477 runTestOnUiThread(new Runnable() { | 477 runTestOnUiThread(new Runnable() { |
478 @Override | 478 @Override |
479 public void run() { | 479 public void run() { |
480 AwMessagePort[] channel1 = mAwContents.createMessageChannel(); | 480 AppWebMessagePort[] channel1 = mAwContents.createMessageChannel(
); |
481 mAwContents.postMessageToFrame(null, "1", mWebServer.getBaseUrl(
), | 481 mAwContents.postMessageToFrame(null, "1", mWebServer.getBaseUrl(
), |
482 new AwMessagePort[]{channel1[1]}); | 482 new AppWebMessagePort[]{channel1[1]}); |
483 AwMessagePort[] channel2 = mAwContents.createMessageChannel(); | 483 AppWebMessagePort[] channel2 = mAwContents.createMessageChannel(
); |
484 channel1[0].postMessage("2", new AwMessagePort[]{channel2[0]}); | 484 channel1[0].postMessage("2", new AppWebMessagePort[]{channel2[0]
}); |
485 try { | 485 try { |
486 channel2[0].close(); | 486 channel2[0].close(); |
487 } catch (IllegalStateException ex) { | 487 } catch (IllegalStateException ex) { |
488 latch.countDown(); | 488 latch.countDown(); |
489 return; | 489 return; |
490 } | 490 } |
491 fail(); | 491 fail(); |
492 } | 492 } |
493 }); | 493 }); |
494 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); | 494 boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILL
ISECONDS); |
495 } | 495 } |
496 | 496 |
497 // Create two message channels, and while they are in pending state, transfe
r the | 497 // Create two message channels, and while they are in pending state, transfe
r the |
498 // second one in the first one. | 498 // second one in the first one. |
499 @SmallTest | 499 @SmallTest |
500 @Feature({"AndroidWebView", "Android-PostMessage"}) | 500 @Feature({"AndroidWebView", "Android-PostMessage"}) |
501 public void testPendingPortCanBeTransferredInPendingPort() throws Throwable
{ | 501 public void testPendingPortCanBeTransferredInPendingPort() throws Throwable
{ |
502 loadPage(TITLE_FROM_POSTMESSAGE_TO_CHANNEL); | 502 loadPage(TITLE_FROM_POSTMESSAGE_TO_CHANNEL); |
503 final TestMessagePort testPort = | 503 final TestMessagePort testPort = |
504 new TestMessagePort(getAwBrowserContext().getMessagePortService(
)); | 504 new TestMessagePort(getAwBrowserContext().getMessagePortService(
)); |
505 runTestOnUiThread(new Runnable() { | 505 runTestOnUiThread(new Runnable() { |
506 @Override | 506 @Override |
507 public void run() { | 507 public void run() { |
508 AwMessagePort[] channel1 = mAwContents.createMessageChannel(); | 508 AppWebMessagePort[] channel1 = mAwContents.createMessageChannel(
); |
509 mAwContents.postMessageToFrame(null, "1", mWebServer.getBaseUrl(
), | 509 mAwContents.postMessageToFrame(null, "1", mWebServer.getBaseUrl(
), |
510 new AwMessagePort[]{channel1[1]}); | 510 new AppWebMessagePort[]{channel1[1]}); |
511 AwMessagePort[] channel2 = mAwContents.createMessageChannel(); | 511 AppWebMessagePort[] channel2 = mAwContents.createMessageChannel(
); |
512 channel1[0].postMessage("2", new AwMessagePort[]{channel2[0]}); | 512 channel1[0].postMessage("2", new AppWebMessagePort[]{channel2[0]
}); |
513 } | 513 } |
514 }); | 514 }); |
515 expectTitle("2"); | 515 expectTitle("2"); |
516 } | 516 } |
517 | 517 |
518 private static class ChannelContainer { | 518 private static class ChannelContainer { |
519 private boolean mReady; | 519 private boolean mReady; |
520 private AwMessagePort[] mChannel; | 520 private AppWebMessagePort[] mChannel; |
521 private final Object mLock = new Object(); | 521 private final Object mLock = new Object(); |
522 private String mMessage = ""; | 522 private String mMessage = ""; |
523 private int mCount; | 523 private int mCount; |
524 private int mWaitCount; | 524 private int mWaitCount; |
525 | 525 |
526 public ChannelContainer() { | 526 public ChannelContainer() { |
527 this(1); | 527 this(1); |
528 } | 528 } |
529 | 529 |
530 public ChannelContainer(int n) { | 530 public ChannelContainer(int n) { |
531 mWaitCount = n; | 531 mWaitCount = n; |
532 } | 532 } |
533 | 533 |
534 public void set(AwMessagePort[] channel) { | 534 public void set(AppWebMessagePort[] channel) { |
535 mChannel = channel; | 535 mChannel = channel; |
536 } | 536 } |
537 public AwMessagePort[] get() { | 537 public AppWebMessagePort[] get() { |
538 return mChannel; | 538 return mChannel; |
539 } | 539 } |
540 | 540 |
541 public void setMessage(String message) { | 541 public void setMessage(String message) { |
542 synchronized (mLock) { | 542 synchronized (mLock) { |
543 mMessage += message; | 543 mMessage += message; |
544 if (++mCount < mWaitCount) return; | 544 if (++mCount < mWaitCount) return; |
545 mReady = true; | 545 mReady = true; |
546 mLock.notify(); | 546 mLock.notify(); |
547 } | 547 } |
(...skipping 26 matching lines...) Expand all Loading... |
574 // to browser to block waiting for UI thread, and this would in turn block r
enderer | 574 // to browser to block waiting for UI thread, and this would in turn block r
enderer |
575 // doing the conversion. | 575 // doing the conversion. |
576 @DisabledTest | 576 @DisabledTest |
577 @Feature({"AndroidWebView", "Android-PostMessage"}) | 577 @Feature({"AndroidWebView", "Android-PostMessage"}) |
578 public void testReceiveMessageInBackgroundThread() throws Throwable { | 578 public void testReceiveMessageInBackgroundThread() throws Throwable { |
579 loadPage(TEST_PAGE); | 579 loadPage(TEST_PAGE); |
580 final ChannelContainer channelContainer = new ChannelContainer(); | 580 final ChannelContainer channelContainer = new ChannelContainer(); |
581 runTestOnUiThread(new Runnable() { | 581 runTestOnUiThread(new Runnable() { |
582 @Override | 582 @Override |
583 public void run() { | 583 public void run() { |
584 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 584 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
585 // verify communication from JS to Java. | 585 // verify communication from JS to Java. |
586 channelContainer.set(channel); | 586 channelContainer.set(channel); |
587 channel[0].setMessageCallback(new AwMessagePort.MessageCallback(
) { | 587 channel[0].setMessageCallback(new AppWebMessagePort.MessageCallb
ack() { |
588 @Override | 588 @Override |
589 public void onMessage(String message, AwMessagePort[] sentPo
rts) { | 589 public void onMessage(String message, AppWebMessagePort[] se
ntPorts) { |
590 channelContainer.setMessage(message); | 590 channelContainer.setMessage(message); |
591 } | 591 } |
592 }, null); | 592 }, null); |
593 mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer
.getBaseUrl(), | 593 mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer
.getBaseUrl(), |
594 new AwMessagePort[]{channel[1]}); | 594 new AppWebMessagePort[]{channel[1]}); |
595 } | 595 } |
596 }); | 596 }); |
597 mMessageObject.waitForMessage(); | 597 mMessageObject.waitForMessage(); |
598 assertEquals(WEBVIEW_MESSAGE, mMessageObject.getData()); | 598 assertEquals(WEBVIEW_MESSAGE, mMessageObject.getData()); |
599 assertEquals(SOURCE_ORIGIN, mMessageObject.getOrigin()); | 599 assertEquals(SOURCE_ORIGIN, mMessageObject.getOrigin()); |
600 // verify that one message port is received at the js side | 600 // verify that one message port is received at the js side |
601 assertEquals(1, mMessageObject.getPorts().length); | 601 assertEquals(1, mMessageObject.getPorts().length); |
602 // wait until we receive a message from JS | 602 // wait until we receive a message from JS |
603 runTestOnUiThread(new Runnable() { | 603 runTestOnUiThread(new Runnable() { |
604 @Override | 604 @Override |
(...skipping 13 matching lines...) Expand all Loading... |
618 + " <script>" | 618 + " <script>" |
619 + " onmessage = function (e) {" | 619 + " onmessage = function (e) {" |
620 + " var myPort = e.ports[0];" | 620 + " var myPort = e.ports[0];" |
621 + " myPort.onmessage = function(e) {" | 621 + " myPort.onmessage = function(e) {" |
622 + " myPort.postMessage(e.data + \"" + JS_MESSAGE + "\
"); }" | 622 + " myPort.postMessage(e.data + \"" + JS_MESSAGE + "\
"); }" |
623 + " }" | 623 + " }" |
624 + " </script>" | 624 + " </script>" |
625 + "</body></html>"; | 625 + "</body></html>"; |
626 | 626 |
627 // Call on non-UI thread. | 627 // Call on non-UI thread. |
628 private void waitUntilPortReady(final AwMessagePort port) throws Throwable { | 628 private void waitUntilPortReady(final AppWebMessagePort port) throws Throwab
le { |
629 CriteriaHelper.pollUiThread(new Criteria() { | 629 CriteriaHelper.pollUiThread(new Criteria() { |
630 @Override | 630 @Override |
631 public boolean isSatisfied() { | 631 public boolean isSatisfied() { |
632 return port.isReady(); | 632 return port.isReady(); |
633 } | 633 } |
634 }); | 634 }); |
635 } | 635 } |
636 | 636 |
637 private static final String HELLO = "HELLO"; | 637 private static final String HELLO = "HELLO"; |
638 | 638 |
639 // Message channels are created on UI thread in a pending state. They are | 639 // Message channels are created on UI thread in a pending state. They are |
640 // initialized at a later stage. Verify that a message port that is initiali
zed | 640 // initialized at a later stage. Verify that a message port that is initiali
zed |
641 // can be transferred to JS and full communication can happen on it. | 641 // can be transferred to JS and full communication can happen on it. |
642 // Do this by sending a message to JS and let it echo'ing the message with | 642 // Do this by sending a message to JS and let it echo'ing the message with |
643 // some text prepended to it. | 643 // some text prepended to it. |
644 @SmallTest | 644 @SmallTest |
645 @Feature({"AndroidWebView", "Android-PostMessage"}) | 645 @Feature({"AndroidWebView", "Android-PostMessage"}) |
646 public void testMessageChannelUsingInitializedPort() throws Throwable { | 646 public void testMessageChannelUsingInitializedPort() throws Throwable { |
647 final ChannelContainer channelContainer = new ChannelContainer(); | 647 final ChannelContainer channelContainer = new ChannelContainer(); |
648 loadPage(ECHO_PAGE); | 648 loadPage(ECHO_PAGE); |
649 final AwMessagePort[] channel = ThreadUtils.runOnUiThreadBlocking( | 649 final AppWebMessagePort[] channel = ThreadUtils.runOnUiThreadBlocking( |
650 new Callable<AwMessagePort[]>() { | 650 new Callable<AppWebMessagePort[]>() { |
651 @Override | 651 @Override |
652 public AwMessagePort[] call() { | 652 public AppWebMessagePort[] call() { |
653 return mAwContents.createMessageChannel(); | 653 return mAwContents.createMessageChannel(); |
654 } | 654 } |
655 }); | 655 }); |
656 | 656 |
657 waitUntilPortReady(channel[0]); | 657 waitUntilPortReady(channel[0]); |
658 waitUntilPortReady(channel[1]); | 658 waitUntilPortReady(channel[1]); |
659 runTestOnUiThread(new Runnable() { | 659 runTestOnUiThread(new Runnable() { |
660 @Override | 660 @Override |
661 public void run() { | 661 public void run() { |
662 channel[0].setMessageCallback(new AwMessagePort.MessageCallback(
) { | 662 channel[0].setMessageCallback(new AppWebMessagePort.MessageCallb
ack() { |
663 @Override | 663 @Override |
664 public void onMessage(String message, AwMessagePort[] sentPo
rts) { | 664 public void onMessage(String message, AppWebMessagePort[] se
ntPorts) { |
665 channelContainer.setMessage(message); | 665 channelContainer.setMessage(message); |
666 } | 666 } |
667 }, null); | 667 }, null); |
668 mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer
.getBaseUrl(), | 668 mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer
.getBaseUrl(), |
669 new AwMessagePort[]{channel[1]}); | 669 new AppWebMessagePort[]{channel[1]}); |
670 channel[0].postMessage(HELLO, null); | 670 channel[0].postMessage(HELLO, null); |
671 } | 671 } |
672 }); | 672 }); |
673 // wait for the asynchronous response from JS | 673 // wait for the asynchronous response from JS |
674 channelContainer.waitForMessage(); | 674 channelContainer.waitForMessage(); |
675 assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage()); | 675 assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage()); |
676 } | 676 } |
677 | 677 |
678 // Verify that a message port can be used immediately (even if it is in | 678 // Verify that a message port can be used immediately (even if it is in |
679 // pending state) after creation. In particular make sure the message port c
an be | 679 // pending state) after creation. In particular make sure the message port c
an be |
680 // transferred to JS and full communication can happen on it. | 680 // transferred to JS and full communication can happen on it. |
681 // Do this by sending a message to JS and let it echo'ing the message with | 681 // Do this by sending a message to JS and let it echo'ing the message with |
682 // some text prepended to it. | 682 // some text prepended to it. |
683 @SmallTest | 683 @SmallTest |
684 @Feature({"AndroidWebView", "Android-PostMessage"}) | 684 @Feature({"AndroidWebView", "Android-PostMessage"}) |
685 public void testMessageChannelUsingPendingPort() throws Throwable { | 685 public void testMessageChannelUsingPendingPort() throws Throwable { |
686 final ChannelContainer channelContainer = new ChannelContainer(); | 686 final ChannelContainer channelContainer = new ChannelContainer(); |
687 loadPage(ECHO_PAGE); | 687 loadPage(ECHO_PAGE); |
688 runTestOnUiThread(new Runnable() { | 688 runTestOnUiThread(new Runnable() { |
689 @Override | 689 @Override |
690 public void run() { | 690 public void run() { |
691 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 691 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
692 channel[0].setMessageCallback(new AwMessagePort.MessageCallback(
) { | 692 channel[0].setMessageCallback(new AppWebMessagePort.MessageCallb
ack() { |
693 @Override | 693 @Override |
694 public void onMessage(String message, AwMessagePort[] sentPo
rts) { | 694 public void onMessage(String message, AppWebMessagePort[] se
ntPorts) { |
695 channelContainer.setMessage(message); | 695 channelContainer.setMessage(message); |
696 } | 696 } |
697 }, null); | 697 }, null); |
698 mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer
.getBaseUrl(), | 698 mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer
.getBaseUrl(), |
699 new AwMessagePort[]{channel[1]}); | 699 new AppWebMessagePort[]{channel[1]}); |
700 channel[0].postMessage(HELLO, null); | 700 channel[0].postMessage(HELLO, null); |
701 } | 701 } |
702 }); | 702 }); |
703 // Wait for the asynchronous response from JS. | 703 // Wait for the asynchronous response from JS. |
704 channelContainer.waitForMessage(); | 704 channelContainer.waitForMessage(); |
705 assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage()); | 705 assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage()); |
706 } | 706 } |
707 | 707 |
708 // Verify that a message port can be used for message transfer when both | 708 // Verify that a message port can be used for message transfer when both |
709 // ports are owned by same Webview. | 709 // ports are owned by same Webview. |
710 @SmallTest | 710 @SmallTest |
711 @Feature({"AndroidWebView", "Android-PostMessage"}) | 711 @Feature({"AndroidWebView", "Android-PostMessage"}) |
712 public void testMessageChannelCommunicationWithinWebView() throws Throwable
{ | 712 public void testMessageChannelCommunicationWithinWebView() throws Throwable
{ |
713 final ChannelContainer channelContainer = new ChannelContainer(); | 713 final ChannelContainer channelContainer = new ChannelContainer(); |
714 loadPage(ECHO_PAGE); | 714 loadPage(ECHO_PAGE); |
715 runTestOnUiThread(new Runnable() { | 715 runTestOnUiThread(new Runnable() { |
716 @Override | 716 @Override |
717 public void run() { | 717 public void run() { |
718 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 718 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
719 channel[1].setMessageCallback(new AwMessagePort.MessageCallback(
) { | 719 channel[1].setMessageCallback(new AppWebMessagePort.MessageCallb
ack() { |
720 @Override | 720 @Override |
721 public void onMessage(String message, AwMessagePort[] sentPo
rts) { | 721 public void onMessage(String message, AppWebMessagePort[] se
ntPorts) { |
722 channelContainer.setMessage(message); | 722 channelContainer.setMessage(message); |
723 } | 723 } |
724 }, null); | 724 }, null); |
725 channel[0].postMessage(HELLO, null); | 725 channel[0].postMessage(HELLO, null); |
726 } | 726 } |
727 }); | 727 }); |
728 // Wait for the asynchronous response from JS. | 728 // Wait for the asynchronous response from JS. |
729 channelContainer.waitForMessage(); | 729 channelContainer.waitForMessage(); |
730 assertEquals(HELLO, channelContainer.getMessage()); | 730 assertEquals(HELLO, channelContainer.getMessage()); |
731 } | 731 } |
732 | 732 |
733 // Post a message with a pending port to a frame and then post a bunch of me
ssages | 733 // Post a message with a pending port to a frame and then post a bunch of me
ssages |
734 // after that. Make sure that they are not ordered at the receiver side. | 734 // after that. Make sure that they are not ordered at the receiver side. |
735 @SmallTest | 735 @SmallTest |
736 @Feature({"AndroidWebView", "Android-PostMessage"}) | 736 @Feature({"AndroidWebView", "Android-PostMessage"}) |
737 public void testPostMessageToFrameNotReordersMessages() throws Throwable { | 737 public void testPostMessageToFrameNotReordersMessages() throws Throwable { |
738 loadPage(TITLE_FROM_POSTMESSAGE_TO_FRAME); | 738 loadPage(TITLE_FROM_POSTMESSAGE_TO_FRAME); |
739 runTestOnUiThread(new Runnable() { | 739 runTestOnUiThread(new Runnable() { |
740 @Override | 740 @Override |
741 public void run() { | 741 public void run() { |
742 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 742 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
743 mAwContents.postMessageToFrame(null, "1", mWebServer.getBaseUrl(
), | 743 mAwContents.postMessageToFrame(null, "1", mWebServer.getBaseUrl(
), |
744 new AwMessagePort[]{channel[1]}); | 744 new AppWebMessagePort[]{channel[1]}); |
745 mAwContents.postMessageToFrame(null, "2", mWebServer.getBaseUrl(
), null); | 745 mAwContents.postMessageToFrame(null, "2", mWebServer.getBaseUrl(
), null); |
746 mAwContents.postMessageToFrame(null, "3", mWebServer.getBaseUrl(
), null); | 746 mAwContents.postMessageToFrame(null, "3", mWebServer.getBaseUrl(
), null); |
747 } | 747 } |
748 }); | 748 }); |
749 expectTitle("123"); | 749 expectTitle("123"); |
750 } | 750 } |
751 | 751 |
752 private static final String RECEIVE_JS_MESSAGE_CHANNEL_PAGE = | 752 private static final String RECEIVE_JS_MESSAGE_CHANNEL_PAGE = |
753 "<!DOCTYPE html><html><body>" | 753 "<!DOCTYPE html><html><body>" |
754 + " <script>" | 754 + " <script>" |
(...skipping 18 matching lines...) Expand all Loading... |
773 // 3. Java sends a message using the new channel in 2. | 773 // 3. Java sends a message using the new channel in 2. |
774 // 4. Js responds to this message using the channel in 2. | 774 // 4. Js responds to this message using the channel in 2. |
775 // 5. Java responds to message in 4 using the channel in 2. | 775 // 5. Java responds to message in 4 using the channel in 2. |
776 @SmallTest | 776 @SmallTest |
777 @Feature({"AndroidWebView", "Android-PostMessage"}) | 777 @Feature({"AndroidWebView", "Android-PostMessage"}) |
778 public void testCanUseReceivedAwMessagePortFromJS() throws Throwable { | 778 public void testCanUseReceivedAwMessagePortFromJS() throws Throwable { |
779 loadPage(RECEIVE_JS_MESSAGE_CHANNEL_PAGE); | 779 loadPage(RECEIVE_JS_MESSAGE_CHANNEL_PAGE); |
780 runTestOnUiThread(new Runnable() { | 780 runTestOnUiThread(new Runnable() { |
781 @Override | 781 @Override |
782 public void run() { | 782 public void run() { |
783 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 783 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
784 mAwContents.postMessageToFrame(null, "1", mWebServer.getBaseUrl(
), | 784 mAwContents.postMessageToFrame(null, "1", mWebServer.getBaseUrl(
), |
785 new AwMessagePort[]{channel[1]}); | 785 new AppWebMessagePort[]{channel[1]}); |
786 channel[0].setMessageCallback(new AwMessagePort.MessageCallback(
) { | 786 channel[0].setMessageCallback(new AppWebMessagePort.MessageCallb
ack() { |
787 @Override | 787 @Override |
788 public void onMessage(String message, final AwMessagePort[]
p) { | 788 public void onMessage(String message, final AppWebMessagePor
t[] p) { |
789 p[0].setMessageCallback(new AwMessagePort.MessageCallbac
k() { | 789 p[0].setMessageCallback(new AppWebMessagePort.MessageCal
lback() { |
790 @Override | 790 @Override |
791 public void onMessage(String message, AwMessagePort[
] q) { | 791 public void onMessage(String message, AppWebMessageP
ort[] q) { |
792 assertEquals("3", message); | 792 assertEquals("3", message); |
793 p[0].postMessage("4", null); | 793 p[0].postMessage("4", null); |
794 } | 794 } |
795 }, null); | 795 }, null); |
796 p[0].postMessage("2", null); | 796 p[0].postMessage("2", null); |
797 } | 797 } |
798 }, null); | 798 }, null); |
799 } | 799 } |
800 }); | 800 }); |
801 expectTitle("24"); | 801 expectTitle("24"); |
802 } | 802 } |
803 | 803 |
804 private static class TestMessagePort extends AwMessagePort { | 804 private static class TestMessagePort extends AppWebMessagePort { |
805 | 805 |
806 private boolean mReady; | 806 private boolean mReady; |
807 private AwMessagePort mPort; | 807 private AppWebMessagePort mPort; |
808 private final Object mLock = new Object(); | 808 private final Object mLock = new Object(); |
809 | 809 |
810 public TestMessagePort(AwMessagePortService service) { | 810 public TestMessagePort(AppWebMessagePortService service) { |
811 super(service); | 811 super(service); |
812 } | 812 } |
813 | 813 |
814 public void setMessagePort(AwMessagePort port) { | 814 public void setMessagePort(AppWebMessagePort port) { |
815 mPort = port; | 815 mPort = port; |
816 } | 816 } |
817 | 817 |
818 public void setReady(boolean ready) { | 818 public void setReady(boolean ready) { |
819 synchronized (mLock) { | 819 synchronized (mLock) { |
820 mReady = ready; | 820 mReady = ready; |
821 } | 821 } |
822 } | 822 } |
823 @Override | 823 @Override |
824 public boolean isReady() { | 824 public boolean isReady() { |
(...skipping 15 matching lines...) Expand all Loading... |
840 } | 840 } |
841 @Override | 841 @Override |
842 public boolean isClosed() { | 842 public boolean isClosed() { |
843 return mPort.isClosed(); | 843 return mPort.isClosed(); |
844 } | 844 } |
845 @Override | 845 @Override |
846 public void setMessageCallback(MessageCallback messageCallback, Handler
handler) { | 846 public void setMessageCallback(MessageCallback messageCallback, Handler
handler) { |
847 mPort.setMessageCallback(messageCallback, handler); | 847 mPort.setMessageCallback(messageCallback, handler); |
848 } | 848 } |
849 @Override | 849 @Override |
850 public void onMessage(String message, AwMessagePort[] sentPorts) { | 850 public void onMessage(String message, AppWebMessagePort[] sentPorts) { |
851 mPort.onMessage(message, sentPorts); | 851 mPort.onMessage(message, sentPorts); |
852 } | 852 } |
853 @Override | 853 @Override |
854 public void postMessage(String message, AwMessagePort[] sentPorts) throw
s | 854 public void postMessage(String message, AppWebMessagePort[] sentPorts) t
hrows |
855 IllegalStateException { | 855 IllegalStateException { |
856 mPort.postMessage(message, sentPorts); | 856 mPort.postMessage(message, sentPorts); |
857 } | 857 } |
858 } | 858 } |
859 | 859 |
860 // Post a message with a pending port to a frame and then post a message tha
t | 860 // Post a message with a pending port to a frame and then post a message tha
t |
861 // is pending after that. Make sure that when first message becomes ready, | 861 // is pending after that. Make sure that when first message becomes ready, |
862 // the subsequent not-ready message is not sent. | 862 // the subsequent not-ready message is not sent. |
863 @SmallTest | 863 @SmallTest |
864 @Feature({"AndroidWebView", "Android-PostMessage"}) | 864 @Feature({"AndroidWebView", "Android-PostMessage"}) |
865 public void testPostMessageToFrameNotSendsPendingMessages() throws Throwable
{ | 865 public void testPostMessageToFrameNotSendsPendingMessages() throws Throwable
{ |
866 loadPage(TITLE_FROM_POSTMESSAGE_TO_FRAME); | 866 loadPage(TITLE_FROM_POSTMESSAGE_TO_FRAME); |
867 final TestMessagePort testPort = | 867 final TestMessagePort testPort = |
868 new TestMessagePort(getAwBrowserContext().getMessagePortService(
)); | 868 new TestMessagePort(getAwBrowserContext().getMessagePortService(
)); |
869 runTestOnUiThread(new Runnable() { | 869 runTestOnUiThread(new Runnable() { |
870 @Override | 870 @Override |
871 public void run() { | 871 public void run() { |
872 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 872 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
873 mAwContents.postMessageToFrame(null, "1", mWebServer.getBaseUrl(
), | 873 mAwContents.postMessageToFrame(null, "1", mWebServer.getBaseUrl(
), |
874 new AwMessagePort[]{channel[1]}); | 874 new AppWebMessagePort[]{channel[1]}); |
875 mAwContents.postMessageToFrame(null, "2", mWebServer.getBaseUrl(
), null); | 875 mAwContents.postMessageToFrame(null, "2", mWebServer.getBaseUrl(
), null); |
876 AwMessagePort[] channel2 = mAwContents.createMessageChannel(); | 876 AppWebMessagePort[] channel2 = mAwContents.createMessageChannel(
); |
877 // Test port is in a pending state so it should not be transferr
ed. | 877 // Test port is in a pending state so it should not be transferr
ed. |
878 testPort.setMessagePort(channel2[0]); | 878 testPort.setMessagePort(channel2[0]); |
879 mAwContents.postMessageToFrame(null, "3", mWebServer.getBaseUrl(
), | 879 mAwContents.postMessageToFrame(null, "3", mWebServer.getBaseUrl(
), |
880 new AwMessagePort[]{testPort}); | 880 new AppWebMessagePort[]{testPort}); |
881 } | 881 } |
882 }); | 882 }); |
883 expectTitle("12"); | 883 expectTitle("12"); |
884 } | 884 } |
885 | 885 |
886 private static final String WORKER_MESSAGE = "from_worker"; | 886 private static final String WORKER_MESSAGE = "from_worker"; |
887 | 887 |
888 // Listen for messages. Pass port 1 to worker and use port 2 to receive mess
ages from | 888 // Listen for messages. Pass port 1 to worker and use port 2 to receive mess
ages from |
889 // from worker. | 889 // from worker. |
890 private static final String TEST_PAGE_FOR_PORT_TRANSFER = | 890 private static final String TEST_PAGE_FOR_PORT_TRANSFER = |
(...skipping 29 matching lines...) Expand all Loading... |
920 @SmallTest | 920 @SmallTest |
921 @Feature({"AndroidWebView", "Android-PostMessage"}) | 921 @Feature({"AndroidWebView", "Android-PostMessage"}) |
922 @RetryOnFailure | 922 @RetryOnFailure |
923 public void testTransferPortsToWorker() throws Throwable { | 923 public void testTransferPortsToWorker() throws Throwable { |
924 mWebServer.setResponse("/worker.js", WORKER_SCRIPT, | 924 mWebServer.setResponse("/worker.js", WORKER_SCRIPT, |
925 CommonResources.getTextJavascriptHeaders(true)); | 925 CommonResources.getTextJavascriptHeaders(true)); |
926 loadPage(TEST_PAGE_FOR_PORT_TRANSFER); | 926 loadPage(TEST_PAGE_FOR_PORT_TRANSFER); |
927 runTestOnUiThread(new Runnable() { | 927 runTestOnUiThread(new Runnable() { |
928 @Override | 928 @Override |
929 public void run() { | 929 public void run() { |
930 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 930 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
931 mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer
.getBaseUrl(), | 931 mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer
.getBaseUrl(), |
932 new AwMessagePort[]{channel[0], channel[1]}); | 932 new AppWebMessagePort[]{channel[0], channel[1]}); |
933 } | 933 } |
934 }); | 934 }); |
935 mMessageObject.waitForMessage(); | 935 mMessageObject.waitForMessage(); |
936 assertEquals(WORKER_MESSAGE, mMessageObject.getData()); | 936 assertEquals(WORKER_MESSAGE, mMessageObject.getData()); |
937 } | 937 } |
938 | 938 |
939 private static final String POPUP_MESSAGE = "from_popup"; | 939 private static final String POPUP_MESSAGE = "from_popup"; |
940 private static final String POPUP_URL = "/popup.html"; | 940 private static final String POPUP_URL = "/popup.html"; |
941 private static final String IFRAME_URL = "/iframe.html"; | 941 private static final String IFRAME_URL = "/iframe.html"; |
942 private static final String MAIN_PAGE_FOR_POPUP_TEST = "<!DOCTYPE html><html
>" | 942 private static final String MAIN_PAGE_FOR_POPUP_TEST = "<!DOCTYPE html><html
>" |
(...skipping 25 matching lines...) Expand all Loading... |
968 @Feature({"AndroidWebView", "Android-PostMessage"}) | 968 @Feature({"AndroidWebView", "Android-PostMessage"}) |
969 public void testPostMessageToPopup() throws Throwable { | 969 public void testPostMessageToPopup() throws Throwable { |
970 triggerPopup(mAwContents, mContentsClient, mWebServer, MAIN_PAGE_FOR_POP
UP_TEST, ECHO_PAGE, | 970 triggerPopup(mAwContents, mContentsClient, mWebServer, MAIN_PAGE_FOR_POP
UP_TEST, ECHO_PAGE, |
971 POPUP_URL, "createPopup()"); | 971 POPUP_URL, "createPopup()"); |
972 connectPendingPopup(mAwContents); | 972 connectPendingPopup(mAwContents); |
973 final ChannelContainer channelContainer = new ChannelContainer(); | 973 final ChannelContainer channelContainer = new ChannelContainer(); |
974 | 974 |
975 runTestOnUiThread(new Runnable() { | 975 runTestOnUiThread(new Runnable() { |
976 @Override | 976 @Override |
977 public void run() { | 977 public void run() { |
978 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 978 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
979 channelContainer.set(channel); | 979 channelContainer.set(channel); |
980 channel[0].setMessageCallback(new AwMessagePort.MessageCallback(
) { | 980 channel[0].setMessageCallback(new AppWebMessagePort.MessageCallb
ack() { |
981 @Override | 981 @Override |
982 public void onMessage(String message, AwMessagePort[] sentPo
rts) { | 982 public void onMessage(String message, AppWebMessagePort[] se
ntPorts) { |
983 channelContainer.setMessage(message); | 983 channelContainer.setMessage(message); |
984 } | 984 } |
985 }, null); | 985 }, null); |
986 mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer
.getBaseUrl(), | 986 mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer
.getBaseUrl(), |
987 new AwMessagePort[] {channel[1]}); | 987 new AppWebMessagePort[] {channel[1]}); |
988 channel[0].postMessage(HELLO, null); | 988 channel[0].postMessage(HELLO, null); |
989 } | 989 } |
990 }); | 990 }); |
991 channelContainer.waitForMessage(); | 991 channelContainer.waitForMessage(); |
992 assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage()); | 992 assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage()); |
993 } | 993 } |
994 | 994 |
995 // Test if WebView can post a message from/to an iframe in a popup window. | 995 // Test if WebView can post a message from/to an iframe in a popup window. |
996 @SmallTest | 996 @SmallTest |
997 @Feature({"AndroidWebView", "Android-PostMessage"}) | 997 @Feature({"AndroidWebView", "Android-PostMessage"}) |
998 public void testPostMessageToIframeInsidePopup() throws Throwable { | 998 public void testPostMessageToIframeInsidePopup() throws Throwable { |
999 mWebServer.setResponse(IFRAME_URL, ECHO_PAGE, null); | 999 mWebServer.setResponse(IFRAME_URL, ECHO_PAGE, null); |
1000 triggerPopup(mAwContents, mContentsClient, mWebServer, MAIN_PAGE_FOR_POP
UP_TEST, | 1000 triggerPopup(mAwContents, mContentsClient, mWebServer, MAIN_PAGE_FOR_POP
UP_TEST, |
1001 POPUP_PAGE_WITH_IFRAME, POPUP_URL, "createPopup()"); | 1001 POPUP_PAGE_WITH_IFRAME, POPUP_URL, "createPopup()"); |
1002 connectPendingPopup(mAwContents); | 1002 connectPendingPopup(mAwContents); |
1003 final ChannelContainer channelContainer = new ChannelContainer(); | 1003 final ChannelContainer channelContainer = new ChannelContainer(); |
1004 | 1004 |
1005 runTestOnUiThread(new Runnable() { | 1005 runTestOnUiThread(new Runnable() { |
1006 @Override | 1006 @Override |
1007 public void run() { | 1007 public void run() { |
1008 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 1008 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
1009 channelContainer.set(channel); | 1009 channelContainer.set(channel); |
1010 channel[0].setMessageCallback(new AwMessagePort.MessageCallback(
) { | 1010 channel[0].setMessageCallback(new AppWebMessagePort.MessageCallb
ack() { |
1011 @Override | 1011 @Override |
1012 public void onMessage(String message, AwMessagePort[] sentPo
rts) { | 1012 public void onMessage(String message, AppWebMessagePort[] se
ntPorts) { |
1013 channelContainer.setMessage(message); | 1013 channelContainer.setMessage(message); |
1014 } | 1014 } |
1015 }, null); | 1015 }, null); |
1016 mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer
.getBaseUrl(), | 1016 mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer
.getBaseUrl(), |
1017 new AwMessagePort[] {channel[1]}); | 1017 new AppWebMessagePort[] {channel[1]}); |
1018 channel[0].postMessage(HELLO, null); | 1018 channel[0].postMessage(HELLO, null); |
1019 } | 1019 } |
1020 }); | 1020 }); |
1021 channelContainer.waitForMessage(); | 1021 channelContainer.waitForMessage(); |
1022 assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage()); | 1022 assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage()); |
1023 } | 1023 } |
1024 | 1024 |
1025 private static final String TEST_PAGE_FOR_UNSUPPORTED_MESSAGES = "<!DOCTYPE
html><html><body>" | 1025 private static final String TEST_PAGE_FOR_UNSUPPORTED_MESSAGES = "<!DOCTYPE
html><html><body>" |
1026 + " <script>" | 1026 + " <script>" |
1027 + " onmessage = function (e) {" | 1027 + " onmessage = function (e) {" |
(...skipping 11 matching lines...) Expand all Loading... |
1039 | 1039 |
1040 // Make sure that postmessage can handle unsupported messages gracefully. | 1040 // Make sure that postmessage can handle unsupported messages gracefully. |
1041 @SmallTest | 1041 @SmallTest |
1042 @Feature({"AndroidWebView", "Android-PostMessage"}) | 1042 @Feature({"AndroidWebView", "Android-PostMessage"}) |
1043 public void testPostUnsupportedWebMessageToApp() throws Throwable { | 1043 public void testPostUnsupportedWebMessageToApp() throws Throwable { |
1044 loadPage(TEST_PAGE_FOR_UNSUPPORTED_MESSAGES); | 1044 loadPage(TEST_PAGE_FOR_UNSUPPORTED_MESSAGES); |
1045 final ChannelContainer channelContainer = new ChannelContainer(); | 1045 final ChannelContainer channelContainer = new ChannelContainer(); |
1046 runTestOnUiThread(new Runnable() { | 1046 runTestOnUiThread(new Runnable() { |
1047 @Override | 1047 @Override |
1048 public void run() { | 1048 public void run() { |
1049 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 1049 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
1050 channelContainer.set(channel); | 1050 channelContainer.set(channel); |
1051 channel[0].setMessageCallback(new AwMessagePort.MessageCallback(
) { | 1051 channel[0].setMessageCallback(new AppWebMessagePort.MessageCallb
ack() { |
1052 @Override | 1052 @Override |
1053 public void onMessage(String message, AwMessagePort[] sentPo
rts) { | 1053 public void onMessage(String message, AppWebMessagePort[] se
ntPorts) { |
1054 channelContainer.setMessage(message); | 1054 channelContainer.setMessage(message); |
1055 } | 1055 } |
1056 }, null); | 1056 }, null); |
1057 mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer
.getBaseUrl(), | 1057 mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer
.getBaseUrl(), |
1058 new AwMessagePort[] {channel[1]}); | 1058 new AppWebMessagePort[] {channel[1]}); |
1059 } | 1059 } |
1060 }); | 1060 }); |
1061 channelContainer.waitForMessage(); | 1061 channelContainer.waitForMessage(); |
1062 assertEquals(JS_MESSAGE, channelContainer.getMessage()); | 1062 assertEquals(JS_MESSAGE, channelContainer.getMessage()); |
1063 // Assert that onMessage is called only once. | 1063 // Assert that onMessage is called only once. |
1064 assertEquals(1, channelContainer.getMessageCount()); | 1064 assertEquals(1, channelContainer.getMessageCount()); |
1065 } | 1065 } |
1066 | 1066 |
1067 private static final String TEST_TRANSFER_EMPTY_PORTS = "<!DOCTYPE html><htm
l><body>" | 1067 private static final String TEST_TRANSFER_EMPTY_PORTS = "<!DOCTYPE html><htm
l><body>" |
1068 + " <script>" | 1068 + " <script>" |
1069 + " onmessage = function (e) {" | 1069 + " onmessage = function (e) {" |
1070 + " e.ports[0].postMessage('1', undefined);" | 1070 + " e.ports[0].postMessage('1', undefined);" |
1071 + " e.ports[0].postMessage('2', []);" | 1071 + " e.ports[0].postMessage('2', []);" |
1072 + " }" | 1072 + " }" |
1073 + " </script>" | 1073 + " </script>" |
1074 + "</body></html>"; | 1074 + "</body></html>"; |
1075 | 1075 |
1076 // Make sure that postmessage can handle unsupported messages gracefully. | 1076 // Make sure that postmessage can handle unsupported messages gracefully. |
1077 @SmallTest | 1077 @SmallTest |
1078 @Feature({"AndroidWebView", "Android-PostMessage"}) | 1078 @Feature({"AndroidWebView", "Android-PostMessage"}) |
1079 public void testTransferEmptyPortsArray() throws Throwable { | 1079 public void testTransferEmptyPortsArray() throws Throwable { |
1080 loadPage(TEST_TRANSFER_EMPTY_PORTS); | 1080 loadPage(TEST_TRANSFER_EMPTY_PORTS); |
1081 final ChannelContainer channelContainer = new ChannelContainer(2); | 1081 final ChannelContainer channelContainer = new ChannelContainer(2); |
1082 runTestOnUiThread(new Runnable() { | 1082 runTestOnUiThread(new Runnable() { |
1083 @Override | 1083 @Override |
1084 public void run() { | 1084 public void run() { |
1085 AwMessagePort[] channel = mAwContents.createMessageChannel(); | 1085 AppWebMessagePort[] channel = mAwContents.createMessageChannel()
; |
1086 channelContainer.set(channel); | 1086 channelContainer.set(channel); |
1087 channel[0].setMessageCallback(new AwMessagePort.MessageCallback(
) { | 1087 channel[0].setMessageCallback(new AppWebMessagePort.MessageCallb
ack() { |
1088 @Override | 1088 @Override |
1089 public void onMessage(String message, AwMessagePort[] sentPo
rts) { | 1089 public void onMessage(String message, AppWebMessagePort[] se
ntPorts) { |
1090 channelContainer.setMessage(message); | 1090 channelContainer.setMessage(message); |
1091 } | 1091 } |
1092 }, null); | 1092 }, null); |
1093 mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer
.getBaseUrl(), | 1093 mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer
.getBaseUrl(), |
1094 new AwMessagePort[] {channel[1]}); | 1094 new AppWebMessagePort[] {channel[1]}); |
1095 } | 1095 } |
1096 }); | 1096 }); |
1097 channelContainer.waitForMessage(); | 1097 channelContainer.waitForMessage(); |
1098 assertEquals("12", channelContainer.getMessage()); | 1098 assertEquals("12", channelContainer.getMessage()); |
1099 } | 1099 } |
1100 } | 1100 } |
OLD | NEW |