/* 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 . */
// @flow
import {
toServerLocation,
fromServerLocation,
createLoadedObject
} from "./create";
import type { SourceLocation } from "../../types";
import type { ServerLocation, Agents } from "./types";
type setBreakpointResponseType = {
breakpointId: string,
serverLocation?: ServerLocation
};
let debuggerAgent;
let runtimeAgent;
let pageAgent;
function setupCommands({ Debugger, Runtime, Page }: Agents) {
debuggerAgent = Debugger;
runtimeAgent = Runtime;
pageAgent = Page;
}
function resume() {
return debuggerAgent.resume();
}
function stepIn() {
return debuggerAgent.stepInto();
}
function stepOver() {
return debuggerAgent.stepOver();
}
function stepOut() {
return debuggerAgent.stepOut();
}
function pauseOnExceptions(
shouldPauseOnExceptions: boolean,
shouldIgnoreCaughtExceptions: boolean
) {
if (!shouldPauseOnExceptions) {
return debuggerAgent.setPauseOnExceptions({ state: "none" });
}
const state = shouldIgnoreCaughtExceptions ? "uncaught" : "all";
return debuggerAgent.setPauseOnExceptions({ state });
}
function breakOnNext() {
return debuggerAgent.pause();
}
function sourceContents(sourceId: string) {
return debuggerAgent
.getScriptSource({ scriptId: sourceId })
.then(({ scriptSource }) => ({
source: scriptSource,
contentType: null
}));
}
async function setBreakpoint(location: SourceLocation, condition: string) {
const {
breakpointId,
serverLocation
}: setBreakpointResponseType = await debuggerAgent.setBreakpoint({
location: toServerLocation(location),
columnNumber: location.column
});
const actualLocation = fromServerLocation(serverLocation) || location;
return {
id: breakpointId,
actualLocation: actualLocation
};
}
function removeBreakpoint(breakpointId: string) {
return debuggerAgent.removeBreakpoint({ breakpointId });
}
async function getProperties(object: any) {
const { result } = await runtimeAgent.getProperties({
objectId: object.objectId
});
const loadedObjects = result.map(createLoadedObject);
return { loadedObjects };
}
function evaluate(script: string) {
return runtimeAgent.evaluate({ expression: script });
}
function debuggeeCommand(script: string): Promise {
evaluate(script);
return Promise.resolve();
}
function navigate(url: string) {
return pageAgent.navigate({ url });
}
function getBreakpointByLocation(location: SourceLocation) {}
function getFrameScopes() {}
function evaluateInFrame() {}
function evaluateExpressions() {}
const clientCommands = {
resume,
stepIn,
stepOut,
stepOver,
pauseOnExceptions,
breakOnNext,
sourceContents,
setBreakpoint,
removeBreakpoint,
evaluate,
debuggeeCommand,
navigate,
getProperties,
getBreakpointByLocation,
getFrameScopes,
evaluateInFrame,
evaluateExpressions
};
export { setupCommands, clientCommands };