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..5b13ba8f65c998b7fef2d71e31c2d0637c304358 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,26 @@ |
| // 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, !Promise<!Array<?string>>>} */ |
|
lushnikov
2017/03/28 03:32:11
nit: let's drop the <array>, you never use it and
einbinder
2017/03/28 23:51:05
Done.
|
| + this._loadingUISourceCodes = new Map(); |
| + |
| + /** @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 +52,13 @@ WorkspaceDiff.WorkspaceDiff = class { |
| } |
| /** |
| + * @return {!Array<!Workspace.UISourceCode>} |
| + */ |
| + modifiedUISourceCodes() { |
| + return Array.from(this._modifiedUISourceCodes); |
| + } |
| + |
| + /** |
| * @param {!Workspace.UISourceCode} uiSourceCode |
| * @return {!WorkspaceDiff.WorkspaceDiff.UISourceCodeDiff} |
| */ |
| @@ -44,6 +67,92 @@ 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); |
| + this._loadingUISourceCodes.delete(uiSourceCode); |
| + } |
| + |
| + /** |
| + * @param {!Common.Event} event |
| + */ |
| + _projectRemoved(event) { |
| + var project = /** @type {!Workspace.Project} */ (event.data); |
| + for (var uiSourceCode of project.uiSourceCodes()) { |
| + this._markAsUnmodified(uiSourceCode); |
| + this._loadingUISourceCodes.delete(uiSourceCode); |
| + } |
| + } |
| + |
| + /** |
| + * @param {!Workspace.UISourceCode} uiSourceCode |
| + */ |
| + _markAsUnmodified(uiSourceCode) { |
| + if (this._modifiedUISourceCodes.delete(uiSourceCode)) |
| + this.emit(new WorkspaceDiff.ModifiedStatusChangedEvent(uiSourceCode, false)); |
| + } |
| + |
| + /** |
| + * @param {!Workspace.UISourceCode} uiSourceCode |
| + */ |
| + _markAsModified(uiSourceCode) { |
| + if (this._modifiedUISourceCodes.has(uiSourceCode)) |
| + return; |
| + this._modifiedUISourceCodes.add(uiSourceCode); |
| + this.emit(new WorkspaceDiff.ModifiedStatusChangedEvent(uiSourceCode, true)); |
| + } |
| + |
| + /** |
| + * @param {!Workspace.UISourceCode} uiSourceCode |
| + */ |
| + async _refreshUISourceCode(uiSourceCode) { |
|
lushnikov
2017/03/28 03:32:11
_updateModifiedState
einbinder
2017/03/28 23:51:05
Done.
|
| + this._loadingUISourceCodes.delete(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 contentsPromise = Promise.all([uiSourceCode.requestOriginalContent(), uiSourceCode.requestContent()]); |
| + this._loadingUISourceCodes.set(uiSourceCode, contentsPromise); |
| + var contents = await contentsPromise; |
| + if (this._loadingUISourceCodes.get(uiSourceCode) !== contentsPromise) |
| + return; |
| + this._loadingUISourceCodes.delete(uiSourceCode); |
| + |
| + if (contents[0] !== null && contents[1] !== null && contents[0] !== contents[1]) |
| + this._markAsModified(uiSourceCode); |
| + else |
| + this._markAsUnmodified(uiSourceCode); |
| + } |
| }; |
| WorkspaceDiff.WorkspaceDiff.UISourceCodeDiff = class extends Common.Object { |
| @@ -108,11 +217,37 @@ WorkspaceDiff.WorkspaceDiff.UISourceCodeDiff = class extends Common.Object { |
| WorkspaceDiff.DiffChangedEvent = class {}; |
| /** |
| + * @implements {Common.Emittable} |
| + */ |
| +WorkspaceDiff.UnmodifiedEvent = class { |
|
lushnikov
2017/03/28 03:32:11
unused
einbinder
2017/03/28 23:51:05
Done.
|
| + /** |
| + * @param {!Workspace.UISourceCode} uiSourceCode |
| + */ |
| + constructor(uiSourceCode) { |
| + this.uiSourceCode = uiSourceCode; |
| + } |
| +}; |
| + |
| +/** |
| + * @implements {Common.Emittable} |
| + */ |
| +WorkspaceDiff.ModifiedStatusChangedEvent = class { |
| + /** |
| + * @param {!Workspace.UISourceCode} uiSourceCode |
| + * @param {boolean} status |
| + */ |
| + constructor(uiSourceCode, status) { |
| + this.uiSourceCode = uiSourceCode; |
| + this.status = status; |
|
lushnikov
2017/03/28 03:32:11
this.isModified
einbinder
2017/03/28 23:51:04
Done.
|
| + } |
| +}; |
| + |
| +/** |
| * @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; |
| }; |