2017-09-28 15:29:55 +00:00
|
|
|
/* 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";
|
|
|
|
|
2018-12-21 00:31:09 +00:00
|
|
|
const {arg, DebuggerClient} = require("devtools/shared/client/debugger-client");
|
2017-09-28 15:29:55 +00:00
|
|
|
|
|
|
|
const noop = () => {};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A SourceClient provides a way to access the source text of a script.
|
|
|
|
*
|
|
|
|
* @param client ThreadClient
|
|
|
|
* The thread client parent.
|
|
|
|
* @param form Object
|
|
|
|
* The form sent across the remote debugging protocol.
|
|
|
|
*/
|
|
|
|
function SourceClient(client, form) {
|
|
|
|
this._form = form;
|
|
|
|
this._activeThread = client;
|
|
|
|
this._client = client.client;
|
|
|
|
}
|
|
|
|
|
|
|
|
SourceClient.prototype = {
|
|
|
|
get _transport() {
|
|
|
|
return this._client._transport;
|
|
|
|
},
|
|
|
|
get actor() {
|
|
|
|
return this._form.actor;
|
|
|
|
},
|
|
|
|
get request() {
|
|
|
|
return this._client.request;
|
|
|
|
},
|
|
|
|
get url() {
|
|
|
|
return this._form.url;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Black box this SourceClient's source.
|
|
|
|
*/
|
2018-12-21 00:31:09 +00:00
|
|
|
blackBox: DebuggerClient.requester(
|
|
|
|
{
|
|
|
|
type: "blackbox",
|
|
|
|
range: arg(0),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
telemetry: "BLACKBOX",
|
2018-10-19 12:55:39 +00:00
|
|
|
},
|
2018-12-21 00:31:09 +00:00
|
|
|
),
|
2017-09-28 15:29:55 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Un-black box this SourceClient's source.
|
|
|
|
*/
|
2018-12-21 00:31:09 +00:00
|
|
|
unblackBox: DebuggerClient.requester(
|
|
|
|
{
|
|
|
|
type: "unblackbox",
|
|
|
|
range: arg(0),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
telemetry: "UNBLACKBOX",
|
2018-10-19 12:55:39 +00:00
|
|
|
},
|
2018-12-21 00:31:09 +00:00
|
|
|
),
|
2017-09-28 15:29:55 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get Executable Lines from a source
|
|
|
|
*/
|
2018-03-12 18:24:38 +00:00
|
|
|
getExecutableLines: function(cb = noop) {
|
2018-06-01 10:36:09 +00:00
|
|
|
const packet = {
|
2017-09-28 15:29:55 +00:00
|
|
|
to: this._form.actor,
|
2018-10-19 12:55:39 +00:00
|
|
|
type: "getExecutableLines",
|
2017-09-28 15:29:55 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
return this._client.request(packet).then(res => {
|
|
|
|
cb(res.lines);
|
|
|
|
return res.lines;
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2018-12-19 22:18:53 +00:00
|
|
|
getBreakpointPositions: function(query) {
|
|
|
|
const packet = {
|
|
|
|
to: this._form.actor,
|
|
|
|
type: "getBreakpointPositions",
|
|
|
|
query,
|
|
|
|
};
|
|
|
|
return this._client.request(packet);
|
|
|
|
},
|
|
|
|
|
|
|
|
getBreakpointPositionsCompressed: function(query) {
|
|
|
|
const packet = {
|
|
|
|
to: this._form.actor,
|
|
|
|
type: "getBreakpointPositionsCompressed",
|
|
|
|
query,
|
|
|
|
};
|
|
|
|
return this._client.request(packet);
|
|
|
|
},
|
|
|
|
|
2017-09-28 15:29:55 +00:00
|
|
|
/**
|
|
|
|
* Get a long string grip for this SourceClient's source.
|
|
|
|
*/
|
2018-06-05 08:09:43 +00:00
|
|
|
source: function() {
|
2018-06-01 10:36:09 +00:00
|
|
|
const packet = {
|
2017-09-28 15:29:55 +00:00
|
|
|
to: this._form.actor,
|
2018-10-19 12:55:39 +00:00
|
|
|
type: "source",
|
2017-09-28 15:29:55 +00:00
|
|
|
};
|
|
|
|
return this._client.request(packet).then(response => {
|
2018-06-05 08:09:43 +00:00
|
|
|
return this._onSourceResponse(response);
|
2017-09-28 15:29:55 +00:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2018-06-05 08:09:43 +00:00
|
|
|
_onSourceResponse: function(response) {
|
2017-09-28 15:29:55 +00:00
|
|
|
if (typeof response.source === "string") {
|
|
|
|
return response;
|
|
|
|
}
|
|
|
|
|
2018-06-01 10:36:09 +00:00
|
|
|
const { contentType, source } = response;
|
2017-09-28 15:29:55 +00:00
|
|
|
if (source.type === "arrayBuffer") {
|
2018-06-01 10:36:09 +00:00
|
|
|
const arrayBuffer = this._activeThread.threadArrayBuffer(source);
|
2018-03-12 18:24:38 +00:00
|
|
|
return arrayBuffer.slice(0, arrayBuffer.length).then(function(resp) {
|
2017-09-28 15:29:55 +00:00
|
|
|
if (resp.error) {
|
|
|
|
return resp;
|
|
|
|
}
|
|
|
|
// Keeping str as a string, ArrayBuffer/Uint8Array will not survive
|
|
|
|
// setIn/mergeIn operations.
|
|
|
|
const str = atob(resp.encoded);
|
2018-06-01 10:36:09 +00:00
|
|
|
const newResponse = {
|
2017-09-28 15:29:55 +00:00
|
|
|
source: {
|
|
|
|
binary: str,
|
|
|
|
toString: () => "[wasm]",
|
|
|
|
},
|
|
|
|
contentType,
|
|
|
|
};
|
|
|
|
return newResponse;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2018-06-01 10:36:09 +00:00
|
|
|
const longString = this._activeThread.threadLongString(source);
|
2018-03-12 18:24:38 +00:00
|
|
|
return longString.substring(0, longString.length).then(function(resp) {
|
2017-09-28 15:29:55 +00:00
|
|
|
if (resp.error) {
|
|
|
|
return resp;
|
|
|
|
}
|
|
|
|
|
2018-06-01 10:36:09 +00:00
|
|
|
const newResponse = {
|
2017-09-28 15:29:55 +00:00
|
|
|
source: resp.substring,
|
2018-10-19 12:55:39 +00:00
|
|
|
contentType: contentType,
|
2017-09-28 15:29:55 +00:00
|
|
|
};
|
|
|
|
return newResponse;
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2018-03-19 17:51:51 +00:00
|
|
|
setPausePoints: function(pausePoints) {
|
|
|
|
const packet = {
|
|
|
|
to: this._form.actor,
|
|
|
|
type: "setPausePoints",
|
2018-10-19 12:55:39 +00:00
|
|
|
pausePoints,
|
2018-03-19 17:51:51 +00:00
|
|
|
};
|
|
|
|
return this._client.request(packet);
|
|
|
|
},
|
2017-09-28 15:29:55 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
module.exports = SourceClient;
|