| Index: Source/devtools/front_end/sources/ScriptFormatterEditorAction.js
|
| diff --git a/Source/devtools/front_end/sources/ScriptFormatterEditorAction.js b/Source/devtools/front_end/sources/ScriptFormatterEditorAction.js
|
| index b15acca4e63dfad1e9ef9ed97c0e39229c5f61d2..3b26901238f7fc53803687f012d70adae579d7a2 100644
|
| --- a/Source/devtools/front_end/sources/ScriptFormatterEditorAction.js
|
| +++ b/Source/devtools/front_end/sources/ScriptFormatterEditorAction.js
|
| @@ -5,19 +5,13 @@
|
| /**
|
| * @constructor
|
| * @implements {WebInspector.SourceMapping}
|
| - * @param {!WebInspector.Workspace} workspace
|
| - * @param {!WebInspector.DebuggerModel} debuggerModel
|
| + * @param {!WebInspector.Target} target
|
| + * @param {!WebInspector.ScriptFormatterEditorAction} editorAction
|
| */
|
| -WebInspector.FormatterScriptMapping = function(workspace, debuggerModel)
|
| +WebInspector.FormatterScriptMapping = function(target, editorAction)
|
| {
|
| - this._workspace = workspace;
|
| - this._debuggerModel = debuggerModel;
|
| -
|
| - this._init();
|
| -
|
| - this._projectId = "formatter:";
|
| - this._projectDelegate = new WebInspector.FormatterProjectDelegate(workspace, this._projectId);
|
| - this._debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared, this._debuggerReset, this);
|
| + this._target = target;
|
| + this._editorAction = editorAction;
|
| }
|
|
|
| WebInspector.FormatterScriptMapping.prototype = {
|
| @@ -29,11 +23,11 @@ WebInspector.FormatterScriptMapping.prototype = {
|
| {
|
| var debuggerModelLocation = /** @type {!WebInspector.DebuggerModel.Location} */ (rawLocation);
|
| var script = debuggerModelLocation.script();
|
| - var uiSourceCode = this._uiSourceCodes.get(script);
|
| + var uiSourceCode = this._editorAction._uiSourceCodes.get(script);
|
| if (!uiSourceCode)
|
| return null;
|
|
|
| - var formatData = this._formatData.get(uiSourceCode);
|
| + var formatData = this._editorAction._formatData.get(uiSourceCode);
|
| if (!formatData)
|
| return null;
|
| var mapping = formatData.mapping;
|
| @@ -51,11 +45,15 @@ WebInspector.FormatterScriptMapping.prototype = {
|
| */
|
| uiLocationToRawLocation: function(uiSourceCode, lineNumber, columnNumber)
|
| {
|
| - var formatData = this._formatData.get(uiSourceCode);
|
| + var formatData = this._editorAction._formatData.get(uiSourceCode);
|
| if (!formatData)
|
| return null;
|
| - var originalLocation = formatData.mapping.formattedToOriginal(lineNumber, columnNumber)
|
| - return this._debuggerModel.createRawLocation(formatData.scripts[0], originalLocation[0], originalLocation[1]);
|
| + var originalLocation = formatData.mapping.formattedToOriginal(lineNumber, columnNumber);
|
| + for (var i = 0; i < formatData.scripts.length; ++i) {
|
| + if (formatData.scripts[i].target() === this._target)
|
| + return this._target.debuggerModel.createRawLocation(formatData.scripts[i], originalLocation[0], originalLocation[1])
|
| + }
|
| + return null;
|
| },
|
|
|
| /**
|
| @@ -74,131 +72,8 @@ WebInspector.FormatterScriptMapping.prototype = {
|
| uiLineHasMapping: function(uiSourceCode, lineNumber)
|
| {
|
| return true;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.UISourceCode} uiSourceCode
|
| - * @return {!Array.<!WebInspector.Script>}
|
| - */
|
| - _scriptsForUISourceCode: function(uiSourceCode)
|
| - {
|
| - /**
|
| - * @param {!WebInspector.Script} script
|
| - * @return {boolean}
|
| - */
|
| - function isInlineScript(script)
|
| - {
|
| - return script.isInlineScript();
|
| - }
|
| -
|
| - if (uiSourceCode.contentType() === WebInspector.resourceTypes.Document)
|
| - return this._debuggerModel.scriptsForSourceURL(uiSourceCode.url).filter(isInlineScript);
|
| - if (uiSourceCode.contentType() === WebInspector.resourceTypes.Script) {
|
| - var rawLocation = /** @type {!WebInspector.DebuggerModel.Location} */ (uiSourceCode.uiLocationToRawLocation(this._debuggerModel.target(), 0, 0));
|
| - return rawLocation ? [rawLocation.script()] : [];
|
| - }
|
| - return [];
|
| - },
|
| -
|
| - _init: function()
|
| - {
|
| - /** @type {!Map.<!WebInspector.Script, !WebInspector.UISourceCode>} */
|
| - this._uiSourceCodes = new Map();
|
| - /** @type {!StringMap.<string>} */
|
| - this._formattedPaths = new StringMap();
|
| - /** @type {!Map.<!WebInspector.UISourceCode, !WebInspector.FormatterScriptMapping.FormatData>} */
|
| - this._formatData = new Map();
|
| - },
|
| -
|
| - _debuggerReset: function()
|
| - {
|
| - var formattedPaths = this._formattedPaths.values();
|
| - for (var i = 0; i < formattedPaths.length; ++i)
|
| - this._projectDelegate._removeFormatted(formattedPaths[i]);
|
| - this._init();
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.UISourceCode} uiSourceCode
|
| - * @param {function(?WebInspector.UISourceCode, !WebInspector.FormatterSourceMapping=)} callback
|
| - */
|
| - _performUISourceCodeScriptFormatting: function(uiSourceCode, callback)
|
| - {
|
| - var path = this._formattedPaths.get(uiSourceCode.project().id() + ":" + uiSourceCode.path());
|
| - if (path) {
|
| - var uiSourceCodePath = path;
|
| - var formattedUISourceCode = this._workspace.uiSourceCode(this._projectId, uiSourceCodePath);
|
| - var formatData = formattedUISourceCode ? this._formatData.get(formattedUISourceCode) : null;
|
| - if (!formatData)
|
| - callback(null);
|
| - else
|
| - callback(formattedUISourceCode, formatData.mapping);
|
| - return;
|
| - }
|
| -
|
| - uiSourceCode.requestContent(contentLoaded.bind(this));
|
| -
|
| - /**
|
| - * @this {WebInspector.FormatterScriptMapping}
|
| - * @param {?string} content
|
| - */
|
| - function contentLoaded(content)
|
| - {
|
| - var formatter = WebInspector.Formatter.createFormatter(uiSourceCode.contentType());
|
| - formatter.formatContent(uiSourceCode.highlighterType(), content || "", innerCallback.bind(this));
|
| - }
|
| -
|
| - /**
|
| - * @this {WebInspector.FormatterScriptMapping}
|
| - * @param {string} formattedContent
|
| - * @param {!WebInspector.FormatterSourceMapping} formatterMapping
|
| - */
|
| - function innerCallback(formattedContent, formatterMapping)
|
| - {
|
| - var scripts = this._scriptsForUISourceCode(uiSourceCode);
|
| - if (!scripts.length) {
|
| - callback(null);
|
| - return;
|
| - }
|
| - var name;
|
| - if (uiSourceCode.contentType() === WebInspector.resourceTypes.Document)
|
| - name = uiSourceCode.displayName();
|
| - else
|
| - name = uiSourceCode.name() || scripts[0].scriptId;
|
| - path = this._projectDelegate._addFormatted(name, uiSourceCode.url, uiSourceCode.contentType(), formattedContent);
|
| - var formattedUISourceCode = /** @type {!WebInspector.UISourceCode} */ (this._workspace.uiSourceCode(this._projectId, path));
|
| -
|
| - var formatData = new WebInspector.FormatterScriptMapping.FormatData(uiSourceCode.project().id(), uiSourceCode.path(), formatterMapping, scripts);
|
| - this._formatData.put(formattedUISourceCode, formatData);
|
| - this._formattedPaths.put(uiSourceCode.project().id() + ":" + uiSourceCode.path(), path);
|
| - for (var i = 0; i < scripts.length; ++i) {
|
| - this._uiSourceCodes.put(scripts[i], formattedUISourceCode);
|
| - scripts[i].pushSourceMapping(this);
|
| - }
|
| - formattedUISourceCode.setSourceMappingForTarget(this._debuggerModel.target(), this);
|
| - callback(formattedUISourceCode, formatterMapping);
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.UISourceCode} formattedUISourceCode
|
| - * @return {?WebInspector.FormatterSourceMapping}
|
| - */
|
| - _discardFormattedUISourceCodeScript: function(formattedUISourceCode)
|
| - {
|
| - var formatData = this._formatData.get(formattedUISourceCode);
|
| - if (!formatData)
|
| - return null;
|
| -
|
| - this._formatData.remove(formattedUISourceCode);
|
| - this._formattedPaths.remove(formatData.projectId + ":" + formatData.path);
|
| - for (var i = 0; i < formatData.scripts.length; ++i) {
|
| - this._uiSourceCodes.remove(formatData.scripts[i]);
|
| - formatData.scripts[i].popSourceMapping();
|
| - }
|
| - this._projectDelegate._removeFormatted(formattedUISourceCode.path());
|
| - return formatData.mapping;
|
| }
|
| +
|
| }
|
|
|
| /**
|
| @@ -213,7 +88,7 @@ WebInspector.FormatterScriptMapping.FormatData = function(projectId, path, mappi
|
| this.projectId = projectId;
|
| this.path = path;
|
| this.mapping = mapping;
|
| - this.scripts = scripts;
|
| + this.scripts= scripts;
|
| }
|
|
|
| /**
|
| @@ -263,14 +138,47 @@ WebInspector.FormatterProjectDelegate.prototype = {
|
| /**
|
| * @constructor
|
| * @implements {WebInspector.SourcesView.EditorAction}
|
| + * @implements {WebInspector.TargetManager.Observer}
|
| */
|
| WebInspector.ScriptFormatterEditorAction = function()
|
| {
|
| - this._scriptMapping = new WebInspector.FormatterScriptMapping(WebInspector.workspace, WebInspector.debuggerModel);
|
| + this._projectId = "formatter:";
|
| + this._projectDelegate = new WebInspector.FormatterProjectDelegate(WebInspector.workspace, this._projectId);
|
| +
|
| + /** @type {!Map.<!WebInspector.Script, !WebInspector.UISourceCode>} */
|
| + this._uiSourceCodes = new Map();
|
| + /** @type {!StringMap.<string>} */
|
| + this._formattedPaths = new StringMap();
|
| + /** @type {!Map.<!WebInspector.UISourceCode, !WebInspector.FormatterScriptMapping.FormatData>} */
|
| + this._formatData = new Map();
|
| +
|
| + /** @type {!Map.<!WebInspector.Target, !WebInspector.FormatterScriptMapping>} */
|
| + this._scriptMappingByTarget = new Map();
|
| + this._workspace = WebInspector.workspace;
|
| + WebInspector.targetManager.observeTargets(this);
|
| }
|
|
|
| WebInspector.ScriptFormatterEditorAction.prototype = {
|
| /**
|
| + * @param {!WebInspector.Target} target
|
| + */
|
| + targetAdded: function(target)
|
| + {
|
| + this._scriptMappingByTarget.put(target, new WebInspector.FormatterScriptMapping(target, this));
|
| + target.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared, this._debuggerReset, this);
|
| + },
|
| +
|
| + /**
|
| + * @param {!WebInspector.Target} target
|
| + */
|
| + targetRemoved: function(target)
|
| + {
|
| + this._scriptMappingByTarget.remove(target);
|
| + this._cleanForTarget(target);
|
| + target.debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared, this._debuggerReset, this);
|
| + },
|
| +
|
| + /**
|
| * @param {!WebInspector.Event} event
|
| */
|
| _editorSelected: function(event)
|
| @@ -352,38 +260,167 @@ WebInspector.ScriptFormatterEditorAction.prototype = {
|
|
|
| /**
|
| * @param {!WebInspector.UISourceCode} uiSourceCode
|
| + * @param {!WebInspector.UISourceCode} formattedUISourceCode
|
| + * @param {!WebInspector.FormatterSourceMapping} mapping
|
| + * @private
|
| */
|
| - _formatUISourceCodeScript: function(uiSourceCode)
|
| + _showIfNeeded: function(uiSourceCode, formattedUISourceCode, mapping)
|
| + {
|
| + if (uiSourceCode !== this._sourcesView.currentUISourceCode())
|
| + return;
|
| + var sourceFrame = this._sourcesView.viewForFile(uiSourceCode);
|
| + var start = [0, 0];
|
| + if (sourceFrame) {
|
| + var selection = sourceFrame.selection();
|
| + start = mapping.originalToFormatted(selection.startLine, selection.startColumn);
|
| + }
|
| + this._sourcesView.showSourceLocation(formattedUISourceCode, start[0], start[1]);
|
| + this._updateButton(formattedUISourceCode);
|
| + },
|
| +
|
| + /**
|
| + * @param {!WebInspector.UISourceCode} formattedUISourceCode
|
| + */
|
| + _discardFormattedUISourceCodeScript: function(formattedUISourceCode)
|
| + {
|
| + var formatData = this._formatData.get(formattedUISourceCode);
|
| + if (!formatData)
|
| + return;
|
| +
|
| + this._formatData.remove(formattedUISourceCode);
|
| + this._formattedPaths.remove(formatData.projectId + ":" + formatData.path);
|
| + for (var i = 0; i < formatData.scripts.length; ++i) {
|
| + this._uiSourceCodes.remove(formatData.scripts[i]);
|
| + formatData.scripts[i].popSourceMapping();
|
| + }
|
| + this._projectDelegate._removeFormatted(formattedUISourceCode.path());
|
| + },
|
| +
|
| + /**
|
| + * @param {!WebInspector.Target} target
|
| + */
|
| + _cleanForTarget: function(target)
|
| {
|
| - this._scriptMapping._performUISourceCodeScriptFormatting(uiSourceCode, innerCallback.bind(this));
|
| + var uiSourceCodes = this._formatData.keys();
|
| + for (var i = 0; i < uiSourceCodes.length; ++i) {
|
| + uiSourceCodes[i].setSourceMappingForTarget(target, null);
|
| + var formatData = this._formatData.get(uiSourceCodes[i]);
|
| + var scripts = [];
|
| + for (var j = 0; j < formatData.scripts.length; ++j) {
|
| + if (formatData.scripts[j].target() === target)
|
| + this._uiSourceCodes.remove(formatData.scripts[j]);
|
| + else
|
| + scripts.push(formatData.scripts[j]);
|
| + }
|
| +
|
| + if (scripts.length)
|
| + formatData.scripts = scripts;
|
| + else {
|
| + this._formattedPaths.remove(formatData.projectId + ":" + formatData.path);
|
| + this._formatData.remove(uiSourceCodes[i]);
|
| + this._projectDelegate._removeFormatted(uiSourceCodes[i].path());
|
| + }
|
| + }
|
| + },
|
|
|
| + /**
|
| + * @param {!WebInspector.Event} event
|
| + */
|
| + _debuggerReset: function(event)
|
| + {
|
| + var debuggerModel = /** @type {!WebInspector.DebuggerModel} */ (event.target);
|
| + this._cleanForTarget(debuggerModel.target());
|
| + },
|
| +
|
| + /**
|
| + * @param {!WebInspector.UISourceCode} uiSourceCode
|
| + * @return {!Array.<!WebInspector.Script>}
|
| + */
|
| + _scriptsForUISourceCode: function(uiSourceCode)
|
| + {
|
| /**
|
| - * @this {WebInspector.ScriptFormatterEditorAction}
|
| - * @param {?WebInspector.UISourceCode} formattedUISourceCode
|
| - * @param {!WebInspector.FormatterSourceMapping=} mapping
|
| + * @param {!WebInspector.Script} script
|
| + * @return {boolean}
|
| */
|
| - function innerCallback(formattedUISourceCode, mapping)
|
| + function isInlineScript(script)
|
| {
|
| - if (!formattedUISourceCode)
|
| - return;
|
| - if (uiSourceCode !== this._sourcesView.currentUISourceCode())
|
| - return;
|
| - var sourceFrame = this._sourcesView.viewForFile(uiSourceCode);
|
| - var start = [0, 0];
|
| - if (sourceFrame) {
|
| - var selection = sourceFrame.selection();
|
| - start = mapping.originalToFormatted(selection.startLine, selection.startColumn);
|
| - }
|
| - this._sourcesView.showSourceLocation(formattedUISourceCode, start[0], start[1]);
|
| - this._updateButton(formattedUISourceCode);
|
| + return script.isInlineScript();
|
| + }
|
| +
|
| + if (uiSourceCode.contentType() === WebInspector.resourceTypes.Document) {
|
| + var scripts = [];
|
| + var targets = WebInspector.targetManager.targets();
|
| + for (var i = 0; i < targets.length; ++i)
|
| + scripts.pushAll(targets[i].debuggerModel.scriptsForSourceURL(uiSourceCode.url));
|
| + return scripts.filter(isInlineScript);
|
| }
|
| + if (uiSourceCode.contentType() === WebInspector.resourceTypes.Script) {
|
| + var rawLocations = (uiSourceCode.uiLocationToRawLocations(0, 0));
|
| + return rawLocations.map(function(rawLocation) { return rawLocation.script()});
|
| + }
|
| + return [];
|
| },
|
|
|
| /**
|
| * @param {!WebInspector.UISourceCode} uiSourceCode
|
| */
|
| - _discardFormattedUISourceCodeScript: function(uiSourceCode)
|
| + _formatUISourceCodeScript: function(uiSourceCode)
|
| {
|
| - this._scriptMapping._discardFormattedUISourceCodeScript(uiSourceCode);
|
| + var path = this._formattedPaths.get(uiSourceCode.project().id() + ":" + uiSourceCode.path());
|
| + if (path) {
|
| + var uiSourceCodePath = path;
|
| + var formattedUISourceCode = this._workspace.uiSourceCode(this._projectId, uiSourceCodePath);
|
| + var formatData = formattedUISourceCode ? this._formatData.get(formattedUISourceCode) : null;
|
| + if (formatData)
|
| + this._showIfNeeded(uiSourceCode, /** @type {!WebInspector.UISourceCode} */ (formattedUISourceCode), formatData.mapping);
|
| + return;
|
| + }
|
| +
|
| + uiSourceCode.requestContent(contentLoaded.bind(this));
|
| +
|
| + /**
|
| + * @this {WebInspector.ScriptFormatterEditorAction}
|
| + * @param {?string} content
|
| + */
|
| + function contentLoaded(content)
|
| + {
|
| + var formatter = WebInspector.Formatter.createFormatter(uiSourceCode.contentType());
|
| + formatter.formatContent(uiSourceCode.highlighterType(), content || "", innerCallback.bind(this));
|
| + }
|
| +
|
| + /**
|
| + * @this {WebInspector.ScriptFormatterEditorAction}
|
| + * @param {string} formattedContent
|
| + * @param {!WebInspector.FormatterSourceMapping} formatterMapping
|
| + */
|
| + function innerCallback(formattedContent, formatterMapping)
|
| + {
|
| + var scripts = this._scriptsForUISourceCode(uiSourceCode);
|
| + if (!scripts.length)
|
| + return;
|
| +
|
| + var name;
|
| + if (uiSourceCode.contentType() === WebInspector.resourceTypes.Document)
|
| + name = uiSourceCode.displayName();
|
| + else
|
| + name = uiSourceCode.name() || scripts[0].scriptId;
|
| + path = this._projectDelegate._addFormatted(name, uiSourceCode.url, uiSourceCode.contentType(), formattedContent);
|
| + var formattedUISourceCode = /** @type {!WebInspector.UISourceCode} */ (this._workspace.uiSourceCode(this._projectId, path));
|
| + var formatData = new WebInspector.FormatterScriptMapping.FormatData(uiSourceCode.project().id(), uiSourceCode.path(), formatterMapping, scripts);
|
| + this._formatData.put(formattedUISourceCode, formatData);
|
| + this._formattedPaths.put(uiSourceCode.project().id() + ":" + uiSourceCode.path(), path);
|
| + for (var i = 0; i < scripts.length; ++i) {
|
| + this._uiSourceCodes.put(scripts[i], formattedUISourceCode);
|
| + var scriptMapping = /** @type {!WebInspector.FormatterScriptMapping} */(this._scriptMappingByTarget.get(scripts[i].target()));
|
| + scripts[i].pushSourceMapping(scriptMapping);
|
| + }
|
| +
|
| + var targets = WebInspector.targetManager.targets();
|
| + for (var i = 0; i < targets.length; ++i) {
|
| + var scriptMapping = /** @type {!WebInspector.FormatterScriptMapping} */(this._scriptMappingByTarget.get(targets[i]));
|
| + formattedUISourceCode.setSourceMappingForTarget(targets[i], scriptMapping);
|
| + }
|
| + this._showIfNeeded(uiSourceCode, formattedUISourceCode, formatterMapping);
|
| + }
|
| }
|
| }
|
|
|