summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/test/mochitest/code_frame-script.js
blob: 35a950b01aa9ab539927f873a1564ee42c9bc09f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
"use strict";

var { classes: Cc, interfaces: Ci, utils: Cu } = Components;
const { loadSubScript } = Cc["@mozilla.org/moz/jssubscript-loader;1"].
                          getService(Ci.mozIJSSubScriptLoader);

// Set up a dummy environment so that EventUtils works. We need to be careful to
// pass a window object into each EventUtils method we call rather than having
// it rely on the |window| global.
let EventUtils = {};
EventUtils.window = content;
EventUtils.parent = EventUtils.window;
EventUtils._EU_Ci = Components.interfaces;
EventUtils._EU_Cc = Components.classes;
EventUtils.navigator = content.navigator;
EventUtils.KeyboardEvent = content.KeyboardEvent;
loadSubScript("chrome://mochikit/content/tests/SimpleTest/EventUtils.js", EventUtils);

dump("Frame script loaded.\n");

var workers = {};

this.call = function (name, args) {
  dump("Calling function with name " + name + ".\n");

  dump("args " + JSON.stringify(args) + "\n");
  return XPCNativeWrapper.unwrap(content)[name].apply(undefined, args);
};

this._eval = function (string) {
  dump("Evalling string.\n");

  return content.eval(string);
};

this.generateMouseClick = function (path) {
  dump("Generating mouse click.\n");

  let target = eval(path);
  EventUtils.synthesizeMouseAtCenter(target, {},
                                     target.ownerDocument.defaultView);
};

this.createWorker = function (url) {
  dump("Creating worker with url '" + url + "'.\n");

  return new Promise(function (resolve, reject) {
    let worker = new content.Worker(url);
    worker.addEventListener("message", function listener() {
      worker.removeEventListener("message", listener);
      workers[url] = worker;
      resolve();
    });
  });
};

this.terminateWorker = function (url) {
  dump("Terminating worker with url '" + url + "'.\n");

  workers[url].terminate();
  delete workers[url];
};

this.postMessageToWorker = function (url, message) {
  dump("Posting message to worker with url '" + url + "'.\n");

  return new Promise(function (resolve) {
    let worker = workers[url];
    worker.postMessage(message);
    worker.addEventListener("message", function listener() {
      worker.removeEventListener("message", listener);
      resolve();
    });
  });
};

addMessageListener("jsonrpc", function ({ data: { method, params, id } }) {
  method = this[method];
  Promise.resolve().then(function () {
    return method.apply(undefined, params);
  }).then(function (result) {
    sendAsyncMessage("jsonrpc", {
      result: result,
      error: null,
      id: id
    });
  }, function (error) {
    sendAsyncMessage("jsonrpc", {
      result: null,
      error: error.message.toString(),
      id: id
    });
  });
});

addMessageListener("test:postMessageToWorker", function (message) {
  dump("Posting message '" + message.data.message + "' to worker with url '" +
       message.data.url + "'.\n");

  let worker = workers[message.data.url];
  worker.postMessage(message.data.message);
  worker.addEventListener("message", function listener() {
    worker.removeEventListener("message", listener);
    sendAsyncMessage("test:postMessageToWorker");
  });
});