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

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

Issue 2925023003: DevTools: Avoid a race in WorkspaceDiff when UISourceCodes are removed (Closed)
Patch Set: done Created 3 years, 6 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 unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 5
6 WorkspaceDiff.WorkspaceDiff = class extends Common.Object { 6 WorkspaceDiff.WorkspaceDiff = class extends Common.Object {
7 /** 7 /**
8 * @param {!Workspace.Workspace} workspace 8 * @param {!Workspace.Workspace} workspace
9 */ 9 */
10 constructor(workspace) { 10 constructor(workspace) {
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 _uiSourceCodeAdded(event) { 82 _uiSourceCodeAdded(event) {
83 var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data); 83 var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data);
84 this._updateModifiedState(uiSourceCode); 84 this._updateModifiedState(uiSourceCode);
85 } 85 }
86 86
87 /** 87 /**
88 * @param {!Common.Event} event 88 * @param {!Common.Event} event
89 */ 89 */
90 _uiSourceCodeRemoved(event) { 90 _uiSourceCodeRemoved(event) {
91 var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data); 91 var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data);
92 this._loadingUISourceCodes.delete(uiSourceCode); 92 this._removeUISourceCode(uiSourceCode);
93 this._markAsUnmodified(uiSourceCode);
94 } 93 }
95 94
96 /** 95 /**
97 * @param {!Common.Event} event 96 * @param {!Common.Event} event
98 */ 97 */
99 _projectRemoved(event) { 98 _projectRemoved(event) {
100 var project = /** @type {!Workspace.Project} */ (event.data); 99 var project = /** @type {!Workspace.Project} */ (event.data);
101 for (var uiSourceCode of project.uiSourceCodes()) { 100 for (var uiSourceCode of project.uiSourceCodes())
102 this._loadingUISourceCodes.delete(uiSourceCode); 101 this._removeUISourceCode(uiSourceCode);
103 this._markAsUnmodified(uiSourceCode);
104 }
105 } 102 }
106 103
107 /** 104 /**
105 * @param {!Workspace.UISourceCode} uiSourceCode
106 */
107 _removeUISourceCode(uiSourceCode) {
108 this._loadingUISourceCodes.delete(uiSourceCode);
109 var uiSourceCodeDiff = this._uiSourceCodeDiffs.get(uiSourceCode);
110 if (uiSourceCodeDiff)
111 uiSourceCodeDiff._dispose = true;
112 this._markAsUnmodified(uiSourceCode);
113 }
114
115 /**
108 * @param {!Workspace.UISourceCode} uiSourceCode 116 * @param {!Workspace.UISourceCode} uiSourceCode
109 */ 117 */
110 _markAsUnmodified(uiSourceCode) { 118 _markAsUnmodified(uiSourceCode) {
111 this._uiSourceCodeProcessedForTest(); 119 this._uiSourceCodeProcessedForTest();
112 if (this._modifiedUISourceCodes.delete(uiSourceCode)) 120 if (this._modifiedUISourceCodes.delete(uiSourceCode))
113 this.dispatchEventToListeners(WorkspaceDiff.Events.ModifiedStatusChanged, {uiSourceCode, isModified: false}); 121 this.dispatchEventToListeners(WorkspaceDiff.Events.ModifiedStatusChanged, {uiSourceCode, isModified: false});
114 } 122 }
115 123
116 /** 124 /**
117 * @param {!Workspace.UISourceCode} uiSourceCode 125 * @param {!Workspace.UISourceCode} uiSourceCode
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 /** 172 /**
165 * @param {!Workspace.UISourceCode} uiSourceCode 173 * @param {!Workspace.UISourceCode} uiSourceCode
166 */ 174 */
167 constructor(uiSourceCode) { 175 constructor(uiSourceCode) {
168 super(); 176 super();
169 this._uiSourceCode = uiSourceCode; 177 this._uiSourceCode = uiSourceCode;
170 uiSourceCode.addEventListener(Workspace.UISourceCode.Events.WorkingCopyChang ed, this._uiSourceCodeChanged, this); 178 uiSourceCode.addEventListener(Workspace.UISourceCode.Events.WorkingCopyChang ed, this._uiSourceCodeChanged, this);
171 uiSourceCode.addEventListener(Workspace.UISourceCode.Events.WorkingCopyCommi tted, this._uiSourceCodeChanged, this); 179 uiSourceCode.addEventListener(Workspace.UISourceCode.Events.WorkingCopyCommi tted, this._uiSourceCodeChanged, this);
172 this._requestDiffPromise = null; 180 this._requestDiffPromise = null;
173 this._pendingChanges = null; 181 this._pendingChanges = null;
182 this._dispose = false;
174 } 183 }
175 184
176 _uiSourceCodeChanged() { 185 _uiSourceCodeChanged() {
177 if (this._pendingChanges) { 186 if (this._pendingChanges) {
178 clearTimeout(this._pendingChanges); 187 clearTimeout(this._pendingChanges);
179 this._pendingChanges = null; 188 this._pendingChanges = null;
180 } 189 }
181 this._requestDiffPromise = null; 190 this._requestDiffPromise = null;
182 191
183 var content = this._uiSourceCode.content(); 192 var content = this._uiSourceCode.content();
184 var delay = (!content || content.length < 65536) ? 0 : WorkspaceDiff.Workspa ceDiff.UpdateTimeout; 193 var delay = (!content || content.length < 65536) ? 0 : WorkspaceDiff.Workspa ceDiff.UpdateTimeout;
185 this._pendingChanges = setTimeout(emitDiffChanged.bind(this), delay); 194 this._pendingChanges = setTimeout(emitDiffChanged.bind(this), delay);
186 195
187 /** 196 /**
188 * @this {WorkspaceDiff.WorkspaceDiff.UISourceCodeDiff} 197 * @this {WorkspaceDiff.WorkspaceDiff.UISourceCodeDiff}
189 */ 198 */
190 function emitDiffChanged() { 199 function emitDiffChanged() {
200 if (this._dispose)
201 return;
191 this.dispatchEventToListeners(WorkspaceDiff.Events.DiffChanged); 202 this.dispatchEventToListeners(WorkspaceDiff.Events.DiffChanged);
192 this._pendingChanges = null; 203 this._pendingChanges = null;
193 } 204 }
194 } 205 }
195 206
196 /** 207 /**
197 * @return {!Promise<?Diff.Diff.DiffArray>} 208 * @return {!Promise<?Diff.Diff.DiffArray>}
198 */ 209 */
199 requestDiff() { 210 requestDiff() {
200 if (!this._requestDiffPromise) 211 if (!this._requestDiffPromise)
201 this._requestDiffPromise = this._innerRequestDiff(); 212 this._requestDiffPromise = this._innerRequestDiff();
202 return this._requestDiffPromise; 213 return this._requestDiffPromise;
203 } 214 }
204 215
205 /** 216 /**
206 * @return {!Promise<?Diff.Diff.DiffArray>} 217 * @return {!Promise<?Diff.Diff.DiffArray>}
207 */ 218 */
208 async _innerRequestDiff() { 219 async _innerRequestDiff() {
220 if (this._dispose)
221 return null;
222
209 var current = this._uiSourceCode.workingCopy(); 223 var current = this._uiSourceCode.workingCopy();
210 if (!current && !this._uiSourceCode.contentLoaded()) 224 if (!current && !this._uiSourceCode.contentLoaded())
211 current = await this._uiSourceCode.requestContent(); 225 current = await this._uiSourceCode.requestContent();
226 // ------------ ASYNC ------------
227 if (this._dispose)
228 return null;
229
212 var baseline = await this._uiSourceCode.requestOriginalContent(); 230 var baseline = await this._uiSourceCode.requestOriginalContent();
231 // ------------ ASYNC ------------
232 if (this._dispose)
233 return null;
234
213 if (current === null || baseline === null) 235 if (current === null || baseline === null)
214 return null; 236 return null;
215 return Diff.Diff.lineDiff(baseline.split('\n'), current.split('\n')); 237 return Diff.Diff.lineDiff(baseline.split('\n'), current.split('\n'));
216 } 238 }
217 }; 239 };
218 240
219 /** 241 /**
220 * @enum {symbol} 242 * @enum {symbol}
221 */ 243 */
222 WorkspaceDiff.Events = { 244 WorkspaceDiff.Events = {
223 DiffChanged: Symbol('DiffChanged'), 245 DiffChanged: Symbol('DiffChanged'),
224 ModifiedStatusChanged: Symbol('ModifiedStatusChanged') 246 ModifiedStatusChanged: Symbol('ModifiedStatusChanged')
225 }; 247 };
226 248
227 /** 249 /**
228 * @return {!WorkspaceDiff.WorkspaceDiff} 250 * @return {!WorkspaceDiff.WorkspaceDiff}
229 */ 251 */
230 WorkspaceDiff.workspaceDiff = function() { 252 WorkspaceDiff.workspaceDiff = function() {
231 if (!WorkspaceDiff.WorkspaceDiff._instance) 253 if (!WorkspaceDiff.WorkspaceDiff._instance)
232 WorkspaceDiff.WorkspaceDiff._instance = new WorkspaceDiff.WorkspaceDiff(Work space.workspace); 254 WorkspaceDiff.WorkspaceDiff._instance = new WorkspaceDiff.WorkspaceDiff(Work space.workspace);
233 return WorkspaceDiff.WorkspaceDiff._instance; 255 return WorkspaceDiff.WorkspaceDiff._instance;
234 }; 256 };
235 257
236 WorkspaceDiff.WorkspaceDiff.UpdateTimeout = 200; 258 WorkspaceDiff.WorkspaceDiff.UpdateTimeout = 200;
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698