Index: third_party/WebKit/Source/devtools/front_end/sources/SourceFormatter.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/SourceFormatter.js b/third_party/WebKit/Source/devtools/front_end/sources/SourceFormatter.js |
index 229f128ca3f62479c0ba09bea47c31765c31daa3..1faab4b2d49f83a2745207d505e76ff12e1ddb01 100644 |
--- a/third_party/WebKit/Source/devtools/front_end/sources/SourceFormatter.js |
+++ b/third_party/WebKit/Source/devtools/front_end/sources/SourceFormatter.js |
@@ -36,8 +36,8 @@ Sources.SourceFormatter = class { |
Workspace.workspace, this._projectId, Workspace.projectTypes.Formatter, 'formatter', |
true /* isServiceProject */); |
- /** @type {!Map<string, !Workspace.UISourceCode>} */ |
- this._formattedPaths = new Map(); |
+ /** @type {!Map<!Workspace.UISourceCode, !{promise: !Promise<!Sources.SourceFormatData>, formatData: ?Sources.SourceFormatData}>} */ |
+ this._formattedSourceCodes = new Map(); |
this._scriptMapping = new Sources.SourceFormatter.ScriptMapping(); |
this._styleMapping = new Sources.SourceFormatter.StyleMapping(); |
Workspace.workspace.addEventListener( |
@@ -49,9 +49,10 @@ Sources.SourceFormatter = class { |
*/ |
_onUISourceCodeRemoved(event) { |
var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data); |
- var formattedUISourceCode = this._formattedPaths.get(uiSourceCode.project().id() + ':' + uiSourceCode.url()); |
- if (formattedUISourceCode) |
- this.discardFormattedUISourceCode(formattedUISourceCode); |
+ var cacheEntry = this._formattedSourceCodes.get(uiSourceCode); |
+ if (cacheEntry && cacheEntry.formatData) |
+ this._discardFormatData(cacheEntry.formatData); |
+ this._formattedSourceCodes.remove(uiSourceCode); |
} |
/** |
@@ -62,13 +63,19 @@ Sources.SourceFormatter = class { |
var formatData = Sources.SourceFormatData._for(formattedUISourceCode); |
if (!formatData) |
return null; |
+ this._discardFormatData(formatData); |
+ this._formattedSourceCodes.remove(formatData.originalSourceCode); |
+ return formatData.originalSourceCode; |
+ } |
- delete formattedUISourceCode[Sources.SourceFormatData._formatDataSymbol]; |
+ /** |
+ * @param {!Sources.SourceFormatData} formatData |
+ */ |
+ _discardFormatData(formatData) { |
+ delete formatData.formattedSourceCode[Sources.SourceFormatData._formatDataSymbol]; |
this._scriptMapping._setSourceMappingEnabled(formatData, false); |
this._styleMapping._setSourceMappingEnabled(formatData, false); |
- this._project.removeFile(formattedUISourceCode.url()); |
- this._formattedPaths.remove(formatData.originalPath()); |
- return formatData.originalSourceCode; |
+ this._project.removeFile(formatData.formattedSourceCode.url()); |
} |
/** |
@@ -76,7 +83,7 @@ Sources.SourceFormatter = class { |
* @return {boolean} |
*/ |
hasFormatted(uiSourceCode) { |
- return this._formattedPaths.has(uiSourceCode.project().id() + ':' + uiSourceCode.url()); |
+ return this._formattedSourceCodes.has(uiSourceCode); |
} |
/** |
@@ -84,17 +91,18 @@ Sources.SourceFormatter = class { |
* @return {!Promise<!Sources.SourceFormatData>} |
*/ |
async format(uiSourceCode) { |
- var formattedUISourceCode = this._formattedPaths.get(uiSourceCode.project().id() + ':' + uiSourceCode.url()); |
- if (formattedUISourceCode) |
- return Sources.SourceFormatData._for(formattedUISourceCode); |
+ var cacheEntry = this._formattedSourceCodes.get(uiSourceCode); |
+ if (cacheEntry) |
+ return cacheEntry.promise; |
- var content = await uiSourceCode.requestContent(); |
var fulfillFormatPromise; |
var resultPromise = new Promise(fulfill => { |
fulfillFormatPromise = fulfill; |
}); |
- Sources.Formatter.format( |
- uiSourceCode.contentType(), uiSourceCode.mimeType(), content || '', innerCallback.bind(this)); |
+ this._formattedSourceCodes.set(uiSourceCode, {promise: resultPromise, formatData: null}); |
+ var content = await uiSourceCode.requestContent(); |
+ // ------------ ASYNC ------------ |
+ Sources.Formatter.format(uiSourceCode.contentType(), uiSourceCode.mimeType(), content || '', formatDone.bind(this)); |
return resultPromise; |
/** |
@@ -102,8 +110,17 @@ Sources.SourceFormatter = class { |
* @param {string} formattedContent |
* @param {!Sources.FormatterSourceMapping} formatterMapping |
*/ |
- function innerCallback(formattedContent, formatterMapping) { |
- var formattedURL = uiSourceCode.url() + ':formatted'; |
+ function formatDone(formattedContent, formatterMapping) { |
+ var cacheEntry = this._formattedSourceCodes.get(uiSourceCode); |
+ if (!cacheEntry || cacheEntry.promise !== resultPromise) |
+ return; |
+ var formattedURL; |
+ var count = 0; |
+ var suffix = ''; |
+ do { |
+ formattedURL = `${uiSourceCode.url()}:formatted${suffix}`; |
+ suffix = `:${count++}`; |
+ } while (this._project.uiSourceCodeForURL(formattedURL)); |
var contentProvider = |
Common.StaticContentProvider.fromString(formattedURL, uiSourceCode.contentType(), formattedContent); |
var formattedUISourceCode = |
@@ -112,9 +129,7 @@ Sources.SourceFormatter = class { |
formattedUISourceCode[Sources.SourceFormatData._formatDataSymbol] = formatData; |
this._scriptMapping._setSourceMappingEnabled(formatData, true); |
this._styleMapping._setSourceMappingEnabled(formatData, true); |
- |
- var path = formatData.originalPath(); |
- this._formattedPaths.set(path, formattedUISourceCode); |
+ cacheEntry.formatData = formatData; |
for (var decoration of uiSourceCode.allDecorations()) { |
var range = decoration.range(); |