| Index: chrome/browser/resources/file_manager/foreground/js/directory_tree.js
|
| diff --git a/chrome/browser/resources/file_manager/foreground/js/directory_tree.js b/chrome/browser/resources/file_manager/foreground/js/directory_tree.js
|
| index 9869f9597132031120e107bdec1932e9af375258..3ee73c17120e01a6c9b9958baede3c3ffef6b26a 100644
|
| --- a/chrome/browser/resources/file_manager/foreground/js/directory_tree.js
|
| +++ b/chrome/browser/resources/file_manager/foreground/js/directory_tree.js
|
| @@ -50,9 +50,11 @@ DirectoryItemTreeBaseMethods.updateSubElementsFromList = function(recursive) {
|
| while (this.entries_[index]) {
|
| var currentEntry = this.entries_[index];
|
| var currentElement = this.items[index];
|
| + // TODO(mtomasz): Stop using full paths, and use getLocationInfo() instead.
|
| + var label = PathUtil.getFolderLabel(currentEntry.fullPath);
|
|
|
| if (index >= this.items.length) {
|
| - var item = new DirectoryItem(currentEntry, this, tree);
|
| + var item = new DirectoryItem(label, currentEntry, this, tree);
|
| this.add(item);
|
| index++;
|
| } else if (currentEntry.fullPath == currentElement.fullPath) {
|
| @@ -61,7 +63,7 @@ DirectoryItemTreeBaseMethods.updateSubElementsFromList = function(recursive) {
|
|
|
| index++;
|
| } else if (currentEntry.fullPath < currentElement.fullPath) {
|
| - var item = new DirectoryItem(currentEntry, this, tree);
|
| + var item = new DirectoryItem(label, currentEntry, this, tree);
|
| this.addAt(item, index);
|
| index++;
|
| } else if (currentEntry.fullPath > currentElement.fullPath) {
|
| @@ -109,29 +111,31 @@ Object.freeze(DirectoryItemTreeBaseMethods);
|
| /**
|
| * A directory in the tree. Each element represents one directory.
|
| *
|
| + * @param {string} label Label for this item.
|
| * @param {DirectoryEntry} dirEntry DirectoryEntry of this item.
|
| * @param {DirectoryItem|DirectoryTree} parentDirItem Parent of this item.
|
| * @param {DirectoryTree} tree Current tree, which contains this item.
|
| * @extends {cr.ui.TreeItem}
|
| * @constructor
|
| */
|
| -function DirectoryItem(dirEntry, parentDirItem, tree) {
|
| +function DirectoryItem(label, dirEntry, parentDirItem, tree) {
|
| var item = cr.doc.createElement('div');
|
| - DirectoryItem.decorate(item, dirEntry, parentDirItem, tree);
|
| + DirectoryItem.decorate(item, label, dirEntry, parentDirItem, tree);
|
| return item;
|
| }
|
|
|
| /**
|
| * @param {HTMLElement} el Element to be DirectoryItem.
|
| + * @param {string} label Label for this item.
|
| * @param {DirectoryEntry} dirEntry DirectoryEntry of this item.
|
| * @param {DirectoryItem|DirectoryTree} parentDirItem Parent of this item.
|
| * @param {DirectoryTree} tree Current tree, which contains this item.
|
| */
|
| DirectoryItem.decorate =
|
| - function(el, dirEntry, parentDirItem, tree) {
|
| + function(el, label, dirEntry, parentDirItem, tree) {
|
| el.__proto__ = DirectoryItem.prototype;
|
| (/** @type {DirectoryItem} */ el).decorate(
|
| - dirEntry, parentDirItem, tree);
|
| + label, dirEntry, parentDirItem, tree);
|
| };
|
|
|
| DirectoryItem.prototype = {
|
| @@ -178,12 +182,13 @@ DirectoryItem.prototype.searchAndSelectByEntry = function(entry) {
|
| };
|
|
|
| /**
|
| + * @param {string} label Localized label for this item.
|
| * @param {DirectoryEntry} dirEntry DirectoryEntry of this item.
|
| * @param {DirectoryItem|DirectoryTree} parentDirItem Parent of this item.
|
| * @param {DirectoryTree} tree Current tree, which contains this item.
|
| */
|
| DirectoryItem.prototype.decorate = function(
|
| - dirEntry, parentDirItem, tree) {
|
| + label, dirEntry, parentDirItem, tree) {
|
| this.className = 'tree-item';
|
| this.innerHTML =
|
| '<div class="tree-row">' +
|
| @@ -197,7 +202,7 @@ DirectoryItem.prototype.decorate = function(
|
| this.parentTree_ = tree;
|
| this.directoryModel_ = tree.directoryModel;
|
| this.parent_ = parentDirItem;
|
| - this.label = dirEntry.label || dirEntry.name;
|
| + this.label = label;
|
| this.fullPath = dirEntry.fullPath;
|
| this.dirEntry_ = dirEntry;
|
| this.fileFilter_ = this.directoryModel_.getFileFilter();
|
| @@ -511,14 +516,6 @@ DirectoryTree.prototype.decorate = function(directoryModel, volumeManager) {
|
|
|
| this.scrollBar_ = MainPanelScrollBar();
|
| this.scrollBar_.initialize(this.parentNode, this);
|
| -
|
| - // Once, draws the list with the fake '/drive/' entry.
|
| - this.redraw(false /* recursive */);
|
| - // Resolves 'My Drive' entry and replaces the fake with the true one.
|
| - this.maybeResolveMyDriveRoot_(function() {
|
| - // After the true entry is resolved, draws the list again.
|
| - this.redraw(true /* recursive */);
|
| - }.bind(this));
|
| };
|
|
|
| /**
|
| @@ -531,74 +528,56 @@ DirectoryTree.prototype.selectByEntry = function(entry) {
|
| if (!DirectoryTreeUtil.isEligiblePathForDirectoryTree(entry.fullPath))
|
| return;
|
|
|
| - this.maybeResolveMyDriveRoot_(function() {
|
| - if (this.selectedItem && util.isSameEntry(entry, this.selectedItem.entry))
|
| - return;
|
| -
|
| - if (this.searchAndSelectByEntry(entry))
|
| - return;
|
| -
|
| - this.selectedItem = null;
|
| - this.updateSubDirectories(
|
| - false /* recursive */,
|
| - // Success callback, failure is not handled.
|
| - function() {
|
| - if (!this.searchAndSelectByEntry(entry))
|
| - this.selectedItem = null;
|
| - }.bind(this));
|
| - }.bind(this));
|
| -};
|
| -
|
| -/**
|
| - * Resolves the My Drive root's entry, if it is a fake. If the entry is already
|
| - * resolved to a DirectoryEntry, completionCallback() will be called
|
| - * immediately.
|
| - * @param {function()} completionCallback Called when the resolving is
|
| - * done (or the entry is already resolved), regardless if it is
|
| - * successfully done or not.
|
| - * @private
|
| - */
|
| -DirectoryTree.prototype.maybeResolveMyDriveRoot_ = function(
|
| - completionCallback) {
|
| - var myDriveItem = this.items[0];
|
| - if (!myDriveItem || !util.isFakeEntry(myDriveItem.entry)) {
|
| - // The entry is already resolved. Don't need to try again.
|
| - completionCallback();
|
| + var volumeInfo = this.volumeManager_.getVolumeInfo(entry);
|
| + if (this.selectedItem && util.isSameEntry(entry, this.selectedItem.entry))
|
| return;
|
| - }
|
|
|
| - // The entry is a fake.
|
| - this.directoryModel_.resolveDirectory(
|
| - myDriveItem.fullPath,
|
| - function(entry) {
|
| - if (!util.isFakeEntry(entry))
|
| - myDriveItem.dirEntry_ = entry;
|
| + if (this.searchAndSelectByEntry(entry))
|
| + return;
|
|
|
| - completionCallback();
|
| - },
|
| - completionCallback);
|
| + this.updateSubDirectories(false /* recursive */);
|
| + // TODO(yoshiki, mtomasz): There may be a race in here.
|
| + volumeInfo.resolveDisplayRoot(function() {
|
| + if (!this.searchAndSelectByEntry(entry))
|
| + this.selectedItem = null;
|
| + }.bind(this));
|
| };
|
|
|
| /**
|
| * Retrieves the latest subdirectories and update them on the tree.
|
| + *
|
| * @param {boolean} recursive True if the update is recursively.
|
| - * @param {function()=} opt_successCallback Callback called on success.
|
| - * @param {function()=} opt_errorCallback Callback called on error.
|
| + * @param {function()=} opt_callback Called when subdirectories are fully
|
| + * updated.
|
| */
|
| DirectoryTree.prototype.updateSubDirectories = function(
|
| - recursive, opt_successCallback, opt_errorCallback) {
|
| - var hasFakeEntries = this.currentVolumeInfo_ &&
|
| - this.currentVolumeInfo_.volumeType === util.VolumeType.DRIVE;
|
| - this.entries_ = hasFakeEntries ? [
|
| - this.currentVolumeInfo_.fakeEntries[RootType.DRIVE],
|
| - this.currentVolumeInfo_.fakeEntries[RootType.DRIVE_OFFLINE],
|
| - this.currentVolumeInfo_.fakeEntries[RootType.DRIVE_SHARED_WITH_ME],
|
| - this.currentVolumeInfo_.fakeEntries[RootType.DRIVE_RECENT]
|
| - ] : [];
|
| -
|
| - this.redraw(recursive);
|
| - if (opt_successCallback)
|
| - opt_successCallback();
|
| + recursive, opt_callback) {
|
| + var callback = opt_callback || function() {};
|
| + this.entries_ = [];
|
| +
|
| + var compareEntries = function(a, b) {
|
| + return a.toURL() < b.toURL();
|
| + };
|
| +
|
| + // Add fakes (if any).
|
| + for (var key in this.currentVolumeInfo_.fakeEntries) {
|
| + this.entries_.push(this.currentVolumeInfo_.fakeEntries[key]);
|
| + }
|
| +
|
| + // If the display root is not available yet, then redraw anyway with what
|
| + // we have. However, concurrently try to resolve the display root and then
|
| + // redraw.
|
| + if (!this.currentVolumeInfo_.displayRoot) {
|
| + this.entries_.sort(compareEntries);
|
| + this.redraw(recursive);
|
| + }
|
| +
|
| + this.currentVolumeInfo_.resolveDisplayRoot(function(displayRoot) {
|
| + this.entries_.push(this.currentVolumeInfo_.displayRoot);
|
| + this.entries_.sort(compareEntries);
|
| + this.redraw(recursive); // Redraw.
|
| + callback();
|
| + }.bind(this), callback /* Ignore errors. */);
|
| };
|
|
|
| /**
|
|
|