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 9c7d42e4e8ddd67aa2db390c63d6ebc4cea36ad7..dcda6053a0a53d24ccfcc00723d5285b0aec96bf 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>} */ |
| + 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._updateModifiedState.bind(this)); |
| } |
| /** |
| @@ -36,6 +52,13 @@ WorkspaceDiff.WorkspaceDiff = class { |
| } |
| /** |
| + * @return {!Array<!Workspace.UISourceCode>} |
| + */ |
| + modifiedUISourceCodes() { |
| + return Array.from(this._modifiedUISourceCodes); |
|
luoe
2017/03/29 18:25:42
If ChangesSidebar just adds each modified UISC, is
einbinder
2017/03/29 19:06:41
It is copied for safety, and then an array is fast
|
| + } |
| + |
| + /** |
| * @param {!Workspace.UISourceCode} uiSourceCode |
| * @return {!WorkspaceDiff.WorkspaceDiff.UISourceCodeDiff} |
| */ |
| @@ -44,6 +67,97 @@ 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._updateModifiedState(uiSourceCode); |
| + } |
| + |
| + /** |
| + * @param {!Common.Event} event |
| + */ |
| + _uiSourceCodeAdded(event) { |
| + var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data); |
| + this._updateModifiedState(uiSourceCode); |
| + } |
| + |
| + /** |
| + * @param {!Common.Event} event |
| + */ |
| + _uiSourceCodeRemoved(event) { |
| + var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data); |
| + this._loadingUISourceCodes.delete(uiSourceCode); |
| + this._markAsUnmodified(uiSourceCode); |
| + } |
| + |
| + /** |
| + * @param {!Common.Event} event |
| + */ |
| + _projectRemoved(event) { |
| + var project = /** @type {!Workspace.Project} */ (event.data); |
| + for (var uiSourceCode of project.uiSourceCodes()) { |
| + this._loadingUISourceCodes.delete(uiSourceCode); |
| + this._markAsUnmodified(uiSourceCode); |
| + } |
| + } |
| + |
| + /** |
| + * @param {!Workspace.UISourceCode} uiSourceCode |
| + */ |
| + _markAsUnmodified(uiSourceCode) { |
| + this._uiSourceCodeProcessedForTest(); |
| + if (this._modifiedUISourceCodes.delete(uiSourceCode)) |
| + this.dispatchEventToListeners(WorkspaceDiff.Events.ModifiedStatusChanged, {uiSourceCode, isModified: false}); |
| + } |
| + |
| + /** |
| + * @param {!Workspace.UISourceCode} uiSourceCode |
| + */ |
| + _markAsModified(uiSourceCode) { |
| + this._uiSourceCodeProcessedForTest(); |
| + if (this._modifiedUISourceCodes.has(uiSourceCode)) |
| + return; |
| + this._modifiedUISourceCodes.add(uiSourceCode); |
| + this.dispatchEventToListeners(WorkspaceDiff.Events.ModifiedStatusChanged, {uiSourceCode, isModified: true}); |
| + } |
| + |
| + _uiSourceCodeProcessedForTest() { |
| + } |
| + |
| + /** |
| + * @param {!Workspace.UISourceCode} uiSourceCode |
| + */ |
| + async _updateModifiedState(uiSourceCode) { |
| + 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 { |
| @@ -106,7 +220,8 @@ WorkspaceDiff.WorkspaceDiff.UISourceCodeDiff = class extends Common.Object { |
| * @enum {symbol} |
| */ |
| WorkspaceDiff.Events = { |
| - DiffChanged: Symbol('DiffChanged') |
| + DiffChanged: Symbol('DiffChanged'), |
| + ModifiedStatusChanged: Symbol('ModifiedStatusChanged') |
| }; |
| /** |
| @@ -114,7 +229,7 @@ WorkspaceDiff.Events = { |
| */ |
| 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; |
| }; |