/* 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/>. */
const DBG_STRINGS_URI = [ "devtools/client/locales/debugger.properties", // These are used in the AppErrorBoundary component "devtools/client/locales/startup.properties", "devtools/client/locales/components.properties", // Used by SourceMapLoader "devtools/client/locales/toolbox.properties",
]; const L10N = new MultiLocalizationHelper(...DBG_STRINGS_URI);
async function getNodeFront(gripOrFront, toolbox) { // Given a NodeFront if ("actorID" in gripOrFront) { returnnew Promise(resolve => resolve(gripOrFront));
}
async open() { // whypaused-* strings are in devtools/shared as they're used in the PausedDebuggerOverlay as well const fluentL10n = new FluentL10n();
await fluentL10n.init(["devtools/shared/debugger-paused-reasons.ftl"]);
unHighlightDomElement() { if (!this._unhighlight) { return Promise.resolve();
}
returnthis._unhighlight();
}
/** * Return the Frame Actor ID of the currently selected frame, * or null if the debugger isn't paused.
*/
getSelectedFrameActorID() { const selectedFrame = this._selectors.getSelectedFrame(this._getState()); if (selectedFrame) { return selectedFrame.id;
} returnnull;
}
/** * Return the source-mapped variables for the current scope. * @returns {{[String]: String} | null} A dictionary mapping original variable names to generated * variable names if map scopes is enabled, otherwise null.
*/
getMappedVariables() { if (!this._selectors.isMapScopesEnabled(this._getState())) { returnnull;
} constthread = this._selectors.getCurrentThread(this._getState()); returnthis._selectors.getSelectedScopeMappings(this._getState(), thread);
}
/** * This is called when some other panels wants to open a given source * in the debugger at a precise line/column. * * @param {String} generatedURL * @param {Number} generatedLine * @param {Number} generatedColumn * @param {String} sourceActorId (optional) * If the callsite knows about a particular sourceActorId, * or if the source doesn't have a URL, you have to pass a sourceActorId. * @param {String} reason * A telemetry identifier to record when opening the debugger. * This help differentiate why we opened the debugger. * * @return {Boolean} * Returns true if the location is known by the debugger * and the debugger opens it.
*/
async openSourceInDebugger({
generatedURL,
generatedLine,
generatedColumn,
sourceActorId,
reason,
}) { const generatedSource = sourceActorId
? this._selectors.getSourceByActorId(this._getState(), sourceActorId)
: this._selectors.getSourceByURL(this._getState(), generatedURL); // We won't try opening source in the debugger when we can't find the related source actor in the reducer, // or, when it doesn't have any related source actor registered. if (
!generatedSource || // Note: We're not entirely sure when this can happen, // so we may want to revisit that at some point.
!this._selectors.getSourceActorsForSource( this._getState(),
generatedSource.id
).length
) { returnfalse;
}
// Note that getOriginalLocation can easily return generatedLocation // if the location can't be mapped to any original source. // So that we may open either regular source or original sources here. const originalLocation = await getOriginalLocation(generatedLocation, { // Reproduce a minimal thunkArgs for getOriginalLocation.
sourceMapLoader: this.toolbox.sourceMapLoader,
getState: this._store.getState,
});
// view-source module only forced the load of debugger in the background. // Now that we know we want to show a source, force displaying it in foreground. // // Note that browser_markup_view-source.js doesn't wait for the debugger // to be fully loaded with the source and requires the debugger to be loaded late. // But we might try to load display it early to improve user perception.
await this.toolbox.selectTool("jsdebugger", reason);
// XXX: should this be moved to selectSpecificLocation?? if (this._selectors.hasLogpoint(this._getState(), originalLocation)) { this._actions.openConditionalPanel(originalLocation, true);
}
returntrue;
}
async selectServiceWorker(workerDescriptorFront) { // The descriptor used by the application panel isn't fetching the worker target, // but the debugger will fetch it via the watcher actor and TargetCommand. // So try to match the descriptor with its related target. const targets = this.commands.targetCommand.getAllTargets([ this.commands.targetCommand.TYPES.SERVICE_WORKER,
]); const workerTarget = targets.find(
target => target.id == workerDescriptorFront.id
);
if (!features.windowlessServiceWorkers) {
console.error( "Selecting a worker needs the pref debugger.features.windowless-service-workers set to true"
); return;
}
if (!isThreadAvailable) {
console.error(`Worker ${threadActorID} is not available for debugging`); return;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.