| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| Sources.ScriptOriginPlugin = class extends Sources.UISourceCodeFrame.Plugin { |
| /** |
| * @param {!SourceFrame.SourcesTextEditor} textEditor |
| * @param {!Workspace.UISourceCode} uiSourceCode |
| */ |
| constructor(textEditor, uiSourceCode) { |
| super(); |
| this._textEditor = textEditor; |
| this._uiSourceCode = uiSourceCode; |
| } |
| |
| /** |
| * @override |
| * @param {!Workspace.UISourceCode} uiSourceCode |
| * @return {boolean} |
| */ |
| static accepts(uiSourceCode) { |
| return uiSourceCode.contentType().hasScripts() || !!Sources.ScriptOriginPlugin._script(uiSourceCode); |
| } |
| |
| /** |
| * @override |
| * @return {!Array<!UI.ToolbarItem>} |
| */ |
| rightToolbarItems() { |
| const originURL = Bindings.CompilerScriptMapping.uiSourceCodeOrigin(this._uiSourceCode); |
| if (originURL) { |
| const item = UI.formatLocalized('(source mapped from %s)', [Components.Linkifier.linkifyURL(originURL)]); |
| return [new UI.ToolbarItem(item)]; |
| } |
| |
| // Handle anonymous scripts with an originStackTrace. |
| const script = Sources.ScriptOriginPlugin._script(this._uiSourceCode); |
| if (!script || !script.originStackTrace) { |
| return []; |
| } |
| const link = Sources.ScriptOriginPlugin._linkifier.linkifyStackTraceTopFrame( |
| script.debuggerModel.target(), script.originStackTrace); |
| return [new UI.ToolbarItem(link)]; |
| } |
| |
| /** |
| * @param {!Workspace.UISourceCode} uiSourceCode |
| * @return {?SDK.Script} |
| */ |
| static _script(uiSourceCode) { |
| const locations = Bindings.debuggerWorkspaceBinding.uiLocationToRawLocations(uiSourceCode, 0, 0); |
| for (const location of locations) { |
| const script = location.script(); |
| if (script && script.originStackTrace) { |
| return script; |
| } |
| } |
| return null; |
| } |
| }; |
| |
| Sources.ScriptOriginPlugin._linkifier = new Components.Linkifier(); |