code_frame-script.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. "use strict";
  2. var { classes: Cc, interfaces: Ci, utils: Cu } = Components;
  3. const { loadSubScript } = Cc["@mozilla.org/moz/jssubscript-loader;1"].
  4. getService(Ci.mozIJSSubScriptLoader);
  5. // Set up a dummy environment so that EventUtils works. We need to be careful to
  6. // pass a window object into each EventUtils method we call rather than having
  7. // it rely on the |window| global.
  8. let EventUtils = {};
  9. EventUtils.window = content;
  10. EventUtils.parent = EventUtils.window;
  11. EventUtils._EU_Ci = Components.interfaces;
  12. EventUtils._EU_Cc = Components.classes;
  13. EventUtils.navigator = content.navigator;
  14. EventUtils.KeyboardEvent = content.KeyboardEvent;
  15. loadSubScript("chrome://mochikit/content/tests/SimpleTest/EventUtils.js", EventUtils);
  16. dump("Frame script loaded.\n");
  17. var workers = {};
  18. this.call = function (name, args) {
  19. dump("Calling function with name " + name + ".\n");
  20. dump("args " + JSON.stringify(args) + "\n");
  21. return XPCNativeWrapper.unwrap(content)[name].apply(undefined, args);
  22. };
  23. this._eval = function (string) {
  24. dump("Evalling string.\n");
  25. return content.eval(string);
  26. };
  27. this.generateMouseClick = function (path) {
  28. dump("Generating mouse click.\n");
  29. let target = eval(path);
  30. EventUtils.synthesizeMouseAtCenter(target, {},
  31. target.ownerDocument.defaultView);
  32. };
  33. this.createWorker = function (url) {
  34. dump("Creating worker with url '" + url + "'.\n");
  35. return new Promise(function (resolve, reject) {
  36. let worker = new content.Worker(url);
  37. worker.addEventListener("message", function listener() {
  38. worker.removeEventListener("message", listener);
  39. workers[url] = worker;
  40. resolve();
  41. });
  42. });
  43. };
  44. this.terminateWorker = function (url) {
  45. dump("Terminating worker with url '" + url + "'.\n");
  46. workers[url].terminate();
  47. delete workers[url];
  48. };
  49. this.postMessageToWorker = function (url, message) {
  50. dump("Posting message to worker with url '" + url + "'.\n");
  51. return new Promise(function (resolve) {
  52. let worker = workers[url];
  53. worker.postMessage(message);
  54. worker.addEventListener("message", function listener() {
  55. worker.removeEventListener("message", listener);
  56. resolve();
  57. });
  58. });
  59. };
  60. addMessageListener("jsonrpc", function ({ data: { method, params, id } }) {
  61. method = this[method];
  62. Promise.resolve().then(function () {
  63. return method.apply(undefined, params);
  64. }).then(function (result) {
  65. sendAsyncMessage("jsonrpc", {
  66. result: result,
  67. error: null,
  68. id: id
  69. });
  70. }, function (error) {
  71. sendAsyncMessage("jsonrpc", {
  72. result: null,
  73. error: error.message.toString(),
  74. id: id
  75. });
  76. });
  77. });
  78. addMessageListener("test:postMessageToWorker", function (message) {
  79. dump("Posting message '" + message.data.message + "' to worker with url '" +
  80. message.data.url + "'.\n");
  81. let worker = workers[message.data.url];
  82. worker.postMessage(message.data.message);
  83. worker.addEventListener("message", function listener() {
  84. worker.removeEventListener("message", listener);
  85. sendAsyncMessage("test:postMessageToWorker");
  86. });
  87. });