Index: ui/file_manager/gallery/js/gallery.js |
diff --git a/ui/file_manager/gallery/js/gallery.js b/ui/file_manager/gallery/js/gallery.js |
index 3ed781726c8ecd712d72aea52728693581152a4f..9b9cd34616d00a3a05fe6788c4fe2648501371dc 100644 |
--- a/ui/file_manager/gallery/js/gallery.js |
+++ b/ui/file_manager/gallery/js/gallery.js |
@@ -57,6 +57,11 @@ function Gallery(volumeManager) { |
* @const |
*/ |
this.metadataModel_ = MetadataModel.create(volumeManager); |
+ /** |
+ * @private {!ThumbnailModel} |
+ * @const |
+ */ |
+ this.thumbnailModel_ = new ThumbnailModel(this.metadataModel_); |
this.selectedEntry_ = null; |
this.metadataCacheObserverId_ = null; |
this.onExternallyUnmountedBound_ = this.onExternallyUnmounted_.bind(this); |
@@ -163,6 +168,8 @@ function Gallery(volumeManager) { |
this.errorBanner_, |
this.dataModel_, |
this.selectionModel_, |
+ this.metadataModel_, |
+ this.thumbnailModel_, |
this.context_, |
this.volumeManager_, |
this.toggleMode_.bind(this), |
@@ -249,6 +256,13 @@ Gallery.MOSAIC_BACKGROUND_INIT_DELAY = 1000; |
Gallery.METADATA_TYPE = 'thumbnail|filesystem|media|external'; |
/** |
+ * Types of metadata Gallery uses (to query the metadata cache). |
+ * @const |
+ * @type {!Array<string>} |
+ */ |
+Gallery.PREFETCH_PROPERTY_NAMES = ['imageWidth', 'imageHeight', 'size']; |
+ |
+/** |
* Closes gallery when a volume containing the selected item is unmounted. |
* @param {!Event} event The unmount event. |
* @private |
@@ -310,12 +324,12 @@ Gallery.prototype.loadInternal_ = function(entries, selectedEntries) { |
// Obtains max chank size. |
var maxChunkSize = 20; |
var volumeInfo = this.volumeManager_.getVolumeInfo(entries[0]); |
- if (volumeInfo && |
- volumeInfo.volumeType === VolumeManagerCommon.VolumeType.MTP) { |
- maxChunkSize = 1; |
+ if (volumeInfo) { |
+ if (volumeInfo.volumeType === VolumeManagerCommon.VolumeType.MTP) |
+ maxChunkSize = 1; |
+ if (volumeInfo.isReadOnly) |
+ this.context_.readonlyDirName = volumeInfo.label; |
} |
- if (volumeInfo.isReadOnly) |
- this.context_.readonlyDirName = volumeInfo.label; |
// Make loading list. |
var entrySet = {}; |
@@ -361,17 +375,21 @@ Gallery.prototype.loadInternal_ = function(entries, selectedEntries) { |
var chunk = loadingList.splice(0, maxChunkSize); |
if (!chunk.length) |
return; |
- |
- return new Promise(function(fulfill) { |
+ var entries = chunk.map(function(chunkItem) { |
+ return chunkItem.entry; |
+ }); |
+ var oldMetadataPromise = new Promise(function(fulfill) { |
// Obtains metadata for chunk. |
- var entries = chunk.map(function(chunkItem) { |
- return chunkItem.entry; |
- }); |
self.metadataCache_.get(entries, Gallery.METADATA_TYPE, fulfill); |
}).then(function(metadataList) { |
if (chunk.length !== metadataList.length) |
return Promise.reject('Failed to load metadata.'); |
- |
+ return metadataList; |
+ }); |
+ var metadataPromise = self.metadataModel_.get( |
+ entries, Gallery.PREFETCH_PROPERTY_NAMES); |
+ return Promise.all([oldMetadataPromise, metadataPromise]).then( |
+ function(metadataLists) { |
// Remove all the previous items if it's the first chunk. |
// Do it here because prevent a flicker between removing all the items |
// and adding new ones. |
@@ -386,11 +404,13 @@ Gallery.prototype.loadInternal_ = function(entries, selectedEntries) { |
var locationInfo = self.volumeManager_.getLocationInfo(chunkItem.entry); |
if (!locationInfo) // Skip the item, since gone. |
return; |
- var clonedMetadata = MetadataCache.cloneMetadata(metadataList[index]); |
+ var clonedMetadata = |
+ MetadataCache.cloneMetadata(metadataLists[0][index]); |
items.push(new Gallery.Item( |
chunkItem.entry, |
locationInfo, |
clonedMetadata, |
+ metadataLists[1][index], |
self.metadataCache_, |
self.metadataModel_, |
/* original */ true)); |