/* * 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. */ importScript("BreakpointsSidebarPane.js"); importScript("CallStackSidebarPane.js"); importScript("FilePathScoreFunction.js"); importScript("FilteredItemSelectionDialog.js"); importScript("UISourceCodeFrame.js"); importScript("JavaScriptSourceFrame.js"); importScript("CSSSourceFrame.js"); importScript("NavigatorOverlayController.js"); importScript("NavigatorView.js"); importScript("RevisionHistoryView.js"); importScript("ScopeChainSidebarPane.js"); importScript("SourcesNavigator.js"); importScript("SourcesSearchScope.js"); importScript("StyleSheetOutlineDialog.js"); importScript("TabbedEditorContainer.js"); importScript("WatchExpressionsSidebarPane.js"); importScript("WorkersSidebarPane.js"); /** * @constructor * @implements {WebInspector.TabbedEditorContainerDelegate} * @implements {WebInspector.ContextMenu.Provider} * @implements {WebInspector.Searchable} * @extends {WebInspector.Panel} * @param {!WebInspector.Workspace=} workspaceForTest */ WebInspector.SourcesPanel = function(workspaceForTest) { WebInspector.Panel.call(this, "sources"); this.registerRequiredCSS("sourcesPanel.css"); this.registerRequiredCSS("textPrompt.css"); // Watch Expressions autocomplete. WebInspector.settings.navigatorWasOnceHidden = WebInspector.settings.createSetting("navigatorWasOnceHidden", false); WebInspector.settings.debuggerSidebarHidden = WebInspector.settings.createSetting("debuggerSidebarHidden", false); WebInspector.settings.showEditorInDrawer = WebInspector.settings.createSetting("showEditorInDrawer", true); this._workspace = workspaceForTest || WebInspector.workspace; /** * @return {!WebInspector.View} * @this {WebInspector.SourcesPanel} */ function viewGetter() { return this.visibleView; } WebInspector.GoToLineDialog.install(this, viewGetter.bind(this)); var helpSection = WebInspector.shortcutsScreen.section(WebInspector.UIString("Sources Panel")); this.debugToolbar = this._createDebugToolbar(); const initialDebugSidebarWidth = 225; const minimumDebugSidebarWidthPercent = 0.5; this.createSidebarView(this.element, WebInspector.SidebarView.SidebarPosition.End, initialDebugSidebarWidth); this.splitView.element.id = "scripts-split-view"; this.splitView.setSidebarElementConstraints(Preferences.minScriptsSidebarWidth); this.splitView.setMainElementConstraints(minimumDebugSidebarWidthPercent); // Create scripts navigator const initialNavigatorWidth = 225; const minimumViewsContainerWidthPercent = 0.5; this.editorView = new WebInspector.SidebarView(WebInspector.SidebarView.SidebarPosition.Start, "scriptsPanelNavigatorSidebarWidth", initialNavigatorWidth); this.editorView.element.id = "scripts-editor-split-view"; this.editorView.element.tabIndex = 0; this.editorView.setSidebarElementConstraints(Preferences.minScriptsSidebarWidth); this.editorView.setMainElementConstraints(minimumViewsContainerWidthPercent); this.editorView.show(this.splitView.mainElement); this._navigator = new WebInspector.SourcesNavigator(); this._navigator.view.show(this.editorView.sidebarElement); var tabbedEditorPlaceholderText = WebInspector.isMac() ? WebInspector.UIString("Hit Cmd+O to open a file") : WebInspector.UIString("Hit Ctrl+O to open a file"); this.editorView.mainElement.classList.add("vbox"); this.editorView.sidebarElement.classList.add("vbox"); this.sourcesView = new WebInspector.SourcesView(); this._searchableView = new WebInspector.SearchableView(this); this._searchableView.setMinimalSearchQuerySize(0); this._searchableView.show(this.sourcesView.element); this._editorContainer = new WebInspector.TabbedEditorContainer(this, "previouslyViewedFiles", tabbedEditorPlaceholderText); this._editorContainer.show(this._searchableView.element); this._navigatorController = new WebInspector.NavigatorOverlayController(this.editorView, this._navigator.view, this._editorContainer.view); this._navigator.addEventListener(WebInspector.SourcesNavigator.Events.SourceSelected, this._sourceSelected, this); this._navigator.addEventListener(WebInspector.SourcesNavigator.Events.ItemSearchStarted, this._itemSearchStarted, this); this._navigator.addEventListener(WebInspector.SourcesNavigator.Events.ItemCreationRequested, this._itemCreationRequested, this); this._navigator.addEventListener(WebInspector.SourcesNavigator.Events.ItemRenamingRequested, this._itemRenamingRequested, this); this._editorContainer.addEventListener(WebInspector.TabbedEditorContainer.Events.EditorSelected, this._editorSelected, this); this._editorContainer.addEventListener(WebInspector.TabbedEditorContainer.Events.EditorClosed, this._editorClosed, this); this._debugSidebarResizeWidgetElement = document.createElementWithClass("div", "resizer-widget"); this._debugSidebarResizeWidgetElement.id = "scripts-debug-sidebar-resizer-widget"; this.splitView.installResizer(this._debugSidebarResizeWidgetElement); this.sidebarPanes = {}; 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.CallFrameRestarted, this._callFrameRestartedInSidebar.bind(this)); this.sidebarPanes.scopechain = new WebInspector.ScopeChainSidebarPane(); this.sidebarPanes.jsBreakpoints = new WebInspector.JavaScriptBreakpointsSidebarPane(WebInspector.breakpointManager, this._showSourceLocation.bind(this)); this.sidebarPanes.domBreakpoints = WebInspector.domBreakpointsSidebarPane.createProxy(this); this.sidebarPanes.xhrBreakpoints = new WebInspector.XHRBreakpointsSidebarPane(); this.sidebarPanes.eventListenerBreakpoints = new WebInspector.EventListenerBreakpointsSidebarPane(); if (Capabilities.canInspectWorkers && !WebInspector.WorkerManager.isWorkerFrontend()) { WorkerAgent.enable(); this.sidebarPanes.workerList = new WebInspector.WorkersSidebarPane(WebInspector.workerManager); } this.sidebarPanes.callstack.registerShortcuts(this.registerShortcuts.bind(this)); this.registerShortcuts(WebInspector.SourcesPanelDescriptor.ShortcutKeys.GoToMember, this._showOutlineDialog.bind(this)); this.registerShortcuts(WebInspector.SourcesPanelDescriptor.ShortcutKeys.ToggleBreakpoint, this._toggleBreakpoint.bind(this)); this._extensionSidebarPanes = []; this._toggleFormatSourceButton = new WebInspector.StatusBarButton(WebInspector.UIString("Pretty print"), "sources-toggle-pretty-print-status-bar-item"); this._toggleFormatSourceButton.toggled = false; this._toggleFormatSourceButton.addEventListener("click", this._toggleFormatSource, this); this._scriptViewStatusBarItemsContainer = document.createElement("div"); this._scriptViewStatusBarItemsContainer.className = "inline-block"; this._scriptViewStatusBarTextContainer = document.createElement("div"); this._scriptViewStatusBarTextContainer.className = "inline-block"; this._statusBarContainerElement = this.sourcesView.element.createChild("div", "sources-status-bar"); this._statusBarContainerElement.appendChild(this._toggleFormatSourceButton.element); this._statusBarContainerElement.appendChild(this._scriptViewStatusBarItemsContainer); this._statusBarContainerElement.appendChild(this._scriptViewStatusBarTextContainer); this._installDebuggerSidebarController(); WebInspector.dockController.addEventListener(WebInspector.DockController.Events.DockSideChanged, this._dockSideChanged.bind(this)); WebInspector.settings.splitVerticallyWhenDockedToRight.addChangeListener(this._dockSideChanged.bind(this)); this._dockSideChanged(); /** @type {!Map.} */ this._sourceFramesByUISourceCode = new Map(); this._updateDebuggerButtons(); this._pauseOnExceptionStateChanged(); if (WebInspector.debuggerModel.isPaused()) this._showDebuggerPausedDetails(); WebInspector.settings.pauseOnExceptionStateString.addChangeListener(this._pauseOnExceptionStateChanged, this); WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerWasEnabled, this._debuggerWasEnabled, this); WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerWasDisabled, this._debuggerWasDisabled, this); WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerPaused, this._debuggerPaused, this); WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerResumed, this._debuggerResumed, this); WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.CallFrameSelected, this._callFrameSelected, this); WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.ConsoleCommandEvaluatedInSelectedCallFrame, this._consoleCommandEvaluatedInSelectedCallFrame, this); WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointsActiveStateChanged, this._breakpointsActiveStateChanged, this); WebInspector.startBatchUpdate(); this._workspace.uiSourceCodes().forEach(this._addUISourceCode.bind(this)); WebInspector.endBatchUpdate(); this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAdded, this); this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved, this._uiSourceCodeRemoved, this); this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectWillReset, this._projectWillReset.bind(this), this); WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared, this._debuggerReset, this); WebInspector.advancedSearchController.registerSearchScope(new WebInspector.SourcesSearchScope(this._workspace)); this._boundOnKeyUp = this._onKeyUp.bind(this); this._boundOnKeyDown = this._onKeyDown.bind(this); function handleBeforeUnload(event) { if (event.returnValue) return; var unsavedSourceCodes = WebInspector.workspace.unsavedSourceCodes(); if (!unsavedSourceCodes.length) return; event.returnValue = WebInspector.UIString("DevTools have unsaved changes that will be permanently lost."); WebInspector.showPanel("sources"); for (var i = 0; i < unsavedSourceCodes.length; ++i) WebInspector.panels.sources.showUISourceCode(unsavedSourceCodes[i]); } window.addEventListener("beforeunload", handleBeforeUnload.bind(this), true); } WebInspector.SourcesPanel.prototype = { defaultFocusedElement: function() { return this._editorContainer.view.defaultFocusedElement() || this._navigator.view.defaultFocusedElement(); }, get paused() { return this._paused; }, wasShown: function() { WebInspector.inspectorView.closeViewInDrawer("editor"); this.sourcesView.show(this.editorView.mainElement); WebInspector.Panel.prototype.wasShown.call(this); this._navigatorController.wasShown(); this.element.addEventListener("keydown", this._boundOnKeyDown, false); this.element.addEventListener("keyup", this._boundOnKeyUp, false); }, willHide: function() { this.element.removeEventListener("keydown", this._boundOnKeyDown, false); this.element.removeEventListener("keyup", this._boundOnKeyUp, false); WebInspector.Panel.prototype.willHide.call(this); }, /** * @return {!WebInspector.SearchableView} */ searchableView: function() { return this._searchableView; }, /** * @param {!WebInspector.Event} event */ _uiSourceCodeAdded: function(event) { var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data); this._addUISourceCode(uiSourceCode); }, /** * @param {!WebInspector.UISourceCode} uiSourceCode */ _addUISourceCode: function(uiSourceCode) { if (this._toggleFormatSourceButton.toggled) uiSourceCode.setFormatted(true); if (uiSourceCode.project().isServiceProject()) return; this._navigator.addUISourceCode(uiSourceCode); this._editorContainer.addUISourceCode(uiSourceCode); // Replace debugger script-based uiSourceCode with a network-based one. var currentUISourceCode = this._currentUISourceCode; if (currentUISourceCode && currentUISourceCode.project().isServiceProject() && currentUISourceCode !== uiSourceCode && currentUISourceCode.url === uiSourceCode.url) { this._showFile(uiSourceCode); this._editorContainer.removeUISourceCode(currentUISourceCode); } }, _uiSourceCodeRemoved: function(event) { var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data); this._removeUISourceCodes([uiSourceCode]); }, /** * @param {!Array.} uiSourceCodes */ _removeUISourceCodes: function(uiSourceCodes) { for (var i = 0; i < uiSourceCodes.length; ++i) { this._navigator.removeUISourceCode(uiSourceCodes[i]); this._removeSourceFrame(uiSourceCodes[i]); } this._editorContainer.removeUISourceCodes(uiSourceCodes); }, _consoleCommandEvaluatedInSelectedCallFrame: function(event) { this.sidebarPanes.scopechain.update(WebInspector.debuggerModel.selectedCallFrame()); }, _debuggerPaused: function() { WebInspector.inspectorView.setCurrentPanel(this); this._showDebuggerPausedDetails(); }, _showDebuggerPausedDetails: function() { var details = WebInspector.debuggerModel.debuggerPausedDetails(); this._paused = true; this._waitingToPause = false; this._stepping = false; this._updateDebuggerButtons(); this.sidebarPanes.callstack.update(details.callFrames, details.asyncStackTrace); /** * @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.findBreakpoint(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.auxData, didCreateBreakpointHitStatusMessage.bind(this)); } else if (details.reason === WebInspector.DebuggerModel.BreakReason.EventListener) { var eventName = details.auxData.eventName; this.sidebarPanes.eventListenerBreakpoints.highlightBreakpoint(details.auxData.eventName); 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) this.sidebarPanes.callstack.setStatus(WebInspector.UIString("Paused on exception: '%s'.", details.auxData.description)); 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.callFrames.length) details.callFrames[0].createLiveLocation(didGetUILocation.bind(this)); else console.warn("ScriptsPanel paused, but callFrames.length is zero."); // TODO remove this once we understand this case better } this._enableDebuggerSidebar(true); this._toggleDebuggerSidebarButton.setEnabled(false); window.focus(); InspectorFrontendHost.bringToFront(); }, _debuggerResumed: function() { this._paused = false; this._waitingToPause = false; this._stepping = false; this._clearInterface(); this._toggleDebuggerSidebarButton.setEnabled(true); }, _debuggerWasEnabled: function() { this._updateDebuggerButtons(); }, _debuggerWasDisabled: function() { this._debuggerReset(); }, _debuggerReset: function() { this._debuggerResumed(); this.sidebarPanes.watchExpressions.reset(); delete this._skipExecutionLineRevealing; }, _projectWillReset: function(event) { var project = event.data; var uiSourceCodes = project.uiSourceCodes(); this._removeUISourceCodes(uiSourceCodes); if (project.type() === WebInspector.projectTypes.Network) this._editorContainer.reset(); }, get visibleView() { return this._editorContainer.visibleView; }, _updateScriptViewStatusBarItems: function() { this._scriptViewStatusBarItemsContainer.removeChildren(); this._scriptViewStatusBarTextContainer.removeChildren(); var sourceFrame = this.visibleView; if (sourceFrame) { var statusBarItems = sourceFrame.statusBarItems() || []; for (var i = 0; i < statusBarItems.length; ++i) this._scriptViewStatusBarItemsContainer.appendChild(statusBarItems[i]); var statusBarText = sourceFrame.statusBarText(); if (statusBarText) this._scriptViewStatusBarTextContainer.appendChild(statusBarText); } }, /** * @param {!Element} anchor * @return {boolean} */ showAnchorLocation: function(anchor) { if (!anchor.uiSourceCode) { var uiSourceCode = WebInspector.workspace.uiSourceCodeForURL(anchor.href); if (uiSourceCode) anchor.uiSourceCode = uiSourceCode; } if (!anchor.uiSourceCode) return false; this._showSourceLocation(anchor.uiSourceCode, anchor.lineNumber, anchor.columnNumber); return true; }, /** * @param {!WebInspector.UISourceCode} uiSourceCode * @param {number=} lineNumber * @param {number=} columnNumber * @param {boolean=} forceShowInPanel */ showUISourceCode: function(uiSourceCode, lineNumber, columnNumber, forceShowInPanel) { this._showSourceLocation(uiSourceCode, lineNumber, columnNumber, forceShowInPanel); }, /** * @param {boolean=} forceShowInPanel */ _showEditor: function(forceShowInPanel) { if (this.sourcesView.isShowing()) return; if (this._canShowEditorInDrawer() && !forceShowInPanel) { var drawerEditorView = new WebInspector.DrawerEditorView(); this.sourcesView.show(drawerEditorView.element); WebInspector.inspectorView.showCloseableViewInDrawer("editor", WebInspector.UIString("Editor"), drawerEditorView); } else { WebInspector.showPanel("sources"); } }, /** * @return {?WebInspector.UISourceCode} */ currentUISourceCode: function() { return this._currentUISourceCode; }, /** * @param {!WebInspector.UILocation} uiLocation * @param {boolean=} forceShowInPanel */ showUILocation: function(uiLocation, forceShowInPanel) { this._showSourceLocation(uiLocation.uiSourceCode, uiLocation.lineNumber, uiLocation.columnNumber, forceShowInPanel); }, /** * @return {boolean} */ _canShowEditorInDrawer: function() { return WebInspector.experimentsSettings.showEditorInDrawer.isEnabled() && WebInspector.settings.showEditorInDrawer.get(); }, /** * @param {!WebInspector.UISourceCode} uiSourceCode * @param {number=} lineNumber * @param {number=} columnNumber * @param {boolean=} forceShowInPanel */ _showSourceLocation: function(uiSourceCode, lineNumber, columnNumber, forceShowInPanel) { this._showEditor(forceShowInPanel); var sourceFrame = this._showFile(uiSourceCode); if (typeof lineNumber === "number") sourceFrame.highlightPosition(lineNumber, columnNumber); sourceFrame.focus(); WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction, { action: WebInspector.UserMetrics.UserActionNames.OpenSourceLink, url: uiSourceCode.originURL(), lineNumber: lineNumber }); }, /** * @param {!WebInspector.UISourceCode} uiSourceCode * @return {!WebInspector.SourceFrame} */ _showFile: function(uiSourceCode) { var sourceFrame = this._getOrCreateSourceFrame(uiSourceCode); if (this._currentUISourceCode === uiSourceCode) return sourceFrame; this._currentUISourceCode = uiSourceCode; if (!uiSourceCode.project().isServiceProject()) this._navigator.revealUISourceCode(uiSourceCode, true); this._editorContainer.showFile(uiSourceCode); this._updateScriptViewStatusBarItems(); if (this._currentUISourceCode.project().type() === WebInspector.projectTypes.Snippets) this._runSnippetButton.element.classList.remove("hidden"); else this._runSnippetButton.element.classList.add("hidden"); return sourceFrame; }, /** * @param {!WebInspector.UISourceCode} uiSourceCode * @return {!WebInspector.SourceFrame} */ _createSourceFrame: function(uiSourceCode) { var sourceFrame; switch (uiSourceCode.contentType()) { case WebInspector.resourceTypes.Script: sourceFrame = new WebInspector.JavaScriptSourceFrame(this, uiSourceCode); break; case WebInspector.resourceTypes.Document: sourceFrame = new WebInspector.JavaScriptSourceFrame(this, uiSourceCode); break; case WebInspector.resourceTypes.Stylesheet: sourceFrame = new WebInspector.CSSSourceFrame(uiSourceCode); break; default: sourceFrame = new WebInspector.UISourceCodeFrame(uiSourceCode); break; } sourceFrame.setHighlighterType(uiSourceCode.highlighterType()); this._sourceFramesByUISourceCode.put(uiSourceCode, sourceFrame); return sourceFrame; }, /** * @param {!WebInspector.UISourceCode} uiSourceCode * @return {!WebInspector.SourceFrame} */ _getOrCreateSourceFrame: function(uiSourceCode) { return this._sourceFramesByUISourceCode.get(uiSourceCode) || this._createSourceFrame(uiSourceCode); }, /** * @param {!WebInspector.SourceFrame} sourceFrame * @param {!WebInspector.UISourceCode} uiSourceCode * @return {boolean} */ _sourceFrameMatchesUISourceCode: function(sourceFrame, uiSourceCode) { switch (uiSourceCode.contentType()) { case WebInspector.resourceTypes.Script: case WebInspector.resourceTypes.Document: return sourceFrame instanceof WebInspector.JavaScriptSourceFrame; case WebInspector.resourceTypes.Stylesheet: return sourceFrame instanceof WebInspector.CSSSourceFrame; default: return !(sourceFrame instanceof WebInspector.JavaScriptSourceFrame); } }, /** * @param {!WebInspector.UISourceCode} uiSourceCode */ _recreateSourceFrameIfNeeded: function(uiSourceCode) { var oldSourceFrame = this._sourceFramesByUISourceCode.get(uiSourceCode); if (!oldSourceFrame) return; if (this._sourceFrameMatchesUISourceCode(oldSourceFrame, uiSourceCode)) { oldSourceFrame.setHighlighterType(uiSourceCode.highlighterType()); } else { this._editorContainer.removeUISourceCode(uiSourceCode); this._removeSourceFrame(uiSourceCode); } }, /** * @param {!WebInspector.UISourceCode} uiSourceCode * @return {!WebInspector.SourceFrame} */ viewForFile: function(uiSourceCode) { return this._getOrCreateSourceFrame(uiSourceCode); }, /** * @param {!WebInspector.UISourceCode} uiSourceCode */ _removeSourceFrame: function(uiSourceCode) { var sourceFrame = this._sourceFramesByUISourceCode.get(uiSourceCode); if (!sourceFrame) return; this._sourceFramesByUISourceCode.remove(uiSourceCode); sourceFrame.dispose(); }, _clearCurrentExecutionLine: function() { if (this._executionSourceFrame) this._executionSourceFrame.clearExecutionLine(); delete this._executionSourceFrame; }, _setExecutionLine: function(uiLocation) { var callFrame = WebInspector.debuggerModel.selectedCallFrame() var sourceFrame = this._getOrCreateSourceFrame(uiLocation.uiSourceCode); sourceFrame.setExecutionLine(uiLocation.lineNumber, callFrame); this._executionSourceFrame = sourceFrame; }, _executionLineChanged: function(uiLocation) { this._clearCurrentExecutionLine(); this._setExecutionLine(uiLocation); var uiSourceCode = uiLocation.uiSourceCode; var scriptFile = this._currentUISourceCode ? this._currentUISourceCode.scriptFile() : null; if (this._skipExecutionLineRevealing) return; this._skipExecutionLineRevealing = true; var sourceFrame = this._showFile(uiSourceCode); sourceFrame.revealLine(uiLocation.lineNumber); if (sourceFrame.canEditSource()) sourceFrame.setSelection(WebInspector.TextRange.createFromLocation(uiLocation.lineNumber, 0)); sourceFrame.focus(); }, _callFrameSelected: function(event) { var callFrame = event.data; if (!callFrame) return; this.sidebarPanes.scopechain.update(callFrame); this.sidebarPanes.watchExpressions.refreshExpressions(); this.sidebarPanes.callstack.setSelectedCallFrame(callFrame); callFrame.createLiveLocation(this._executionLineChanged.bind(this)); }, _editorClosed: function(event) { this._navigatorController.hideNavigatorOverlay(); var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data); if (this._currentUISourceCode === uiSourceCode) delete this._currentUISourceCode; // SourcesNavigator does not need to update on EditorClosed. this._updateScriptViewStatusBarItems(); this._searchableView.resetSearch(); }, _editorSelected: function(event) { var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data); var sourceFrame = this._showFile(uiSourceCode); this._navigatorController.hideNavigatorOverlay(); if (!this._navigatorController.isNavigatorPinned()) sourceFrame.focus(); this._searchableView.setCanReplace(!!sourceFrame && sourceFrame.canEditSource()); this._searchableView.resetSearch(); }, _sourceSelected: function(event) { var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data.uiSourceCode); var sourceFrame = this._showFile(uiSourceCode); this._navigatorController.hideNavigatorOverlay(); if (sourceFrame && (!this._navigatorController.isNavigatorPinned() || event.data.focusSource)) sourceFrame.focus(); }, _itemSearchStarted: function(event) { var searchText = /** @type {string} */ (event.data); WebInspector.OpenResourceDialog.show(this, this.editorView.mainElement, searchText); }, _pauseOnExceptionStateChanged: function() { var pauseOnExceptionsState = WebInspector.settings.pauseOnExceptionStateString.get(); switch (pauseOnExceptionsState) { case WebInspector.DebuggerModel.PauseOnExceptionsState.DontPauseOnExceptions: this._pauseOnExceptionButton.title = WebInspector.UIString("Don't pause on exceptions.\nClick to Pause on all exceptions."); break; case WebInspector.DebuggerModel.PauseOnExceptionsState.PauseOnAllExceptions: this._pauseOnExceptionButton.title = WebInspector.UIString("Pause on all exceptions.\nClick to Pause on uncaught exceptions."); break; case WebInspector.DebuggerModel.PauseOnExceptionsState.PauseOnUncaughtExceptions: this._pauseOnExceptionButton.title = WebInspector.UIString("Pause on uncaught exceptions.\nClick to Not pause on exceptions."); break; } this._pauseOnExceptionButton.state = pauseOnExceptionsState; }, _updateDebuggerButtons: function() { if (this._paused) { this._updateButtonTitle(this._pauseButton, WebInspector.UIString("Resume script execution (%s).")) this._pauseButton.state = 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._updateButtonTitle(this._pauseButton, WebInspector.UIString("Pause script execution (%s).")) this._pauseButton.state = false; this._pauseButton.setLongClickOptionsEnabled(null); this._pauseButton.setEnabled(!this._waitingToPause); this._stepOverButton.setEnabled(false); this._stepIntoButton.setEnabled(false); this._stepOutButton.setEnabled(false); } }, _clearInterface: function() { this.sidebarPanes.callstack.update(null, null); this.sidebarPanes.scopechain.update(null); this.sidebarPanes.jsBreakpoints.clearBreakpointHighlight(); WebInspector.domBreakpointsSidebarPane.clearBreakpointHighlight(); this.sidebarPanes.eventListenerBreakpoints.clearBreakpointHighlight(); this.sidebarPanes.xhrBreakpoints.clearBreakpointHighlight(); this._clearCurrentExecutionLine(); this._updateDebuggerButtons(); }, _togglePauseOnExceptions: function() { var nextStateMap = {}; var stateEnum = WebInspector.DebuggerModel.PauseOnExceptionsState; nextStateMap[stateEnum.DontPauseOnExceptions] = stateEnum.PauseOnAllExceptions; nextStateMap[stateEnum.PauseOnAllExceptions] = stateEnum.PauseOnUncaughtExceptions; nextStateMap[stateEnum.PauseOnUncaughtExceptions] = stateEnum.DontPauseOnExceptions; WebInspector.settings.pauseOnExceptionStateString.set(nextStateMap[this._pauseOnExceptionButton.state]); }, /** * @return {boolean} */ _runSnippet: function() { if (this._currentUISourceCode.project().type() !== WebInspector.projectTypes.Snippets) return false; WebInspector.scriptSnippetModel.evaluateScriptSnippet(this._currentUISourceCode); return true; }, /** * @return {boolean} */ _togglePause: function() { if (this._paused) { delete this._skipExecutionLineRevealing; this._paused = false; this._waitingToPause = false; WebInspector.debuggerModel.resume(); } else { this._stepping = false; this._waitingToPause = true; // Make sure pauses didn't stick skipped. WebInspector.debuggerModel.skipAllPauses(false); DebuggerAgent.pause(); } this._clearInterface(); return true; }, /** * @return {boolean} */ _longResume: function() { if (!this._paused) return true; this._paused = false; this._waitingToPause = false; WebInspector.debuggerModel.skipAllPausesUntilReloadOrTimeout(500); WebInspector.debuggerModel.resume(); this._clearInterface(); return true; }, /** * @return {boolean} */ _stepOverClicked: function() { if (!this._paused) return true; delete this._skipExecutionLineRevealing; this._paused = false; this._stepping = true; this._clearInterface(); WebInspector.debuggerModel.stepOver(); return true; }, /** * @return {boolean} */ _stepIntoClicked: function() { if (!this._paused) return true; delete this._skipExecutionLineRevealing; this._paused = false; this._stepping = true; this._clearInterface(); WebInspector.debuggerModel.stepInto(); return true; }, /** * @param {?Event=} event * @return {boolean} */ _stepIntoSelectionClicked: function(event) { if (!this._paused) return true; if (this._executionSourceFrame) { var stepIntoMarkup = this._executionSourceFrame.stepIntoMarkup(); if (stepIntoMarkup) stepIntoMarkup.iterateSelection(event.shiftKey); } return true; }, doStepIntoSelection: function(rawLocation) { if (!this._paused) return; delete this._skipExecutionLineRevealing; this._paused = false; this._stepping = true; this._clearInterface(); WebInspector.debuggerModel.stepIntoSelection(rawLocation); }, /** * @return {boolean} */ _stepOutClicked: function() { if (!this._paused) return true; delete this._skipExecutionLineRevealing; this._paused = false; this._stepping = true; this._clearInterface(); WebInspector.debuggerModel.stepOut(); return true; }, /** * @param {!WebInspector.Event} event */ _callFrameSelectedInSidebar: function(event) { var callFrame = /** @type {!WebInspector.DebuggerModel.CallFrame} */ (event.data); delete this._skipExecutionLineRevealing; WebInspector.debuggerModel.setSelectedCallFrame(callFrame); }, _callFrameRestartedInSidebar: function() { delete this._skipExecutionLineRevealing; }, continueToLocation: function(rawLocation) { if (!this._paused) return; delete this._skipExecutionLineRevealing; this._paused = false; this._stepping = true; this._clearInterface(); WebInspector.debuggerModel.continueToLocation(rawLocation); }, _toggleBreakpointsClicked: function(event) { WebInspector.debuggerModel.setBreakpointsActive(!WebInspector.debuggerModel.breakpointsActive()); }, _breakpointsActiveStateChanged: function(event) { var active = event.data; this._toggleBreakpointsButton.toggled = !active; if (active) { this._toggleBreakpointsButton.title = WebInspector.UIString("Deactivate breakpoints."); this._editorContainer.view.element.classList.remove("breakpoints-deactivated"); this.sidebarPanes.jsBreakpoints.listElement.classList.remove("breakpoints-list-deactivated"); } else { this._toggleBreakpointsButton.title = WebInspector.UIString("Activate breakpoints."); this._editorContainer.view.element.classList.add("breakpoints-deactivated"); this.sidebarPanes.jsBreakpoints.listElement.classList.add("breakpoints-list-deactivated"); } }, _createDebugToolbar: function() { var debugToolbar = document.createElement("div"); debugToolbar.className = "status-bar"; debugToolbar.id = "scripts-debug-toolbar"; var title, handler; var platformSpecificModifier = WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta; // Run snippet. title = WebInspector.UIString("Run snippet (%s)."); handler = this._runSnippet.bind(this); this._runSnippetButton = this._createButtonAndRegisterShortcuts("scripts-run-snippet", title, handler, WebInspector.SourcesPanelDescriptor.ShortcutKeys.RunSnippet); debugToolbar.appendChild(this._runSnippetButton.element); this._runSnippetButton.element.classList.add("hidden"); // Continue. handler = this._togglePause.bind(this); this._pauseButton = this._createButtonAndRegisterShortcuts("scripts-pause", "", handler, WebInspector.SourcesPanelDescriptor.ShortcutKeys.PauseContinue); debugToolbar.appendChild(this._pauseButton.element); // 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); // Step over. title = WebInspector.UIString("Step over next function call (%s)."); handler = this._stepOverClicked.bind(this); this._stepOverButton = this._createButtonAndRegisterShortcuts("scripts-step-over", title, handler, WebInspector.SourcesPanelDescriptor.ShortcutKeys.StepOver); debugToolbar.appendChild(this._stepOverButton.element); // Step into. title = WebInspector.UIString("Step into next function call (%s)."); handler = this._stepIntoClicked.bind(this); this._stepIntoButton = this._createButtonAndRegisterShortcuts("scripts-step-into", title, handler, WebInspector.SourcesPanelDescriptor.ShortcutKeys.StepInto); debugToolbar.appendChild(this._stepIntoButton.element); // Step into selection (keyboard shortcut only). this.registerShortcuts(WebInspector.SourcesPanelDescriptor.ShortcutKeys.StepIntoSelection, this._stepIntoSelectionClicked.bind(this)) // Step out. title = WebInspector.UIString("Step out of current function (%s)."); handler = this._stepOutClicked.bind(this); this._stepOutButton = this._createButtonAndRegisterShortcuts("scripts-step-out", title, handler, WebInspector.SourcesPanelDescriptor.ShortcutKeys.StepOut); debugToolbar.appendChild(this._stepOutButton.element); // Toggle Breakpoints this._toggleBreakpointsButton = new WebInspector.StatusBarButton(WebInspector.UIString("Deactivate breakpoints."), "scripts-toggle-breakpoints"); this._toggleBreakpointsButton.toggled = false; this._toggleBreakpointsButton.addEventListener("click", this._toggleBreakpointsClicked, this); debugToolbar.appendChild(this._toggleBreakpointsButton.element); // Pause on Exception this._pauseOnExceptionButton = new WebInspector.StatusBarButton("", "scripts-pause-on-exceptions-status-bar-item", 3); this._pauseOnExceptionButton.addEventListener("click", this._togglePauseOnExceptions, this); debugToolbar.appendChild(this._pauseOnExceptionButton.element); return debugToolbar; }, /** * @param {!WebInspector.StatusBarButton} button * @param {string} buttonTitle */ _updateButtonTitle: function(button, buttonTitle) { var hasShortcuts = button.shortcuts && button.shortcuts.length; if (hasShortcuts) button.title = String.vsprintf(buttonTitle, [button.shortcuts[0].name]); else button.title = buttonTitle; }, /** * @param {string} buttonId * @param {string} buttonTitle * @param {function(?Event=):boolean} handler * @param {!Array.} shortcuts * @return {!WebInspector.StatusBarButton} */ _createButtonAndRegisterShortcuts: function(buttonId, buttonTitle, handler, shortcuts) { var button = new WebInspector.StatusBarButton(buttonTitle, buttonId); button.element.addEventListener("click", handler, false); button.shortcuts = shortcuts; this._updateButtonTitle(button, buttonTitle); this.registerShortcuts(shortcuts, handler); return button; }, searchCanceled: function() { if (this._searchView) this._searchView.searchCanceled(); delete this._searchView; delete this._searchQuery; }, /** * @param {string} query * @param {boolean} shouldJump */ performSearch: function(query, shouldJump) { this._searchableView.updateSearchMatchesCount(0); if (!this.visibleView) return; this._searchView = this.visibleView; this._searchQuery = query; /** * @param {!WebInspector.View} view * @param {number} searchMatches * @this {WebInspector.SourcesPanel} */ function finishedCallback(view, searchMatches) { if (!searchMatches) return; this._searchableView.updateSearchMatchesCount(searchMatches); } /** * @param {number} currentMatchIndex * @this {WebInspector.SourcesPanel} */ function currentMatchChanged(currentMatchIndex) { this._searchableView.updateCurrentMatchIndex(currentMatchIndex); } /** * @this {WebInspector.SourcesPanel} */ function searchResultsChanged() { this._searchableView.cancelSearch(); } this._searchView.performSearch(query, shouldJump, finishedCallback.bind(this), currentMatchChanged.bind(this), searchResultsChanged.bind(this)); }, jumpToNextSearchResult: function() { if (!this._searchView) return; if (this._searchView !== this.visibleView) { this.performSearch(this._searchQuery, true); return; } this._searchView.jumpToNextSearchResult(); return true; }, jumpToPreviousSearchResult: function() { if (!this._searchView) return; if (this._searchView !== this.visibleView) { this.performSearch(this._searchQuery, true); if (this._searchView) this._searchView.jumpToLastSearchResult(); return; } this._searchView.jumpToPreviousSearchResult(); }, /** * @param {string} text */ replaceSelectionWith: function(text) { var view = /** @type {!WebInspector.SourceFrame} */ (this.visibleView); view.replaceSearchMatchWith(text); }, /** * @param {string} query * @param {string} text */ replaceAllWith: function(query, text) { var view = /** @type {!WebInspector.SourceFrame} */ (this.visibleView); view.replaceAllWith(query, text); }, _onKeyDown: function(event) { if (event.keyCode !== WebInspector.KeyboardShortcut.Keys.CtrlOrMeta.code) return; if (!this._paused || !this._executionSourceFrame) return; var stepIntoMarkup = this._executionSourceFrame.stepIntoMarkup(); if (stepIntoMarkup) stepIntoMarkup.startIteratingSelection(); }, _onKeyUp: function(event) { if (event.keyCode !== WebInspector.KeyboardShortcut.Keys.CtrlOrMeta.code) return; if (!this._paused || !this._executionSourceFrame) return; var stepIntoMarkup = this._executionSourceFrame.stepIntoMarkup(); if (!stepIntoMarkup) return; var currentPosition = stepIntoMarkup.getSelectedItemIndex(); if (typeof currentPosition === "undefined") { stepIntoMarkup.stopIteratingSelection(); } else { var rawLocation = stepIntoMarkup.getRawPosition(currentPosition); this.doStepIntoSelection(rawLocation); } }, _toggleFormatSource: function() { delete this._skipExecutionLineRevealing; this._toggleFormatSourceButton.toggled = !this._toggleFormatSourceButton.toggled; var uiSourceCodes = this._workspace.uiSourceCodes(); for (var i = 0; i < uiSourceCodes.length; ++i) uiSourceCodes[i].setFormatted(this._toggleFormatSourceButton.toggled); var currentFile = this._editorContainer.currentFile(); WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction, { action: WebInspector.UserMetrics.UserActionNames.TogglePrettyPrint, enabled: this._toggleFormatSourceButton.toggled, url: currentFile ? currentFile.originURL() : null }); }, addToWatch: function(expression) { this.sidebarPanes.watchExpressions.addExpression(expression); }, /** * @return {boolean} */ _toggleBreakpoint: function() { var sourceFrame = this.visibleView; if (!sourceFrame) return false; if (sourceFrame instanceof WebInspector.JavaScriptSourceFrame) { var javaScriptSourceFrame = /** @type {!WebInspector.JavaScriptSourceFrame} */ (sourceFrame); javaScriptSourceFrame.toggleBreakpointOnCurrentLine(); return true; } return false; }, /** * @param {?Event=} event * @return {boolean} */ _showOutlineDialog: function(event) { var uiSourceCode = this._editorContainer.currentFile(); if (!uiSourceCode) return false; switch (uiSourceCode.contentType()) { case WebInspector.resourceTypes.Document: case WebInspector.resourceTypes.Script: WebInspector.JavaScriptOutlineDialog.show(this.visibleView, uiSourceCode, this.highlightPosition.bind(this)); return true; case WebInspector.resourceTypes.Stylesheet: WebInspector.StyleSheetOutlineDialog.show(this.visibleView, uiSourceCode, this.highlightPosition.bind(this)); return true; } return false; }, _installDebuggerSidebarController: function() { this._toggleDebuggerSidebarButton = new WebInspector.StatusBarButton("", "right-sidebar-show-hide-button scripts-debugger-show-hide-button", 3); this._toggleDebuggerSidebarButton.addEventListener("click", clickHandler, this); if (this.splitView.isVertical()) { this.editorView.element.appendChild(this._toggleDebuggerSidebarButton.element); this.splitView.mainElement.appendChild(this._debugSidebarResizeWidgetElement); } else { this._statusBarContainerElement.appendChild(this._debugSidebarResizeWidgetElement); this._statusBarContainerElement.appendChild(this._toggleDebuggerSidebarButton.element); } this._enableDebuggerSidebar(!WebInspector.settings.debuggerSidebarHidden.get()); /** * @this {WebInspector.SourcesPanel} */ function clickHandler() { this._enableDebuggerSidebar(this._toggleDebuggerSidebarButton.state === "left"); } }, /** * @param {boolean} show */ _enableDebuggerSidebar: function(show) { this._toggleDebuggerSidebarButton.state = show ? "right" : "left"; this._toggleDebuggerSidebarButton.title = show ? WebInspector.UIString("Hide debugger") : WebInspector.UIString("Show debugger"); if (show) this.splitView.showSidebarElement(); else this.splitView.hideSidebarElement(); this._debugSidebarResizeWidgetElement.enableStyleClass("hidden", !show); WebInspector.settings.debuggerSidebarHidden.set(!show); }, /** * @param {!WebInspector.Event} event */ _itemCreationRequested: function(event) { var project = event.data.project; var path = event.data.path; var uiSourceCodeToCopy = event.data.uiSourceCode; var filePath; var shouldHideNavigator; var uiSourceCode; /** * @param {?string} content * @this {WebInspector.SourcesPanel} */ function contentLoaded(content) { createFile.call(this, content || ""); } if (uiSourceCodeToCopy) uiSourceCodeToCopy.requestContent(contentLoaded.bind(this)); else createFile.call(this); /** * @param {string=} content * @this {WebInspector.SourcesPanel} */ function createFile(content) { project.createFile(path, null, content || "", fileCreated.bind(this)); } /** * @param {?string} path * @this {WebInspector.SourcesPanel} */ function fileCreated(path) { if (!path) return; filePath = path; uiSourceCode = project.uiSourceCode(filePath); this._showSourceLocation(uiSourceCode); shouldHideNavigator = !this._navigatorController.isNavigatorPinned(); if (this._navigatorController.isNavigatorHidden()) this._navigatorController.showNavigatorOverlay(); this._navigator.rename(uiSourceCode, callback.bind(this)); } /** * @param {boolean} committed * @this {WebInspector.SourcesPanel} */ function callback(committed) { if (shouldHideNavigator) this._navigatorController.hideNavigatorOverlay(); if (!committed) { project.deleteFile(uiSourceCode); return; } this._recreateSourceFrameIfNeeded(uiSourceCode); this._navigator.updateIcon(uiSourceCode); this._showSourceLocation(uiSourceCode); } }, /** * @param {!WebInspector.Event} event */ _itemRenamingRequested: function(event) { var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data); var shouldHideNavigator = !this._navigatorController.isNavigatorPinned(); if (this._navigatorController.isNavigatorHidden()) this._navigatorController.showNavigatorOverlay(); this._navigator.rename(uiSourceCode, callback.bind(this)); /** * @param {boolean} committed * @this {WebInspector.SourcesPanel} */ function callback(committed) { if (shouldHideNavigator && committed) this._navigatorController.hideNavigatorOverlay(); this._recreateSourceFrameIfNeeded(uiSourceCode); this._navigator.updateIcon(uiSourceCode); this._showSourceLocation(uiSourceCode); } }, /** * @param {!WebInspector.UISourceCode} uiSourceCode */ _showLocalHistory: function(uiSourceCode) { WebInspector.RevisionHistoryView.showHistory(uiSourceCode); }, /** * @param {!WebInspector.ContextMenu} contextMenu * @param {!Object} target */ appendApplicableItems: function(event, contextMenu, target) { this._appendUISourceCodeItems(contextMenu, target); this._appendFunctionItems(contextMenu, target); }, /** * @param {!WebInspector.UISourceCode} uiSourceCode */ _mapFileSystemToNetwork: function(uiSourceCode) { WebInspector.SelectUISourceCodeForProjectTypeDialog.show(uiSourceCode.name(), WebInspector.projectTypes.Network, mapFileSystemToNetwork.bind(this), this.editorView.mainElement) /** * @param {!WebInspector.UISourceCode} networkUISourceCode * @this {WebInspector.SourcesPanel} */ function mapFileSystemToNetwork(networkUISourceCode) { this._workspace.addMapping(networkUISourceCode, uiSourceCode, WebInspector.fileSystemWorkspaceProvider); } }, /** * @param {!WebInspector.UISourceCode} uiSourceCode */ _removeNetworkMapping: function(uiSourceCode) { if (confirm(WebInspector.UIString("Are you sure you want to remove network mapping?"))) this._workspace.removeMapping(uiSourceCode); }, /** * @param {!WebInspector.UISourceCode} networkUISourceCode */ _mapNetworkToFileSystem: function(networkUISourceCode) { WebInspector.SelectUISourceCodeForProjectTypeDialog.show(networkUISourceCode.name(), WebInspector.projectTypes.FileSystem, mapNetworkToFileSystem.bind(this), this.editorView.mainElement) /** * @param {!WebInspector.UISourceCode} uiSourceCode * @this {WebInspector.SourcesPanel} */ function mapNetworkToFileSystem(uiSourceCode) { this._workspace.addMapping(networkUISourceCode, uiSourceCode, WebInspector.fileSystemWorkspaceProvider); } }, /** * @param {!WebInspector.ContextMenu} contextMenu * @param {!WebInspector.UISourceCode} uiSourceCode */ _appendUISourceCodeMappingItems: function(contextMenu, uiSourceCode) { if (uiSourceCode.project().type() === WebInspector.projectTypes.FileSystem) { var hasMappings = !!uiSourceCode.url; if (!hasMappings) contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Map to network resource\u2026" : "Map to Network Resource\u2026"), this._mapFileSystemToNetwork.bind(this, uiSourceCode)); else contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Remove network mapping" : "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) { if (!this._workspace.projects().filter(filterProject).length) return; if (this._workspace.uiSourceCodeForURL(uiSourceCode.url) === uiSourceCode) contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Map to file system resource\u2026" : "Map to File System Resource\u2026"), this._mapNetworkToFileSystem.bind(this, uiSourceCode)); } }, /** * @param {!WebInspector.ContextMenu} contextMenu * @param {!Object} target */ _appendUISourceCodeItems: function(contextMenu, target) { if (!(target instanceof WebInspector.UISourceCode)) return; var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (target); contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Local modifications\u2026" : "Local Modifications\u2026"), this._showLocalHistory.bind(this, uiSourceCode)); if (WebInspector.isolatedFileSystemManager.supportsFileSystems()) this._appendUISourceCodeMappingItems(contextMenu, uiSourceCode); }, /** * @param {!WebInspector.ContextMenu} contextMenu * @param {!Object} target */ _appendFunctionItems: function(contextMenu, target) { if (!(target instanceof WebInspector.RemoteObject)) return; var remoteObject = /** @type {!WebInspector.RemoteObject} */ (target); if (remoteObject.type !== "function") return; /** * @param {?Protocol.Error} error * @param {!DebuggerAgent.FunctionDetails} response * @this {WebInspector.SourcesPanel} */ function didGetDetails(error, response) { if (error) { console.error(error); return; } var uiLocation = WebInspector.debuggerModel.rawLocationToUILocation(response.location); if (!uiLocation) return; this.showUILocation(uiLocation, true); } /** * @this {WebInspector.SourcesPanel} */ function revealFunction() { DebuggerAgent.getFunctionDetails(remoteObject.objectId, didGetDetails.bind(this)); } contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Show function definition" : "Show Function Definition"), revealFunction.bind(this)); }, showGoToSourceDialog: function() { var uiSourceCodes = this._editorContainer.historyUISourceCodes(); /** @type {!Map.} */ var defaultScores = new Map(); for (var i = 1; i < uiSourceCodes.length; ++i) // Skip current element defaultScores.put(uiSourceCodes[i], uiSourceCodes.length - i); WebInspector.OpenResourceDialog.show(this, this.editorView.mainElement, undefined, defaultScores); }, _dockSideChanged: function() { var dockSide = WebInspector.dockController.dockSide(); var vertically = dockSide === WebInspector.DockController.State.DockedToRight && WebInspector.settings.splitVerticallyWhenDockedToRight.get(); this._splitVertically(vertically); }, /** * @param {boolean} vertically */ _splitVertically: function(vertically) { if (this.sidebarPaneView && vertically === !this.splitView.isVertical()) return; if (this.sidebarPaneView) this.sidebarPaneView.detach(); this.splitView.setVertical(!vertically); if (!vertically) { this.splitView.uninstallResizer(this._statusBarContainerElement); this.sidebarPaneView = new WebInspector.SidebarPaneStack(); for (var pane in this.sidebarPanes) this.sidebarPaneView.addPane(this.sidebarPanes[pane]); this._extensionSidebarPanesContainer = this.sidebarPaneView; this.sidebarElement.appendChild(this.debugToolbar); this.editorView.element.appendChild(this._toggleDebuggerSidebarButton.element); this.splitView.mainElement.appendChild(this._debugSidebarResizeWidgetElement); } else { this.splitView.installResizer(this._statusBarContainerElement); this.sidebarPaneView = new WebInspector.SplitView(true, this.name + "PanelSplitSidebarRatio", 0.5); var group1 = new WebInspector.SidebarPaneStack(); group1.show(this.sidebarPaneView.firstElement()); group1.element.id = "scripts-sidebar-stack-pane"; group1.addPane(this.sidebarPanes.callstack); group1.addPane(this.sidebarPanes.jsBreakpoints); group1.addPane(this.sidebarPanes.domBreakpoints); group1.addPane(this.sidebarPanes.xhrBreakpoints); group1.addPane(this.sidebarPanes.eventListenerBreakpoints); if (this.sidebarPanes.workerList) group1.addPane(this.sidebarPanes.workerList); var group2 = new WebInspector.SidebarTabbedPane(); group2.show(this.sidebarPaneView.secondElement()); group2.addPane(this.sidebarPanes.scopechain); group2.addPane(this.sidebarPanes.watchExpressions); this._extensionSidebarPanesContainer = group2; this.sidebarPaneView.firstElement().appendChild(this.debugToolbar); this._statusBarContainerElement.appendChild(this._debugSidebarResizeWidgetElement); this._statusBarContainerElement.appendChild(this._toggleDebuggerSidebarButton.element) } for (var i = 0; i < this._extensionSidebarPanes.length; ++i) this._extensionSidebarPanesContainer.addPane(this._extensionSidebarPanes[i]); this.sidebarPaneView.element.id = "scripts-debug-sidebar-contents"; this.sidebarPaneView.show(this.splitView.sidebarElement); this.sidebarPanes.scopechain.expand(); this.sidebarPanes.jsBreakpoints.expand(); this.sidebarPanes.callstack.expand(); if (WebInspector.settings.watchExpressions.get().length > 0) this.sidebarPanes.watchExpressions.expand(); }, canHighlightPosition: function() { return this.visibleView && this.visibleView.canHighlightPosition(); }, /** * @param {number} line * @param {number=} column */ highlightPosition: function(line, column) { if (!this.canHighlightPosition()) return; this.visibleView.highlightPosition(line, column); }, /** * @param {string} id * @param {!WebInspector.SidebarPane} pane */ addExtensionSidebarPane: function(id, pane) { this._extensionSidebarPanes.push(pane); this._extensionSidebarPanesContainer.addPane(pane); this.setHideOnDetach(); }, /** * @return {!WebInspector.TabbedEditorContainer} */ get tabbedEditorContainer() { return this._editorContainer; }, __proto__: WebInspector.Panel.prototype } /** * @constructor * @extends {WebInspector.View} */ WebInspector.SourcesView = function() { WebInspector.View.call(this); this.registerRequiredCSS("sourcesView.css"); this.element.id = "sources-panel-sources-view"; this.element.classList.add("vbox"); this.element.addEventListener("dragenter", this._onDragEnter.bind(this), true); this.element.addEventListener("dragover", this._onDragOver.bind(this), true); } WebInspector.SourcesView.dragAndDropFilesType = "Files"; WebInspector.SourcesView.prototype = { _onDragEnter: function (event) { if (event.dataTransfer.types.indexOf(WebInspector.SourcesView.dragAndDropFilesType) === -1) return; event.consume(true); }, _onDragOver: function (event) { if (event.dataTransfer.types.indexOf(WebInspector.SourcesView.dragAndDropFilesType) === -1) return; event.consume(true); if (this._dragMaskElement) return; this._dragMaskElement = this.element.createChild("div", "fill drag-mask"); this._dragMaskElement.addEventListener("drop", this._onDrop.bind(this), true); this._dragMaskElement.addEventListener("dragleave", this._onDragLeave.bind(this), true); }, _onDrop: function (event) { event.consume(true); this._removeMask(); var items = /** @type {!Array.} */ (event.dataTransfer.items); if (!items.length) return; var entry = items[0].webkitGetAsEntry(); if (!entry.isDirectory) return; InspectorFrontendHost.upgradeDraggedFileSystemPermissions(entry.filesystem); }, _onDragLeave: function (event) { event.consume(true); this._removeMask(); }, _removeMask: function () { this._dragMaskElement.remove(); delete this._dragMaskElement; }, __proto__: WebInspector.View.prototype } /** * @constructor * @extends {WebInspector.View} */ WebInspector.DrawerEditorView = function() { WebInspector.View.call(this); this.element.id = "drawer-editor-view"; this.element.classList.add("vbox"); } WebInspector.DrawerEditorView.prototype = { __proto__: WebInspector.View.prototype }