diff options
Diffstat (limited to 'toolkit/jetpack/dev/debuggee.js')
-rw-r--r-- | toolkit/jetpack/dev/debuggee.js | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/toolkit/jetpack/dev/debuggee.js b/toolkit/jetpack/dev/debuggee.js new file mode 100644 index 000000000..0ca0bd37a --- /dev/null +++ b/toolkit/jetpack/dev/debuggee.js @@ -0,0 +1,95 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +module.metadata = { + "stability": "experimental" +}; + +const { Cu } = require("chrome"); +const { Class } = require("../sdk/core/heritage"); +const { MessagePort, MessageChannel } = require("../sdk/messaging"); +const { require: devtoolsRequire } = Cu.import("resource://devtools/shared/Loader.jsm", {}); +const { DebuggerServer } = devtoolsRequire("devtools/server/main"); + +const outputs = new WeakMap(); +const inputs = new WeakMap(); +const targets = new WeakMap(); +const transports = new WeakMap(); + +const inputFor = port => inputs.get(port); +const outputFor = port => outputs.get(port); +const transportFor = port => transports.get(port); + +const fromTarget = target => { + const debuggee = new Debuggee(); + const { port1, port2 } = new MessageChannel(); + inputs.set(debuggee, port1); + outputs.set(debuggee, port2); + targets.set(debuggee, target); + + return debuggee; +}; +exports.fromTarget = fromTarget; + +const Debuggee = Class({ + extends: MessagePort.prototype, + close: function() { + const server = transportFor(this); + if (server) { + transports.delete(this); + server.close(); + } + outputFor(this).close(); + }, + start: function() { + const target = targets.get(this); + if (target.isLocalTab) { + // Since a remote protocol connection will be made, let's start the + // DebuggerServer here, once and for all tools. + if (!DebuggerServer.initialized) { + DebuggerServer.init(); + DebuggerServer.addBrowserActors(); + } + + transports.set(this, DebuggerServer.connectPipe()); + } + // TODO: Implement support for remote connections (See Bug 980421) + else { + throw Error("Remote targets are not yet supported"); + } + + // pipe messages send to the debuggee to an actual + // server via remote debugging protocol transport. + inputFor(this).addEventListener("message", ({data}) => + transportFor(this).send(data)); + + // pipe messages received from the remote debugging + // server transport onto the this debuggee. + transportFor(this).hooks = { + onPacket: packet => inputFor(this).postMessage(packet), + onClosed: () => inputFor(this).close() + }; + + inputFor(this).start(); + outputFor(this).start(); + }, + postMessage: function(data) { + return outputFor(this).postMessage(data); + }, + get onmessage() { + return outputFor(this).onmessage; + }, + set onmessage(onmessage) { + outputFor(this).onmessage = onmessage; + }, + addEventListener: function(...args) { + return outputFor(this).addEventListener(...args); + }, + removeEventListener: function(...args) { + return outputFor(this).removeEventListener(...args); + } +}); +exports.Debuggee = Debuggee; |