* @param {number} sourceColumn * @param {string} sourceID * @param {(string|object)} [reason=unknown] * * @return {Promise} */ exports.viewSourceInDebugger = async function ( toolbox, generatedURL, generatedLine, generatedColumn, sourceActorId, reason = "unknown" ) { // Load the debugger in the background const dbg = await toolbox.loadTool("jsdebugger"); const openedSourceInDebugger = await dbg.openSourceInDebugger({ generatedURL, generatedLine, generatedColumn, sourceActorId, reason, }); if (openedSourceInDebugger) { toolbox.emitForTests("source-opened-in-debugger"); return true; } // Fallback to built-in firefox view-source: exports.viewSource(toolbox, generatedURL, generatedLine, generatedColumn); return false; }; async function getOriginalLocation( toolbox, generatedID, generatedLine, generatedColumn ) { // If there is no line number, then there's no chance that we'll get back // a useful original location. if (typeof generatedLine !== "number") { return null; } let originalLocation = null; try { originalLocation = await toolbox.sourceMapLoader.getOriginalLocation({ sourceId: generatedID, line: generatedLine, column: generatedColumn, }); if (originalLocation && originalLocation.sourceId === generatedID) { originalLocation = null; } } catch (err) { console.error( "Failed to resolve sourcemapped location for the given source location", { generatedID, generatedLine, generatedColumn }, err ); } return originalLocation; } /** * Open a link in Firefox's View Source. * * @param {Toolbox} toolbox * @param {string} sourceURL * @param {number} sourceLine * @param {number} sourceColumn * * @return {Promise} */ exports.viewSource = async function ( toolbox, sourceURL, sourceLine, sourceColumn ) { const utils = toolbox.gViewSourceUtils; utils.viewSource({ URL: sourceURL, lineNumber: sourceLine || -1, columnNumber: sourceColumn || -1, }); }; PK