summaryrefslogtreecommitdiffstats
path: root/devtools/server/worker.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/server/worker.js')
-rw-r--r--devtools/server/worker.js110
1 files changed, 110 insertions, 0 deletions
diff --git a/devtools/server/worker.js b/devtools/server/worker.js
new file mode 100644
index 000000000..e9a1afb8e
--- /dev/null
+++ b/devtools/server/worker.js
@@ -0,0 +1,110 @@
+"use strict";
+
+// This function is used to do remote procedure calls from the worker to the
+// main thread. It is exposed as a built-in global to every module by the
+// worker loader. To make sure the worker loader can access it, it needs to be
+// defined before loading the worker loader script below.
+this.rpc = function (method, ...params) {
+ let id = nextId++;
+
+ postMessage(JSON.stringify({
+ type: "rpc",
+ method: method,
+ params: params,
+ id: id
+ }));
+
+ let deferred = Promise.defer();
+ rpcDeferreds[id] = deferred;
+ return deferred.promise;
+};
+
+loadSubScript("resource://devtools/shared/worker/loader.js");
+
+var Promise = worker.require("promise");
+var { ActorPool } = worker.require("devtools/server/actors/common");
+var { ThreadActor } = worker.require("devtools/server/actors/script");
+var { WebConsoleActor } = worker.require("devtools/server/actors/webconsole");
+var { TabSources } = worker.require("devtools/server/actors/utils/TabSources");
+var makeDebugger = worker.require("devtools/server/actors/utils/make-debugger");
+var { DebuggerServer } = worker.require("devtools/server/main");
+
+DebuggerServer.init();
+DebuggerServer.createRootActor = function () {
+ throw new Error("Should never get here!");
+};
+
+var connections = Object.create(null);
+var nextId = 0;
+var rpcDeferreds = [];
+
+this.addEventListener("message", function (event) {
+ let packet = JSON.parse(event.data);
+ switch (packet.type) {
+ case "connect":
+ // Step 3: Create a connection to the parent.
+ let connection = DebuggerServer.connectToParent(packet.id, this);
+ connections[packet.id] = {
+ connection : connection,
+ rpcs: []
+ };
+
+ // Step 4: Create a thread actor for the connection to the parent.
+ let pool = new ActorPool(connection);
+ connection.addActorPool(pool);
+
+ let sources = null;
+
+ let parent = {
+ actorID: packet.id,
+
+ makeDebugger: makeDebugger.bind(null, {
+ findDebuggees: () => {
+ return [this.global];
+ },
+
+ shouldAddNewGlobalAsDebuggee: () => {
+ return true;
+ },
+ }),
+
+ get sources() {
+ if (sources === null) {
+ sources = new TabSources(threadActor);
+ }
+ return sources;
+ },
+
+ window: global
+ };
+
+ let threadActor = new ThreadActor(parent, global);
+ pool.addActor(threadActor);
+
+ let consoleActor = new WebConsoleActor(connection, parent);
+ pool.addActor(consoleActor);
+
+ // Step 5: Send a response packet to the parent to notify
+ // it that a connection has been established.
+ postMessage(JSON.stringify({
+ type: "connected",
+ id: packet.id,
+ threadActor: threadActor.actorID,
+ consoleActor: consoleActor.actorID,
+ }));
+ break;
+
+ case "disconnect":
+ connections[packet.id].connection.close();
+ break;
+
+ case "rpc":
+ let deferred = rpcDeferreds[packet.id];
+ delete rpcDeferreds[packet.id];
+ if (packet.error) {
+ deferred.reject(packet.error);
+ }
+ deferred.resolve(packet.result);
+ break;
+ }
+});