Index: chrome/browser/resources/file_manager/js/file_manager.js |
diff --git a/chrome/browser/resources/file_manager/js/file_manager.js b/chrome/browser/resources/file_manager/js/file_manager.js |
index ce566b237d5e1a4fdc4a96bb49454ec02cb1942e..add59ae0c240fbc62c2f702ab688d706d6134832 100644 |
--- a/chrome/browser/resources/file_manager/js/file_manager.js |
+++ b/chrome/browser/resources/file_manager/js/file_manager.js |
@@ -482,7 +482,7 @@ FileManager.prototype = { |
(this.dialogType_ == FileManager.DialogType.FULL_PAGE || |
this.dialogType_ == FileManager.DialogType.SELECT_OPEN_MULTI_FILE); |
- this.table_.list.startBatchUpdates(); |
+ this.table_.startBatchUpdates(); |
this.grid_.startBatchUpdates(); |
this.initFileList_(); |
@@ -550,7 +550,7 @@ FileManager.prototype = { |
this.createMetadataProvider_(); |
- this.table_.list.endBatchUpdates(); |
+ this.table_.endBatchUpdates(); |
this.grid_.endBatchUpdates(); |
metrics.recordInterval('Load.DOM'); |
@@ -761,7 +761,9 @@ FileManager.prototype = { |
// TODO(dgozman): add "Add a drive" item. |
this.rootsList_.dataModel = this.directoryModel_.rootsList; |
- this.directoryModel_.updateRoots(); |
+ this.directoryModel_.updateRoots(function() { |
+ self.rootsList_.endBatchUpdates(); |
+ }); |
}; |
FileManager.prototype.initGData_ = function() { |
@@ -1400,6 +1402,14 @@ FileManager.prototype = { |
* window has neither. |
*/ |
FileManager.prototype.setupCurrentDirectory_ = function() { |
+ // Avoid a bunch of intermediate list redraws while the data model is |
+ // cleared and updated. Note that it may (or may not) be desirable to draw |
+ // partial results as we get them, but today the DirectoryReader API |
+ // generally returns all entries in one chunk so even without this batching |
+ // we wouldn't have incremental updates. |
+ this.table_.startBatchUpdates(); |
+ var onLoaded = this.table_.endBatchUpdates.bind(this.table_); |
+ |
if (location.hash) { |
// Location hash has the highest priority. |
var path = decodeURI(location.hash.substr(1)); |
@@ -1415,10 +1425,15 @@ FileManager.prototype = { |
this.document_.body.appendChild(shade); |
function removeShade() { shade.parentNode.removeChild(shade) } |
+ // Keep track of whether the path is identified as an existing leaf |
+ // node. Note that onResolve is guaranteed to be called (exactly once) |
+ // before onLoadedActivateLeaf. |
+ var foundLeaf = true; |
Rick Byers
2012/03/02 00:19:46
Here's where I handled the special 'onFileSelected
|
function onResolve(baseName, leafName, exists) { |
if (!exists || leafName == '') { |
// Non-existent file or a directory. Remove the shade immediately. |
removeShade(); |
+ foundLeaf = false; |
} |
} |
@@ -1426,33 +1441,38 @@ FileManager.prototype = { |
// of urls instead of a selection. This will remove the need to wait |
// until the selection is done. |
var self = this; |
- function onFileSelected() { |
- self.dispatchDefaultTask_(); |
- setTimeout(removeShade, 1000); |
+ function onLoadedActivateLeaf() { |
+ onLoaded(); |
+ if (foundLeaf) { |
+ self.dispatchDefaultTask_(); |
+ setTimeout(removeShade, 1000); |
+ } |
} |
- this.directoryModel_.setupPath(path, onResolve, onFileSelected); |
+ this.directoryModel_.setupPath(path, onLoadedActivateLeaf, onResolve); |
+ |
return; |
} |
- this.directoryModel_.setupPath(path); |
+ this.directoryModel_.setupPath(path, onLoaded); |
return; |
} |
if (this.params_.defaultPath) { |
var path = this.params_.defaultPath; |
if (this.dialogType_ == FileManager.DialogType.SELECT_SAVEAS_FILE) { |
- this.directoryModel_.setupPath(path, function(basePath, leafName) { |
- this.filenameInput_.value = leafName; |
- this.selectDefaultPathInFilenameInput_(); |
- }.bind(this)); |
+ this.directoryModel_.setupPath(path, onLoaded, |
+ function(basePath, leafName) { |
+ this.filenameInput_.value = leafName; |
+ this.selectDefaultPathInFilenameInput_(); |
+ }.bind(this)); |
return; |
} |
- this.directoryModel_.setupPath(path); |
+ this.directoryModel_.setupPath(path, onLoaded); |
return; |
} |
- this.directoryModel_.setupDefaultPath(); |
+ this.directoryModel_.setupDefaultPath(onLoaded); |
}; |
/** |
@@ -2401,7 +2421,11 @@ FileManager.prototype = { |
// Even if something failed root list should be rescanned. |
// Failed mounts can "give" us new devices which might be formatted, |
// so we have to refresh root list then. |
- self.directoryModel_.updateRoots(changeDirectoryTo); |
+ self.directoryModel_.updateRoots(function() { |
+ if (changeDirectoryTo) { |
+ self.directoryModel_.changeDirectory(changeDirectoryTo); |
+ } |
+ }); |
}); |
}; |