worker_messageChannel.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. function ok(a, msg) {
  2. postMessage({ type: 'check', check: !!a, message: msg });
  3. }
  4. function is(a, b, msg) {
  5. ok (a === b, msg);
  6. }
  7. function info(msg) {
  8. postMessage({ type: 'info', message: msg });
  9. }
  10. function finish() {
  11. postMessage({ type: 'finish' });
  12. }
  13. function basic()
  14. {
  15. var a = new MessageChannel();
  16. ok(a, "MessageChannel created");
  17. var port1 = a.port1;
  18. ok(port1, "MessageChannel.port1 exists");
  19. is(port1, a.port1, "MessageChannel.port1 is port1");
  20. var port2 = a.port2;
  21. ok(port2, "MessageChannel.port1 exists");
  22. is(port2, a.port2, "MessageChannel.port2 is port2");
  23. [ 'postMessage', 'start', 'close' ].forEach(function(e) {
  24. ok(e in port1, "MessagePort1." + e + " exists");
  25. ok(e in port2, "MessagePort2." + e + " exists");
  26. });
  27. runTests();
  28. }
  29. function sendMessages()
  30. {
  31. var a = new MessageChannel();
  32. ok(a, "MessageChannel created");
  33. a.port1.postMessage("Hello world!");
  34. a.port1.onmessage = function(e) {
  35. is(e.data, "Hello world!", "The message is back!");
  36. runTests();
  37. }
  38. a.port2.onmessage = function(e) {
  39. a.port2.postMessage(e.data);
  40. }
  41. }
  42. function transferPort()
  43. {
  44. var a = new MessageChannel();
  45. ok(a, "MessageChannel created");
  46. a.port1.postMessage("Hello world!");
  47. a.port1.onmessage = function(e) {
  48. is(e.data, "Hello world!", "The message is back!");
  49. runTests();
  50. }
  51. postMessage({ type: 'port' }, [a.port2]);
  52. }
  53. function transferPort2()
  54. {
  55. onmessage = function(evt) {
  56. is(evt.ports.length, 1, "A port has been received by the worker");
  57. evt.ports[0].onmessage = function(e) {
  58. is(e.data, 42, "Data is 42!");
  59. runTests();
  60. }
  61. }
  62. postMessage({ type: 'newport' });
  63. }
  64. var tests = [
  65. basic,
  66. sendMessages,
  67. transferPort,
  68. transferPort2,
  69. ];
  70. function runTests() {
  71. if (!tests.length) {
  72. finish();
  73. return;
  74. }
  75. var t = tests.shift();
  76. t();
  77. }
  78. var subworker;
  79. onmessage = function(evt) {
  80. if (evt.data == 0) {
  81. runTests();
  82. return;
  83. }
  84. if (!subworker) {
  85. info("Create a subworkers. ID: " + evt.data);
  86. subworker = new Worker('worker_messageChannel.js');
  87. subworker.onmessage = function(e) {
  88. info("Proxy a message to the parent.");
  89. postMessage(e.data, e.ports);
  90. }
  91. subworker.postMessage(evt.data - 1);
  92. return;
  93. }
  94. info("Dispatch a message to the subworker.");
  95. subworker.postMessage(evt.data, evt.ports);
  96. }