| 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);
|
| + }
|
| +
|
| + /**
|
| * @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;
|
| };
|
|
|
|
|