| Index: ui/file_manager/file_manager/background/js/volume_manager.js
|
| diff --git a/ui/file_manager/file_manager/background/js/volume_manager.js b/ui/file_manager/file_manager/background/js/volume_manager.js
|
| index 329527a4d6ed61d7671219994a9c5630f96eebc7..660ec4dab53c75834ad6b56e89ffb1f6a5d03680 100644
|
| --- a/ui/file_manager/file_manager/background/js/volume_manager.js
|
| +++ b/ui/file_manager/file_manager/background/js/volume_manager.js
|
| @@ -46,6 +46,8 @@ function VolumeInfo(
|
| this.displayRoot_ = null;
|
| this.fakeEntries_ = {};
|
| this.displayRoot_ = null;
|
| +
|
| + /** @type {Promise.<DirectoryEntry>} */
|
| this.displayRootPromise_ = null;
|
|
|
| if (volumeType === VolumeManagerCommon.VolumeType.DRIVE) {
|
| @@ -168,7 +170,7 @@ VolumeInfo.prototype = /** @struct */ {
|
| * @param {function(DirectoryEntry)=} opt_onSuccess Success callback with the
|
| * display root directory as an argument.
|
| * @param {function(*)=} opt_onFailure Failure callback.
|
| - * @return {Promise}
|
| + * @return {Promise.<DirectoryEntry>}
|
| */
|
| VolumeInfo.prototype.resolveDisplayRoot = function(opt_onSuccess,
|
| opt_onFailure) {
|
| @@ -177,9 +179,11 @@ VolumeInfo.prototype.resolveDisplayRoot = function(opt_onSuccess,
|
| // remove this if logic. Call opt_onSuccess() always, instead.
|
| if (this.volumeType !== VolumeManagerCommon.VolumeType.DRIVE) {
|
| if (this.fileSystem_)
|
| - this.displayRootPromise_ = Promise.resolve(this.fileSystem_.root);
|
| + this.displayRootPromise_ = /** @type {Promise.<DirectoryEntry>} */ (
|
| + Promise.resolve(this.fileSystem_.root));
|
| else
|
| - this.displayRootPromise_ = Promise.reject(this.error);
|
| + this.displayRootPromise_ = /** @type {Promise.<DirectoryEntry>} */ (
|
| + Promise.reject(this.error));
|
| } else {
|
| // For Drive, we need to resolve.
|
| var displayRootURL = this.fileSystem_.root.toURL() + '/root';
|
| @@ -351,6 +355,9 @@ function VolumeInfoList() {
|
| (volumeManagerUtil.compareVolumeInfo_));
|
| this.model_.sort(field, 'asc');
|
|
|
| + /** @private {!Object.<string, !importer.Resolver.<!VolumeInfo>>} */
|
| + this.volumeInfoResolvers_ = {};
|
| +
|
| Object.freeze(this);
|
| }
|
|
|
| @@ -387,6 +394,14 @@ VolumeInfoList.prototype.add = function(volumeInfo) {
|
| this.model_.splice(index, 1, volumeInfo);
|
| else
|
| this.model_.push(volumeInfo);
|
| +
|
| + // Some folks might be expecting this volume to be initialized soon.
|
| + // In that case there'll be a resolver function (associated with a promise)
|
| + // waiting for us here.
|
| + var resolver = this.volumeInfoResolvers_[volumeInfo.volumeId];
|
| + if (resolver) {
|
| + resolver.resolve(volumeInfo);
|
| + }
|
| };
|
|
|
| /**
|
| @@ -397,6 +412,9 @@ VolumeInfoList.prototype.remove = function(volumeId) {
|
| var index = this.findIndex(volumeId);
|
| if (index !== -1)
|
| this.model_.splice(index, 1);
|
| +
|
| + // Remove any associated resolvers.
|
| + delete this.volumeInfoResolvers_[volumeId];
|
| };
|
|
|
| /**
|
| @@ -451,6 +469,43 @@ VolumeInfoList.prototype.findByDevicePath = function(devicePath) {
|
| };
|
|
|
| /**
|
| + * Returns a VolumInfo for the volume ID, or null if not found.
|
| + *
|
| + * @param {string} volumeId
|
| + * @return {VolumeInfo} The volume's information, or null if not found.
|
| + * @private
|
| + */
|
| +VolumeInfoList.prototype.findByVolumeId_ = function(volumeId) {
|
| + var index = this.findIndex(volumeId);
|
| + return (index !== -1) ?
|
| + /** @type {VolumeInfo} */ (this.model_.item(index)) :
|
| + null;
|
| +};
|
| +
|
| +/**
|
| + * Returns a promise that will be resolved when volume info, identified
|
| + * by {@code volumeId} is created.
|
| + *
|
| + * @param {string} volumeId
|
| + * @return {!Promise.<!VolumeInfo>} The VolumeInfo. Will not resolve
|
| + * if the volume is never mounted.
|
| + */
|
| +VolumeInfoList.prototype.whenVolumeInfoReady = function(volumeId) {
|
| + var info = this.findByVolumeId_(volumeId);
|
| + if (!!info) {
|
| + return Promise.resolve(info);
|
| + }
|
| +
|
| + var resolver = this.volumeInfoResolvers_[volumeId];
|
| + if (!resolver) {
|
| + resolver = new importer.Resolver();
|
| + this.volumeInfoResolvers_[volumeId] = resolver;
|
| + }
|
| +
|
| + return resolver.promise;
|
| +};
|
| +
|
| +/**
|
| * @param {number} index The index of the volume in the list.
|
| * @return {!VolumeInfo} The VolumeInfo instance.
|
| */
|
|
|