📄 scriptspanel.js
字号:
/* * Copyright (C) 2008 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. ``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. */WebInspector.ScriptsPanel = function(){ WebInspector.Panel.call(this); this.element.addStyleClass("scripts"); this.topStatusBar = document.createElement("div"); this.topStatusBar.className = "status-bar"; this.topStatusBar.id = "scripts-status-bar"; this.element.appendChild(this.topStatusBar); this.backButton = document.createElement("button"); this.backButton.className = "status-bar-item"; this.backButton.id = "scripts-back"; this.backButton.title = WebInspector.UIString("Show the previous script resource."); this.backButton.disabled = true; this.backButton.appendChild(document.createElement("img")); this.backButton.addEventListener("click", this._goBack.bind(this), false); this.topStatusBar.appendChild(this.backButton); this.forwardButton = document.createElement("button"); this.forwardButton.className = "status-bar-item"; this.forwardButton.id = "scripts-forward"; this.forwardButton.title = WebInspector.UIString("Show the next script resource."); this.forwardButton.disabled = true; this.forwardButton.appendChild(document.createElement("img")); this.forwardButton.addEventListener("click", this._goForward.bind(this), false); this.topStatusBar.appendChild(this.forwardButton); this.filesSelectElement = document.createElement("select"); this.filesSelectElement.className = "status-bar-item"; this.filesSelectElement.id = "scripts-files"; this.filesSelectElement.addEventListener("change", this._changeVisibleFile.bind(this), false); this.topStatusBar.appendChild(this.filesSelectElement); this.functionsSelectElement = document.createElement("select"); this.functionsSelectElement.className = "status-bar-item"; this.functionsSelectElement.id = "scripts-functions"; // FIXME: append the functions select element to the top status bar when it is implemented. // this.topStatusBar.appendChild(this.functionsSelectElement); this.sidebarButtonsElement = document.createElement("div"); this.sidebarButtonsElement.id = "scripts-sidebar-buttons"; this.topStatusBar.appendChild(this.sidebarButtonsElement); this.pauseButton = document.createElement("button"); this.pauseButton.className = "status-bar-item"; this.pauseButton.id = "scripts-pause"; this.pauseButton.title = WebInspector.UIString("Pause script execution."); this.pauseButton.disabled = true; this.pauseButton.appendChild(document.createElement("img")); this.pauseButton.addEventListener("click", this._togglePause.bind(this), false); this.sidebarButtonsElement.appendChild(this.pauseButton); this.stepOverButton = document.createElement("button"); this.stepOverButton.className = "status-bar-item"; this.stepOverButton.id = "scripts-step-over"; this.stepOverButton.title = WebInspector.UIString("Step over next function call."); this.stepOverButton.disabled = true; this.stepOverButton.addEventListener("click", this._stepOverClicked.bind(this), false); this.stepOverButton.appendChild(document.createElement("img")); this.sidebarButtonsElement.appendChild(this.stepOverButton); this.stepIntoButton = document.createElement("button"); this.stepIntoButton.className = "status-bar-item"; this.stepIntoButton.id = "scripts-step-into"; this.stepIntoButton.title = WebInspector.UIString("Step into next function call."); this.stepIntoButton.disabled = true; this.stepIntoButton.addEventListener("click", this._stepIntoClicked.bind(this), false); this.stepIntoButton.appendChild(document.createElement("img")); this.sidebarButtonsElement.appendChild(this.stepIntoButton); this.stepOutButton = document.createElement("button"); this.stepOutButton.className = "status-bar-item"; this.stepOutButton.id = "scripts-step-out"; this.stepOutButton.title = WebInspector.UIString("Step out of current function."); this.stepOutButton.disabled = true; this.stepOutButton.addEventListener("click", this._stepOutClicked.bind(this), false); this.stepOutButton.appendChild(document.createElement("img")); this.sidebarButtonsElement.appendChild(this.stepOutButton); this.debuggerStatusElement = document.createElement("div"); this.debuggerStatusElement.id = "scripts-debugger-status"; this.sidebarButtonsElement.appendChild(this.debuggerStatusElement); this.viewsContainerElement = document.createElement("div"); this.viewsContainerElement.id = "script-resource-views"; this.sidebarElement = document.createElement("div"); this.sidebarElement.id = "scripts-sidebar"; this.sidebarResizeElement = document.createElement("div"); this.sidebarResizeElement.className = "sidebar-resizer-vertical"; this.sidebarResizeElement.addEventListener("mousedown", this._startSidebarResizeDrag.bind(this), false); this.sidebarResizeWidgetElement = document.createElement("div"); this.sidebarResizeWidgetElement.id = "scripts-sidebar-resizer-widget"; this.sidebarResizeWidgetElement.addEventListener("mousedown", this._startSidebarResizeDrag.bind(this), false); this.topStatusBar.appendChild(this.sidebarResizeWidgetElement); this.sidebarPanes = {}; this.sidebarPanes.callstack = new WebInspector.CallStackSidebarPane(); this.sidebarPanes.scopechain = new WebInspector.ScopeChainSidebarPane(); this.sidebarPanes.breakpoints = new WebInspector.BreakpointsSidebarPane(); for (var pane in this.sidebarPanes) this.sidebarElement.appendChild(this.sidebarPanes[pane].element); // FIXME: remove the following line of code when the Breakpoints pane has content. this.sidebarElement.removeChild(this.sidebarPanes.breakpoints.element); this.sidebarPanes.callstack.expanded = true; this.sidebarPanes.callstack.addEventListener("call frame selected", this._callFrameSelected, this); this.sidebarPanes.scopechain.expanded = true; var panelEnablerHeading = WebInspector.UIString("You need to enable debugging before you can use the Scripts panel."); var panelEnablerDisclaimer = WebInspector.UIString("Enabling debugging will make scripts run slower."); var panelEnablerButton = WebInspector.UIString("Enable Debugging"); this.panelEnablerView = new WebInspector.PanelEnablerView("scripts", panelEnablerHeading, panelEnablerDisclaimer, panelEnablerButton); this.panelEnablerView.addEventListener("enable clicked", this._enableDebugging, this); this.element.appendChild(this.panelEnablerView.element); this.element.appendChild(this.viewsContainerElement); this.element.appendChild(this.sidebarElement); this.element.appendChild(this.sidebarResizeElement); this.enableToggleButton = document.createElement("button"); this.enableToggleButton.className = "enable-toggle-status-bar-item status-bar-item"; this.enableToggleButton.addEventListener("click", this._toggleDebugging.bind(this), false); this.pauseOnExceptionButton = document.createElement("button"); this.pauseOnExceptionButton.id = "scripts-pause-on-exceptions-status-bar-item"; this.pauseOnExceptionButton.className = "status-bar-item"; this.pauseOnExceptionButton.addEventListener("click", this._togglePauseOnExceptions.bind(this), false); this._breakpointsURLMap = {}; this.reset();}WebInspector.ScriptsPanel.prototype = { toolbarItemClass: "scripts", get toolbarItemLabel() { return WebInspector.UIString("Scripts"); }, get statusBarItems() { return [this.enableToggleButton, this.pauseOnExceptionButton]; }, get paused() { return this._paused; }, show: function() { WebInspector.Panel.prototype.show.call(this); this.sidebarResizeElement.style.right = (this.sidebarElement.offsetWidth - 3) + "px"; if (this.visibleView) { if (this.visibleView instanceof WebInspector.ResourceView) this.visibleView.headersVisible = false; this.visibleView.show(this.viewsContainerElement); } // Hide any views that are visible that are not this panel's current visible view. // This can happen when a ResourceView is visible in the Resources panel then switched // to the this panel. for (var sourceID in this._sourceIDMap) { var scriptOrResource = this._sourceIDMap[sourceID]; var view = this._sourceViewForScriptOrResource(scriptOrResource); if (!view || view === this.visibleView) continue; view.visible = false; } }, get searchableViews() { var views = []; const visibleView = this.visibleView; if (visibleView && visibleView.performSearch) { visibleView.alreadySearching = true; views.push(visibleView); } for (var sourceID in this._sourceIDMap) { var scriptOrResource = this._sourceIDMap[sourceID]; var view = this._sourceViewForScriptOrResource(scriptOrResource); if (!view || !view.performSearch || view.alreadySearching) continue; view.alreadySearching = true; views.push(view); } for (var i = 0; i < views.length; ++i) delete views[i].alreadySearching; return views; }, addScript: function(sourceID, sourceURL, source, startingLine, errorLine, errorMessage) { var script = new WebInspector.Script(sourceID, sourceURL, source, startingLine, errorLine, errorMessage); if (sourceURL in WebInspector.resourceURLMap) { var resource = WebInspector.resourceURLMap[sourceURL]; resource.addScript(script); } if (sourceURL in this._breakpointsURLMap && sourceID) { var breakpoints = this._breakpointsURLMap[sourceURL]; var breakpointsLength = breakpoints.length; for (var i = 0; i < breakpointsLength; ++i) { var breakpoint = breakpoints[i]; if (startingLine <= breakpoint.line) { breakpoint.sourceID = sourceID; if (breakpoint.enabled) InspectorController.addBreakpoint(breakpoint.sourceID, breakpoint.line); } } } if (sourceID) this._sourceIDMap[sourceID] = (resource || script); this._addScriptToFilesMenu(script); }, addBreakpoint: function(breakpoint) { this.sidebarPanes.breakpoints.addBreakpoint(breakpoint); var sourceFrame; if (breakpoint.url) { if (!(breakpoint.url in this._breakpointsURLMap)) this._breakpointsURLMap[breakpoint.url] = []; this._breakpointsURLMap[breakpoint.url].unshift(breakpoint); if (breakpoint.url in WebInspector.resourceURLMap) { var resource = WebInspector.resourceURLMap[breakpoint.url]; sourceFrame = this._sourceFrameForScriptOrResource(resource); } } if (breakpoint.sourceID && !sourceFrame) { var object = this._sourceIDMap[breakpoint.sourceID] sourceFrame = this._sourceFrameForScriptOrResource(object); } if (sourceFrame) sourceFrame.addBreakpoint(breakpoint); }, removeBreakpoint: function(breakpoint) { this.sidebarPanes.breakpoints.removeBreakpoint(breakpoint); var sourceFrame; if (breakpoint.url && breakpoint.url in this._breakpointsURLMap) { var breakpoints = this._breakpointsURLMap[breakpoint.url]; breakpoints.remove(breakpoint); if (!breakpoints.length) delete this._breakpointsURLMap[breakpoint.url]; if (breakpoint.url in WebInspector.resourceURLMap) { var resource = WebInspector.resourceURLMap[breakpoint.url]; sourceFrame = this._sourceFrameForScriptOrResource(resource); } } if (breakpoint.sourceID && !sourceFrame) { var object = this._sourceIDMap[breakpoint.sourceID] sourceFrame = this._sourceFrameForScriptOrResource(object); } if (sourceFrame) sourceFrame.removeBreakpoint(breakpoint); }, evaluateInSelectedCallFrame: function(code, updateInterface) { var selectedCallFrame = this.sidebarPanes.callstack.selectedCallFrame; if (!this._paused || !selectedCallFrame) return; if (typeof updateInterface === "undefined") updateInterface = true; var result = selectedCallFrame.evaluate(code); if (updateInterface) this.sidebarPanes.scopechain.update(selectedCallFrame); return result; }, variablesInScopeForSelectedCallFrame: function() { var selectedCallFrame = this.sidebarPanes.callstack.selectedCallFrame; if (!this._paused || !selectedCallFrame) return {}; var result = {}; var scopeChain = selectedCallFrame.scopeChain; for (var i = 0; i < scopeChain.length; ++i) { var scopeObject = scopeChain[i]; for (var property in scopeObject) result[property] = true; } return result; }, debuggerPaused: function() { this._paused = true; this._waitingToPause = false; this._stepping = false; this._updateDebuggerButtons(); var callStackPane = this.sidebarPanes.callstack; var currentFrame = InspectorController.currentCallFrame(); callStackPane.update(currentFrame, this._sourceIDMap); callStackPane.selectedCallFrame = currentFrame; WebInspector.currentPanel = this; window.focus(); }, debuggerWasEnabled: function() { this.reset(); }, debuggerWasDisabled: function() { this.reset(); }, reset: function() { this.visibleView = null; delete this.currentQuery; this.searchCanceled(); if (!InspectorController.debuggerEnabled()) { this._paused = false; this._waitingToPause = false; this._stepping = false; } this._clearInterface(); this._backForwardList = []; this._currentBackForwardIndex = -1; this._updateBackAndForwardButtons(); this._scriptsForURLsInFilesSelect = {}; this.filesSelectElement.removeChildren(); this.functionsSelectElement.removeChildren(); this.viewsContainerElement.removeChildren(); if (this._sourceIDMap) { for (var sourceID in this._sourceIDMap) { var object = this._sourceIDMap[sourceID]; if (object instanceof WebInspector.Resource) object.removeAllScripts(); } } this._sourceIDMap = {}; }, get visibleView() { return this._visibleView; }, set visibleView(x) { if (this._visibleView === x) return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -