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

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

Issue 420743002: Gallery: Store image caches in Gallery items. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed. Created 6 years, 4 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 | Annotate | Revision Log
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 'use strict'; 5 'use strict';
6 6
7 /** 7 /**
8 * Called from the main frame when unloading. 8 * Called from the main frame when unloading.
9 * @param {boolean=} opt_exiting True if the app is exiting. 9 * @param {boolean=} opt_exiting True if the app is exiting.
10 */ 10 */
(...skipping 10 matching lines...) Expand all
21 * Data model for gallery. 21 * Data model for gallery.
22 * 22 *
23 * @constructor 23 * @constructor
24 * @extends {cr.ui.ArrayDataModel} 24 * @extends {cr.ui.ArrayDataModel}
25 */ 25 */
26 function GalleryDataModel() { 26 function GalleryDataModel() {
27 cr.ui.ArrayDataModel.call(this, []); 27 cr.ui.ArrayDataModel.call(this, []);
28 this.metadataCache_ = null; 28 this.metadataCache_ = null;
29 } 29 }
30 30
31 /**
32 * Maximum number of full size image cache.
33 * @type {number}
34 * @const
35 * @private
36 */
37 GalleryDataModel.MAX_FULL_IMAGE_CACHE_ = 3;
38
39 /**
40 * Maximum number of screen size image cache.
41 * @type {number}
42 * @const
43 * @private
44 */
45 GalleryDataModel.MAX_SCREEN_IMAGE_CACHE_ = 5;
46
31 GalleryDataModel.prototype = { 47 GalleryDataModel.prototype = {
32 __proto__: cr.ui.ArrayDataModel.prototype 48 __proto__: cr.ui.ArrayDataModel.prototype
33 }; 49 };
34 50
35 /** 51 /**
36 * Initializes the data model. 52 * Initializes the data model.
37 * 53 *
38 * @param {MetadataCache} metadataCache Metadata cache. 54 * @param {MetadataCache} metadataCache Metadata cache.
39 * @param {Array.<FileEntry>} entries Image entries. 55 * @param {Array.<FileEntry>} entries Image entries.
40 * @return {Promise} Promise to be fulfilled with after initialization. 56 * @return {Promise} Promise to be fulfilled with after initialization.
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 // correctly. 143 // correctly.
128 this.splice(this.indexOf(item) + 1, 0, anotherItem); 144 this.splice(this.indexOf(item) + 1, 0, anotherItem);
129 } 145 }
130 146
131 fulfill(); 147 fulfill();
132 }.bind(this)); 148 }.bind(this));
133 }.bind(this)); 149 }.bind(this));
134 }; 150 };
135 151
136 /** 152 /**
153 * Evicts image caches in the items.
154 * @param {Gallery.Item} currentSelectedItem Current selected item.
155 */
156 GalleryDataModel.prototype.evictCache = function(currentSelectedItem) {
157 // Updates the last accessed date.
158 if (currentSelectedItem)
159 currentSelectedItem.lastAccessed = Date.now();
mtomasz 2014/07/28 07:51:21 I think updating lastAccessed time shouldn't be re
hirono 2014/07/28 09:10:33 How about adding touch method and calling it when
mtomasz 2014/07/28 09:14:00 SGTM!
hirono 2014/07/28 09:27:21 Thanks! Done.
160
161 // Sort the item by the last accessed date.
162 var sorted = this.slice().sort(function(a, b) {
163 return b.lastAccessed - a.lastAccessed;
164 });
165
166 // Evict caches.
167 var contentCacheCount = 0;
168 var screenCacheCount = 0;
169 for (var i = 0; i < sorted.length; i++) {
170 if (sorted[i].contentImage) {
171 if (++contentCacheCount > GalleryDataModel.MAX_FULL_IMAGE_CACHE_) {
172 if (sorted[i].contentImage.parentNode) {
173 console.error('The content image has a parent node.');
174 } else {
175 // Force to free the buffer of the canvas by assinng zero size.
176 sorted[i].contentImage.width = 0;
177 sorted[i].contentImage.height = 0;
178 sorted[i].contentImage = null;
179 }
180 }
181 }
182 if (sorted[i].screenImage) {
183 if (++screenCacheCount > GalleryDataModel.MAX_SCREEN_IMAGE_CACHE_) {
184 if (sorted[i].screenImage.parentNode) {
185 console.error('The screen image has a parent node.');
186 } else {
187 // Force to free the buffer of the canvas by assinng zero size.
188 sorted[i].screenImage.width = 0;
189 sorted[i].screenImage.height = 0;
190 sorted[i].screenImage = null;
191 }
192 }
193 }
194 }
195 };
196
197 /**
137 * Gallery for viewing and editing image files. 198 * Gallery for viewing and editing image files.
138 * 199 *
139 * @param {!VolumeManager} volumeManager The VolumeManager instance of the 200 * @param {!VolumeManager} volumeManager The VolumeManager instance of the
140 * system. 201 * system.
141 * @constructor 202 * @constructor
142 */ 203 */
143 function Gallery(volumeManager) { 204 function Gallery(volumeManager) {
144 this.context_ = { 205 this.context_ = {
145 appWindow: chrome.app.window.current(), 206 appWindow: chrome.app.window.current(),
146 onClose: function() { close(); }, 207 onClose: function() { close(); },
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 return items[0]; 700 return items[0];
640 }; 701 };
641 702
642 /** 703 /**
643 * Selection change event handler. 704 * Selection change event handler.
644 * @private 705 * @private
645 */ 706 */
646 Gallery.prototype.onSelection_ = function() { 707 Gallery.prototype.onSelection_ = function() {
647 this.updateSelectionAndState_(); 708 this.updateSelectionAndState_();
648 this.updateShareMenu_(); 709 this.updateShareMenu_();
710 this.dataModel_.evictCache(this.getSelectedItems()[0]);
649 }; 711 };
650 712
651 /** 713 /**
652 * Data model splice event handler. 714 * Data model splice event handler.
653 * @private 715 * @private
654 */ 716 */
655 Gallery.prototype.onSplice_ = function() { 717 Gallery.prototype.onSplice_ = function() {
656 this.selectionModel_.adjustLength(this.dataModel_.length); 718 this.selectionModel_.adjustLength(this.dataModel_.length);
657 }; 719 };
658 720
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
969 window.loadTimeData.data = backgroundComponents.stringData; 1031 window.loadTimeData.data = backgroundComponents.stringData;
970 gallery = new Gallery(backgroundComponents.volumeManager); 1032 gallery = new Gallery(backgroundComponents.volumeManager);
971 }; 1033 };
972 1034
973 /** 1035 /**
974 * Loads entries. 1036 * Loads entries.
975 */ 1037 */
976 window.loadEntries = function(entries, selectedEntries) { 1038 window.loadEntries = function(entries, selectedEntries) {
977 gallery.load(entries, selectedEntries); 1039 gallery.load(entries, selectedEntries);
978 }; 1040 };
OLDNEW
« no previous file with comments | « ui/file_manager/file_manager/common/js/util.js ('k') | ui/file_manager/gallery/js/gallery_item.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698