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..b201099354bf3d579dc07ccf70bdddbc5dbd99f5 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(); |
| + this._workspace = workspace; |
|
luoe
2017/03/23 21:59:59
var workspace = ...
einbinder
2017/03/28 00:07:11
Done.
|
| /** @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(); |
| + this._workspace.addEventListener(Workspace.Workspace.Events.WorkingCopyChanged, this._uiSourceCodeChanged, this); |
| + this._workspace.addEventListener(Workspace.Workspace.Events.WorkingCopyCommitted, this._uiSourceCodeChanged, this); |
| + this._workspace.addEventListener(Workspace.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAdded, this); |
| + this._workspace.addEventListener(Workspace.Workspace.Events.UISourceCodeRemoved, this._uiSourceCodeRemoved, this); |
| + this._workspace.addEventListener(Workspace.Workspace.Events.ProjectRemoved, this._projectRemoved, this); |
| } |
| /** |
| @@ -36,6 +53,13 @@ WorkspaceDiff.WorkspaceDiff = class { |
| } |
| /** |
| + * @return {!Array<!Workspace.UISourceCode>} |
| + */ |
| + modifiedUISourceCodes() { |
| + return Array.from(this._modifiedUISourceCodes); |
|
luoe
2017/03/23 21:59:59
Do we need it to be an array? Passing the set sho
einbinder
2017/03/28 00:07:12
I don't want to expose the actual set, and as long
|
| + } |
| + |
| + /** |
| * @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) { |
| + this._markAsUnmodified(uiSourceCode); |
| + return; |
| + } |
| + if (uiSourceCode.isDirty()) { |
| + this._markAsModified(uiSourceCode); |
| + return; |
| + } |
| + if (!uiSourceCode.history().length) { |
| + this._markAsUnmodified(uiSourceCode); |
| + return; |
| + } |
| + |
| + var id = this._loadingUISourceCodesId++; |
| + this._loadingUISourceCodes.set(uiSourceCode, id); |
| + var originalContent = await uiSourceCode.requestOriginalContent(); |
| + 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 { |
| + /** |
| + * @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; |
| }; |