summaryrefslogtreecommitdiff
path: root/Source/WebInspectorUI/UserInterface/DebuggerSidebarPanel.js
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebInspectorUI/UserInterface/DebuggerSidebarPanel.js')
-rw-r--r--Source/WebInspectorUI/UserInterface/DebuggerSidebarPanel.js497
1 files changed, 497 insertions, 0 deletions
diff --git a/Source/WebInspectorUI/UserInterface/DebuggerSidebarPanel.js b/Source/WebInspectorUI/UserInterface/DebuggerSidebarPanel.js
new file mode 100644
index 000000000..1d92251a8
--- /dev/null
+++ b/Source/WebInspectorUI/UserInterface/DebuggerSidebarPanel.js
@@ -0,0 +1,497 @@
+/*
+ * Copyright (C) 2013 Apple 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. AND ITS CONTRIBUTORS ``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 ITS 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.
+ */
+
+WebInspector.DebuggerSidebarPanel = function()
+{
+ WebInspector.NavigationSidebarPanel.call(this, "debugger", WebInspector.UIString("Debugger"), "Images/NavigationItemBug.pdf", "3", true);
+
+ WebInspector.Frame.addEventListener(WebInspector.Frame.Event.MainResourceDidChange, this._mainResourceChanged, this);
+ WebInspector.Frame.addEventListener(WebInspector.Frame.Event.ResourceWasAdded, this._resourceAdded, this);
+
+ WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.CallFramesDidChange, this._debuggerCallFramesDidChange, this);
+ WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.BreakpointAdded, this._breakpointAdded, this);
+ WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.BreakpointRemoved, this._breakpointRemoved, this);
+ WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.ScriptAdded, this._scriptAdded, this);
+ WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.ScriptsCleared, this._scriptsCleared, this);
+ WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.Paused, this._debuggerDidPause, this);
+ WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.Resumed, this._debuggerDidResume, this);
+
+ this._pauseOrResumeKeyboardShortcut = new WebInspector.KeyboardShortcut(WebInspector.KeyboardShortcut.Modifier.Control | WebInspector.KeyboardShortcut.Modifier.Command, "Y", this._debuggerPauseResumeButtonClicked.bind(this));
+ this._stepOverKeyboardShortcut = new WebInspector.KeyboardShortcut(null, WebInspector.KeyboardShortcut.Key.F6, this._debuggerStepOverButtonClicked.bind(this));
+ this._stepIntoKeyboardShortcut = new WebInspector.KeyboardShortcut(null, WebInspector.KeyboardShortcut.Key.F7, this._debuggerStepIntoButtonClicked.bind(this));
+ this._stepOutKeyboardShortcut = new WebInspector.KeyboardShortcut(null, WebInspector.KeyboardShortcut.Key.F8, this._debuggerStepOutButtonClicked.bind(this));
+
+ this._pauseOrResumeAlternateKeyboardShortcut = new WebInspector.KeyboardShortcut(WebInspector.KeyboardShortcut.Modifier.Command, WebInspector.KeyboardShortcut.Key.Slash, this._debuggerPauseResumeButtonClicked.bind(this));
+ this._stepOverAlternateKeyboardShortcut = new WebInspector.KeyboardShortcut(WebInspector.KeyboardShortcut.Modifier.Command, WebInspector.KeyboardShortcut.Key.SingleQuote, this._debuggerStepOverButtonClicked.bind(this));
+ this._stepIntoAlternateKeyboardShortcut = new WebInspector.KeyboardShortcut(WebInspector.KeyboardShortcut.Modifier.Command, WebInspector.KeyboardShortcut.Key.Semicolon, this._debuggerStepIntoButtonClicked.bind(this));
+ this._stepOutAlternateKeyboardShortcut = new WebInspector.KeyboardShortcut(WebInspector.KeyboardShortcut.Modifier.Shift | WebInspector.KeyboardShortcut.Modifier.Command, WebInspector.KeyboardShortcut.Key.Semicolon, this._debuggerStepOutButtonClicked.bind(this));
+
+ this._navigationBar = new WebInspector.NavigationBar;
+ this.element.appendChild(this._navigationBar.element);
+
+ var toolTip = WebInspector.UIString("Enable all breakpoints");
+ var altToolTip = WebInspector.UIString("Disable all breakpoints");
+
+ this._debuggerBreakpointsButtonItem = new WebInspector.ActivateButtonNavigationItem("debugger-breakpoints", toolTip, altToolTip, "Images/Breakpoints.pdf", 16, 16);
+ this._debuggerBreakpointsButtonItem.activated = WebInspector.debuggerManager.breakpointsEnabled;
+ this._debuggerBreakpointsButtonItem.addEventListener(WebInspector.ButtonNavigationItem.Event.Clicked, this._breakpointsToggleButtonClicked, this);
+ this._navigationBar.addNavigationItem(this._debuggerBreakpointsButtonItem);
+
+ toolTip = WebInspector.UIString("Pause script execution (%s or %s)").format(this._pauseOrResumeKeyboardShortcut.displayName, this._pauseOrResumeAlternateKeyboardShortcut.displayName);
+ altToolTip = WebInspector.UIString("Continue script execution (%s or %s)").format(this._pauseOrResumeKeyboardShortcut.displayName, this._pauseOrResumeAlternateKeyboardShortcut.displayName);
+
+ this._debuggerPauseResumeButtonItem = new WebInspector.ToggleButtonNavigationItem("debugger-pause-resume", toolTip, altToolTip, "Images/Pause.pdf", "Images/Resume.pdf", 16, 16);
+ this._debuggerPauseResumeButtonItem.addEventListener(WebInspector.ButtonNavigationItem.Event.Clicked, this._debuggerPauseResumeButtonClicked, this);
+ this._navigationBar.addNavigationItem(this._debuggerPauseResumeButtonItem);
+
+ this._debuggerStepOverButtonItem = new WebInspector.ButtonNavigationItem("debugger-step-over", WebInspector.UIString("Step over (%s or %s)").format(this._stepOverKeyboardShortcut.displayName, this._stepOverAlternateKeyboardShortcut.displayName), "Images/StepOver.pdf", 16, 16);
+ this._debuggerStepOverButtonItem.addEventListener(WebInspector.ButtonNavigationItem.Event.Clicked, this._debuggerStepOverButtonClicked, this);
+ this._debuggerStepOverButtonItem.enabled = false;
+ this._navigationBar.addNavigationItem(this._debuggerStepOverButtonItem);
+
+ this._debuggerStepIntoButtonItem = new WebInspector.ButtonNavigationItem("debugger-step-into", WebInspector.UIString("Step into (%s or %s)").format(this._stepIntoKeyboardShortcut.displayName, this._stepIntoAlternateKeyboardShortcut.displayName), "Images/StepInto.pdf", 16, 16);
+ this._debuggerStepIntoButtonItem.addEventListener(WebInspector.ButtonNavigationItem.Event.Clicked, this._debuggerStepIntoButtonClicked, this);
+ this._debuggerStepIntoButtonItem.enabled = false;
+ this._navigationBar.addNavigationItem(this._debuggerStepIntoButtonItem);
+
+ this._debuggerStepOutButtonItem = new WebInspector.ButtonNavigationItem("debugger-step-out", WebInspector.UIString("Step out (%s or %s)").format(this._stepOutKeyboardShortcut.displayName, this._stepOutAlternateKeyboardShortcut.displayName), "Images/StepOut.pdf", 16, 16);
+ this._debuggerStepOutButtonItem.addEventListener(WebInspector.ButtonNavigationItem.Event.Clicked, this._debuggerStepOutButtonClicked, this);
+ this._debuggerStepOutButtonItem.enabled = false;
+ this._navigationBar.addNavigationItem(this._debuggerStepOutButtonItem);
+
+ // Add this offset-sections class name so the sticky headers don't overlap the navigation bar.
+ this.element.classList.add(WebInspector.DebuggerSidebarPanel.OffsetSectionsStyleClassName);
+
+ this._allExceptionsBreakpointTreeElement = new WebInspector.BreakpointTreeElement(WebInspector.debuggerManager.allExceptionsBreakpoint, WebInspector.DebuggerSidebarPanel.ExceptionIconStyleClassName, WebInspector.UIString("All Exceptions"));
+ this._allUncaughtExceptionsBreakpointTreeElement = new WebInspector.BreakpointTreeElement(WebInspector.debuggerManager.allUncaughtExceptionsBreakpoint, WebInspector.DebuggerSidebarPanel.ExceptionIconStyleClassName, WebInspector.UIString("All Uncaught Exceptions"));
+
+ this.filterBar.placeholder = WebInspector.UIString("Filter Breakpoint List");
+
+ this._breakpointsContentTreeOutline = this.contentTreeOutline;
+ this._breakpointsContentTreeOutline.onselect = this._treeElementSelected.bind(this);
+ this._breakpointsContentTreeOutline.ondelete = this._breakpointTreeOutlineDeleteTreeElement.bind(this);
+ this._breakpointsContentTreeOutline.oncontextmenu = this._breakpointTreeOutlineContextMenuTreeElement.bind(this);
+
+ this._breakpointsContentTreeOutline.appendChild(this._allExceptionsBreakpointTreeElement);
+ this._breakpointsContentTreeOutline.appendChild(this._allUncaughtExceptionsBreakpointTreeElement);
+
+ var breakpointsRow = new WebInspector.DetailsSectionRow;
+ breakpointsRow.element.appendChild(this._breakpointsContentTreeOutline.element);
+
+ var breakpointsGroup = new WebInspector.DetailsSectionGroup([breakpointsRow]);
+ var breakpointsSection = new WebInspector.DetailsSection("breakpoints", WebInspector.UIString("Breakpoints"), [breakpointsGroup]);
+ this.contentElement.appendChild(breakpointsSection.element);
+
+ this._callStackContentTreeOutline = this.createContentTreeOutline(true);
+ this._callStackContentTreeOutline.onselect = this._treeElementSelected.bind(this);
+
+ this._callStackRow = new WebInspector.DetailsSectionRow(WebInspector.UIString("No Call Frames"));
+ this._callStackRow.showEmptyMessage();
+
+ var callStackGroup = new WebInspector.DetailsSectionGroup([this._callStackRow]);
+ this._callStackSection = new WebInspector.DetailsSection("call-stack", WebInspector.UIString("Call Stack"), [callStackGroup]);
+
+ WebInspector.Breakpoint.addEventListener(WebInspector.Breakpoint.Event.DisplayLocationDidChange, this._breakpointDisplayLocationDidChange, this);
+};
+
+WebInspector.DebuggerSidebarPanel.OffsetSectionsStyleClassName = "offset-sections";
+WebInspector.DebuggerSidebarPanel.ExceptionIconStyleClassName = "breakpoint-exception-icon";
+
+WebInspector.DebuggerSidebarPanel.prototype = {
+ constructor: WebInspector.DebuggerSidebarPanel,
+
+ // Private
+
+ _debuggerPauseResumeButtonClicked: function(event)
+ {
+ if (WebInspector.debuggerManager.paused)
+ WebInspector.debuggerManager.resume();
+ else {
+ this._debuggerPauseResumeButtonItem.enabled = false;
+ WebInspector.debuggerManager.pause();
+ }
+ },
+
+ _debuggerStepOverButtonClicked: function(event)
+ {
+ WebInspector.debuggerManager.stepOver();
+ },
+
+ _debuggerStepIntoButtonClicked: function(event)
+ {
+ WebInspector.debuggerManager.stepInto();
+ },
+
+ _debuggerStepOutButtonClicked: function(event)
+ {
+ WebInspector.debuggerManager.stepOut();
+ },
+
+ _debuggerDidPause: function(event)
+ {
+ this.contentElement.insertBefore(this._callStackSection.element, this.contentElement.firstChild);
+
+ this._debuggerPauseResumeButtonItem.enabled = true;
+ this._debuggerPauseResumeButtonItem.toggled = true;
+ this._debuggerStepOverButtonItem.enabled = true;
+ this._debuggerStepIntoButtonItem.enabled = true;
+ this._debuggerStepOutButtonItem.enabled = true;
+ },
+
+ _debuggerDidResume: function(event)
+ {
+ this._callStackSection.element.remove();
+
+ this._debuggerPauseResumeButtonItem.enabled = true;
+ this._debuggerPauseResumeButtonItem.toggled = false;
+ this._debuggerStepOverButtonItem.enabled = false;
+ this._debuggerStepIntoButtonItem.enabled = false;
+ this._debuggerStepOutButtonItem.enabled = false;
+ },
+
+ _breakpointsToggleButtonClicked: function(event)
+ {
+ this._debuggerBreakpointsButtonItem.activated = !this._debuggerBreakpointsButtonItem.activated;
+ WebInspector.debuggerManager.breakpointsEnabled = this._debuggerBreakpointsButtonItem.activated;
+ },
+
+ _addBreakpoint: function(breakpoint, sourceCode)
+ {
+ var sourceCode = breakpoint.sourceCodeLocation.displaySourceCode;
+ if (!sourceCode)
+ return null;
+
+ var parentTreeElement = this._breakpointsContentTreeOutline.getCachedTreeElement(sourceCode);
+ if (!parentTreeElement) {
+ if (sourceCode instanceof WebInspector.SourceMapResource)
+ parentTreeElement = new WebInspector.SourceMapResourceTreeElement(sourceCode);
+ else if (sourceCode instanceof WebInspector.Resource)
+ parentTreeElement = new WebInspector.ResourceTreeElement(sourceCode);
+ else if (sourceCode instanceof WebInspector.Script)
+ parentTreeElement = new WebInspector.ScriptTreeElement(sourceCode);
+ }
+
+ if (!parentTreeElement.parent) {
+ parentTreeElement.hasChildren = true;
+ parentTreeElement.expand();
+
+ this._breakpointsContentTreeOutline.insertChild(parentTreeElement, insertionIndexForObjectInListSortedByFunction(parentTreeElement, this._breakpointsContentTreeOutline.children, this._compareTopLevelTreeElements.bind(this)));
+ }
+
+ // Mark disabled breakpoints as resolved if there is source code loaded with that URL.
+ // This gives the illusion the breakpoint was resolved, but since we don't send disabled
+ // breakpoints to the backend we don't know for sure. If the user enables the breakpoint
+ // it will be resolved properly.
+ if (breakpoint.disabled)
+ breakpoint.resolved = true;
+
+ var breakpointTreeElement = new WebInspector.BreakpointTreeElement(breakpoint);
+ parentTreeElement.insertChild(breakpointTreeElement, insertionIndexForObjectInListSortedByFunction(breakpointTreeElement, parentTreeElement.children, this._compareBreakpointTreeElements));
+ return breakpointTreeElement;
+ },
+
+ _addBreakpointsForSourceCode: function(sourceCode)
+ {
+ var breakpoints = WebInspector.debuggerManager.breakpointsForSourceCode(sourceCode);
+ for (var i = 0; i < breakpoints.length; ++i)
+ this._addBreakpoint(breakpoints[i], sourceCode);
+ },
+
+ _resourceAdded: function(event)
+ {
+ var resource = event.data.resource;
+ this._addBreakpointsForSourceCode(resource);
+ },
+
+ _mainResourceChanged: function(event)
+ {
+ var resource = event.target.mainResource;
+ this._addBreakpointsForSourceCode(resource);
+ },
+
+ _scriptAdded: function(event)
+ {
+ var script = event.data.script;
+
+ // Don't add breakpoints if the script is represented by a Resource. They were
+ // already added by _resourceAdded.
+ if (script.resource)
+ return;
+
+ this._addBreakpointsForSourceCode(script);
+ },
+
+ _scriptsCleared: function(event)
+ {
+ for (var i = this._breakpointsContentTreeOutline.children.length - 1; i >= 0; --i) {
+ var treeElement = this._breakpointsContentTreeOutline.children[i];
+ if (!(treeElement instanceof WebInspector.ScriptTreeElement))
+ continue;
+
+ this._breakpointsContentTreeOutline.removeChildAtIndex(i, true, true);
+ }
+ },
+
+ _breakpointAdded: function(event)
+ {
+ var breakpoint = event.data.breakpoint;
+ this._addBreakpoint(breakpoint);
+ },
+
+ _breakpointRemoved: function(event)
+ {
+ var breakpoint = event.data.breakpoint;
+
+ var breakpointTreeElement = this._breakpointsContentTreeOutline.getCachedTreeElement(breakpoint);
+ console.assert(breakpointTreeElement);
+ if (!breakpointTreeElement)
+ return;
+
+ this._removeBreakpointTreeElement(breakpointTreeElement);
+ },
+
+ _breakpointDisplayLocationDidChange: function(event)
+ {
+ var breakpoint = event.target;
+ if (event.data.oldDisplaySourceCode === breakpoint.displaySourceCode)
+ return;
+
+ var breakpointTreeElement = this._breakpointsContentTreeOutline.getCachedTreeElement(breakpoint);
+ if (!breakpointTreeElement)
+ return;
+
+ // A known breakpoint moved between resources, remove the old tree element
+ // and create a new tree element with the updated file.
+
+ var wasSelected = breakpointTreeElement.selected;
+
+ this._removeBreakpointTreeElement(breakpointTreeElement);
+ var newBreakpointTreeElement = this._addBreakpoint(breakpoint);
+
+ if (newBreakpointTreeElement && wasSelected)
+ newBreakpointTreeElement.revealAndSelect(true, false, true, true);
+ },
+
+ _removeBreakpointTreeElement: function(breakpointTreeElement)
+ {
+ var parentTreeElement = breakpointTreeElement.parent;
+ parentTreeElement.removeChild(breakpointTreeElement);
+
+ console.assert(parentTreeElement.parent === this._breakpointsContentTreeOutline);
+
+ if (!parentTreeElement.children.length)
+ this._breakpointsContentTreeOutline.removeChild(parentTreeElement);
+ },
+
+ _debuggerCallFramesDidChange: function()
+ {
+ this._callStackContentTreeOutline.removeChildren();
+
+ var callFrames = WebInspector.debuggerManager.callFrames;
+ if (!callFrames || !callFrames.length) {
+ this._callStackRow.showEmptyMessage();
+ return;
+ }
+
+ this._callStackRow.hideEmptyMessage();
+ this._callStackRow.element.appendChild(this._callStackContentTreeOutline.element);
+
+ var treeElementToSelect = null;
+
+ var activeCallFrame = WebInspector.debuggerManager.activeCallFrame;
+ for (var i = 0; i < callFrames.length; ++i) {
+ var callFrameTreeElement = new WebInspector.CallFrameTreeElement(callFrames[i]);
+ if (callFrames[i] === activeCallFrame)
+ treeElementToSelect = callFrameTreeElement;
+ this._callStackContentTreeOutline.appendChild(callFrameTreeElement);
+ }
+
+ if (treeElementToSelect)
+ treeElementToSelect.select(true, true);
+ },
+
+ _breakpointsBeneathTreeElement: function(treeElement)
+ {
+ console.assert(treeElement instanceof WebInspector.ResourceTreeElement || treeElement instanceof WebInspector.ScriptTreeElement);
+ if (!(treeElement instanceof WebInspector.ResourceTreeElement) && !(treeElement instanceof WebInspector.ScriptTreeElement))
+ return [];
+
+ var breakpoints = [];
+ var breakpointTreeElements = treeElement.children;
+ for (var i = 0; i < breakpointTreeElements.length; ++i) {
+ console.assert(breakpointTreeElements[i] instanceof WebInspector.BreakpointTreeElement);
+ console.assert(breakpointTreeElements[i].breakpoint);
+ var breakpoint = breakpointTreeElements[i].breakpoint;
+ if (breakpoint)
+ breakpoints.push(breakpoint);
+ }
+
+ return breakpoints;
+ },
+
+ _removeAllBreakpoints: function(breakpoints)
+ {
+ for (var i = 0; i < breakpoints.length; ++i) {
+ var breakpoint = breakpoints[i];
+ if (WebInspector.debuggerManager.isBreakpointRemovable(breakpoint))
+ WebInspector.debuggerManager.removeBreakpoint(breakpoint);
+ }
+ },
+
+ _toggleAllBreakpoints: function(breakpoints, disabled)
+ {
+ for (var i = 0; i < breakpoints.length; ++i)
+ breakpoints[i].disabled = disabled;
+ },
+
+ _breakpointTreeOutlineDeleteTreeElement: function(treeElement)
+ {
+ console.assert(treeElement.selected);
+ console.assert(treeElement instanceof WebInspector.ResourceTreeElement || treeElement instanceof WebInspector.ScriptTreeElement);
+ if (!(treeElement instanceof WebInspector.ResourceTreeElement) && !(treeElement instanceof WebInspector.ScriptTreeElement))
+ return false;
+
+ var wasTopResourceTreeElement = treeElement.previousSibling === this._allUncaughtExceptionsBreakpointTreeElement;
+ var nextSibling = treeElement.nextSibling;
+
+ var breakpoints = this._breakpointsBeneathTreeElement(treeElement);
+ this._removeAllBreakpoints(breakpoints);
+
+ if (wasTopResourceTreeElement && nextSibling)
+ nextSibling.select(true, true);
+
+ return true;
+ },
+
+ _breakpointTreeOutlineContextMenuTreeElement: function(event, treeElement)
+ {
+ console.assert(treeElement instanceof WebInspector.ResourceTreeElement || treeElement instanceof WebInspector.ScriptTreeElement);
+ if (!(treeElement instanceof WebInspector.ResourceTreeElement) && !(treeElement instanceof WebInspector.ScriptTreeElement))
+ return;
+
+ var breakpoints = this._breakpointsBeneathTreeElement(treeElement);
+ var shouldDisable = false;
+ for (var i = 0; i < breakpoints.length; ++i) {
+ if (!breakpoints[i].disabled) {
+ shouldDisable = true;
+ break;
+ }
+ }
+
+ function removeAllResourceBreakpoints()
+ {
+ this._removeAllBreakpoints(breakpoints);
+ }
+
+ function toggleAllResourceBreakpoints()
+ {
+ this._toggleAllBreakpoints(breakpoints, shouldDisable);
+ }
+
+ var contextMenu = new WebInspector.ContextMenu(event);
+ if (shouldDisable)
+ contextMenu.appendItem(WebInspector.UIString("Disable Breakpoints"), toggleAllResourceBreakpoints.bind(this));
+ else
+ contextMenu.appendItem(WebInspector.UIString("Enable Breakpoints"), toggleAllResourceBreakpoints.bind(this));
+ contextMenu.appendItem(WebInspector.UIString("Delete Breakpoints"), removeAllResourceBreakpoints.bind(this));
+ contextMenu.show();
+ },
+
+ _treeElementSelected: function(treeElement, selectedByUser)
+ {
+ function deselectCallStackContentTreeElements()
+ {
+ // Deselect any tree element in the call stack content tree outline to prevent two selections in the sidebar.
+ var selectedTreeElement = this._callStackContentTreeOutline.selectedTreeElement;
+ if (selectedTreeElement)
+ selectedTreeElement.deselect();
+ }
+
+ if (treeElement instanceof WebInspector.ResourceTreeElement || treeElement instanceof WebInspector.ScriptTreeElement) {
+ // If the resource is being selected when it has no children it is in the process of being deleted, don't do anything.
+ if (!treeElement.children.length)
+ return;
+ deselectCallStackContentTreeElements.call(this);
+ WebInspector.resourceSidebarPanel.showSourceCode(treeElement.representedObject);
+ return;
+ }
+
+ if (treeElement instanceof WebInspector.CallFrameTreeElement) {
+ // Deselect any tree element in the breakpoints content tree outline to prevent two selections in the sidebar.
+ var selectedTreeElement = this._breakpointsContentTreeOutline.selectedTreeElement;
+ if (selectedTreeElement)
+ selectedTreeElement.deselect();
+
+ var callFrame = treeElement.callFrame;
+ WebInspector.debuggerManager.activeCallFrame = callFrame;
+ WebInspector.resourceSidebarPanel.showSourceCodeLocation(callFrame.sourceCodeLocation);
+ return;
+ }
+
+ if (!(treeElement instanceof WebInspector.BreakpointTreeElement))
+ return;
+
+ deselectCallStackContentTreeElements.call(this);
+
+ if (!treeElement.parent.representedObject)
+ return;
+
+ console.assert(treeElement.parent.representedObject instanceof WebInspector.SourceCode);
+ if (!(treeElement.parent.representedObject instanceof WebInspector.SourceCode))
+ return;
+
+ var breakpoint = treeElement.breakpoint;
+ WebInspector.resourceSidebarPanel.showSourceCodeLocation(breakpoint.sourceCodeLocation);
+ },
+
+ _compareTopLevelTreeElements: function(a, b)
+ {
+ if (a === this._allExceptionsBreakpointTreeElement)
+ return -1;
+ if (b === this._allExceptionsBreakpointTreeElement)
+ return 1;
+
+ if (a === this._allUncaughtExceptionsBreakpointTreeElement)
+ return -1;
+ if (b === this._allUncaughtExceptionsBreakpointTreeElement)
+ return 1;
+
+ return a.mainTitle.localeCompare(b.mainTitle);
+ },
+
+ _compareBreakpointTreeElements: function(a, b)
+ {
+ var aLocation = a.breakpoint.sourceCodeLocation;
+ var bLocation = b.breakpoint.sourceCodeLocation;
+
+ var comparisonResult = aLocation.displayLineNumber - bLocation.displayLineNumber
+ if (comparisonResult !== 0)
+ return comparisonResult;
+
+ return aLocation.displayColumnNumber - bLocation.displayColumnNumber;
+ }
+};
+
+WebInspector.DebuggerSidebarPanel.prototype.__proto__ = WebInspector.NavigationSidebarPanel.prototype;