Chromium Code Reviews| Index: third_party/WebKit/Source/devtools/front_end/workspace_diff/WorkspaceDiff.js |
| diff --git a/third_party/WebKit/Source/devtools/front_end/workspace_diff/WorkspaceDiff.js b/third_party/WebKit/Source/devtools/front_end/workspace_diff/WorkspaceDiff.js |
| index d062c3a3cbb82c7a31870a163a084e5a078cd4da..564771104b590b58c208aacd1f608f86f3f3db35 100644 |
| --- a/third_party/WebKit/Source/devtools/front_end/workspace_diff/WorkspaceDiff.js |
| +++ b/third_party/WebKit/Source/devtools/front_end/workspace_diff/WorkspaceDiff.js |
| @@ -3,10 +3,27 @@ |
| // found in the LICENSE file. |
| -WorkspaceDiff.WorkspaceDiff = class { |
| - constructor() { |
| +WorkspaceDiff.WorkspaceDiff = class extends Common.Object { |
| + /** |
| + * @param {!Workspace.Workspace} workspace |
| + */ |
| + constructor(workspace) { |
| + super(); |
| /** @type {!WeakMap<!Workspace.UISourceCode, !WorkspaceDiff.WorkspaceDiff.UISourceCodeDiff>} */ |
| this._uiSourceCodeDiffs = new WeakMap(); |
| + |
| + /** @type {!Map<!Workspace.UISourceCode, number>} */ |
| + this._loadingUISourceCodes = new Map(); |
| + this._loadingUISourceCodesId = 0; |
| + |
| + /** @type {!Set<!Workspace.UISourceCode>} */ |
| + this._modifiedUISourceCodes = new Set(); |
| + workspace.addEventListener(Workspace.Workspace.Events.WorkingCopyChanged, this._uiSourceCodeChanged, this); |
| + workspace.addEventListener(Workspace.Workspace.Events.WorkingCopyCommitted, this._uiSourceCodeChanged, this); |
| + workspace.addEventListener(Workspace.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAdded, this); |
| + workspace.addEventListener(Workspace.Workspace.Events.UISourceCodeRemoved, this._uiSourceCodeRemoved, this); |
| + workspace.addEventListener(Workspace.Workspace.Events.ProjectRemoved, this._projectRemoved, this); |
| + workspace.uiSourceCodes().forEach(this._refreshUISourceCode.bind(this)); |
| } |
| /** |
| @@ -36,6 +53,13 @@ WorkspaceDiff.WorkspaceDiff = class { |
| } |
| /** |
| + * @return {!Array<!Workspace.UISourceCode>} |
| + */ |
| + modifiedUISourceCodes() { |
| + return Array.from(this._modifiedUISourceCodes); |
| + } |
| + |
| + /** |
| * @param {!Workspace.UISourceCode} uiSourceCode |
| * @return {!WorkspaceDiff.WorkspaceDiff.UISourceCodeDiff} |
| */ |
| @@ -44,6 +68,91 @@ WorkspaceDiff.WorkspaceDiff = class { |
| this._uiSourceCodeDiffs.set(uiSourceCode, new WorkspaceDiff.WorkspaceDiff.UISourceCodeDiff(uiSourceCode)); |
| return this._uiSourceCodeDiffs.get(uiSourceCode); |
| } |
| + |
| + /** |
| + * @param {!Common.Event} event |
| + */ |
| + _uiSourceCodeChanged(event) { |
| + var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data.uiSourceCode); |
| + this._refreshUISourceCode(uiSourceCode); |
| + } |
| + |
| + /** |
| + * @param {!Common.Event} event |
| + */ |
| + _uiSourceCodeAdded(event) { |
| + var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data); |
| + this._refreshUISourceCode(uiSourceCode); |
| + } |
| + |
| + /** |
| + * @param {!Common.Event} event |
| + */ |
| + _uiSourceCodeRemoved(event) { |
| + var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data); |
| + this._markAsUnmodified(uiSourceCode); |
| + } |
| + |
| + /** |
| + * @param {!Common.Event} event |
| + */ |
| + _projectRemoved(event) { |
| + var project = /** @type {!Workspace.Project} */ (event.data); |
| + for (var uiSourceCode of project.uiSourceCodes()) |
| + this._markAsUnmodified(uiSourceCode); |
| + } |
| + |
| + /** |
| + * @param {!Workspace.UISourceCode} uiSourceCode |
| + */ |
| + _markAsUnmodified(uiSourceCode) { |
| + this._loadingUISourceCodes.delete(uiSourceCode); |
| + if (this._modifiedUISourceCodes.delete(uiSourceCode)) |
| + this.emit(new WorkspaceDiff.UnmodifiedEvent(uiSourceCode)); |
| + } |
| + |
| + /** |
| + * @param {!Workspace.UISourceCode} uiSourceCode |
| + */ |
| + _markAsModified(uiSourceCode) { |
| + this._loadingUISourceCodes.delete(uiSourceCode); |
| + if (this._modifiedUISourceCodes.has(uiSourceCode)) |
| + return; |
| + this._modifiedUISourceCodes.add(uiSourceCode); |
| + this.emit(new WorkspaceDiff.ModifiedEvent(uiSourceCode)); |
| + } |
| + |
| + /** |
| + * @param {!Workspace.UISourceCode} uiSourceCode |
| + */ |
| + async _refreshUISourceCode(uiSourceCode) { |
| + if (uiSourceCode.project().type() !== Workspace.projectTypes.Network) { |
|
lushnikov
2017/03/24 04:02:34
let's move these lines in the very beginning:
var
einbinder
2017/03/28 00:07:24
Using promise as id, so I can't set _loadingUISour
|
| + this._markAsUnmodified(uiSourceCode); |
| + return; |
| + } |
| + if (uiSourceCode.isDirty()) { |
| + this._markAsModified(uiSourceCode); |
| + return; |
| + } |
| + if (!uiSourceCode.history().length) { |
| + this._markAsUnmodified(uiSourceCode); |
| + return; |
| + } |
| + |
| + var id = this._loadingUISourceCodesId++; |
|
lushnikov
2017/03/24 04:02:34
you can use promise as identity
einbinder
2017/03/28 00:07:24
Done.
|
| + this._loadingUISourceCodes.set(uiSourceCode, id); |
| + var originalContent = await uiSourceCode.requestOriginalContent(); |
|
lushnikov
2017/03/24 04:02:34
promise.all?
einbinder
2017/03/28 00:07:24
Done.
|
| + if (this._loadingUISourceCodes.get(uiSourceCode) !== id) |
| + return; |
| + var content = await uiSourceCode.requestContent(); |
| + if (this._loadingUISourceCodes.get(uiSourceCode) !== id) |
| + return; |
| + |
| + if (content !== null && originalContent !== null && content !== originalContent) |
| + this._markAsModified(uiSourceCode); |
| + else |
| + this._markAsUnmodified(uiSourceCode); |
| + } |
| }; |
| WorkspaceDiff.WorkspaceDiff.UISourceCodeDiff = class extends Common.Object { |
| @@ -108,11 +217,35 @@ WorkspaceDiff.WorkspaceDiff.UISourceCodeDiff = class extends Common.Object { |
| WorkspaceDiff.DiffChangedEvent = class {}; |
| /** |
| + * @implements {Common.Emittable} |
| + */ |
| +WorkspaceDiff.UnmodifiedEvent = class { |
|
lushnikov
2017/03/24 04:02:34
we need a better name for this.
ModifiedUISourceC
einbinder
2017/03/28 00:07:25
ModifiedStatusChangedEvent
|
| + /** |
| + * @param {!Workspace.UISourceCode} uiSourceCode |
| + */ |
| + constructor(uiSourceCode) { |
| + this.uiSourceCode = uiSourceCode; |
| + } |
| +}; |
| + |
| +/** |
| + * @implements {Common.Emittable} |
| + */ |
| +WorkspaceDiff.ModifiedEvent = class { |
| + /** |
| + * @param {!Workspace.UISourceCode} uiSourceCode |
| + */ |
| + constructor(uiSourceCode) { |
| + this.uiSourceCode = uiSourceCode; |
| + } |
| +}; |
| + |
| +/** |
| * @return {!WorkspaceDiff.WorkspaceDiff} |
| */ |
| WorkspaceDiff.workspaceDiff = function() { |
| if (!WorkspaceDiff.WorkspaceDiff._instance) |
| - WorkspaceDiff.WorkspaceDiff._instance = new WorkspaceDiff.WorkspaceDiff(); |
| + WorkspaceDiff.WorkspaceDiff._instance = new WorkspaceDiff.WorkspaceDiff(Workspace.workspace); |
| return WorkspaceDiff.WorkspaceDiff._instance; |
| }; |