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

Unified Diff: ui/file_manager/file_manager/foreground/js/directory_tree.js

Issue 593573003: Populate volume items without resolving their display roots. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase and update browser_tests. Created 6 years, 3 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: ui/file_manager/file_manager/foreground/js/directory_tree.js
diff --git a/ui/file_manager/file_manager/foreground/js/directory_tree.js b/ui/file_manager/file_manager/foreground/js/directory_tree.js
index e7295885e4df0f2b11ed805d8b2cb31951437985..3597c65d20348101b794542cf34dec62d9e0acc1 100644
--- a/ui/file_manager/file_manager/foreground/js/directory_tree.js
+++ b/ui/file_manager/file_manager/foreground/js/directory_tree.js
@@ -407,23 +407,22 @@ DirectoryItem.prototype.activate = function() {
* A TreeItem which represents a volume. Volume items are displayed as
* top-level children of DirectoryTree.
*
- * @param {DirectoryEntry} entry DirectoryEntry of this item.
* @param {NavigationModelItem} modelItem NavigationModelItem of this volume.
* @param {DirectoryTree} tree Current tree, which contains this item.
* @extends {cr.ui.TreeItem}
* @constructor
*/
-function VolumeItem(entry, modelItem, tree) {
+function VolumeItem(modelItem, tree) {
var item = new cr.ui.TreeItem();
item.__proto__ = VolumeItem.prototype;
- item.decorate(entry, modelItem, tree);
+ item.decorate(modelItem, tree);
return item;
}
VolumeItem.prototype = {
__proto__: cr.ui.TreeItem.prototype,
get entry() {
- return this.dirEntry_;
+ return this.volumeInfo_.displayRoot;
},
get modelItem() {
return this.modelItem_;
@@ -460,14 +459,12 @@ VolumeItem.prototype.searchAndSelectByEntry = function(entry) {
/**
* Decorates this element.
- * @param {DirectoryEntry} entry DirectoryEntry of this item.
* @param {NavigationModelItem} modelItem NavigationModelItem of this volume.
* @param {DirectoryTree} tree Current tree, which contains this item.
*/
-VolumeItem.prototype.decorate = function(entry, modelItem, tree) {
+VolumeItem.prototype.decorate = function(modelItem, tree) {
this.innerHTML = TREE_ITEM_INNTER_HTML;
this.parentTree_ = tree;
- this.dirEntry_ = entry;
this.modelItem_ = modelItem;
this.volumeInfo_ = modelItem.volumeInfo;
this.label = modelItem.volumeInfo.label;
@@ -477,7 +474,10 @@ VolumeItem.prototype.decorate = function(entry, modelItem, tree) {
if (tree.contextMenuForRootItems)
this.setContextMenu(tree.contextMenuForRootItems);
- this.updateSubDirectories(false /* recursive */);
+ // Populate children of this volume using resolved display root.
+ this.volumeInfo_.resolveDisplayRoot(function(displayRoot) {
+ this.updateSubDirectories(false /* recursive */);
+ }.bind(this));
};
/**
@@ -499,8 +499,11 @@ VolumeItem.prototype.handleClick = function(e) {
// If the Drive volume is clicked, select one of the children instead of this
// item itself.
- if (this.isDrive())
- this.searchAndSelectByEntry(this.entry);
+ if (this.isDrive()) {
+ this.volumeInfo_.resolveDisplayRoot(function(displayRoot) {
+ this.searchAndSelectByEntry(displayRoot);
+ }.bind(this));
+ }
};
/**
@@ -509,7 +512,7 @@ VolumeItem.prototype.handleClick = function(e) {
*/
VolumeItem.prototype.updateSubDirectories = function(recursive) {
// Drive volume has children including fake entries (offline, recent, etc...).
- if (this.isDrive() && !this.hasChildren) {
+ if (this.isDrive() && this.entry && !this.hasChildren) {
var entries = [this.entry];
if (this.parentTree_.fakeEntriesVisible_) {
for (var key in this.volumeInfo.fakeEntries)
@@ -577,6 +580,9 @@ VolumeItem.prototype.activate = function() {
metrics.recordUserAction('FolderShortcut.Navigate');
directoryModel.changeDirectoryEntry(entry);
}
+ // In case of failure in resolveDisplayRoot() in the volume's decorate(),
+ // update the volume's children here.
+ this.updateSubDirectories(false);
}.bind(this);
this.volumeInfo.resolveDisplayRoot(
@@ -661,16 +667,15 @@ VolumeItem.prototype.setupEjectButton_ = function(rowElement) {
* A TreeItem which represents a shortcut for Drive folder.
* Shortcut items are displayed as top-level children of DirectoryTree.
*
- * @param {DirectoryEntry} dirEntry DirectoryEntry of this item.
* @param {NavigationModelItem} modelItem NavigationModelItem of this volume.
* @param {DirectoryTree} tree Current tree, which contains this item.
* @extends {cr.ui.TreeItem}
* @constructor
*/
-function ShortcutItem(dirEntry, modelItem, tree) {
+function ShortcutItem(modelItem, tree) {
var item = new cr.ui.TreeItem();
item.__proto__ = ShortcutItem.prototype;
- item.decorate(dirEntry, modelItem, tree);
+ item.decorate(modelItem, tree);
return item;
}
@@ -702,15 +707,14 @@ ShortcutItem.prototype.searchAndSelectByEntry = function(entry) {
/**
* Decorates this element.
- * @param {DirectoryEntry} dirEntry DirectoryEntry of this item.
* @param {NavigationModelItem} modelItem NavigationModelItem of this volume.
* @param {DirectoryTree} tree Current tree, which contains this item.
*/
-ShortcutItem.prototype.decorate = function(dirEntry, modelItem, tree) {
+ShortcutItem.prototype.decorate = function(modelItem, tree) {
this.innerHTML = TREE_ITEM_INNTER_HTML;
this.parentTree_ = tree;
- this.label = dirEntry.name;
- this.dirEntry_ = dirEntry;
+ this.label = modelItem.entry.name;
+ this.dirEntry_ = modelItem.entry;
this.modelItem_ = modelItem;
var icon = this.querySelector('.icon');
@@ -877,12 +881,13 @@ cr.defineProperty(DirectoryTree, 'contextMenuForRootItems', cr.PropertyKind.JS);
* only immediate child directories without arrows.
*/
DirectoryTree.prototype.updateSubElementsFromList = function(recursive) {
- // First, current items which is not included in the models_[] should be
+ // First, current items which is not included in the dataModel should be
// removed.
for (var i = 0; i < this.items.length;) {
var found = false;
- for (var j = 0; j < this.models_.length; j++) {
- if (util.isSameEntry(this.items[i].entry, this.models_[j].entry)) {
+ for (var j = 0; j < this.dataModel.length; j++) {
+ if (NavigationModelItem.isSame(this.items[i].modelItem,
+ this.dataModel.item(j))) {
found = true;
break;
}
@@ -896,24 +901,21 @@ DirectoryTree.prototype.updateSubElementsFromList = function(recursive) {
}
}
- // Next, insert items which is in models_[] but not in current items.
+ // Next, insert items which is in dataModel but not in current items.
var modelIndex = 0;
var itemIndex = 0;
- while (modelIndex < this.models_.length) {
+ while (modelIndex < this.dataModel.length) {
if (itemIndex < this.items.length &&
- util.isSameEntry(this.items[itemIndex].entry,
- this.models_[modelIndex].entry)) {
+ NavigationModelItem.isSame(this.items[itemIndex].modelItem,
+ this.dataModel.item(modelIndex))) {
if (recursive && this.items[itemIndex] instanceof VolumeItem)
this.items[itemIndex].updateSubDirectories(true);
} else {
- var model = this.models_[modelIndex];
- if (model.modelItem.isVolume) {
- this.addAt(new VolumeItem(model.entry, model.modelItem, this),
- itemIndex);
- } else {
- this.addAt(new ShortcutItem(model.entry, model.modelItem, this),
- itemIndex);
- }
+ var modelItem = this.dataModel.item(modelIndex);
+ if (modelItem.isVolume)
+ this.addAt(new VolumeItem(modelItem, this), itemIndex);
+ else
+ this.addAt(new ShortcutItem(modelItem, this), itemIndex);
}
itemIndex++;
modelIndex++;
@@ -1046,33 +1048,9 @@ DirectoryTree.prototype.selectByIndex = function(index) {
*/
DirectoryTree.prototype.updateSubDirectories = function(
recursive, opt_callback) {
- var callback = opt_callback || function() {};
-
- // Resolves all root entries for model items.
- var itemPromises = [];
- for (var i = 0; i < this.dataModel.length; i++) {
- if (this.dataModel.item(i).isVolume) {
- // Volume's root entries need to be resolved.
- itemPromises.push(new Promise(function(resolve, reject) {
- var modelItem = this.dataModel.item(i);
- modelItem.volumeInfo.resolveDisplayRoot(function(entry) {
- resolve({entry: entry, modelItem: modelItem});
- });
- }.bind(this)));
- } else {
- // Shortcuts' root entries can be obtained immediately.
- itemPromises.push(Promise.resolve({
- entry: this.dataModel.item(i).entry,
- modelItem: this.dataModel.item(i)}));
- }
- }
-
- // Redraws this tree using resolved root entries and volume info.
- Promise.all(itemPromises).then(function(results) {
- this.models_ = results;
- this.redraw(recursive);
- callback();
- }.bind(this));
+ this.redraw(recursive);
+ if (opt_callback)
+ opt_callback();
};
/**

Powered by Google App Engine
This is Rietveld 408576698