Index: chrome/browser/resources/file_manager/js/media/media_util.js |
diff --git a/chrome/browser/resources/file_manager/js/media/media_util.js b/chrome/browser/resources/file_manager/js/media/media_util.js |
index b9934bc2469e1cfe1b8f297b6e5f1d700d76bc42..126b6b2205c84099ce85b2ac3ff7d4d71b4254ff 100644 |
--- a/chrome/browser/resources/file_manager/js/media/media_util.js |
+++ b/chrome/browser/resources/file_manager/js/media/media_util.js |
@@ -38,8 +38,7 @@ function ThumbnailLoader(url, opt_loaderType, opt_metadata, opt_mediaType) { |
if (opt_metadata.thumbnail && opt_metadata.thumbnail.url) { |
this.thumbnailUrl_ = opt_metadata.thumbnail.url; |
this.transform_ = opt_metadata.thumbnail.transform; |
- } else if (FileType.isImage(url) && |
- ThumbnailLoader.canUseImageUrl_(opt_metadata)) { |
+ } else if (FileType.isImage(url)) { |
this.thumbnailUrl_ = url; |
this.transform_ = opt_metadata.media && opt_metadata.media.imageTransform; |
} else if (this.fallbackUrl_) { |
@@ -50,16 +49,6 @@ function ThumbnailLoader(url, opt_loaderType, opt_metadata, opt_mediaType) { |
} |
/** |
- * Files with more pixels won't have thumbnails. |
- */ |
-ThumbnailLoader.MAX_PIXEL_COUNT = 1 << 21; // 2 MPix |
- |
-/** |
- * Files of bigger size won't have thumbnails. |
- */ |
-ThumbnailLoader.MAX_FILE_SIZE = 1 << 20; // 1 Mb |
- |
-/** |
* In percents (0.0 - 1.0), how much area can be cropped to fill an image |
* in a container, when loading a thumbnail in FillMode.AUTO mode. |
* The specified 30% value allows to fill 16:9, 3:2 pictures in 4:3 element. |
@@ -78,6 +67,15 @@ ThumbnailLoader.FillMode = { |
}; |
/** |
+ * Optimization mode for downloading thumbnails. |
+ * @enum |
+ */ |
+ThumbnailLoader.OptimizationMode = { |
+ NEVER_DISCARD: 0, // Never discards downloading. No optimization. |
+ DISCARD_DETACHED: 1 // Canceled if the container is not attached anymore. |
+}; |
+ |
+/** |
* Type of element to store the image. |
* @enum |
*/ |
@@ -87,33 +85,36 @@ ThumbnailLoader.LoaderType = { |
}; |
/** |
- * If an image file does not have an embedded thumbnail we might want to use |
- * the image itself as a thumbnail. If the image is too large it hurts |
- * the performance a lot so we allow it only for moderately sized files. |
- * |
- * @param {Object} metadata Metadata object. |
- * @return {boolean} Whether it is OK to use the image url for a preview. |
- * @private |
+ * Maximum thumbnail's width when generating from the full resolution image. |
+ * @const |
+ * @type {number} |
*/ |
-ThumbnailLoader.canUseImageUrl_ = function(metadata) { |
- return (metadata.filesystem && metadata.filesystem.size && |
- metadata.filesystem.size <= ThumbnailLoader.MAX_FILE_SIZE) || |
- (metadata.media && metadata.media.width && metadata.media.height && |
- metadata.media.width * metadata.media.height <= |
- ThumbnailLoader.MAX_PIXEL_COUNT); |
-}; |
+ThumbnailLoader.THUMBNAIL_MAX_WIDTH = 500; |
/** |
+ * Maximum thumbnail's height when generating from the full resolution image. |
+ * @const |
+ * @type {number} |
+ */ |
+ThumbnailLoader.THUMBNAIL_MAX_HEIGHT = 500; |
+ |
+/** |
+ * Loads and attaches an image. |
* |
* @param {HTMLElement} box Container element. |
* @param {ThumbnailLoader.FillMode} fillMode Fill mode. |
+ * @param {ThumbnailLoader.OptimizationMode=} opt_optimizationMode Optimization |
+ * for downloading thumbnails. By default optimizations are disabled. |
* @param {function(Image, object} opt_onSuccess Success callback, |
- * accepts the image and the transform. |
+ * accepts the image and the transform. |
* @param {function} opt_onError Error callback. |
* @param {function} opt_onGeneric Callback for generic image used. |
*/ |
-ThumbnailLoader.prototype.load = function( |
- box, fillMode, opt_onSuccess, opt_onError, opt_onGeneric) { |
+ThumbnailLoader.prototype.load = function(box, fillMode, opt_optimizationMode, |
+ opt_onSuccess, opt_onError, opt_onGeneric) { |
+ opt_optimizationMode = opt_optimizationMode || |
+ ThumbnailLoader.OptimizationMode.NEVER_DISCARD; |
+ |
if (!this.thumbnailUrl_) { |
// Relevant CSS rules are in file_types.css. |
box.setAttribute('generic-thumbnail', this.mediaType_); |
@@ -142,12 +143,31 @@ ThumbnailLoader.prototype.load = function( |
} |
}.bind(this); |
- if (this.image_.src == this.thumbnailUrl_) { |
- console.warn('Thumnbnail already loaded: ' + this.thumbnailUrl_); |
+ if (this.image_.src) { |
+ console.warn('Thumbnail already loaded: ' + this.thumbnailUrl_); |
return; |
} |
- util.loadImage(this.image_, this.thumbnailUrl_); |
+ // TODO(mtomasz): Smarter calculation of the requested size. |
+ var wasAttached = box.ownerDocument.contains(box); |
+ var taskId = util.loadImage( |
+ this.image_, |
+ this.thumbnailUrl_, |
+ { maxWidth: ThumbnailLoader.THUMBNAIL_MAX_WIDTH, |
+ maxHeight: ThumbnailLoader.THUMBNAIL_MAX_HEIGHT, |
+ cache: true }, |
+ function() { |
+ if (opt_optimizationMode == |
+ ThumbnailLoader.OptimizationMode.DISCARD_DETACHED && |
+ !box.ownerDocument.contains(box)) { |
+ // If the container is not attached, then invalidate the download. |
+ return false; |
+ } |
+ return true; |
+ }); |
+ |
+ if (!taskId) |
+ this.image_.classList.add('cached'); |
}; |
/** |
@@ -195,7 +215,17 @@ ThumbnailLoader.prototype.loadDetachedImage = function(callback) { |
this.image_ = new Image(); |
this.image_.onload = callback.bind(null, true); |
this.image_.onerror = callback.bind(null, false); |
- util.loadImage(this.image_, this.thumbnailUrl_); |
+ |
+ // TODO(mtomasz): Smarter calculation of the requested size. |
+ var taskId = util.loadImage( |
+ this.image_, |
+ this.thumbnailUrl_, |
+ { maxWidth: ThumbnailLoader.THUMBNAIL_MAX_WIDTH, |
+ maxHeight: ThumbnailLoader.THUMBNAIL_MAX_HEIGHT, |
+ cache: true }); |
+ |
+ if (!taskId) |
+ this.image_.classList.add('cached'); |
}; |
/** |