Chromium Code Reviews| Index: Source/devtools/front_end/sources/SourcesPanel.js |
| diff --git a/Source/devtools/front_end/sources/SourcesPanel.js b/Source/devtools/front_end/sources/SourcesPanel.js |
| index fe198efe4947fb077f87a1c4c4d6f57cad3b7c72..677d9ee1ca0a0db22a897b5a835d9b1181a5a921 100644 |
| --- a/Source/devtools/front_end/sources/SourcesPanel.js |
| +++ b/Source/devtools/front_end/sources/SourcesPanel.js |
| @@ -125,6 +125,8 @@ WebInspector.SourcesPanel = function(workspaceForTest) |
| this.sidebarPanes.workerList = new WebInspector.WorkersSidebarPane(); |
| this._extensionSidebarPanes = []; |
| + /** @type {!Set.<!WebInspector.Target>} */ |
| + this._waitingToPauseInTarget = new Set(); |
| this._installDebuggerSidebarController(); |
| @@ -139,6 +141,7 @@ WebInspector.SourcesPanel = function(workspaceForTest) |
| WebInspector.settings.pauseOnExceptionEnabled.addChangeListener(this._pauseOnExceptionEnabledChanged, this); |
| WebInspector.targetManager.observeTargets(this); |
| + WebInspector.executionContextSelector.addTargetChangeListener(this._currentTargetChanged, this); |
| } |
| WebInspector.SourcesPanel.minToolbarWidth = 215; |
| @@ -147,9 +150,10 @@ WebInspector.SourcesPanel.prototype = { |
| /** |
| * @param {!WebInspector.Target} target |
| */ |
| - targetAdded: function(target) { |
| + targetAdded: function(target) |
| + { |
| target.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerWasEnabled, this._debuggerWasEnabled, this); |
| - target.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerWasDisabled, this._debuggerWasDisabled, this); |
| + target.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerWasDisabled, this._debuggerReset, this); |
| target.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerPaused, this._debuggerPaused, this); |
| target.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerResumed, this._debuggerResumed, this); |
| target.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.CallFrameSelected, this._callFrameSelected, this); |
| @@ -161,16 +165,36 @@ WebInspector.SourcesPanel.prototype = { |
| /** |
| * @param {!WebInspector.Target} target |
| */ |
| - targetRemoved: function(target) { |
| + targetRemoved: function(target) |
| + { |
| target.debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.DebuggerWasEnabled, this._debuggerWasEnabled, this); |
| - target.debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.DebuggerWasDisabled, this._debuggerWasDisabled, this); |
| + target.debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.DebuggerWasDisabled, this._debuggerReset, this); |
| target.debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.DebuggerPaused, this._debuggerPaused, this); |
| target.debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.DebuggerResumed, this._debuggerResumed, this); |
| target.debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.CallFrameSelected, this._callFrameSelected, this); |
| target.debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.ConsoleCommandEvaluatedInSelectedCallFrame, this._consoleCommandEvaluatedInSelectedCallFrame, this); |
| target.debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.BreakpointsActiveStateChanged, this._breakpointsActiveStateChanged, this); |
| target.debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared, this._debuggerReset, this); |
| + }, |
| + |
| + /** |
| + * @param {?WebInspector.Target} target |
| + */ |
| + _currentTargetChanged: function(target) |
| + { |
| + if (!target) |
| + return; |
| + if (target.debuggerModel.isPaused()) { |
| + this._showDebuggerPausedDetails(target.debuggerModel.debuggerPausedDetails()); |
| + var callFrame = target.debuggerModel.selectedCallFrame(); |
| + if (callFrame) |
| + this._selectCallFrame(callFrame); |
| + } else { |
| + this._paused = false; |
| + this._clearInterface(); |
| + this._toggleDebuggerSidebarButton.setEnabled(true); |
| + } |
| }, |
| /** |
| @@ -181,7 +205,10 @@ WebInspector.SourcesPanel.prototype = { |
| return this._sourcesView.defaultFocusedElement() || this._navigator.view.defaultFocusedElement(); |
| }, |
| - get paused() |
| + /** |
| + * @return {boolean} |
| + */ |
| + paused: function() |
| { |
| return this._paused; |
| }, |
| @@ -235,8 +262,15 @@ WebInspector.SourcesPanel.prototype = { |
| _debuggerPaused: function(event) |
| { |
| var details = /** @type {!WebInspector.DebuggerPausedDetails} */ (event.data); |
| - WebInspector.inspectorView.setCurrentPanel(this); |
| - this._showDebuggerPausedDetails(details); |
| + this._waitingToPauseInTarget.remove(details.target()); |
| + |
| + if (!this._paused) |
| + WebInspector.inspectorView.setCurrentPanel(this); |
| + |
| + if (WebInspector.executionContextSelector.currentTarget() === details.target()) |
| + this._showDebuggerPausedDetails(details); |
| + else if (!this._paused) |
| + WebInspector.executionContextSelector.setCurrentTarget(details.target()); |
| }, |
| /** |
| @@ -245,8 +279,6 @@ WebInspector.SourcesPanel.prototype = { |
| _showDebuggerPausedDetails: function(details) |
| { |
| this._paused = true; |
| - this._waitingToPause = false; |
| - |
| this._updateDebuggerButtons(); |
| this.sidebarPanes.callstack.update(details); |
| @@ -305,11 +337,16 @@ WebInspector.SourcesPanel.prototype = { |
| InspectorFrontendHost.bringToFront(); |
| }, |
| - _debuggerResumed: function() |
| + /** |
| + * @param {!WebInspector.Event} event |
| + */ |
| + _debuggerResumed: function(event) |
| { |
| + var target = /** @type {!WebInspector.Target} */ (event.data); |
| + this._waitingToPauseInTarget.remove(target); |
|
vsevik
2014/06/18 13:51:47
Let's move it on DebuggerModel
sergeyv
2014/06/19 12:42:04
Done.
|
| + if (WebInspector.executionContextSelector.currentTarget() !== target) |
| + return |
| this._paused = false; |
| - this._waitingToPause = false; |
| - |
| this._clearInterface(); |
| this._toggleDebuggerSidebarButton.setEnabled(true); |
| }, |
| @@ -319,15 +356,12 @@ WebInspector.SourcesPanel.prototype = { |
| this._updateDebuggerButtons(); |
| }, |
| - _debuggerWasDisabled: function() |
| - { |
| - this._debuggerReset(); |
| - }, |
| - |
| - _debuggerReset: function() |
| + /** |
| + * @param {!WebInspector.Event} event |
| + */ |
| + _debuggerReset: function(event) |
| { |
| - this._debuggerResumed(); |
| - this.sidebarPanes.watchExpressions.reset(); |
| + this._debuggerResumed(event); |
| delete this._skipExecutionLineRevealing; |
| }, |
| @@ -397,13 +431,24 @@ WebInspector.SourcesPanel.prototype = { |
| this._sourcesView.showSourceLocation(uiLocation.uiSourceCode, uiLocation.lineNumber, 0, undefined, true); |
| }, |
| + /** |
| + * @param {!WebInspector.Event} event |
| + */ |
| _callFrameSelected: function(event) |
| { |
| - var callFrame = event.data; |
| + var callFrame = /** @type {?WebInspector.DebuggerModel.CallFrame} */ (event.data); |
| - if (!callFrame) |
| + if (!callFrame || callFrame.target() !== WebInspector.executionContextSelector.currentTarget()) |
| 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); |
| @@ -438,6 +483,10 @@ WebInspector.SourcesPanel.prototype = { |
| _updateDebuggerButtons: function() |
| { |
| + var currentTarget = WebInspector.executionContextSelector.currentTarget(); |
| + if (!currentTarget) |
| + return; |
| + |
| if (this._paused) { |
| this._updateButtonTitle(this._pauseButton, WebInspector.UIString("Resume script execution (%s).")) |
| this._pauseButton.state = true; |
| @@ -452,7 +501,7 @@ WebInspector.SourcesPanel.prototype = { |
| this._pauseButton.state = false; |
| this._pauseButton.setLongClickOptionsEnabled(null); |
| - this._pauseButton.setEnabled(!this._waitingToPause); |
| + this._pauseButton.setEnabled(!this._waitingToPauseInTarget.contains(currentTarget)); |
| this._stepOverButton.setEnabled(false); |
| this._stepIntoButton.setEnabled(false); |
| this._stepOutButton.setEnabled(false); |
| @@ -527,16 +576,20 @@ WebInspector.SourcesPanel.prototype = { |
| */ |
| togglePause: function() |
| { |
| + var target = WebInspector.executionContextSelector.currentTarget(); |
| + if (!target) |
| + return true; |
| + |
| if (this._paused) { |
| delete this._skipExecutionLineRevealing; |
| this._paused = false; |
| - this._waitingToPause = false; |
| - WebInspector.debuggerModel.resume(); |
| + this._waitingToPauseInTarget.remove(target); |
| + target.debuggerModel.resume(); |
| } else { |
| - this._waitingToPause = true; |
| + this._waitingToPauseInTarget.add(target); |
| // Make sure pauses didn't stick skipped. |
| - WebInspector.debuggerModel.skipAllPauses(false); |
| - DebuggerAgent.pause(); |
| + target.debuggerModel.skipAllPauses(false); |
| + target.debuggerAgent().pause(); |
| } |
| this._clearInterface(); |
| @@ -544,71 +597,57 @@ WebInspector.SourcesPanel.prototype = { |
| }, |
| /** |
| + * @param {!function(!WebInspector.DebuggerModel)} continuation |
| * @return {boolean} |
| */ |
| - _longResume: function() |
| + _stepButtonHandler: function(continuation) |
|
vsevik
2014/06/18 13:51:47
prepareToResume
sergeyv
2014/06/19 12:42:03
Done.
|
| { |
| if (!this._paused) |
| return true; |
| + delete this._skipExecutionLineRevealing; |
| this._paused = false; |
| - this._waitingToPause = false; |
| - WebInspector.debuggerModel.skipAllPausesUntilReloadOrTimeout(500); |
| - WebInspector.debuggerModel.resume(); |
| this._clearInterface(); |
| + var target = WebInspector.executionContextSelector.currentTarget(); |
| + if (target) |
| + continuation.call(this, target.debuggerModel); |
| + |
| return true; |
| }, |
| /** |
| - * @return {boolean} |
| + * @param {!WebInspector.DebuggerModel} debuggerModel |
| */ |
| - _stepOverClicked: function() |
| + _longResume: function(debuggerModel) |
| { |
| - if (!this._paused) |
| - return true; |
| - |
| - delete this._skipExecutionLineRevealing; |
| - this._paused = false; |
| - |
| - this._clearInterface(); |
| - |
| - WebInspector.debuggerModel.stepOver(); |
| - return true; |
| + this._waitingToPauseInTarget.remove(debuggerModel.target()); |
| + debuggerModel.skipAllPausesUntilReloadOrTimeout(500); |
| + debuggerModel.resume(); |
| }, |
| /** |
| - * @return {boolean} |
| + * @param {!WebInspector.DebuggerModel} debuggerModel |
| */ |
| - _stepIntoClicked: function() |
| + _stepOver: function(debuggerModel) |
| { |
| - if (!this._paused) |
| - return true; |
| - |
| - delete this._skipExecutionLineRevealing; |
| - this._paused = false; |
| - |
| - this._clearInterface(); |
| - |
| - WebInspector.debuggerModel.stepInto(); |
| - return true; |
| + debuggerModel.stepOver(); |
| }, |
| /** |
| - * @return {boolean} |
| + * @param {!WebInspector.DebuggerModel} debuggerModel |
| */ |
| - _stepOutClicked: function() |
| + _stepInto: function(debuggerModel) |
| { |
| - if (!this._paused) |
| - return true; |
| - |
| - delete this._skipExecutionLineRevealing; |
| - this._paused = false; |
| - |
| - this._clearInterface(); |
| + debuggerModel.stepInto(); |
| + }, |
| - WebInspector.debuggerModel.stepOut(); |
| - return true; |
| + /** |
| + * @param {!WebInspector.DebuggerModel} debuggerModel |
| + */ |
| + _stepOut: function(debuggerModel) |
| + { |
| + debuggerModel.stepOut(); |
| }, |
| /** |
| @@ -618,7 +657,7 @@ WebInspector.SourcesPanel.prototype = { |
| { |
| var callFrame = /** @type {!WebInspector.DebuggerModel.CallFrame} */ (event.data); |
| delete this._skipExecutionLineRevealing; |
| - WebInspector.debuggerModel.setSelectedCallFrame(callFrame); |
| + callFrame.target().debuggerModel.setSelectedCallFrame(callFrame); |
| }, |
| _callFrameRestartedInSidebar: function() |
| @@ -680,23 +719,23 @@ WebInspector.SourcesPanel.prototype = { |
| // Long resume. |
| title = WebInspector.UIString("Resume with all pauses blocked for 500 ms"); |
| this._longResumeButton = new WebInspector.StatusBarButton(title, "scripts-long-resume"); |
| - this._longResumeButton.addEventListener("click", this._longResume.bind(this), this); |
| + this._longResumeButton.addEventListener("click", this._stepButtonHandler.bind(this, this._longResume), this); |
| // Step over. |
| title = WebInspector.UIString("Step over next function call (%s)."); |
| - handler = this._stepOverClicked.bind(this); |
| + handler = this._stepButtonHandler.bind(this, this._stepOver); |
| this._stepOverButton = this._createButtonAndRegisterShortcuts("scripts-step-over", title, handler, WebInspector.ShortcutsScreen.SourcesPanelShortcuts.StepOver); |
| debugToolbar.appendChild(this._stepOverButton.element); |
| // Step into. |
| title = WebInspector.UIString("Step into next function call (%s)."); |
| - handler = this._stepIntoClicked.bind(this); |
| + handler = this._stepButtonHandler.bind(this, this._stepInto); |
| this._stepIntoButton = this._createButtonAndRegisterShortcuts("scripts-step-into", title, handler, WebInspector.ShortcutsScreen.SourcesPanelShortcuts.StepInto); |
| debugToolbar.appendChild(this._stepIntoButton.element); |
| // Step out. |
| title = WebInspector.UIString("Step out of current function (%s)."); |
| - handler = this._stepOutClicked.bind(this); |
| + handler = this._stepButtonHandler.bind(this, this._stepOut); |
| this._stepOutButton = this._createButtonAndRegisterShortcuts("scripts-step-out", title, handler, WebInspector.ShortcutsScreen.SourcesPanelShortcuts.StepOut); |
| debugToolbar.appendChild(this._stepOutButton.element); |
| @@ -997,6 +1036,8 @@ WebInspector.SourcesPanel.prototype = { |
| */ |
| _showFunctionDefinition: function(remoteObject) |
| { |
| + var target = remoteObject.target(); |
| + |
| /** |
| * @param {?Protocol.Error} error |
| * @param {!DebuggerAgent.FunctionDetails} response |
| @@ -1009,13 +1050,13 @@ WebInspector.SourcesPanel.prototype = { |
| return; |
| } |
| - var uiLocation = WebInspector.debuggerModel.rawLocationToUILocation(response.location); |
| + var uiLocation = target.debuggerModel.rawLocationToUILocation(response.location); |
| if (!uiLocation) |
| return; |
| this.showUILocation(uiLocation, true); |
| } |
| - DebuggerAgent.getFunctionDetails(remoteObject.objectId, didGetFunctionDetails.bind(this)); |
| + target.debuggerAgent().getFunctionDetails(remoteObject.objectId, didGetFunctionDetails.bind(this)); |
| }, |
| showGoToSourceDialog: function() |