blob: f651f21cd178dbd1c6e1ce9141179402d4ef8e55 [file] [log] [blame]
/*
* Copyright (C) 2008 Apple Inc. All Rights Reserved.
* Copyright (C) 2011 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @constructor
* @extends {WebInspector.Panel}
* @implements {WebInspector.ContextMenu.Provider}
* @param {!WebInspector.Workspace=} workspaceForTest
*/
WebInspector.SourcesPanel = function(workspaceForTest)
{
WebInspector.Panel.call(this, "sources");
this.registerRequiredCSS("sources/sourcesPanel.css");
new WebInspector.DropTarget(this.element, [WebInspector.DropTarget.Types.Files], WebInspector.UIString("Drop workspace folder here"), this._handleDrop.bind(this));
this._workspace = workspaceForTest || WebInspector.workspace;
this._networkMapping = WebInspector.networkMapping;
this._debugToolbar = this._createDebugToolbar();
this._debugToolbarDrawer = this._createDebugToolbarDrawer();
const initialDebugSidebarWidth = 225;
this._splitWidget = new WebInspector.SplitWidget(true, true, "sourcesPanelSplitViewState", initialDebugSidebarWidth);
this._splitWidget.enableShowModeSaving();
this._splitWidget.show(this.element);
// Create scripts navigator
const initialNavigatorWidth = 225;
this.editorView = new WebInspector.SplitWidget(true, false, "sourcesPanelNavigatorSplitViewState", initialNavigatorWidth);
this.editorView.enableShowModeSaving();
this.editorView.element.tabIndex = 0;
this._splitWidget.setMainWidget(this.editorView);
this._navigator = new WebInspector.SourcesNavigator(this._workspace);
this._navigator.view.setMinimumSize(100, 25);
this.editorView.setSidebarWidget(this._navigator.view);
this._navigator.addEventListener(WebInspector.SourcesNavigator.Events.SourceSelected, this._sourceSelected, this);
this._navigator.addEventListener(WebInspector.SourcesNavigator.Events.SourceRenamed, this._sourceRenamed, this);
this._sourcesView = new WebInspector.SourcesView(this._workspace, this);
this._sourcesView.addEventListener(WebInspector.SourcesView.Events.EditorSelected, this._editorSelected.bind(this));
this._sourcesView.addEventListener(WebInspector.SourcesView.Events.EditorClosed, this._editorClosed.bind(this));
this._sourcesView.registerShortcuts(this.registerShortcuts.bind(this));
this.editorView.setMainWidget(this._sourcesView);
this.sidebarPanes = {};
this.sidebarPanes.threads = new WebInspector.ThreadsSidebarPane();
this.sidebarPanes.watchExpressions = new WebInspector.WatchExpressionsSidebarPane();
this.sidebarPanes.callstack = new WebInspector.CallStackSidebarPane();
this.sidebarPanes.callstack.addEventListener(WebInspector.CallStackSidebarPane.Events.CallFrameSelected, this._callFrameSelectedInSidebar.bind(this));
this.sidebarPanes.callstack.addEventListener(WebInspector.CallStackSidebarPane.Events.RevealHiddenCallFrames, this._hiddenCallFramesRevealedInSidebar.bind(this));
this.sidebarPanes.callstack.registerShortcuts(this.registerShortcuts.bind(this));
this.sidebarPanes.scopechain = new WebInspector.ScopeChainSidebarPane();
this.sidebarPanes.serviceWorkers = new WebInspector.ServiceWorkersSidebarPane();
this.sidebarPanes.jsBreakpoints = new WebInspector.JavaScriptBreakpointsSidebarPane(WebInspector.breakpointManager, this.showUISourceCode.bind(this));
this.sidebarPanes.domBreakpoints = WebInspector.domBreakpointsSidebarPane.createProxy(this);
this.sidebarPanes.xhrBreakpoints = new WebInspector.XHRBreakpointsSidebarPane();
this.sidebarPanes.eventListenerBreakpoints = new WebInspector.EventListenerBreakpointsSidebarPane();
this.sidebarPanes.objectEventListeners = new WebInspector.ObjectEventListenersSidebarPane();
if (Runtime.experiments.isEnabled("stepIntoAsync"))
this.sidebarPanes.asyncOperationBreakpoints = new WebInspector.AsyncOperationsSidebarPane();
this._lastSelectedTabSetting = WebInspector.settings.createLocalSetting("lastSelectedSourcesSidebarPaneTab", this.sidebarPanes.scopechain.title());
this._installDebuggerSidebarController();
WebInspector.moduleSetting("sidebarPosition").addChangeListener(this._updateSidebarPosition.bind(this));
this._updateSidebarPosition();
this._updateDebuggerButtons();
this._pauseOnExceptionEnabledChanged();
WebInspector.moduleSetting("pauseOnExceptionEnabled").addChangeListener(this._pauseOnExceptionEnabledChanged, this);
this._setTarget(WebInspector.context.flavor(WebInspector.Target));
WebInspector.breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.BreakpointsActiveStateChanged, this._breakpointsActiveStateChanged, this);
WebInspector.context.addFlavorChangeListener(WebInspector.Target, this._onCurrentTargetChanged, this);
WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.DebuggerWasEnabled, this._debuggerWasEnabled, this);
WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.DebuggerWasDisabled, this._debuggerReset, this);
WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.DebuggerPaused, this._debuggerPaused, this);
WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.DebuggerResumed, this._debuggerResumed, this);
WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.CallFrameSelected, this._callFrameSelected, this);
WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.ConsoleCommandEvaluatedInSelectedCallFrame, this._consoleCommandEvaluatedInSelectedCallFrame, this);
WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.GlobalObjectCleared, this._debuggerReset, this);
new WebInspector.WorkspaceMappingTip(this, this._workspace);
WebInspector.extensionServer.addEventListener(WebInspector.ExtensionServer.Events.SidebarPaneAdded, this._extensionSidebarPaneAdded, this);
WebInspector.DataSaverInfobar.maybeShowInPanel(this);
}
WebInspector.SourcesPanel.minToolbarWidth = 215;
WebInspector.SourcesPanel.prototype = {
/**
* @param {?WebInspector.Target} target
*/
_setTarget: function(target)
{
if (!target)
return;
var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);
if (!debuggerModel)
return;
if (debuggerModel.isPaused()) {
this._showDebuggerPausedDetails(/** @type {!WebInspector.DebuggerPausedDetails} */ (debuggerModel.debuggerPausedDetails()));
var callFrame = debuggerModel.selectedCallFrame();
if (callFrame)
this._selectCallFrame(callFrame);
} else {
this._paused = false;
this._clearInterface();
this._toggleDebuggerSidebarButton.disabled = false;
}
},
/**
* @param {!WebInspector.Event} event
*/
_onCurrentTargetChanged: function(event)
{
var target = /** @type {?WebInspector.Target} */ (event.data);
this._setTarget(target);
},
/**
* @override
* @return {!Element}
*/
defaultFocusedElement: function()
{
return this._sourcesView.defaultFocusedElement();
},
/**
* @return {boolean}
*/
paused: function()
{
return this._paused;
},
wasShown: function()
{
WebInspector.context.setFlavor(WebInspector.SourcesPanel, this);
WebInspector.Panel.prototype.wasShown.call(this);
},
willHide: function()
{
WebInspector.Panel.prototype.willHide.call(this);
WebInspector.context.setFlavor(WebInspector.SourcesPanel, null);
},
onResize: function()
{
if (WebInspector.moduleSetting("sidebarPosition").get() === "auto")
this.element.window().requestAnimationFrame(this._updateSidebarPosition.bind(this)); // Do not force layout.
},
/**
* @override
* @return {!WebInspector.SearchableView}
*/
searchableView: function()
{
return this._sourcesView.searchableView();
},
_consoleCommandEvaluatedInSelectedCallFrame: function(event)
{
var debuggerModel = /** @type {!WebInspector.DebuggerModel} */ (event.target);
var target = debuggerModel.target();
if (WebInspector.context.flavor(WebInspector.Target) !== target)
return;
this.sidebarPanes.scopechain.update(debuggerModel.selectedCallFrame());
},
/**
* @param {!WebInspector.Event} event
*/
_debuggerPaused: function(event)
{
var details = /** @type {!WebInspector.DebuggerPausedDetails} */ (event.data);
if (!this._paused)
WebInspector.inspectorView.setCurrentPanel(this);
if (WebInspector.context.flavor(WebInspector.Target) === details.target())
this._showDebuggerPausedDetails(details);
else if (!this._paused)
WebInspector.context.setFlavor(WebInspector.Target, details.target());
},
/**
* @param {!WebInspector.DebuggerPausedDetails} details
*/
_showDebuggerPausedDetails: function(details)
{
this._paused = true;
this._updateDebuggerButtons();
this.sidebarPanes.callstack.update(details);
/**
* @param {!Element} element
* @this {WebInspector.SourcesPanel}
*/
function didCreateBreakpointHitStatusMessage(element)
{
this.sidebarPanes.callstack.setStatus(element);
}
/**
* @param {!WebInspector.UILocation} uiLocation
* @this {WebInspector.SourcesPanel}
*/
function didGetUILocation(uiLocation)
{
var breakpoint = WebInspector.breakpointManager.findBreakpointOnLine(uiLocation.uiSourceCode, uiLocation.lineNumber);
if (!breakpoint)
return;
this.sidebarPanes.jsBreakpoints.highlightBreakpoint(breakpoint);
this.sidebarPanes.callstack.setStatus(WebInspector.UIString("Paused on a JavaScript breakpoint."));
}
if (details.reason === WebInspector.DebuggerModel.BreakReason.DOM) {
WebInspector.domBreakpointsSidebarPane.highlightBreakpoint(details.auxData);
WebInspector.domBreakpointsSidebarPane.createBreakpointHitStatusMessage(details, didCreateBreakpointHitStatusMessage.bind(this));
} else if (details.reason === WebInspector.DebuggerModel.BreakReason.EventListener) {
var eventName = details.auxData["eventName"];
var targetName = details.auxData["targetName"];
this.sidebarPanes.eventListenerBreakpoints.highlightBreakpoint(eventName, targetName);
var eventNameForUI = WebInspector.EventListenerBreakpointsSidebarPane.eventNameForUI(eventName, details.auxData);
this.sidebarPanes.callstack.setStatus(WebInspector.UIString("Paused on a \"%s\" Event Listener.", eventNameForUI));
} else if (details.reason === WebInspector.DebuggerModel.BreakReason.XHR) {
this.sidebarPanes.xhrBreakpoints.highlightBreakpoint(details.auxData["breakpointURL"]);
this.sidebarPanes.callstack.setStatus(WebInspector.UIString("Paused on a XMLHttpRequest."));
} else if (details.reason === WebInspector.DebuggerModel.BreakReason.Exception) {
var description = details.auxData["description"] || "";
this.sidebarPanes.callstack.setStatus(WebInspector.UIString("Paused on exception: '%s'.", description.split("\n", 1)[0]));
} else if (details.reason === WebInspector.DebuggerModel.BreakReason.PromiseRejection) {
var description = details.auxData["description"] || "";
this.sidebarPanes.callstack.setStatus(WebInspector.UIString("Paused on promise rejection: '%s'.", description.split("\n", 1)[0]));
} else if (details.reason === WebInspector.DebuggerModel.BreakReason.Assert) {
this.sidebarPanes.callstack.setStatus(WebInspector.UIString("Paused on assertion."));
} else if (details.reason === WebInspector.DebuggerModel.BreakReason.CSPViolation) {
this.sidebarPanes.callstack.setStatus(WebInspector.UIString("Paused on a script blocked due to Content Security Policy directive: \"%s\".", details.auxData["directiveText"]));
} else if (details.reason === WebInspector.DebuggerModel.BreakReason.DebugCommand) {
this.sidebarPanes.callstack.setStatus(WebInspector.UIString("Paused on a debugged function."));
} else if (details.reason === WebInspector.DebuggerModel.BreakReason.AsyncOperation) {
if (Runtime.experiments.isEnabled("stepIntoAsync")) {
var operationId = details.auxData["operationId"];
var operation = this.sidebarPanes.asyncOperationBreakpoints.operationById(details.target(), operationId);
var description = (operation && operation.description) || WebInspector.UIString("<unknown>");
this.sidebarPanes.callstack.setStatus(WebInspector.UIString("Paused on a \"%s\" async operation.", description));
this.sidebarPanes.asyncOperationBreakpoints.highlightBreakpoint(operationId);
}
} else {
if (details.callFrames.length)
WebInspector.debuggerWorkspaceBinding.createCallFrameLiveLocation(details.callFrames[0], didGetUILocation.bind(this));
else
console.warn("ScriptsPanel paused, but callFrames.length is zero."); // TODO remove this once we understand this case better
}
this._splitWidget.showBoth(true);
this._toggleDebuggerSidebarButton.disabled = true;
window.focus();
InspectorFrontendHost.bringToFront();
},
/**
* @param {!WebInspector.Event} event
*/
_debuggerResumed: function(event)
{
var debuggerModel = /** @type {!WebInspector.DebuggerModel} */ (event.target);
var target = debuggerModel.target();
if (WebInspector.context.flavor(WebInspector.Target) !== target)
return;
this._paused = false;
this._clearInterface();
this._toggleDebuggerSidebarButton.disabled = false;
this._switchToPausedTargetTimeout = setTimeout(this._switchToPausedTarget.bind(this, debuggerModel), 500);
},
/**
* @param {!WebInspector.Event} event
*/
_debuggerWasEnabled: function(event)
{
var target = /** @type {!WebInspector.Target} */ (event.target.target());
if (WebInspector.context.flavor(WebInspector.Target) !== target)
return;
this._updateDebuggerButtons();
},
/**
* @param {!WebInspector.Event} event
*/
_debuggerReset: function(event)
{
this._debuggerResumed(event);
},
/**
* @return {!WebInspector.Widget}
*/
get visibleView()
{
return this._sourcesView.visibleView();
},
/**
* @param {!WebInspector.UISourceCode} uiSourceCode
* @param {number=} lineNumber 0-based
* @param {number=} columnNumber
*/
showUISourceCode: function(uiSourceCode, lineNumber, columnNumber)
{
this._showEditor();
this._sourcesView.showSourceLocation(uiSourceCode, lineNumber, columnNumber);
},
_showEditor: function()
{
WebInspector.inspectorView.setCurrentPanel(this);
},
/**
* @param {!WebInspector.UILocation} uiLocation
*/
showUILocation: function(uiLocation)
{
this.showUISourceCode(uiLocation.uiSourceCode, uiLocation.lineNumber, uiLocation.columnNumber);
},
/**
* @param {!WebInspector.UISourceCode} uiSourceCode
*/
_revealInNavigator: function(uiSourceCode)
{
this._navigator.revealUISourceCode(uiSourceCode);
},
/**
* @param {boolean} ignoreExecutionLineEvents
*/
setIgnoreExecutionLineEvents: function(ignoreExecutionLineEvents)
{
this._ignoreExecutionLineEvents = ignoreExecutionLineEvents;
},
/**
* @param {!WebInspector.UILocation} uiLocation
*/
_executionLineChanged: function(uiLocation)
{
this._sourcesView.clearCurrentExecutionLine();
this._sourcesView.setExecutionLocation(uiLocation);
if (this._ignoreExecutionLineEvents)
return;
this._sourcesView.showSourceLocation(uiLocation.uiSourceCode, uiLocation.lineNumber, uiLocation.columnNumber, undefined, true);
},
/**
* @param {!WebInspector.Event} event
*/
_callFrameSelected: function(event)
{
var callFrame = /** @type {?WebInspector.DebuggerModel.CallFrame} */ (event.data);
if (!callFrame || callFrame.target() !== WebInspector.context.flavor(WebInspector.Target))
return;
this._selectCallFrame(callFrame);
},
/**
* @param {!WebInspector.DebuggerModel.CallFrame} callFrame
*/
_selectCallFrame: function(callFrame)
{
this.sidebarPanes.scopechain.update(callFrame);
this.sidebarPanes.watchExpressions.refreshExpressions();
this.sidebarPanes.callstack.setSelectedCallFrame(callFrame);
WebInspector.debuggerWorkspaceBinding.createCallFrameLiveLocation(callFrame, this._executionLineChanged.bind(this));
},
/**
* @param {!WebInspector.Event} event
*/
_sourceSelected: function(event)
{
var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data.uiSourceCode);
this._sourcesView.showSourceLocation(uiSourceCode, undefined, undefined, !event.data.focusSource)
},
/**
* @param {!WebInspector.Event} event
*/
_sourceRenamed: function(event)
{
var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data);
this._sourcesView.sourceRenamed(uiSourceCode);
},
_pauseOnExceptionEnabledChanged: function()
{
var enabled = WebInspector.moduleSetting("pauseOnExceptionEnabled").get();
this._pauseOnExceptionButton.setToggled(enabled);
this._pauseOnExceptionButton.setTitle(WebInspector.UIString(enabled ? "Don't pause on exceptions" : "Pause on exceptions"));
this._debugToolbarDrawer.classList.toggle("expanded", enabled);
},
_updateDebuggerButtons: function()
{
var currentTarget = WebInspector.context.flavor(WebInspector.Target);
var currentDebuggerModel = WebInspector.DebuggerModel.fromTarget(currentTarget);
if (!currentDebuggerModel) {
this._pauseButton.setEnabled(false);
this._stepOverButton.setEnabled(false);
this._stepIntoButton.setEnabled(false);
this._stepOutButton.setEnabled(false);
} else if (this._paused) {
this._pauseButton.setTitle(WebInspector.UIString("Resume script execution"));
this._pauseButton.setToggled(true);
this._pauseButton.setLongClickOptionsEnabled((function() { return [ this._longResumeButton ]; }).bind(this));
this._pauseButton.setEnabled(true);
this._stepOverButton.setEnabled(true);
this._stepIntoButton.setEnabled(true);
this._stepOutButton.setEnabled(true);
} else {
this._pauseButton.setTitle(WebInspector.UIString("Pause script execution"));
this._pauseButton.setToggled(false);
this._pauseButton.setLongClickOptionsEnabled(null);
this._pauseButton.setEnabled(!currentDebuggerModel.isPausing());
this._stepOverButton.setEnabled(false);
this._stepIntoButton.setEnabled(false);
this._stepOutButton.setEnabled(false);
}
},
_clearInterface: function()
{
this.sidebarPanes.callstack.update(null);
this.sidebarPanes.scopechain.update(null);
this.sidebarPanes.jsBreakpoints.clearBreakpointHighlight();
WebInspector.domBreakpointsSidebarPane.clearBreakpointHighlight();
this.sidebarPanes.eventListenerBreakpoints.clearBreakpointHighlight();
this.sidebarPanes.xhrBreakpoints.clearBreakpointHighlight();
if (this.sidebarPanes.asyncOperationBreakpoints)
this.sidebarPanes.asyncOperationBreakpoints.clearBreakpointHighlight();
this._sourcesView.clearCurrentExecutionLine();
this._updateDebuggerButtons();
if (this._switchToPausedTargetTimeout)
clearTimeout(this._switchToPausedTargetTimeout);
},
/**
* @param {!WebInspector.DebuggerModel} debuggerModel
*/
_switchToPausedTarget: function(debuggerModel)
{
delete this._switchToPausedTargetTimeout;
if (this._paused)
return;
var target = WebInspector.context.flavor(WebInspector.Target);
if (debuggerModel.isPaused())
return;
var debuggerModels = WebInspector.DebuggerModel.instances();
for (var i = 0; i < debuggerModels.length; ++i) {
if (debuggerModels[i].isPaused()) {
WebInspector.context.setFlavor(WebInspector.Target, debuggerModels[i].target());
break;
}
}
},
_togglePauseOnExceptions: function()
{
WebInspector.moduleSetting("pauseOnExceptionEnabled").set(!this._pauseOnExceptionButton.toggled());
},
/**
* @return {boolean}
*/
_runSnippet: function()
{
var uiSourceCode = this._sourcesView.currentUISourceCode();
if (uiSourceCode.project().type() !== WebInspector.projectTypes.Snippets)
return false;
var currentExecutionContext = WebInspector.context.flavor(WebInspector.ExecutionContext);
if (!currentExecutionContext)
return false;
WebInspector.scriptSnippetModel.evaluateScriptSnippet(currentExecutionContext, uiSourceCode);
return true;
},
/**
* @param {!WebInspector.Event} event
*/
_editorSelected: function(event)
{
var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data);
this._editorChanged(uiSourceCode);
},
/**
* @param {!WebInspector.Event} event
*/
_editorClosed: function(event)
{
var wasSelected = /** @type {boolean} */ (event.data.wasSelected);
if (wasSelected)
this._editorChanged(null);
},
/**
* @param {?WebInspector.UISourceCode} uiSourceCode
*/
_editorChanged: function(uiSourceCode)
{
var isSnippet = uiSourceCode && uiSourceCode.project().type() === WebInspector.projectTypes.Snippets;
this._runSnippetButton.element.classList.toggle("hidden", !isSnippet);
},
/**
* @return {boolean}
*/
togglePause: function()
{
var target = WebInspector.context.flavor(WebInspector.Target);
if (!target)
return true;
var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);
if (!debuggerModel)
return true;
if (this._paused) {
this._paused = false;
debuggerModel.resume();
} else {
// Make sure pauses didn't stick skipped.
debuggerModel.pause();
}
this._clearInterface();
return true;
},
/**
* @return {?WebInspector.DebuggerModel}
*/
_prepareToResume: function()
{
if (!this._paused)
return null;
this._paused = false;
this._clearInterface();
var target = WebInspector.context.flavor(WebInspector.Target);
return target ? WebInspector.DebuggerModel.fromTarget(target) : null;
},
/**
* @return {boolean}
*/
_longResume: function()
{
var debuggerModel = this._prepareToResume();
if (!debuggerModel)
return true;
debuggerModel.skipAllPausesUntilReloadOrTimeout(500);
debuggerModel.resume();
return true;
},
/**
* @return {boolean}
*/
_stepOverClicked: function()
{
var debuggerModel = this._prepareToResume();
if (!debuggerModel)
return true;
debuggerModel.stepOver();
return true;
},
/**
* @return {boolean}
*/
_stepIntoClicked: function()
{
var debuggerModel = this._prepareToResume();
if (!debuggerModel)
return true;
debuggerModel.stepInto();
return true;
},
/**
* @return {boolean}
*/
_stepIntoAsyncClicked: function()
{
var debuggerModel = this._prepareToResume();
if (!debuggerModel)
return true;
debuggerModel.stepIntoAsync();
return true;
},
/**
* @return {boolean}
*/
_stepOutClicked: function()
{
var debuggerModel = this._prepareToResume();
if (!debuggerModel)
return true;
debuggerModel.stepOut();
return true;
},
/**
* @param {!WebInspector.Event} event
*/
_callFrameSelectedInSidebar: function(event)
{
var callFrame = /** @type {!WebInspector.DebuggerModel.CallFrame} */ (event.data);
callFrame.debuggerModel.setSelectedCallFrame(callFrame);
},
_hiddenCallFramesRevealedInSidebar: function()
{
if (Runtime.experiments.isEnabled("stepIntoAsync"))
this.sidebarPanes.asyncOperationBreakpoints.revealHiddenCallFrames(WebInspector.context.flavor(WebInspector.Target));
},
/**
* @param {!WebInspector.UILocation} uiLocation
*/
_continueToLocation: function(uiLocation)
{
var executionContext = WebInspector.context.flavor(WebInspector.ExecutionContext);
if (!executionContext)
return;
// Always use 0 column.
var rawLocation = WebInspector.debuggerWorkspaceBinding.uiLocationToRawLocation(executionContext.target(), uiLocation.uiSourceCode, uiLocation.lineNumber, 0);
if (!rawLocation)
return;
if (!this._prepareToResume())
return;
rawLocation.continueToLocation();
},
_toggleBreakpointsActive: function()
{
WebInspector.breakpointManager.setBreakpointsActive(!WebInspector.breakpointManager.breakpointsActive());
},
_breakpointsActiveStateChanged: function(event)
{
var active = event.data;
this._toggleBreakpointsButton.setToggled(!active);
this.sidebarPanes.jsBreakpoints.listElement.classList.toggle("breakpoints-list-deactivated", !active);
this._sourcesView.toggleBreakpointsActiveState(active);
if (active)
this._toggleBreakpointsButton.setTitle(WebInspector.UIString("Deactivate breakpoints"));
else
this._toggleBreakpointsButton.setTitle(WebInspector.UIString("Activate breakpoints"));
},
/**
* @return {!WebInspector.Toolbar}
*/
_createDebugToolbar: function()
{
var debugToolbar = new WebInspector.Toolbar();
debugToolbar.element.classList.add("scripts-debug-toolbar");
var title, handler;
// Run snippet.
title = WebInspector.UIString("Run snippet");
handler = this._runSnippet.bind(this);
this._runSnippetButton = this._createButtonAndRegisterShortcutsForAction("play-toolbar-item", title, "debugger.run-snippet");
debugToolbar.appendToolbarItem(this._runSnippetButton);
this._runSnippetButton.element.classList.add("hidden");
// Continue.
this._pauseButton = this._createButtonAndRegisterShortcutsForAction("pause-toolbar-item", "", "debugger.toggle-pause");
debugToolbar.appendToolbarItem(this._pauseButton);
// Long resume.
title = WebInspector.UIString("Resume with all pauses blocked for 500 ms");
this._longResumeButton = new WebInspector.ToolbarButton(title, "play-toolbar-item");
this._longResumeButton.addEventListener("click", this._longResume.bind(this), this);
// Step over.
title = WebInspector.UIString("Step over next function call");
this._stepOverButton = this._createButtonAndRegisterShortcutsForAction("step-over-toolbar-item", title, "debugger.step-over");
debugToolbar.appendToolbarItem(this._stepOverButton);
// Step into.
title = WebInspector.UIString("Step into next function call");
this._stepIntoButton = this._createButtonAndRegisterShortcutsForAction("step-in-toolbar-item", title, "debugger.step-into");
debugToolbar.appendToolbarItem(this._stepIntoButton);
// Step out.
title = WebInspector.UIString("Step out of current function");
this._stepOutButton = this._createButtonAndRegisterShortcutsForAction("step-out-toolbar-item", title, "debugger.step-out");
debugToolbar.appendToolbarItem(this._stepOutButton);
debugToolbar.appendSeparator();
// Toggle Breakpoints
this._toggleBreakpointsButton = WebInspector.ToolbarButton.createActionButton("debugger.toggle-breakpoints-active");
this._toggleBreakpointsButton.setToggled(false);
debugToolbar.appendToolbarItem(this._toggleBreakpointsButton);
// Pause on Exception
this._pauseOnExceptionButton = new WebInspector.ToolbarButton("", "pause-on-exceptions-toolbar-item");
this._pauseOnExceptionButton.addEventListener("click", this._togglePauseOnExceptions, this);
debugToolbar.appendToolbarItem(this._pauseOnExceptionButton);
debugToolbar.appendSeparator();
// Async operations
debugToolbar.appendToolbarItem(new WebInspector.ToolbarCheckbox(WebInspector.UIString("Async"), WebInspector.UIString("Capture async stack traces"), WebInspector.moduleSetting("enableAsyncStackTraces")));
return debugToolbar;
},
_createDebugToolbarDrawer: function()
{
var debugToolbarDrawer = createElementWithClass("div", "scripts-debug-toolbar-drawer");
var label = WebInspector.UIString("Pause On Caught Exceptions");
var setting = WebInspector.moduleSetting("pauseOnCaughtException");
debugToolbarDrawer.appendChild(WebInspector.SettingsUI.createSettingCheckbox(label, setting, true));
return debugToolbarDrawer;
},
/**
* @param {string} buttonId
* @param {string} buttonTitle
* @param {string} actionId
* @return {!WebInspector.ToolbarButton}
*/
_createButtonAndRegisterShortcutsForAction: function(buttonId, buttonTitle, actionId)
{
var button = new WebInspector.ToolbarButton(buttonTitle, buttonId);
button.setAction(actionId);
button._shortcuts = WebInspector.shortcutRegistry.shortcutDescriptorsForAction(actionId);
button.setTitle(buttonTitle);
return button;
},
addToWatch: function(expression)
{
this.sidebarPanes.watchExpressions.addExpression(expression);
},
_installDebuggerSidebarController: function()
{
this.editorView.displayShowHideSidebarButton("navigator");
this._toggleDebuggerSidebarButton = this._splitWidget.displayShowHideSidebarButton("debugger", "scripts-debugger-show-hide-button");
},
/**
* @param {!WebInspector.UISourceCode} uiSourceCode
*/
_showLocalHistory: function(uiSourceCode)
{
WebInspector.RevisionHistoryView.showHistory(uiSourceCode);
},
/**
* @override
* @param {!Event} event
* @param {!WebInspector.ContextMenu} contextMenu
* @param {!Object} target
*/
appendApplicableItems: function(event, contextMenu, target)
{
this._appendUISourceCodeItems(event, contextMenu, target);
this.appendUILocationItems(contextMenu, target);
this._appendRemoteObjectItems(contextMenu, target);
this._appendNetworkRequestItems(contextMenu, target);
},
_suggestReload: function()
{
if (window.confirm(WebInspector.UIString("It is recommended to restart inspector after making these changes. Would you like to restart it?")))
WebInspector.reload();
},
/**
* @param {!WebInspector.UISourceCode} uiSourceCode
*/
mapFileSystemToNetwork: function(uiSourceCode)
{
WebInspector.SelectUISourceCodeForProjectTypesDialog.show(uiSourceCode.name(), [WebInspector.projectTypes.Network, WebInspector.projectTypes.ContentScripts], mapFileSystemToNetwork.bind(this));
/**
* @param {?WebInspector.UISourceCode} networkUISourceCode
* @this {WebInspector.SourcesPanel}
*/
function mapFileSystemToNetwork(networkUISourceCode)
{
if (!networkUISourceCode)
return;
this._networkMapping.addMapping(networkUISourceCode, uiSourceCode, WebInspector.fileSystemWorkspaceBinding);
this._suggestReload();
}
},
/**
* @param {!WebInspector.UISourceCode} networkUISourceCode
*/
mapNetworkToFileSystem: function(networkUISourceCode)
{
WebInspector.SelectUISourceCodeForProjectTypesDialog.show(networkUISourceCode.name(), [WebInspector.projectTypes.FileSystem], mapNetworkToFileSystem.bind(this));
/**
* @param {?WebInspector.UISourceCode} uiSourceCode
* @this {WebInspector.SourcesPanel}
*/
function mapNetworkToFileSystem(uiSourceCode)
{
if (!uiSourceCode)
return;
this._networkMapping.addMapping(networkUISourceCode, uiSourceCode, WebInspector.fileSystemWorkspaceBinding);
this._suggestReload();
}
},
/**
* @param {!WebInspector.UISourceCode} uiSourceCode
*/
_removeNetworkMapping: function(uiSourceCode)
{
if (confirm(WebInspector.UIString("Are you sure you want to remove network mapping?"))) {
this._networkMapping.removeMapping(uiSourceCode);
this._suggestReload();
}
},
/**
* @param {!WebInspector.ContextMenu} contextMenu
* @param {!WebInspector.UISourceCode} uiSourceCode
*/
_appendUISourceCodeMappingItems: function(contextMenu, uiSourceCode)
{
WebInspector.NavigatorView.appendAddFolderItem(contextMenu);
if (uiSourceCode.project().type() === WebInspector.projectTypes.FileSystem) {
var hasMappings = !!this._networkMapping.networkURL(uiSourceCode);
if (!hasMappings)
contextMenu.appendItem(WebInspector.UIString.capitalize("Map to ^network ^resource\u2026"), this.mapFileSystemToNetwork.bind(this, uiSourceCode));
else
contextMenu.appendItem(WebInspector.UIString.capitalize("Remove ^network ^mapping"), this._removeNetworkMapping.bind(this, uiSourceCode));
}
/**
* @param {!WebInspector.Project} project
*/
function filterProject(project)
{
return project.type() === WebInspector.projectTypes.FileSystem;
}
if (uiSourceCode.project().type() === WebInspector.projectTypes.Network || uiSourceCode.project().type() === WebInspector.projectTypes.ContentScripts) {
if (!this._workspace.projects().filter(filterProject).length)
return;
var networkURL = this._networkMapping.networkURL(uiSourceCode);
if (this._networkMapping.uiSourceCodeForURLForAnyTarget(networkURL) === uiSourceCode)
contextMenu.appendItem(WebInspector.UIString.capitalize("Map to ^file ^system ^resource\u2026"), this.mapNetworkToFileSystem.bind(this, uiSourceCode));
}
},
/**
* @param {!Event} event
* @param {!WebInspector.ContextMenu} contextMenu
* @param {!Object} target
*/
_appendUISourceCodeItems: function(event, contextMenu, target)
{
if (!(target instanceof WebInspector.UISourceCode))
return;
var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (target);
var projectType = uiSourceCode.project().type();
if (projectType !== WebInspector.projectTypes.Debugger && !event.target.isSelfOrDescendant(this._navigator.view.element)) {
contextMenu.appendItem(WebInspector.UIString.capitalize("Reveal in ^navigator"), this._handleContextMenuReveal.bind(this, uiSourceCode));
contextMenu.appendSeparator();
}
this._appendUISourceCodeMappingItems(contextMenu, uiSourceCode);
if (projectType !== WebInspector.projectTypes.FileSystem)
contextMenu.appendItem(WebInspector.UIString.capitalize("Local ^modifications\u2026"), this._showLocalHistory.bind(this, uiSourceCode));
},
/**
* @param {!WebInspector.ContextMenu} contextMenu
* @param {!Object} object
*/
appendUILocationItems: function(contextMenu, object)
{
if (!(object instanceof WebInspector.UILocation))
return;
var uiLocation = /** @type {!WebInspector.UILocation} */ (object);
var uiSourceCode = uiLocation.uiSourceCode;
var projectType = uiSourceCode.project().type();
var contentType = uiSourceCode.contentType();
if (contentType === WebInspector.resourceTypes.Script || contentType === WebInspector.resourceTypes.Document) {
var target = WebInspector.context.flavor(WebInspector.Target);
var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);
if (debuggerModel && debuggerModel.isPaused())
contextMenu.appendItem(WebInspector.UIString.capitalize("Continue to ^here"), this._continueToLocation.bind(this, uiLocation));
}
if ((contentType === WebInspector.resourceTypes.Script || contentType === WebInspector.resourceTypes.Document) && projectType !== WebInspector.projectTypes.Snippets) {
var networkURL = this._networkMapping.networkURL(uiSourceCode);
var url = projectType === WebInspector.projectTypes.Formatter ? uiSourceCode.originURL() : networkURL;
this.sidebarPanes.callstack.appendBlackboxURLContextMenuItems(contextMenu, url, projectType === WebInspector.projectTypes.ContentScripts);
}
},
/**
* @param {!WebInspector.UISourceCode} uiSourceCode
*/
_handleContextMenuReveal: function(uiSourceCode)
{
this.editorView.showBoth();
this._revealInNavigator(uiSourceCode);
},
/**
* @param {!WebInspector.ContextMenu} contextMenu
* @param {!Object} target
*/
_appendRemoteObjectItems: function(contextMenu, target)
{
if (!(target instanceof WebInspector.RemoteObject))
return;
var remoteObject = /** @type {!WebInspector.RemoteObject} */ (target);
contextMenu.appendItem(WebInspector.UIString.capitalize("Store as ^global ^variable"), this._saveToTempVariable.bind(this, remoteObject));
if (remoteObject.type === "function")
contextMenu.appendItem(WebInspector.UIString.capitalize("Show ^function ^definition"), this._showFunctionDefinition.bind(this, remoteObject));
if (remoteObject.subtype === "generator")
contextMenu.appendItem(WebInspector.UIString.capitalize("Show ^generator ^location"), this._showGeneratorLocation.bind(this, remoteObject));
},
/**
* @param {!WebInspector.ContextMenu} contextMenu
* @param {!Object} target
*/
_appendNetworkRequestItems: function(contextMenu, target)
{
if (!(target instanceof WebInspector.NetworkRequest))
return;
var request = /** @type {!WebInspector.NetworkRequest} */ (target);
var uiSourceCode = this._networkMapping.uiSourceCodeForURLForAnyTarget(request.url);
if (!uiSourceCode)
return;
var openText = WebInspector.UIString.capitalize("Open in Sources ^panel");
contextMenu.appendItem(openText, this.showUILocation.bind(this, uiSourceCode.uiLocation(0, 0)));
},
/**
* @param {!WebInspector.RemoteObject} remoteObject
*/
_saveToTempVariable: function(remoteObject)
{
var currentExecutionContext = WebInspector.context.flavor(WebInspector.ExecutionContext);
if (!currentExecutionContext)
return;
currentExecutionContext.globalObject("", false, false, didGetGlobalObject);
/**
* @param {?WebInspector.RemoteObject} global
* @param {boolean=} wasThrown
*/
function didGetGlobalObject(global, wasThrown)
{
/**
* @suppressReceiverCheck
* @this {Window}
*/
function remoteFunction(value)
{
var prefix = "temp";
var index = 1;
while ((prefix + index) in this)
++index;
var name = prefix + index;
this[name] = value;
return name;
}
if (wasThrown || !global)
failedToSave(global);
else
global.callFunction(remoteFunction, [WebInspector.RemoteObject.toCallArgument(remoteObject)], didSave.bind(null, global));
}
/**
* @param {!WebInspector.RemoteObject} global
* @param {?WebInspector.RemoteObject} result
* @param {boolean=} wasThrown
*/
function didSave(global, result, wasThrown)
{
global.release();
if (wasThrown || !result || result.type !== "string")
failedToSave(result);
else
WebInspector.ConsoleModel.evaluateCommandInConsole(currentExecutionContext, result.value);
}
/**
* @param {?WebInspector.RemoteObject} result
*/
function failedToSave(result)
{
var message = WebInspector.UIString("Failed to save to temp variable.");
if (result) {
message += " " + result.description;
result.release();
}
WebInspector.console.error(message);
}
},
/**
* @param {!WebInspector.RemoteObject} remoteObject
*/
_showFunctionDefinition: function(remoteObject)
{
remoteObject.debuggerModel().functionDetails(remoteObject, this._didGetFunctionOrGeneratorObjectDetails.bind(this));
},
/**
* @param {!WebInspector.RemoteObject} remoteObject
*/
_showGeneratorLocation: function(remoteObject)
{
remoteObject.debuggerModel().generatorObjectDetails(remoteObject, this._didGetFunctionOrGeneratorObjectDetails.bind(this));
},
/**
* @param {?{location: ?WebInspector.DebuggerModel.Location}} response
*/
_didGetFunctionOrGeneratorObjectDetails: function(response)
{
if (!response || !response.location)
return;
var location = response.location;
if (!location)
return;
var uiLocation = WebInspector.debuggerWorkspaceBinding.rawLocationToUILocation(location);
if (uiLocation)
this.showUILocation(uiLocation);
},
showGoToSourceDialog: function()
{
this._sourcesView.showOpenResourceDialog();
},
_updateSidebarPosition: function()
{
var vertically;
var position = WebInspector.moduleSetting("sidebarPosition").get();
if (position === "right")
vertically = false;
else if (position === "bottom")
vertically = true;
else
vertically = WebInspector.inspectorView.element.offsetWidth < 680;
if (this.sidebarPaneView && vertically === !this._splitWidget.isVertical())
return;
if (this.sidebarPaneView && this.sidebarPaneView.shouldHideOnDetach())
return; // We can't reparent extension iframes.
if (this.sidebarPaneView)
this.sidebarPaneView.detach();
this._splitWidget.setVertical(!vertically);
this._splitWidget.element.classList.toggle("sources-split-view-vertical", vertically);
if (!vertically)
this._splitWidget.uninstallResizer(this._sourcesView.toolbarContainerElement());
else
this._splitWidget.installResizer(this._sourcesView.toolbarContainerElement());
// Create vertical box with stack.
var vbox = new WebInspector.VBox();
vbox.element.appendChild(this._debugToolbarDrawer);
vbox.setMinimumAndPreferredSizes(25, 25, WebInspector.SourcesPanel.minToolbarWidth, 100);
var sidebarPaneStack = new WebInspector.SidebarPaneStack();
sidebarPaneStack.element.classList.add("flex-auto");
sidebarPaneStack.show(vbox.element);
vbox.element.appendChild(this._debugToolbar.element);
if (!vertically) {
// Populate the only stack.
for (var pane in this.sidebarPanes)
sidebarPaneStack.addPane(this.sidebarPanes[pane]);
this._extensionSidebarPanesContainer = sidebarPaneStack;
this.sidebarPaneView = vbox;
this.sidebarPanes.scopechain.expand();
this.sidebarPanes.watchExpressions.expandIfNecessary();
} else {
var splitWidget = new WebInspector.SplitWidget(true, true, "sourcesPanelDebuggerSidebarSplitViewState", 0.5);
splitWidget.setMainWidget(vbox);
// Populate the left stack.
sidebarPaneStack.addPane(this.sidebarPanes.threads);
sidebarPaneStack.addPane(this.sidebarPanes.callstack);
sidebarPaneStack.addPane(this.sidebarPanes.jsBreakpoints);
sidebarPaneStack.addPane(this.sidebarPanes.domBreakpoints);
sidebarPaneStack.addPane(this.sidebarPanes.xhrBreakpoints);
sidebarPaneStack.addPane(this.sidebarPanes.eventListenerBreakpoints);
sidebarPaneStack.addPane(this.sidebarPanes.objectEventListeners);
if (Runtime.experiments.isEnabled("stepIntoAsync"))
sidebarPaneStack.addPane(this.sidebarPanes.asyncOperationBreakpoints);
var tabbedPane = new WebInspector.SidebarTabbedPane();
splitWidget.setSidebarWidget(tabbedPane);
tabbedPane.addPane(this.sidebarPanes.scopechain);
tabbedPane.addPane(this.sidebarPanes.watchExpressions);
if (this.sidebarPanes.serviceWorkers)
tabbedPane.addPane(this.sidebarPanes.serviceWorkers);
tabbedPane.selectTab(this._lastSelectedTabSetting.get());
tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected, this._tabSelected, this);
this._extensionSidebarPanesContainer = tabbedPane;
this.sidebarPaneView = splitWidget;
}
var extensionSidebarPanes = WebInspector.extensionServer.sidebarPanes();
for (var i = 0; i < extensionSidebarPanes.length; ++i)
this._addExtensionSidebarPane(extensionSidebarPanes[i]);
this._splitWidget.setSidebarWidget(this.sidebarPaneView);
this.sidebarPanes.threads.expand();
this.sidebarPanes.jsBreakpoints.expand();
this.sidebarPanes.callstack.expand();
},
/**
* @param {!WebInspector.Event} event
*/
_tabSelected: function(event)
{
this._lastSelectedTabSetting.set(event.data.tabId);
},
/**
* @param {!WebInspector.Event} event
*/
_extensionSidebarPaneAdded: function(event)
{
var pane = /** @type {!WebInspector.ExtensionSidebarPane} */ (event.data);
this._addExtensionSidebarPane(pane);
},
/**
* @param {!WebInspector.ExtensionSidebarPane} pane
*/
_addExtensionSidebarPane: function(pane)
{
if (pane.panelName() === this.name)
this._extensionSidebarPanesContainer.addPane(pane);
},
/**
* @return {!WebInspector.SourcesView}
*/
sourcesView: function()
{
return this._sourcesView;
},
/**
* @param {!DataTransfer} dataTransfer
*/
_handleDrop: function(dataTransfer)
{
var items = dataTransfer.items;
if (!items.length)
return;
var entry = items[0].webkitGetAsEntry();
if (!entry.isDirectory)
return;
InspectorFrontendHost.upgradeDraggedFileSystemPermissions(entry.filesystem);
},
__proto__: WebInspector.Panel.prototype
}
/**
* @constructor
* @implements {WebInspector.ContextMenu.Provider}
*/
WebInspector.SourcesPanel.ContextMenuProvider = function()
{
}
WebInspector.SourcesPanel.ContextMenuProvider.prototype = {
/**
* @override
* @param {!Event} event
* @param {!WebInspector.ContextMenu} contextMenu
* @param {!Object} target
*/
appendApplicableItems: function(event, contextMenu, target)
{
WebInspector.SourcesPanel.instance().appendApplicableItems(event, contextMenu, target);
}
}
/**
* @constructor
* @implements {WebInspector.Revealer}
*/
WebInspector.SourcesPanel.UILocationRevealer = function()
{
}
WebInspector.SourcesPanel.UILocationRevealer.prototype = {
/**
* @override
* @param {!Object} uiLocation
* @return {!Promise}
*/
reveal: function(uiLocation)
{
if (!(uiLocation instanceof WebInspector.UILocation))
return Promise.reject(new Error("Internal error: not a ui location"));
WebInspector.SourcesPanel.instance().showUILocation(uiLocation);
return Promise.resolve();
}
}
/**
* @constructor
* @implements {WebInspector.Revealer}
*/
WebInspector.SourcesPanel.DebuggerLocationRevealer = function()
{
}
WebInspector.SourcesPanel.DebuggerLocationRevealer.prototype = {
/**
* @override
* @param {!Object} rawLocation
* @return {!Promise}
*/
reveal: function(rawLocation)
{
if (!(rawLocation instanceof WebInspector.DebuggerModel.Location))
return Promise.reject(new Error("Internal error: not a debugger location"));
WebInspector.SourcesPanel.instance().showUILocation(WebInspector.debuggerWorkspaceBinding.rawLocationToUILocation(rawLocation));
return Promise.resolve();
}
}
/**
* @constructor
* @implements {WebInspector.Revealer}
*/
WebInspector.SourcesPanel.UISourceCodeRevealer = function()
{
}
WebInspector.SourcesPanel.UISourceCodeRevealer.prototype = {
/**
* @override
* @param {!Object} uiSourceCode
* @return {!Promise}
*/
reveal: function(uiSourceCode)
{
if (!(uiSourceCode instanceof WebInspector.UISourceCode))
return Promise.reject(new Error("Internal error: not a ui source code"));
WebInspector.SourcesPanel.instance().showUISourceCode(uiSourceCode);
return Promise.resolve();
}
}
/**
* @constructor
* @implements {WebInspector.Revealer}
*/
WebInspector.SourcesPanel.DebuggerPausedDetailsRevealer = function()
{
}
WebInspector.SourcesPanel.DebuggerPausedDetailsRevealer.prototype = {
/**
* @override
* @param {!Object} object
* @return {!Promise}
*/
reveal: function(object)
{
WebInspector.inspectorView.setCurrentPanel(WebInspector.SourcesPanel.instance());
return Promise.resolve();
}
}
/**
* @constructor
* @implements {WebInspector.ActionDelegate}
*/
WebInspector.SourcesPanel.RevealingActionDelegate = function() {}
WebInspector.SourcesPanel.RevealingActionDelegate.prototype = {
/**
* @override
* @param {!WebInspector.Context} context
* @param {string} actionId
*/
handleAction: function(context, actionId)
{
var panel = WebInspector.SourcesPanel.instance();
WebInspector.inspectorView.setCurrentPanel(panel);
switch (actionId) {
case "debugger.toggle-pause":
panel.togglePause();
break;
case "sources.go-to-source":
panel.showGoToSourceDialog();
break;
}
}
}
/**
* @constructor
* @implements {WebInspector.ActionDelegate}
*/
WebInspector.SourcesPanel.DebuggingActionDelegate = function()
{
}
WebInspector.SourcesPanel.DebuggingActionDelegate.prototype = {
/**
* @override
* @param {!WebInspector.Context} context
* @param {string} actionId
*/
handleAction: function(context, actionId)
{
var panel = WebInspector.SourcesPanel.instance();
switch (actionId) {
case "debugger.step-over":
panel._stepOverClicked();
break;
case "debugger.step-into":
panel._stepIntoClicked();
break;
case "debugger.step-into-async":
panel._stepIntoAsyncClicked();
break;
case "debugger.step-out":
panel._stepOutClicked();
break;
case "debugger.run-snippet":
panel._runSnippet();
break;
case "debugger.toggle-breakpoints-active":
panel._toggleBreakpointsActive();
break;
}
}
}
WebInspector.SourcesPanel.show = function()
{
WebInspector.inspectorView.setCurrentPanel(WebInspector.SourcesPanel.instance());
}
/**
* @return {!WebInspector.SourcesPanel}
*/
WebInspector.SourcesPanel.instance = function()
{
if (!WebInspector.SourcesPanel._instanceObject)
WebInspector.SourcesPanel._instanceObject = new WebInspector.SourcesPanel();
return WebInspector.SourcesPanel._instanceObject;
}
/**
* @constructor
* @implements {WebInspector.PanelFactory}
*/
WebInspector.SourcesPanelFactory = function()
{
}
WebInspector.SourcesPanelFactory.prototype = {
/**
* @override
* @return {!WebInspector.Panel}
*/
createPanel: function()
{
return WebInspector.SourcesPanel.instance();
}
}