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

Side by Side Diff: ui/file_manager/gallery/js/gallery_item.js

Issue 988273002: Gallery.app : Truncates the file after a blob of new image is created. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add test cases. Created 5 years, 9 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 unified diff | Download patch
« no previous file with comments | « no previous file | ui/file_manager/gallery/js/gallery_item_unittest.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * Object representing an image item (a photo). 6 * Object representing an image item (a photo).
7 * 7 *
8 * @param {!FileEntry} entry Image entry. 8 * @param {!FileEntry} entry Image entry.
9 * @param {!EntryLocation} locationInfo Entry location information. 9 * @param {!EntryLocation} locationInfo Entry location information.
10 * @param {!MetadataItem} metadataItem 10 * @param {!MetadataItem} metadataItem
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 }.bind(this); 253 }.bind(this);
254 254
255 var onError = function(error) { 255 var onError = function(error) {
256 console.error('Error saving from gallery', name, error); 256 console.error('Error saving from gallery', name, error);
257 ImageUtil.metrics.recordEnum(ImageUtil.getMetricName('SaveResult'), 0, 2); 257 ImageUtil.metrics.recordEnum(ImageUtil.getMetricName('SaveResult'), 0, 2);
258 if (callback) 258 if (callback)
259 callback(false); 259 callback(false);
260 }; 260 };
261 261
262 var doSave = function(newFile, fileEntry) { 262 var doSave = function(newFile, fileEntry) {
263 var metadataPromise = metadataModel.get( 263 var blob;
264 var fileWriter;
265
266 metadataModel.get(
264 [fileEntry], 267 [fileEntry],
265 ['mediaMimeType', 'contentMimeType', 'ifd', 'exifLittleEndian']); 268 ['mediaMimeType', 'contentMimeType', 'ifd', 'exifLittleEndian']
266 metadataPromise.then(function(metadataItems) { 269 ).then(function(metadataItems) {
267 fileEntry.createWriter(function(fileWriter) { 270 // Create the blob of new image.
268 var writeContent = function() { 271 var metadataItem = metadataItems[0];
269 fileWriter.onwriteend = onSuccess.bind(null, fileEntry); 272 metadataItem.modificationTime = new Date();
270 var metadataItem = metadataItems[0]; 273 var metadataEncoder = ImageEncoder.encodeMetadata(
271 metadataItem.modificationTime = new Date(); 274 metadataItem, canvas, /* quality for thumbnail*/ 0.8);
272 var metadataEncoder = ImageEncoder.encodeMetadata( 275 // Contrary to what one might think 1.0 is not a good default. Opening
273 metadataItem, canvas, /* quality for thumbnail*/ 0.8); 276 // and saving an typical photo taken with consumer camera increases
274 // Contrary to what one might think 1.0 is not a good default. Opening 277 // its file size by 50-100%. Experiments show that 0.9 is much better.
275 // and saving an typical photo taken with consumer camera increases 278 // It shrinks some photos a bit, keeps others about the same size, but
276 // its file size by 50-100%. Experiments show that 0.9 is much better. 279 // does not visibly lower the quality.
277 // It shrinks some photos a bit, keeps others about the same size, but 280 blob = ImageEncoder.getBlob(canvas, metadataEncoder, 0.9);
278 // does not visibly lower the quality. 281 }).then(function() {
279 fileWriter.write(ImageEncoder.getBlob(canvas, metadataEncoder, 0.9)); 282 // Create writer.
280 }.bind(this); 283 return new Promise(function(fullfill, reject) {
281 fileWriter.onerror = function(error) { 284 fileEntry.createWriter(fullfill, reject);
282 onError(error); 285 });
283 // Disable all callbacks on the first error. 286 }).then(function(writer) {
284 fileWriter.onerror = null; 287 fileWriter = writer;
285 fileWriter.onwriteend = null; 288
286 }; 289 // Truncates the file to 0 byte if it overwrites.
287 if (newFile) { 290 return new Promise(function(fulfill, reject) {
288 writeContent(); 291 if (!newFile) {
292 fileWriter.onerror = reject;
293 fileWriter.onwriteend = fulfill;
294 fileWriter.truncate(0);
289 } else { 295 } else {
290 fileWriter.onwriteend = writeContent; 296 fulfill(null);
291 fileWriter.truncate(0);
292 } 297 }
293 }.bind(this), onError); 298 });
294 }.bind(this)); 299 }).then(function() {
300 // Writes the blob of new image.
301 return new Promise(function(fulfill, reject) {
302 fileWriter.onerror = reject;
303 fileWriter.onwriteend = fulfill;
304 fileWriter.write(blob);
305 });
306 }).then(onSuccess.bind(null, fileEntry))
307 .catch(function(error) {
308 onError(error);
309 // Disable all callbacks on the first error.
310 fileWriter.onerror = null;
311 fileWriter.onwriteend = null;
312 });
295 }.bind(this); 313 }.bind(this);
296 314
297 var getFile = function(dir, newFile) { 315 var getFile = function(dir, newFile) {
298 dir.getFile(name, {create: newFile, exclusive: newFile}, 316 dir.getFile(name, {create: newFile, exclusive: newFile},
299 function(fileEntry) { 317 function(fileEntry) {
300 doSave(newFile, fileEntry); 318 doSave(newFile, fileEntry);
301 }.bind(this), onError); 319 }.bind(this), onError);
302 }.bind(this); 320 }.bind(this);
303 321
304 var checkExistence = function(dir) { 322 var checkExistence = function(dir) {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 return Promise.reject(str('GALLERY_FILE_EXISTS')); 373 return Promise.reject(str('GALLERY_FILE_EXISTS'));
356 }, function() { 374 }, function() {
357 return new Promise( 375 return new Promise(
358 this.entry_.moveTo.bind(this.entry_, parentDirectory, newFileName)); 376 this.entry_.moveTo.bind(this.entry_, parentDirectory, newFileName));
359 }.bind(this)); 377 }.bind(this));
360 }.bind(this)); 378 }.bind(this));
361 }.bind(this)).then(function(entry) { 379 }.bind(this)).then(function(entry) {
362 this.entry_ = entry; 380 this.entry_ = entry;
363 }.bind(this)); 381 }.bind(this));
364 }; 382 };
OLDNEW
« no previous file with comments | « no previous file | ui/file_manager/gallery/js/gallery_item_unittest.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698