Skip to content
This repository was archived by the owner on Sep 6, 2021. It is now read-only.

Commit c931ef2

Browse files
committed
Debounce calls to ProjectManager._renderTree.
This is a possible fix for #9851. In my tests, this can cause a dramatic speed up when lots of filesystem changes cause the tree to be continuously rerendered. I chose 100ms as the debounce time because that seemed quick enough that users will not be waiting for their actions to be reflected in the tree.
1 parent 59fb94f commit c931ef2

2 files changed

Lines changed: 29 additions & 2 deletions

File tree

src/project/ProjectManager.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,8 @@ define(function (require, exports, module) {
605605
return null;
606606
};
607607

608+
var _RENDER_DEBOUNCE_TIME = 100;
609+
608610
/**
609611
* @private
610612
*
@@ -621,6 +623,8 @@ define(function (require, exports, module) {
621623
FileTreeView.render(fileTreeViewContainer, model._viewModel, projectRoot, actionCreator, forceRender, brackets.platform);
622624
};
623625

626+
_renderTree = _.debounce(_renderTree, _RENDER_DEBOUNCE_TIME);
627+
624628
/**
625629
* @private
626630
*
@@ -1375,7 +1379,8 @@ define(function (require, exports, module) {
13751379

13761380

13771381
// Private API helpful in testing
1378-
exports._actionCreator = actionCreator;
1382+
exports._actionCreator = actionCreator;
1383+
exports._RENDER_DEBOUNCE_TIME = _RENDER_DEBOUNCE_TIME;
13791384

13801385
// Private API for use with SidebarView
13811386
exports._setFileTreeSelectionWidth = _setFileTreeSelectionWidth;

test/spec/ProjectManager-test.js

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424

2525
/*jslint vars: true, plusplus: true, devel: true, browser: true, nomen: true, indent: 4, maxerr: 50 */
26-
/*global define, describe, it, expect, afterEach, waitsFor, runs, waitsForDone, beforeFirst, afterLast */
26+
/*global $, define, describe, it, expect, afterEach, waitsFor, runs, waitsForDone, beforeFirst, afterLast */
2727

2828
define(function (require, exports, module) {
2929
"use strict";
@@ -367,6 +367,20 @@ define(function (require, exports, module) {
367367
expect($selectedItem.text().trim()).toBe(name);
368368
}
369369
}
370+
371+
/**
372+
* ProjectManager pauses between renders for performance reasons. For some tests,
373+
* we'll need to wait for the next render.
374+
*/
375+
function waitForRenderDebounce() {
376+
runs(function () {
377+
var d = new $.Deferred();
378+
setTimeout(function () {
379+
d.resolve();
380+
}, ProjectManager._RENDER_DEBOUNCE_TIME);
381+
waitsForDone(d.promise());
382+
});
383+
}
370384

371385
it("should deselect after opening file not rendered in tree", function () {
372386
var promise,
@@ -377,12 +391,14 @@ define(function (require, exports, module) {
377391
promise = CommandManager.execute(Commands.FILE_OPEN, { fullPath: exposedFile });
378392
waitsForDone(promise);
379393
});
394+
waitForRenderDebounce();
380395
runs(function () {
381396
expectSelected(exposedFile);
382397

383398
promise = CommandManager.execute(Commands.FILE_OPEN, { fullPath: unexposedFile });
384399
waitsForDone(promise);
385400
});
401+
waitForRenderDebounce();
386402
runs(function () {
387403
expectSelected(null);
388404
});
@@ -429,6 +445,7 @@ define(function (require, exports, module) {
429445
promise = CommandManager.execute(Commands.FILE_OPEN, { fullPath: initialFile });
430446
waitsForDone(promise);
431447
});
448+
waitForRenderDebounce();
432449
runs(function () {
433450
expectSelected(initialFile);
434451
toggleFolder(folder, true); // open folder
@@ -437,13 +454,15 @@ define(function (require, exports, module) {
437454
promise = CommandManager.execute(Commands.FILE_OPEN, { fullPath: fileInFolder });
438455
waitsForDone(promise);
439456
});
457+
waitForRenderDebounce();
440458
runs(function () {
441459
expectSelected(fileInFolder);
442460
toggleFolder(folder, false); // close folder
443461
});
444462
runs(function () {
445463
toggleFolder(folder, true); // open folder again
446464
});
465+
waitForRenderDebounce();
447466
runs(function () {
448467
expectSelected(fileInFolder);
449468
toggleFolder(folder, false); // close folder
@@ -460,6 +479,7 @@ define(function (require, exports, module) {
460479
promise = CommandManager.execute(Commands.FILE_OPEN, { fullPath: initialFile });
461480
waitsForDone(promise);
462481
});
482+
waitForRenderDebounce();
463483
runs(function () {
464484
expectSelected(initialFile);
465485
toggleFolder(folder, true); // open folder
@@ -471,10 +491,12 @@ define(function (require, exports, module) {
471491
promise = CommandManager.execute(Commands.FILE_OPEN, { fullPath: fileInFolder });
472492
waitsForDone(promise);
473493
});
494+
waitForRenderDebounce();
474495
runs(function () {
475496
expectSelected(null);
476497
toggleFolder(folder, true); // open folder again
477498
});
499+
waitForRenderDebounce();
478500
runs(function () {
479501
expectSelected(fileInFolder);
480502
toggleFolder(folder, false); // close folder

0 commit comments

Comments
 (0)