| Index: ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
|
| diff --git a/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js b/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
|
| index c14bf9b854f8b45a844e7a9ae466a3b0d08f3ec2..1730bfff37fbf860d694497f527c87659028317a 100644
|
| --- a/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
|
| +++ b/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
|
| @@ -47,12 +47,12 @@ function FileTransferController(doc,
|
| this.onSelectionChanged_.bind(this));
|
|
|
| /**
|
| - * DOM element to represent selected file in drag operation. Used if only
|
| - * one element is selected.
|
| - * @type {HTMLElement}
|
| + * Promise to be fulfilled with the thumbnail image of selected file in drag
|
| + * operation. Used if only one element is selected.
|
| + * @type {Promise}
|
| * @private
|
| */
|
| - this.preloadedThumbnailImageNode_ = null;
|
| + this.preloadedThumbnailImagePromise_ = null;
|
|
|
| /**
|
| * File objects for selected files.
|
| @@ -77,6 +77,15 @@ function FileTransferController(doc,
|
| this.touching_ = false;
|
| }
|
|
|
| +/**
|
| + * Size of drag thumbnail for image files.
|
| + *
|
| + * @type {number}
|
| + * @const
|
| + * @private
|
| + */
|
| +FileTransferController.DRAG_THUMBNAIL_SIZE_ = 64;
|
| +
|
| FileTransferController.prototype = {
|
| __proto__: cr.EventTarget.prototype,
|
|
|
| @@ -399,20 +408,36 @@ FileTransferController.prototype = {
|
| * @param {Entry} entry Entry to preload a thumbnail for.
|
| */
|
| preloadThumbnailImage_: function(entry) {
|
| - var metadataTypes = 'thumbnail|filesystem';
|
| - var thumbnailContainer = this.document_.createElement('div');
|
| - this.preloadedThumbnailImageNode_ = thumbnailContainer;
|
| - this.preloadedThumbnailImageNode_.className = 'img-container';
|
| - this.metadataCache_.getOne(
|
| - entry,
|
| - metadataTypes,
|
| - function(metadata) {
|
| - new ThumbnailLoader(entry,
|
| - ThumbnailLoader.LoaderType.IMAGE,
|
| - metadata).
|
| - load(thumbnailContainer,
|
| - ThumbnailLoader.FillMode.FILL);
|
| - }.bind(this));
|
| + var metadataPromise = new Promise(function(fulfill, reject) {
|
| + this.metadataCache_.getOne(entry,
|
| + 'thumbnail|filesystem',
|
| + function(metadata) {
|
| + if (metadata)
|
| + fulfill(metadata);
|
| + else
|
| + reject('Failed to fetch metadata.');
|
| + });
|
| + }.bind(this));
|
| +
|
| + var imagePromise = metadataPromise.then(function(metadata) {
|
| + return new Promise(function(fulfill, reject) {
|
| + var loader = new ThumbnailLoader(
|
| + entry, ThumbnailLoader.LoaderType.Image, metadata);
|
| + loader.loadDetachedImage(function(result) {
|
| + if (result)
|
| + fulfill(loader.getImage());
|
| + });
|
| + });
|
| + });
|
| +
|
| + imagePromise.then(function(image) {
|
| + // Store the image so that we can obtain the image synchronously.
|
| + imagePromise.value = image;
|
| + }, function(error) {
|
| + console.error(error.stack || error);
|
| + });
|
| +
|
| + this.preloadedThumbnailImagePromise_ = imagePromise;
|
| },
|
|
|
| /**
|
| @@ -429,10 +454,6 @@ FileTransferController.prototype = {
|
| contents.className = 'drag-contents';
|
| container.appendChild(contents);
|
|
|
| - var thumbnailImage;
|
| - if (this.preloadedThumbnailImageNode_)
|
| - thumbnailImage = this.preloadedThumbnailImageNode_.querySelector('img');
|
| -
|
| // Option 1. Multiple selection, render only a label.
|
| if (length > 1) {
|
| var label = this.document_.createElement('div');
|
| @@ -444,10 +465,33 @@ FileTransferController.prototype = {
|
|
|
| // Option 2. Thumbnail image available, then render it without
|
| // a label.
|
| - if (thumbnailImage) {
|
| - thumbnailImage.classList.add('drag-thumbnail');
|
| + if (this.preloadedThumbnailImagePromise_ &&
|
| + this.preloadedThumbnailImagePromise_.value) {
|
| + var thumbnailImage = this.preloadedThumbnailImagePromise_.value;
|
| +
|
| + // Resize the image to canvas.
|
| + var canvas = document.createElement('canvas');
|
| + canvas.width = FileTransferController.DRAG_THUMBNAIL_SIZE_;
|
| + canvas.height = FileTransferController.DRAG_THUMBNAIL_SIZE_;
|
| +
|
| + var minScale = Math.min(
|
| + thumbnailImage.width / canvas.width,
|
| + thumbnailImage.height / canvas.height);
|
| + var srcWidth = Math.min(canvas.width * minScale, thumbnailImage.width);
|
| + var srcHeight = Math.min(canvas.height * minScale, thumbnailImage.height);
|
| +
|
| + var context = canvas.getContext('2d');
|
| + context.drawImage(thumbnailImage,
|
| + (thumbnailImage.width - srcWidth) / 2,
|
| + (thumbnailImage.height - srcHeight) / 2,
|
| + srcWidth,
|
| + srcHeight,
|
| + 0,
|
| + 0,
|
| + canvas.width,
|
| + canvas.height);
|
| contents.classList.add('for-image');
|
| - contents.appendChild(this.preloadedThumbnailImageNode_);
|
| + contents.appendChild(canvas);
|
| return container;
|
| }
|
|
|
| @@ -502,7 +546,7 @@ FileTransferController.prototype = {
|
| }
|
|
|
| var dragThumbnail = this.renderThumbnail_();
|
| - dt.setDragImage(dragThumbnail, 1000, 1000);
|
| + dt.setDragImage(dragThumbnail, 0, 0);
|
|
|
| window[DRAG_AND_DROP_GLOBAL_DATA] = {
|
| sourceRootURL: dt.getData('fs/sourceRootURL'),
|
| @@ -924,7 +968,7 @@ FileTransferController.prototype = {
|
| onSelectionChanged_: function(event) {
|
| var entries = this.selectedEntries_;
|
| var files = this.selectedFileObjects_ = [];
|
| - this.preloadedThumbnailImageNode_ = null;
|
| + this.preloadedThumbnailImagePromise_ = null;
|
|
|
| var fileEntries = [];
|
| for (var i = 0; i < entries.length; i++) {
|
|
|