Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(232)

Unified Diff: ui/file_manager/file_manager/foreground/js/list_thumbnail_loader.js

Issue 912783002: Integrate ListThumbnailLoader to list view and grid view. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix failed test case. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/file_manager/file_manager/foreground/js/list_thumbnail_loader.js
diff --git a/ui/file_manager/file_manager/foreground/js/list_thumbnail_loader.js b/ui/file_manager/file_manager/foreground/js/list_thumbnail_loader.js
index 8c6b44a46489e849b1eb500e2f1bba7ea35a9610..1bf53237200b9edeb71056efef4e49d187624bd3 100644
--- a/ui/file_manager/file_manager/foreground/js/list_thumbnail_loader.js
+++ b/ui/file_manager/file_manager/foreground/js/list_thumbnail_loader.js
@@ -12,7 +12,6 @@
*
* @param {!FileListModel} dataModel A file list model.
* @param {!MetadataCache} metadataCache Metadata cache.
- * @param {!Document} document Document.
* @param {Function=} opt_thumbnailLoaderConstructor A constructor of thumbnail
* loader. This argument is used for testing.
* @struct
@@ -21,7 +20,7 @@
* @suppress {checkStructDictInheritance}
*/
function ListThumbnailLoader(
- dataModel, metadataCache, document, opt_thumbnailLoaderConstructor) {
+ dataModel, metadataCache, opt_thumbnailLoaderConstructor) {
/**
* @type {!FileListModel}
* @private
@@ -35,12 +34,6 @@ function ListThumbnailLoader(
this.metadataCache_ = metadataCache;
/**
- * @type {!Document}
- * @private
- */
- this.document_ = document;
-
- /**
* Constructor of thumbnail loader.
* @type {!Function}
* @private
@@ -91,20 +84,20 @@ ListThumbnailLoader.prototype.__proto__ = cr.EventTarget.prototype;
* Number of maximum active tasks.
* @const {number}
*/
-ListThumbnailLoader.NUM_OF_MAX_ACTIVE_TASKS = 5;
+ListThumbnailLoader.NUM_OF_MAX_ACTIVE_TASKS = 10;
/**
* Number of prefetch requests.
* @const {number}
*/
-ListThumbnailLoader.NUM_OF_PREFETCH = 10;
+ListThumbnailLoader.NUM_OF_PREFETCH = 20;
/**
* Cache size. Cache size must be larger than sum of high priority range size
* and number of prefetch tasks.
* @const {number}
*/
-ListThumbnailLoader.CACHE_SIZE = 100;
+ListThumbnailLoader.CACHE_SIZE = 500;
/**
* An event handler for splice event of data model. When list is changed, start
@@ -159,6 +152,9 @@ ListThumbnailLoader.prototype.getThumbnailFromCache = function(entry) {
/**
* Enqueues tasks if available.
+ *
+ * TODO(yawano): Make queueing for low priority thumbnail fetches more moderate
+ * and smart.
*/
ListThumbnailLoader.prototype.continue_ = function() {
// If tasks are running full or all items are scanned, do nothing.
@@ -169,29 +165,31 @@ ListThumbnailLoader.prototype.continue_ = function() {
return;
}
- var entry = /** @type {Entry} */ (this.dataModel_.item(this.cursor_++));
+ var entry = /** @type {Entry} */ (this.dataModel_.item(this.cursor_));
// If the entry is a directory, already in cache or fetching, skip it.
if (entry.isDirectory ||
this.cache_.get(entry.toURL()) ||
this.active_[entry.toURL()]) {
+ this.cursor_++;
this.continue_();
return;
}
- this.enqueue_(entry);
+ this.enqueue_(this.cursor_, entry);
+ this.cursor_++;
this.continue_();
}
/**
* Enqueues a thumbnail fetch task for an entry.
*
+ * @param {number} index Index of an entry in current data model.
* @param {!Entry} entry An entry.
*/
-ListThumbnailLoader.prototype.enqueue_ = function(entry) {
+ListThumbnailLoader.prototype.enqueue_ = function(index, entry) {
var task = new ListThumbnailLoader.Task(
- entry, this.metadataCache_, this.document_,
- this.thumbnailLoaderConstructor_);
+ entry, this.metadataCache_, this.thumbnailLoaderConstructor_);
var url = entry.toURL();
this.active_[url] = task;
@@ -199,7 +197,7 @@ ListThumbnailLoader.prototype.enqueue_ = function(entry) {
task.fetch().then(function(thumbnail) {
delete this.active_[url];
this.cache_.put(url, thumbnail);
- this.dispatchThumbnailLoaded_(thumbnail);
+ this.dispatchThumbnailLoaded_(index, thumbnail);
this.continue_();
}.bind(this), function() {
delete this.active_[url];
@@ -210,16 +208,58 @@ ListThumbnailLoader.prototype.enqueue_ = function(entry) {
/**
* Dispatches thumbnail loaded event.
*
- * @param {Object} thumbnail Thumbnail.
+ * @param {number} index Index of an original image in the data model.
+ * @param {!ListThumbnailLoader.ThumbnailData} thumbnail Thumbnail.
*/
-ListThumbnailLoader.prototype.dispatchThumbnailLoaded_ = function(thumbnail) {
- // TODO(yawano): Create ThumbnailLoadedEvent class.
+ListThumbnailLoader.prototype.dispatchThumbnailLoaded_ = function(
+ index, thumbnail) {
+ // Update index if it's already invalid, i.e. index may be invalid if some
+ // change had happened in the data model during thumbnail fetch.
+ var item = this.dataModel_.item(index);
+ if (item && item.toURL() !== thumbnail.fileUrl) {
+ index = -1;;
+ for (var i = 0; i < this.dataModel_.length; i++) {
+ if (this.dataModel_.item(i).toURL() === thumbnail.fileUrl) {
+ index = i;
+ break;
+ }
+ }
+ }
+
+ if (index > -1) {
+ this.dispatchEvent(
+ new ListThumbnailLoader.ThumbnailLoadedEvent(index, thumbnail));
+ }
+};
+
+/**
+ * Thumbnail loaded event.
+ * @param {number} index Index of an original image in the current data model.
+ * @param {!ListThumbnailLoader.ThumbnailData} thumbnail Thumbnail.
+ * @extends {Event}
+ * @suppress {checkStructDictInheritance}
+ * @constructor
+ * @struct
+ */
+ListThumbnailLoader.ThumbnailLoadedEvent = function(index, thumbnail) {
var event = new Event('thumbnailLoaded');
+
+ /** @type {number} */
+ event.index = index;
+
+ /** @type {string}*/
event.fileUrl = thumbnail.fileUrl;
+
+ /** @type {string} */
event.dataUrl = thumbnail.dataUrl;
+
+ /** @type {number} */
event.width = thumbnail.width;
+
+ /** @type {number}*/
event.height = thumbnail.height;
- this.dispatchEvent(event);
+
+ return event;
};
/**
@@ -258,17 +298,15 @@ ListThumbnailLoader.ThumbnailData = function(fileUrl, dataUrl, width, height) {
*
* @param {!Entry} entry An entry.
* @param {!MetadataCache} metadataCache Metadata cache.
- * @param {!Document} document Document.
* @param {!Function} thumbnailLoaderConstructor A constructor of thumbnail
* loader.
* @constructor
* @struct
*/
ListThumbnailLoader.Task = function(
- entry, metadataCache, document, thumbnailLoaderConstructor) {
+ entry, metadataCache, thumbnailLoaderConstructor) {
this.entry_ = entry;
this.metadataCache_ = metadataCache;
- this.document_ = document;
this.thumbnailLoaderConstructor_ = thumbnailLoaderConstructor;
}

Powered by Google App Engine
This is Rietveld 408576698