mirror of
https://github.com/classilla/tenfourfox.git
synced 2024-09-28 05:55:58 +00:00
105 lines
2.4 KiB
JavaScript
105 lines
2.4 KiB
JavaScript
|
/* 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";
|
||
|
|
||
|
const { promiseInvoke } = require("devtools/shared/async-utils");
|
||
|
const { reportException } = require("devtools/shared/DevToolsUtils");
|
||
|
|
||
|
// RDP utils
|
||
|
|
||
|
function rdpInvoke(client, method, ...args) {
|
||
|
return (promiseInvoke(client, method, ...args)
|
||
|
.then((packet) => {
|
||
|
if (packet.error) {
|
||
|
let { error, message } = packet;
|
||
|
const err = new Error(error + ": " + message);
|
||
|
err.rdpError = error;
|
||
|
err.rdpMessage = message;
|
||
|
throw err;
|
||
|
}
|
||
|
|
||
|
return packet;
|
||
|
}));
|
||
|
}
|
||
|
|
||
|
function asPaused(client, func) {
|
||
|
if (client.state != "paused") {
|
||
|
return Task.spawn(function*() {
|
||
|
yield rdpInvoke(client, client.interrupt);
|
||
|
let result;
|
||
|
|
||
|
try {
|
||
|
result = yield func();
|
||
|
}
|
||
|
catch(e) {
|
||
|
// Try to put the debugger back in a working state by resuming
|
||
|
// it
|
||
|
yield rdpInvoke(client, client.resume);
|
||
|
throw e;
|
||
|
}
|
||
|
|
||
|
yield rdpInvoke(client, client.resume);
|
||
|
return result;
|
||
|
});
|
||
|
} else {
|
||
|
return func();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function handleError(err) {
|
||
|
reportException("promise", err.toString());
|
||
|
}
|
||
|
|
||
|
function onReducerEvents(controller, listeners, thisContext) {
|
||
|
Object.keys(listeners).forEach(name => {
|
||
|
const listener = listeners[name];
|
||
|
controller.onChange(name, payload => {
|
||
|
listener.call(thisContext, payload);
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function _getIn(destObj, path) {
|
||
|
return path.reduce(function(acc, name) {
|
||
|
return acc[name];
|
||
|
}, destObj);
|
||
|
}
|
||
|
|
||
|
function mergeIn(destObj, path, value) {
|
||
|
path = [...path];
|
||
|
path.reverse();
|
||
|
var obj = path.reduce(function(acc, name) {
|
||
|
return { [name]: acc };
|
||
|
}, value);
|
||
|
|
||
|
return destObj.merge(obj, { deep: true });
|
||
|
}
|
||
|
|
||
|
function setIn(destObj, path, value) {
|
||
|
destObj = mergeIn(destObj, path, null);
|
||
|
return mergeIn(destObj, path, value);
|
||
|
}
|
||
|
|
||
|
function updateIn(destObj, path, fn) {
|
||
|
return setIn(destObj, path, fn(_getIn(destObj, path)));
|
||
|
}
|
||
|
|
||
|
function deleteIn(destObj, path) {
|
||
|
const objPath = path.slice(0, -1);
|
||
|
const propName = path[path.length - 1];
|
||
|
const obj = _getIn(destObj, objPath);
|
||
|
return setIn(destObj, objPath, obj.without(propName));
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
rdpInvoke,
|
||
|
asPaused,
|
||
|
handleError,
|
||
|
onReducerEvents,
|
||
|
mergeIn,
|
||
|
setIn,
|
||
|
updateIn,
|
||
|
deleteIn
|
||
|
};
|