Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(371)

Unified Diff: third_party/WebKit/Source/devtools/front_end/workspace_diff/WorkspaceDiff.js

Issue 2772643002: DevTools: Changes View (Closed)
Patch Set: no highlighting Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
};

Powered by Google App Engine
This is Rietveld 408576698