Index: chrome/browser/resources/file_manager/background/js/volume_manager.js |
diff --git a/chrome/browser/resources/file_manager/background/js/volume_manager.js b/chrome/browser/resources/file_manager/background/js/volume_manager.js |
index eeb58782213f2f3dd26eec62f777b27b18ac260f..002b75147d379c7c1ffe767cfe576e4bcef8012b 100644 |
--- a/chrome/browser/resources/file_manager/background/js/volume_manager.js |
+++ b/chrome/browser/resources/file_manager/background/js/volume_manager.js |
@@ -30,40 +30,32 @@ function VolumeInfo( |
deviceType, |
isReadOnly, |
profile) { |
- this.volumeType = volumeType; |
+ this.volumeType_ = volumeType; |
// TODO(hidehiko): This should include FileSystem instance. |
- this.mountPath = mountPath; |
- this.volumeId = volumeId; |
- this.root = root; |
- this.fakeEntries = {}; |
+ this.mountPath_ = mountPath; |
+ this.volumeId_ = volumeId; |
+ this.root_ = root; |
+ this.displayRoot_ = null; |
+ this.fakeEntries_ = {}; |
+ this.resolveQueue_ = new AsyncUtil.Queue(); |
if (volumeType === util.VolumeType.DRIVE) { |
- this.fakeEntries[RootType.DRIVE] = { |
- fullPath: RootDirectory.DRIVE + '/' + DriveSubRootDirectory.ROOT, |
- isDirectory: true, |
- rootType: RootType.DRIVE, |
- label: PathUtil.getRootLabel(RootType.DRIVE), |
- toURL: function() { return 'fake-entry://' + this.fullPath; } |
- }; |
this.fakeEntries[RootType.DRIVE_OFFLINE] = { |
fullPath: RootDirectory.DRIVE_OFFLINE, |
isDirectory: true, |
rootType: RootType.DRIVE_OFFLINE, |
- label: PathUtil.getRootLabel(RootType.DRIVE_OFFLINE), |
toURL: function() { return 'fake-entry://' + this.fullPath; } |
}; |
this.fakeEntries[RootType.DRIVE_SHARED_WITH_ME] = { |
fullPath: RootDirectory.DRIVE_SHARED_WITH_ME, |
isDirectory: true, |
rootType: RootType.DRIVE_SHARED_WITH_ME, |
- label: PathUtil.getRootLabel(RootType.DRIVE_SHARED_WITH_ME), |
toURL: function() { return 'fake-entry://' + this.fullPath; } |
}; |
this.fakeEntries[RootType.DRIVE_RECENT] = { |
fullPath: RootDirectory.DRIVE_RECENT, |
isDirectory: true, |
rootType: RootType.DRIVE_RECENT, |
- label: PathUtil.getRootLabel(RootType.DRIVE_RECENT), |
toURL: function() { return 'fake-entry://' + this.fullPath; } |
}; |
} |
@@ -76,17 +68,86 @@ function VolumeInfo( |
this.isReadOnly = isReadOnly; |
this.profile = Object.freeze(profile); |
- // VolumeInfo is immutable. |
- Object.freeze(this); |
+ Object.seal(this); |
} |
+VolumeInfo.prototype = { |
+ /** |
+ * @return {util.VolumeType} Volume type. |
+ */ |
+ get volumeType() { |
+ return this.volumeType_; |
+ }, |
+ /** |
+ * @return {string} Mount path. |
+ */ |
+ get mountPath() { |
+ return this.mountPath_; |
+ }, |
+ /** |
+ * @return {string} Volume id. |
+ */ |
+ get volumeId() { |
+ return this.volumeId_; |
+ }, |
+ /** |
+ * @return {DirectoryEntry} Root path. |
+ */ |
+ get root() { |
+ return this.root_; |
+ }, |
+ /** |
+ * @return {DirectoryEntry} Display root path. It is null before |
+ * resolveDisplayRoot() is called. |
+ */ |
+ get displayRoot() { |
+ return this.displayRoot_; |
+ }, |
+ /** |
+ * @return {Object.<string, Object>} Fake entries. |
+ */ |
+ get fakeEntries() { |
+ return this.fakeEntries_; |
+ } |
+}; |
+ |
/** |
- * Obtains a URL of the display root directory that users can see as a root. |
- * @return {string} URL of root entry. |
- */ |
-VolumeInfo.prototype.getDisplayRootDirectoryURL = function() { |
- return this.root.toURL() + |
- (this.volumeType === util.VolumeType.DRIVE ? '/root' : ''); |
+ * Obtains the display root of the entry. It may take long time for Drive. Once |
+ * resolved, it is cached. |
+ * |
+ * @param {function(DirectoryEntry)} onSuccess Success callback with the display |
+ * root directory as an argument. |
+ * @param {function(FileError)} onFailure Failure callback. |
+ */ |
+VolumeInfo.prototype.resolveDisplayRoot = function(onSuccess, onFailure) { |
+ // TODO(mtomasz): Do not add VolumeInfo which failed to resolve root, and |
+ // remove this if logic. Call onSuccess() always, instead. |
+ if (this.volumeType !== util.VolumeType.DRIVE) { |
+ if (this.root) |
+ onSuccess(this.root); |
+ else |
+ onFailure(this.error); |
+ return; |
+ } |
+ |
+ // For Drive, we need to resolve. |
+ this.resolveQueue_.run(function(callback) { |
+ if (this.displayRoot) { |
+ onSuccess(this.displayRoot); |
+ callback(); |
+ return; |
+ } |
+ var displayRootURL = this.root.toURL() + '/root'; |
+ webkitResolveLocalFileSystemURL( |
+ displayRootURL, function(directoryEntry) { |
+ this.displayRoot_ = directoryEntry; |
+ onSuccess(directoryEntry); |
+ callback(); |
+ }.bind(this), function(fileError) { |
+ onFailure(fileError); |
+ callback(); |
+ }.bind(this)); |
+ }.bind(this)); |
}; |
/** |